Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
485 changes: 483 additions & 2 deletions drivers/media/platform/qcom/iris/iris_ctrls.c

Large diffs are not rendered by default.

16 changes: 14 additions & 2 deletions drivers/media/platform/qcom/iris/iris_ctrls.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ int iris_set_level(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id
int iris_set_profile_level_gen1(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_header_mode_gen1(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_header_mode_gen2(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_bitrate(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_bitrate_gen1(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_bitrate_gen2(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_peak_bitrate(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_bitrate_mode_gen1(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_bitrate_mode_gen2(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
Expand All @@ -34,7 +35,18 @@ int iris_set_frame_qp(struct iris_inst *inst, enum platform_inst_fw_cap_type cap
int iris_set_qp_range(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_rotation(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_flip(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_ir_period(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_ir_period_gen1(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_ir_period_gen2(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_ltr_count_gen1(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_ltr_count_gen2(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_use_ltr(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_mark_ltr(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_use_and_mark_ltr(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_intra_period(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_layer_type(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_layer_count_gen1(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_layer_count_gen2(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_layer_bitrate(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_properties(struct iris_inst *inst, u32 plane);

#endif
161 changes: 160 additions & 1 deletion drivers/media/platform/qcom/iris/iris_hfi_gen1.c
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ static const struct platform_inst_fw_cap inst_fw_cap_sm8250_enc[] = {
.hfi_id = HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE,
.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
CAP_FLAG_DYNAMIC_ALLOWED,
.set = iris_set_bitrate,
.set = iris_set_bitrate_gen1,
},
{
.cap_id = BITRATE_MODE,
Expand Down Expand Up @@ -225,6 +225,165 @@ static const struct platform_inst_fw_cap inst_fw_cap_sm8250_enc[] = {
.flags = CAP_FLAG_OUTPUT_PORT,
.set = iris_set_qp_range,
},
{
.cap_id = IR_TYPE,
.min = V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_RANDOM,
.max = V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_CYCLIC,
.step_or_mask = BIT(V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_RANDOM) |
BIT(V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_CYCLIC),
.value = V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_RANDOM,
.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
},
{
.cap_id = IR_PERIOD,
.min = 0,
.max = ((4096 * 2304) >> 8),
.step_or_mask = 1,
.value = 0,
.hfi_id = HFI_PROPERTY_PARAM_VENC_INTRA_REFRESH,
.flags = CAP_FLAG_OUTPUT_PORT,
.set = iris_set_ir_period_gen1,
},
{
.cap_id = LTR_COUNT,
.min = 0,
.max = MAX_LTR_FRAME_COUNT_GEN1,
.step_or_mask = 1,
.value = 0,
.hfi_id = HFI_PROPERTY_PARAM_VENC_LTRMODE,
.flags = CAP_FLAG_OUTPUT_PORT,
.set = iris_set_ltr_count_gen1,
},
{
.cap_id = USE_LTR,
.min = 0,
.max = ((1 << MAX_LTR_FRAME_COUNT_GEN1) - 1),
.step_or_mask = 0,
.value = 0,
.hfi_id = HFI_PROPERTY_CONFIG_VENC_USELTRFRAME,
.flags = CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
.set = iris_set_use_ltr,
},
{
.cap_id = MARK_LTR,
.min = 0,
.max = (MAX_LTR_FRAME_COUNT_GEN1 - 1),
.step_or_mask = 1,
.value = 0,
.hfi_id = HFI_PROPERTY_CONFIG_VENC_MARKLTRFRAME,
.flags = CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
.set = iris_set_mark_ltr,
},
{
.cap_id = B_FRAME,
.min = 0,
.max = 3,
.step_or_mask = 1,
.value = 0,
.flags = CAP_FLAG_OUTPUT_PORT,
},
{
.cap_id = INTRA_PERIOD,
.min = 0,
.max = 1,
.step_or_mask = 1,
.value = 0,
.hfi_id = HFI_PROPERTY_CONFIG_VENC_INTRA_PERIOD,
.flags = CAP_FLAG_OUTPUT_PORT,
.set = iris_set_intra_period,
},
{
.cap_id = LAYER_ENABLE,
.min = 0,
.max = 1,
.step_or_mask = 1,
.value = 0,
.flags = CAP_FLAG_OUTPUT_PORT,
},
{
.cap_id = LAYER_TYPE_H264,
.min = V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P,
.max = V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P,
.step_or_mask = BIT(V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P),
.value = V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P,
.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
},
{
.cap_id = LAYER_COUNT_H264,
.min = 0,
.max = MAX_HIER_CODING_LAYER_GEN1,
.step_or_mask = 1,
.value = 0,
.hfi_id = HFI_PROPERTY_CONFIG_VENC_HIER_P_ENH_LAYER,
.flags = CAP_FLAG_OUTPUT_PORT,
.set = iris_set_layer_count_gen1,
},
{
.cap_id = LAYER0_BITRATE_H264,
.min = 1,
.max = BITRATE_MAX,
.step_or_mask = 1,
.value = BITRATE_DEFAULT,
.hfi_id = HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE,
.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
CAP_FLAG_DYNAMIC_ALLOWED,
.set = iris_set_bitrate_gen1,
},
{
.cap_id = LAYER1_BITRATE_H264,
.min = 1,
.max = BITRATE_MAX,
.step_or_mask = 1,
.value = BITRATE_DEFAULT,
.hfi_id = HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE,
.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
CAP_FLAG_DYNAMIC_ALLOWED,
.set = iris_set_bitrate_gen1,
},
{
.cap_id = LAYER2_BITRATE_H264,
.min = 1,
.max = BITRATE_MAX,
.step_or_mask = 1,
.value = BITRATE_DEFAULT,
.hfi_id = HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE,
.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
CAP_FLAG_DYNAMIC_ALLOWED,
.set = iris_set_bitrate_gen1,
},
{
.cap_id = LAYER3_BITRATE_H264,
.min = 1,
.max = BITRATE_MAX,
.step_or_mask = 1,
.value = BITRATE_DEFAULT,
.hfi_id = HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE,
.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
CAP_FLAG_DYNAMIC_ALLOWED,
.set = iris_set_bitrate_gen1,
},
{
.cap_id = LAYER4_BITRATE_H264,
.min = 1,
.max = BITRATE_MAX,
.step_or_mask = 1,
.value = BITRATE_DEFAULT,
.hfi_id = HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE,
.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
CAP_FLAG_DYNAMIC_ALLOWED,
.set = iris_set_bitrate_gen1,
},
{
.cap_id = LAYER5_BITRATE_H264,
.min = 1,
.max = BITRATE_MAX,
.step_or_mask = 1,
.value = BITRATE_DEFAULT,
.hfi_id = HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE,
.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
CAP_FLAG_DYNAMIC_ALLOWED,
.set = iris_set_bitrate_gen1,
},
};

static const u32 sm8250_vdec_input_config_param_default[] = {
Expand Down
62 changes: 58 additions & 4 deletions drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
Original file line number Diff line number Diff line change
Expand Up @@ -604,11 +604,10 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_session_set_property_pkt *p
break;
}
case HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE: {
struct hfi_bitrate *brate = prop_data;
u32 *in = pdata;
struct hfi_bitrate *in = pdata, *brate = prop_data;

brate->bitrate = *in;
brate->layer_id = 0;
brate->bitrate = in->bitrate;
brate->layer_id = in->layer_id;
packet->shdr.hdr.size += sizeof(u32) + sizeof(*brate);
break;
}
Expand Down Expand Up @@ -687,6 +686,61 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_session_set_property_pkt *p
packet->shdr.hdr.size += sizeof(u32) + sizeof(*plane_actual_info);
break;
}
case HFI_PROPERTY_PARAM_VENC_INTRA_REFRESH: {
struct hfi_intra_refresh *in = pdata, *intra_refresh = prop_data;

intra_refresh->mode = in->mode;
intra_refresh->mbs = in->mbs;
packet->shdr.hdr.size += sizeof(u32) + sizeof(*intra_refresh);
break;
}
case HFI_PROPERTY_PARAM_VENC_LTRMODE: {
struct hfi_ltr_mode *in = pdata, *ltr_mode = prop_data;

ltr_mode->mode = in->mode;
ltr_mode->count = in->count;
ltr_mode->trust_mode = in->trust_mode;
packet->shdr.hdr.size += sizeof(u32) + sizeof(*ltr_mode);
break;
}
case HFI_PROPERTY_CONFIG_VENC_USELTRFRAME: {
struct hfi_ltr_use *in = pdata, *ltr_use = prop_data;

ltr_use->frames = in->frames;
ltr_use->ref_ltr = in->ref_ltr;
ltr_use->use_constrnt = in->use_constrnt;
packet->shdr.hdr.size += sizeof(u32) + sizeof(*ltr_use);
break;
}
case HFI_PROPERTY_CONFIG_VENC_MARKLTRFRAME: {
struct hfi_ltr_mark *in = pdata, *ltr_mark = prop_data;

ltr_mark->mark_frame = in->mark_frame;
packet->shdr.hdr.size += sizeof(u32) + sizeof(*ltr_mark);
break;
}
case HFI_PROPERTY_CONFIG_VENC_INTRA_PERIOD: {
struct hfi_intra_period *in = pdata, *intra_period = prop_data;

intra_period->pframes = in->pframes;
intra_period->bframes = in->bframes;
packet->shdr.hdr.size += sizeof(u32) + sizeof(*intra_period);
break;
}
case HFI_PROPERTY_PARAM_VENC_HIER_P_MAX_NUM_ENH_LAYER: {
u32 *in = pdata;

packet->data[1] = *in;
packet->shdr.hdr.size += sizeof(u32) + sizeof(u32);
break;
}
case HFI_PROPERTY_CONFIG_VENC_HIER_P_ENH_LAYER: {
u32 *in = pdata;

packet->data[1] = *in;
packet->shdr.hdr.size += sizeof(u32) + sizeof(u32);
break;
}
default:
return -EINVAL;
}
Expand Down
49 changes: 49 additions & 0 deletions drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h
Original file line number Diff line number Diff line change
Expand Up @@ -141,9 +141,28 @@
#define HFI_PROPERTY_PARAM_VENC_H264_DEBLOCK_CONTROL 0x2005003
#define HFI_PROPERTY_PARAM_VENC_RATE_CONTROL 0x2005004
#define HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE_V2 0x2005009

#define HFI_INTRA_REFRESH_NONE 0x1
#define HFI_INTRA_REFRESH_CYCLIC 0x2
#define HFI_INTRA_REFRESH_ADAPTIVE 0x3
#define HFI_INTRA_REFRESH_CYCLIC_ADAPTIVE 0x4
#define HFI_INTRA_REFRESH_RANDOM 0x5

#define HFI_PROPERTY_PARAM_VENC_INTRA_REFRESH 0x200500d

#define HFI_LTR_MODE_DISABLE 0x0
#define HFI_LTR_MODE_MANUAL 0x1
#define HFI_LTR_MODE_PERIODIC 0x2

#define HFI_PROPERTY_PARAM_VENC_LTRMODE 0x200501c
#define HFI_PROPERTY_PARAM_VENC_MAX_NUM_B_FRAMES 0x2005020
#define HFI_PROPERTY_PARAM_VENC_HIER_P_MAX_NUM_ENH_LAYER 0x2005026
#define HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE 0x2006001
#define HFI_PROPERTY_CONFIG_VENC_INTRA_PERIOD 0x2006003
#define HFI_PROPERTY_CONFIG_VENC_MARKLTRFRAME 0x2006009
#define HFI_PROPERTY_CONFIG_VENC_USELTRFRAME 0x200600a
#define HFI_PROPERTY_CONFIG_VENC_SYNC_FRAME_SEQUENCE_HEADER 0x2006008
#define HFI_PROPERTY_CONFIG_VENC_HIER_P_ENH_LAYER 0x200600b

struct hfi_pkt_hdr {
u32 size;
Expand Down Expand Up @@ -455,6 +474,36 @@ struct hfi_framerate {
u32 framerate;
};

struct hfi_intra_refresh {
u32 mode;
u32 mbs;
};

struct hfi_ltr_mode {
u32 mode;
u32 count;
u32 trust_mode;
};

struct hfi_ltr_use {
u32 ref_ltr;
u32 use_constrnt;
u32 frames;
};

struct hfi_ltr_mark {
u32 mark_frame;
};

struct hfi_max_num_b_frames {
u32 max_num_b_frames;
};

struct hfi_intra_period {
u32 pframes;
u32 bframes;
};

struct hfi_event_data {
u32 error;
u32 height;
Expand Down
Loading
Loading