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
95 changes: 95 additions & 0 deletions drivers/media/platform/qcom/iris/iris_ctrls.c
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,16 @@ static enum platform_inst_fw_cap_type iris_get_cap_id(u32 id)
return PROFILE_AV1;
case V4L2_CID_MPEG_VIDEO_AV1_LEVEL:
return LEVEL_AV1;
case V4L2_CID_ROTATE:
return ROTATION;
case V4L2_CID_HFLIP:
return HFLIP;
case V4L2_CID_VFLIP:
return VFLIP;
case V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE:
return IR_TYPE;
case V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD:
return IR_PERIOD;
default:
return INST_FW_CAP_MAX;
}
Expand Down Expand Up @@ -193,6 +203,16 @@ static u32 iris_get_v4l2_id(enum platform_inst_fw_cap_type cap_id)
return V4L2_CID_MPEG_VIDEO_AV1_PROFILE;
case LEVEL_AV1:
return V4L2_CID_MPEG_VIDEO_AV1_LEVEL;
case ROTATION:
return V4L2_CID_ROTATE;
case HFLIP:
return V4L2_CID_HFLIP;
case VFLIP:
return V4L2_CID_VFLIP;
case IR_TYPE:
return V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE;
case IR_PERIOD:
return V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD;
default:
return 0;
}
Expand Down Expand Up @@ -901,6 +921,81 @@ int iris_set_qp_range(struct iris_inst *inst, enum platform_inst_fw_cap_type cap
&range, sizeof(range));
}

int iris_set_rotation(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
{
const struct iris_hfi_command_ops *hfi_ops = inst->core->hfi_ops;
u32 hfi_id = inst->fw_caps[cap_id].hfi_id;
u32 hfi_val;

switch (inst->fw_caps[cap_id].value) {
case 0:
hfi_val = HFI_ROTATION_NONE;
return 0;
case 90:
hfi_val = HFI_ROTATION_90;
break;
case 180:
hfi_val = HFI_ROTATION_180;
break;
case 270:
hfi_val = HFI_ROTATION_270;
break;
default:
return -EINVAL;
}

return hfi_ops->session_set_property(inst, hfi_id,
HFI_HOST_FLAGS_NONE,
iris_get_port_info(inst, cap_id),
HFI_PAYLOAD_U32,
&hfi_val, sizeof(u32));
}

int iris_set_flip(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
{
const struct iris_hfi_command_ops *hfi_ops = inst->core->hfi_ops;
u32 hfi_id = inst->fw_caps[cap_id].hfi_id;
u32 hfi_val = HFI_DISABLE_FLIP;

if (inst->fw_caps[HFLIP].value)
hfi_val |= HFI_HORIZONTAL_FLIP;

if (inst->fw_caps[VFLIP].value)
hfi_val |= HFI_VERTICAL_FLIP;

return hfi_ops->session_set_property(inst, hfi_id,
HFI_HOST_FLAGS_NONE,
iris_get_port_info(inst, cap_id),
HFI_PAYLOAD_U32_ENUM,
&hfi_val, sizeof(u32));
}

int iris_set_ir_period(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
{
const struct iris_hfi_command_ops *hfi_ops = inst->core->hfi_ops;
struct vb2_queue *q = v4l2_m2m_get_dst_vq(inst->m2m_ctx);
u32 ir_period = inst->fw_caps[cap_id].value;
u32 ir_type = 0;

if (inst->fw_caps[IR_TYPE].value ==
V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_RANDOM) {
if (vb2_is_streaming(q))
return 0;
ir_type = HFI_PROP_IR_RANDOM_PERIOD;
} else if (inst->fw_caps[IR_TYPE].value ==
V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_CYCLIC) {
ir_type = HFI_PROP_IR_CYCLIC_PERIOD;
} else {
return -EINVAL;
}

return hfi_ops->session_set_property(inst, ir_type,
HFI_HOST_FLAGS_NONE,
iris_get_port_info(inst, cap_id),
HFI_PAYLOAD_U32,
&ir_period, sizeof(u32));
}

int iris_set_properties(struct iris_inst *inst, u32 plane)
{
const struct iris_hfi_command_ops *hfi_ops = inst->core->hfi_ops;
Expand Down
3 changes: 3 additions & 0 deletions drivers/media/platform/qcom/iris/iris_ctrls.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ int iris_set_min_qp(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_i
int iris_set_max_qp(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_frame_qp(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
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_properties(struct iris_inst *inst, u32 plane);

#endif
56 changes: 43 additions & 13 deletions drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
Original file line number Diff line number Diff line change
Expand Up @@ -170,8 +170,7 @@ static int iris_hfi_gen2_session_set_property(struct iris_inst *inst, u32 packet

static int iris_hfi_gen2_set_raw_resolution(struct iris_inst *inst, u32 plane)
{
u32 resolution = inst->fmt_src->fmt.pix_mp.width << 16 |
inst->fmt_src->fmt.pix_mp.height;
u32 resolution = inst->enc_raw_width << 16 | inst->enc_raw_height;
u32 port = iris_hfi_gen2_get_port(inst, plane);

return iris_hfi_gen2_session_set_property(inst,
Expand All @@ -183,22 +182,36 @@ static int iris_hfi_gen2_set_raw_resolution(struct iris_inst *inst, u32 plane)
sizeof(u32));
}

static inline u32 iris_hfi_get_aligned_resolution(struct iris_inst *inst, u32 width, u32 height)
{
u32 codec_align = inst->codec == V4L2_PIX_FMT_HEVC ? 32 : 16;

return (ALIGN(width, codec_align) << 16 | ALIGN(height, codec_align));
}

static int iris_hfi_gen2_set_bitstream_resolution(struct iris_inst *inst, u32 plane)
{
struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
u32 port = iris_hfi_gen2_get_port(inst, plane);
enum hfi_packet_payload_info payload_type;
u32 resolution, codec_align;
u32 width, height;
u32 resolution;

if (inst->domain == DECODER) {
resolution = inst->fmt_src->fmt.pix_mp.width << 16 |
inst->fmt_src->fmt.pix_mp.height;
width = inst->fmt_src->fmt.pix_mp.width;
height = inst->fmt_src->fmt.pix_mp.height;
resolution = iris_hfi_get_aligned_resolution(inst, width, height);
inst_hfi_gen2->src_subcr_params.bitstream_resolution = resolution;
payload_type = HFI_PAYLOAD_U32;
} else {
codec_align = inst->codec == V4L2_PIX_FMT_HEVC ? 32 : 16;
resolution = ALIGN(inst->fmt_dst->fmt.pix_mp.width, codec_align) << 16 |
ALIGN(inst->fmt_dst->fmt.pix_mp.height, codec_align);
if (is_rotation_90_or_270(inst)) {
width = inst->enc_scale_height;
height = inst->enc_scale_width;
} else {
width = inst->enc_scale_width;
height = inst->enc_scale_height;
}
resolution = iris_hfi_get_aligned_resolution(inst, width, height);
inst_hfi_gen2->dst_subcr_params.bitstream_resolution = resolution;
payload_type = HFI_PAYLOAD_32_PACKED;
}
Expand All @@ -218,7 +231,7 @@ static int iris_hfi_gen2_set_crop_offsets(struct iris_inst *inst, u32 plane)
u32 port = iris_hfi_gen2_get_port(inst, plane);
u32 bottom_offset, right_offset;
u32 left_offset, top_offset;
u32 payload[2];
u32 payload[2], codec_align;

if (inst->domain == DECODER) {
if (V4L2_TYPE_IS_OUTPUT(plane)) {
Expand All @@ -233,10 +246,27 @@ static int iris_hfi_gen2_set_crop_offsets(struct iris_inst *inst, u32 plane)
top_offset = inst->compose.top;
}
} else {
bottom_offset = (inst->fmt_src->fmt.pix_mp.height - inst->crop.height);
right_offset = (inst->fmt_src->fmt.pix_mp.width - inst->crop.width);
left_offset = inst->crop.left;
top_offset = inst->crop.top;
codec_align = inst->codec == V4L2_PIX_FMT_HEVC ? 32 : 16;
if (V4L2_TYPE_IS_OUTPUT(plane)) {
bottom_offset = (inst->enc_raw_height - inst->crop.height);
right_offset = (inst->enc_raw_width - inst->crop.width);
left_offset = inst->crop.left;
top_offset = inst->crop.top;
} else {
if (is_rotation_90_or_270(inst)) {
bottom_offset = (ALIGN(inst->enc_scale_width, codec_align) -
inst->enc_scale_width);
right_offset = (ALIGN(inst->enc_scale_height, codec_align) -
inst->enc_scale_height);
} else {
bottom_offset = (ALIGN(inst->enc_scale_height, codec_align) -
inst->enc_scale_height);
right_offset = (ALIGN(inst->enc_scale_width, codec_align) -
inst->enc_scale_width);
}
left_offset = 0;
top_offset = 0;
}
}

payload[0] = FIELD_PREP(GENMASK(31, 16), left_offset) | top_offset;
Expand Down
19 changes: 19 additions & 0 deletions drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ enum hfi_rate_control {
#define HFI_PROP_QP_PACKED 0x0300012e
#define HFI_PROP_MIN_QP_PACKED 0x0300012f
#define HFI_PROP_MAX_QP_PACKED 0x03000130
#define HFI_PROP_IR_RANDOM_PERIOD 0x03000131
#define HFI_PROP_TOTAL_BITRATE 0x0300013b
#define HFI_PROP_MAX_GOP_FRAMES 0x03000146
#define HFI_PROP_MAX_B_FRAMES 0x03000147
Expand All @@ -83,6 +84,23 @@ enum hfi_seq_header_mode {
};

#define HFI_PROP_SEQ_HEADER_MODE 0x03000149

enum hfi_rotation {
HFI_ROTATION_NONE = 0x00000000,
HFI_ROTATION_90 = 0x00000001,
HFI_ROTATION_180 = 0x00000002,
HFI_ROTATION_270 = 0x00000003,
};

#define HFI_PROP_ROTATION 0x0300014b

enum hfi_flip {
HFI_DISABLE_FLIP = 0x00000000,
HFI_HORIZONTAL_FLIP = 0x00000001,
HFI_VERTICAL_FLIP = 0x00000002,
};

#define HFI_PROP_FLIP 0x0300014c
#define HFI_PROP_SIGNAL_COLOR_INFO 0x03000155
#define HFI_PROP_PICTURE_TYPE 0x03000162
#define HFI_PROP_DEC_DEFAULT_HEADER 0x03000168
Expand All @@ -96,6 +114,7 @@ enum hfi_seq_header_mode {
#define HFI_PROP_AV1_FILM_GRAIN_PRESENT 0x03000180
#define HFI_PROP_AV1_SUPER_BLOCK_ENABLED 0x03000181
#define HFI_PROP_AV1_OP_POINT 0x03000182
#define HFI_PROP_IR_CYCLIC_PERIOD 0x0300017E
#define HFI_PROP_OPB_ENABLE 0x03000184
#define HFI_PROP_AV1_TILE_ROWS_COLUMNS 0x03000187
#define HFI_PROP_AV1_DRAP_CONFIG 0x03000189
Expand Down
2 changes: 2 additions & 0 deletions drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ static u32 iris_hfi_gen2_buf_type_to_driver(struct iris_inst *inst,
return BUF_SCRATCH_2;
case HFI_BUFFER_PERSIST:
return BUF_PERSIST;
case HFI_BUFFER_VPSS:
return BUF_VPSS;
case HFI_BUFFER_PARTIAL_DATA:
return BUF_PARTIAL;
default:
Expand Down
8 changes: 8 additions & 0 deletions drivers/media/platform/qcom/iris/iris_instance.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,10 @@ struct iris_fmt {
* @frame_rate: frame rate of current instance
* @operating_rate: operating rate of current instance
* @hfi_rc_type: rate control type
* @enc_raw_width: source image width for encoder instance
* @enc_raw_height: source image height for encoder instance
* @enc_scale_width: scale width for encoder instance
* @enc_scale_height: scale height for encoder instance
*/

struct iris_inst {
Expand Down Expand Up @@ -108,6 +112,10 @@ struct iris_inst {
u32 frame_rate;
u32 operating_rate;
u32 hfi_rc_type;
u32 enc_raw_width;
u32 enc_raw_height;
u32 enc_scale_width;
u32 enc_scale_height;
};

#endif
5 changes: 5 additions & 0 deletions drivers/media/platform/qcom/iris/iris_platform_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,11 @@ enum platform_inst_fw_cap_type {
P_FRAME_QP_HEVC,
B_FRAME_QP_H264,
B_FRAME_QP_HEVC,
ROTATION,
HFLIP,
VFLIP,
IR_TYPE,
IR_PERIOD,
INST_FW_CAP_MAX,
};

Expand Down
Loading