* [PATCH v2 0/5] media: qcom: iris: encoder feature enhancements
@ 2025-10-31 9:50 Wangao Wang
2025-10-31 9:50 ` [PATCH v2 1/5] media: qcom: iris: Improve format alignment for encoder Wangao Wang
` (5 more replies)
0 siblings, 6 replies; 13+ messages in thread
From: Wangao Wang @ 2025-10-31 9:50 UTC (permalink / raw)
To: Vikash Garodia, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab
Cc: linux-media, linux-arm-msm, linux-kernel, Wangao Wang,
quic_qiweil, quic_renjiang
Hi All,
This patch series introduces several enhancements to the Qualcomm Iris
encoder driver, improving support for V4L2 controls and enabling more
video encoding features.
All patches have been tested with v4l2-compliance, v4l2-ctl and
on QCS8300 for encoder.
Commands used for V4l2-ctl validation:
Scale:
v4l2-ctl --verbose -d /dev/video1 \
--set-fmt-video-out=width=1920,height=1080,pixelformat=NV12 \
--set-selection-output target=crop,width=1920,height=1080 \
--set-fmt-video=width=1280,height=720,pixelformat=H264 \
--stream-mmap --stream-out-mmap \
--stream-from=input_nv12_1080p.yuv \
--stream-to=output/scale_720p_output.h264
Flip:
v4l2-ctl --verbose -d /dev/video1 \
--set-fmt-video-out=width=1920,height=1080,pixelformat=NV12 \
--set-selection-output target=crop,width=1920,height=1080 \
--set-fmt-video=pixelformat=H264 --stream-mmap --stream-out-mmap \
--stream-from=input_nv12_1080p.yuv \
--stream-to=output/vertical_flip.h264 \
--set-ctrl vertical_flip=1
v4l2-ctl --verbose -d /dev/video1 \
--set-fmt-video-out=width=1920,height=1080,pixelformat=NV12 \
--set-selection-output target=crop,width=1920,height=1080 \
--set-fmt-video=pixelformat=H264 --stream-mmap --stream-out-mmap \
--stream-from=input_nv12_1080p.yuv \
--stream-to=output/horizontal_flip.h264 \
--set-ctrl horizontal_flip=1
Rotate:
v4l2-ctl --verbose -d /dev/video1 \
--set-fmt-video-out=width=1920,height=1080,pixelformat=NV12 \
--set-selection-output target=crop,width=1920,height=1080 \
--set-fmt-video=pixelformat=H264 --stream-mmap --stream-out-mmap \
--stream-from=input_nv12_1080p.yuv \
--stream-to=output/rotate90.h264 \
--set-ctrl rotate=90
v4l2-ctl --verbose -d /dev/video1 \
--set-fmt-video-out=width=1920,height=1080,pixelformat=NV12 \
--set-selection-output target=crop,width=1920,height=1080 \
--set-fmt-video=pixelformat=H264 --stream-mmap --stream-out-mmap \
--stream-from=input_nv12_1080p.yuv \
--stream-to=output/rotate180.h264 \
--set-ctrl rotate=180
v4l2-ctl --verbose -d /dev/video1 \
--set-fmt-video-out=width=1920,height=1080,pixelformat=NV12 \
--set-selection-output target=crop,width=1920,height=1080 \
--set-fmt-video=pixelformat=H264 --stream-mmap --stream-out-mmap \
--stream-from=input_nv12_1080p.yuv \
--stream-to=output/rotate270.h264 \
--set-ctrl rotate=270
Intra Refresh:
Testing of this feature requires the use of this application.
https://github.com/quic/v4l-video-test-app
The result of v4l2-compliance on QCS8300:
v4l2-compliance 1.31.0-5378, 64 bits, 64-bit time_t
v4l2-compliance SHA: 2ed8da243dd1 2025-06-30 08:18:40
Compliance test for iris_driver device /dev/video1:
Driver Info:
Driver name : iris_driver
Card type : Iris Encoder
Bus info : platform:aa00000.video-codec
Driver version : 6.17.0
Capabilities : 0x84204000
Video Memory-to-Memory Multiplanar
Streaming
Extended Pix Format
Device Capabilities
Device Caps : 0x04204000
Video Memory-to-Memory Multiplanar
Streaming
Extended Pix Format
Detected Stateful Encoder
Required ioctls:
test VIDIOC_QUERYCAP: OK
test invalid ioctls: OK
Allow for multiple opens:
test second /dev/video1 open: OK
test VIDIOC_QUERYCAP: OK
test VIDIOC_G/S_PRIORITY: OK
test for unlimited opens: OK
Debug ioctls:
test VIDIOC_DBG_G/S_REGISTER: OK (Not Supported)
test VIDIOC_LOG_STATUS: OK (Not Supported)
Input ioctls:
test VIDIOC_G/S_TUNER/ENUM_FREQ_BANDS: OK (Not Supported)
test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
test VIDIOC_S_HW_FREQ_SEEK: OK (Not Supported)
test VIDIOC_ENUMAUDIO: OK (Not Supported)
test VIDIOC_G/S/ENUMINPUT: OK (Not Supported)
test VIDIOC_G/S_AUDIO: OK (Not Supported)
Inputs: 0 Audio Inputs: 0 Tuners: 0
Output ioctls:
test VIDIOC_G/S_MODULATOR: OK (Not Supported)
test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
test VIDIOC_ENUMAUDOUT: OK (Not Supported)
test VIDIOC_G/S/ENUMOUTPUT: OK (Not Supported)
test VIDIOC_G/S_AUDOUT: OK (Not Supported)
Outputs: 0 Audio Outputs: 0 Modulators: 0
Input/Output configuration ioctls:
test VIDIOC_ENUM/G/S/QUERY_STD: OK (Not Supported)
test VIDIOC_ENUM/G/S/QUERY_DV_TIMINGS: OK (Not Supported)
test VIDIOC_DV_TIMINGS_CAP: OK (Not Supported)
test VIDIOC_G/S_EDID: OK (Not Supported)
Control ioctls:
test VIDIOC_QUERY_EXT_CTRL/QUERYMENU: OK
test VIDIOC_QUERYCTRL: OK
test VIDIOC_G/S_CTRL: OK
test VIDIOC_G/S/TRY_EXT_CTRLS: OK
test VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: OK
test VIDIOC_G/S_JPEGCOMP: OK (Not Supported)
Standard Controls: 43 Private Controls: 0
Format ioctls:
test VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: OK
test VIDIOC_G/S_PARM: OK
test VIDIOC_G_FBUF: OK (Not Supported)
test VIDIOC_G_FMT: OK
test VIDIOC_TRY_FMT: OK
test VIDIOC_S_FMT: OK
test VIDIOC_G_SLICED_VBI_CAP: OK (Not Supported)
test Cropping: OK
test Composing: OK (Not Supported)
test Scaling: OK (Not Supported)
Codec ioctls:
test VIDIOC_(TRY_)ENCODER_CMD: OK
test VIDIOC_G_ENC_INDEX: OK (Not Supported)
test VIDIOC_(TRY_)DECODER_CMD: OK (Not Supported)
Buffer ioctls:
test VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: OK
test CREATE_BUFS maximum buffers: OK
test VIDIOC_REMOVE_BUFS: OK
test VIDIOC_EXPBUF: OK
test Requests: OK (Not Supported)
test blocking wait: OK
Test input 0:
Streaming ioctls:
test read/write: OK (Not Supported)
Video Capture Multiplanar: Captured 61 buffers
test MMAP (select, REQBUFS): OK
Video Capture Multiplanar: Captured 61 buffers
test MMAP (epoll, REQBUFS): OK
Video Capture Multiplanar: Captured 61 buffers
test MMAP (select, CREATE_BUFS): OK
Video Capture Multiplanar: Captured 61 buffers
test MMAP (epoll, CREATE_BUFS): OK
test USERPTR (select): OK (Not Supported)
test DMABUF: Cannot test, specify --expbuf-device
Total for iris_driver device /dev/video1: 54, Succeeded: 54, Failed: 0, Warnings: 0
Signed-off-by: Wangao Wang <wangao.wang@oss.qualcomm.com>
---
Changes in v2:
- Split ‘improve alignment’ and ‘enable scale’ into two patches.(bod)
- HFI_PROP_RAW_RESOLUTION uses the actual YUV
resolution.(Vikash,Dikshita)
- Rename enc_bitstream_* to enc_scale_*.(Dikshita)
- Add comment for scale case.(Dikshita)
- Make the resolution assignment into an inline function.(bod)
- Shorten the long chain that checks whether scaling is enabled.(bod)
- Correct the handling of rotation in crop offsets.(Dikshita)
- Move VPSS buffer things into scale patch.(Dikshita)
- Link to v1: https://lore.kernel.org/r/20251015092708.3703-1-wangao.wang@oss.qualcomm.com
---
Wangao Wang (5):
media: qcom: iris: Improve format alignment for encoder
media: qcom: iris: Add scale support for encoder
media: qcom: iris: Add rotation support for encoder
media: qcom: iris: Add flip support for encoder
media: qcom: iris: Add intra refresh support for encoder
drivers/media/platform/qcom/iris/iris_ctrls.c | 94 ++++++++++++++++++++++
drivers/media/platform/qcom/iris/iris_ctrls.h | 3 +
.../platform/qcom/iris/iris_hfi_gen2_command.c | 51 +++++++++---
.../platform/qcom/iris/iris_hfi_gen2_defines.h | 19 +++++
.../platform/qcom/iris/iris_hfi_gen2_response.c | 2 +
drivers/media/platform/qcom/iris/iris_instance.h | 8 ++
.../platform/qcom/iris/iris_platform_common.h | 5 ++
.../media/platform/qcom/iris/iris_platform_gen2.c | 63 +++++++++++++++
drivers/media/platform/qcom/iris/iris_utils.c | 6 ++
drivers/media/platform/qcom/iris/iris_utils.h | 1 +
drivers/media/platform/qcom/iris/iris_venc.c | 33 +++++++-
drivers/media/platform/qcom/iris/iris_vpu_buffer.c | 55 ++++++++-----
12 files changed, 302 insertions(+), 38 deletions(-)
---
base-commit: 13863a59e410cab46d26751941980dc8f088b9b3
change-id: 20251017-iris_encoder_enhancements-f2d1967b29f9
Best regards,
--
Wangao Wang <wangao.wang@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 1/5] media: qcom: iris: Improve format alignment for encoder
2025-10-31 9:50 [PATCH v2 0/5] media: qcom: iris: encoder feature enhancements Wangao Wang
@ 2025-10-31 9:50 ` Wangao Wang
2025-11-03 10:54 ` kernel test robot
2025-11-04 5:13 ` Dikshita Agarwal
2025-10-31 9:50 ` [PATCH v2 2/5] media: qcom: iris: Add scale support " Wangao Wang
` (4 subsequent siblings)
5 siblings, 2 replies; 13+ messages in thread
From: Wangao Wang @ 2025-10-31 9:50 UTC (permalink / raw)
To: Vikash Garodia, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab
Cc: linux-media, linux-arm-msm, linux-kernel, Wangao Wang,
quic_qiweil, quic_renjiang
Add members enc_raw_width, enc_raw_height to the struct iris_inst to
support codec alignment requirements.
HFI_PROP_CROP_OFFSETS is used to inform the firmware of the region
of interest, rather than indicating that the codec supports crop.
Therefore, the crop handling has been corrected accordingly.
Signed-off-by: Wangao Wang <wangao.wang@oss.qualcomm.com>
---
.../media/platform/qcom/iris/iris_hfi_gen2_command.c | 18 ++++++++++++------
drivers/media/platform/qcom/iris/iris_instance.h | 4 ++++
drivers/media/platform/qcom/iris/iris_venc.c | 10 +++++++---
3 files changed, 23 insertions(+), 9 deletions(-)
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
index 4ce71a14250832440099e4cf3835b4aedfb749e8..ada9b4d298ef10ac47a573061369828a1e150f85 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
@@ -168,8 +168,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,
@@ -216,8 +215,11 @@ 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 codec_align;
u32 payload[2];
+ codec_align = inst->codec == V4L2_PIX_FMT_HEVC ? 32 : 16;
+
if (inst->domain == DECODER) {
if (V4L2_TYPE_IS_OUTPUT(plane)) {
bottom_offset = (inst->fmt_src->fmt.pix_mp.height - inst->crop.height);
@@ -231,10 +233,14 @@ 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;
+ if (V4L2_TYPE_IS_CAPTURE(plane)) {
+ bottom_offset = (ALIGN(inst->enc_raw_height, codec_align) -
+ inst->enc_raw_height);
+ right_offset = (ALIGN(inst->enc_raw_width, codec_align) -
+ inst->enc_raw_width);
+ left_offset = inst->crop.left;
+ top_offset = inst->crop.top;
+ }
}
payload[0] = FIELD_PREP(GENMASK(31, 16), left_offset) | top_offset;
diff --git a/drivers/media/platform/qcom/iris/iris_instance.h b/drivers/media/platform/qcom/iris/iris_instance.h
index 5982d7adefeab80905478b32cddba7bd4651a691..fbae1662947df73bb3d10b7892839fa1076b7e61 100644
--- a/drivers/media/platform/qcom/iris/iris_instance.h
+++ b/drivers/media/platform/qcom/iris/iris_instance.h
@@ -64,6 +64,8 @@ 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: raw image width for encoder instance
+ * @enc_raw_height: raw image height for encoder instance
*/
struct iris_inst {
@@ -102,6 +104,8 @@ struct iris_inst {
u32 frame_rate;
u32 operating_rate;
u32 hfi_rc_type;
+ u32 enc_raw_width;
+ u32 enc_raw_height;
};
#endif
diff --git a/drivers/media/platform/qcom/iris/iris_venc.c b/drivers/media/platform/qcom/iris/iris_venc.c
index 099bd5ed4ae0294725860305254c4cad1ec88d7e..6adadc89e360a6e4bebe1f839d38892990e10fa2 100644
--- a/drivers/media/platform/qcom/iris/iris_venc.c
+++ b/drivers/media/platform/qcom/iris/iris_venc.c
@@ -68,6 +68,9 @@ int iris_venc_inst_init(struct iris_inst *inst)
inst->operating_rate = DEFAULT_FPS;
inst->frame_rate = DEFAULT_FPS;
+ inst->enc_raw_width = DEFAULT_WIDTH;
+ inst->enc_raw_height = DEFAULT_HEIGHT;
+
memcpy(&inst->fw_caps[0], &core->inst_fw_caps_enc[0],
INST_FW_CAP_MAX * sizeof(struct platform_inst_fw_cap));
@@ -249,6 +252,9 @@ static int iris_venc_s_fmt_input(struct iris_inst *inst, struct v4l2_format *f)
inst->buffers[BUF_INPUT].min_count = iris_vpu_buf_count(inst, BUF_INPUT);
inst->buffers[BUF_INPUT].size = fmt->fmt.pix_mp.plane_fmt[0].sizeimage;
+ inst->enc_raw_width = f->fmt.pix_mp.width;
+ inst->enc_raw_height = f->fmt.pix_mp.height;
+
if (f->fmt.pix_mp.width != inst->crop.width ||
f->fmt.pix_mp.height != inst->crop.height) {
inst->crop.top = 0;
@@ -329,9 +335,7 @@ int iris_venc_s_selection(struct iris_inst *inst, struct v4l2_selection *s)
inst->crop.top = s->r.top;
inst->crop.width = s->r.width;
inst->crop.height = s->r.height;
- inst->fmt_dst->fmt.pix_mp.width = inst->crop.width;
- inst->fmt_dst->fmt.pix_mp.height = inst->crop.height;
- return iris_venc_s_fmt_output(inst, inst->fmt_dst);
+ return 0;
default:
return -EINVAL;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 2/5] media: qcom: iris: Add scale support for encoder
2025-10-31 9:50 [PATCH v2 0/5] media: qcom: iris: encoder feature enhancements Wangao Wang
2025-10-31 9:50 ` [PATCH v2 1/5] media: qcom: iris: Improve format alignment for encoder Wangao Wang
@ 2025-10-31 9:50 ` Wangao Wang
2025-10-31 10:54 ` Neil Armstrong
2025-10-31 9:50 ` [PATCH v2 3/5] media: qcom: iris: Add rotation " Wangao Wang
` (3 subsequent siblings)
5 siblings, 1 reply; 13+ messages in thread
From: Wangao Wang @ 2025-10-31 9:50 UTC (permalink / raw)
To: Vikash Garodia, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab
Cc: linux-media, linux-arm-msm, linux-kernel, Wangao Wang,
quic_qiweil, quic_renjiang
Add members enc_scale_width, enc_scale_height to the struct iris_inst to
support scale requirements.
Add output width and height settings in iris_venc_s_fmt_output to
enable scaling functionality.
Add VPSS buffer to platform data, which the scale function requires.
Signed-off-by: Wangao Wang <wangao.wang@oss.qualcomm.com>
---
.../platform/qcom/iris/iris_hfi_gen2_command.c | 4 ++--
.../platform/qcom/iris/iris_hfi_gen2_response.c | 2 ++
drivers/media/platform/qcom/iris/iris_instance.h | 4 ++++
.../media/platform/qcom/iris/iris_platform_gen2.c | 12 +++++++++++
drivers/media/platform/qcom/iris/iris_venc.c | 23 +++++++++++++++++++++-
drivers/media/platform/qcom/iris/iris_vpu_buffer.c | 9 +++++----
6 files changed, 47 insertions(+), 7 deletions(-)
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
index ada9b4d298ef10ac47a573061369828a1e150f85..6ec217268a2bc1f939fa33820c1ae19adaad2e96 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
@@ -194,8 +194,8 @@ static int iris_hfi_gen2_set_bitstream_resolution(struct iris_inst *inst, u32 pl
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);
+ resolution = ALIGN(inst->enc_scale_width, codec_align) << 16 |
+ ALIGN(inst->enc_scale_height, codec_align);
inst_hfi_gen2->dst_subcr_params.bitstream_resolution = resolution;
payload_type = HFI_PAYLOAD_32_PACKED;
}
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
index 2f1f118eae4f6462ab1aa1d16844b34e6e699f1e..dc3e606b6ab429a1d15536fa8316afb1e384d674 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
@@ -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;
default:
return 0;
}
diff --git a/drivers/media/platform/qcom/iris/iris_instance.h b/drivers/media/platform/qcom/iris/iris_instance.h
index fbae1662947df73bb3d10b7892839fa1076b7e61..5ff01dd7177fc919d0cc69553fadede5801592a1 100644
--- a/drivers/media/platform/qcom/iris/iris_instance.h
+++ b/drivers/media/platform/qcom/iris/iris_instance.h
@@ -66,6 +66,8 @@ struct iris_fmt {
* @hfi_rc_type: rate control type
* @enc_raw_width: raw image width for encoder instance
* @enc_raw_height: raw image height for encoder instance
+ * @enc_scale_width: scale width for encoder instance
+ * @enc_scale_height: scale height for encoder instance
*/
struct iris_inst {
@@ -106,6 +108,8 @@ struct iris_inst {
u32 hfi_rc_type;
u32 enc_raw_width;
u32 enc_raw_height;
+ u32 enc_scale_width;
+ u32 enc_scale_height;
};
#endif
diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen2.c b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
index 36d69cc73986b74534a2912524c8553970fd862e..d3306189d902a1f42666010468c9e4e4316a66e1 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_gen2.c
+++ b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
@@ -729,6 +729,10 @@ static const u32 sm8550_dec_op_int_buf_tbl[] = {
BUF_DPB,
};
+static const u32 sm8550_enc_ip_int_buf_tbl[] = {
+ BUF_VPSS,
+};
+
static const u32 sm8550_enc_op_int_buf_tbl[] = {
BUF_BIN,
BUF_COMV,
@@ -816,6 +820,8 @@ struct iris_platform_data sm8550_data = {
.dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
.dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_op_int_buf_tbl),
+ .enc_ip_int_buf_tbl = sm8550_enc_ip_int_buf_tbl,
+ .enc_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_ip_int_buf_tbl),
.enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
.enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
};
@@ -908,6 +914,8 @@ struct iris_platform_data sm8650_data = {
.dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
.dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_op_int_buf_tbl),
+ .enc_ip_int_buf_tbl = sm8550_enc_ip_int_buf_tbl,
+ .enc_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_ip_int_buf_tbl),
.enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
.enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
};
@@ -989,6 +997,8 @@ struct iris_platform_data sm8750_data = {
.dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
.dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_op_int_buf_tbl),
+ .enc_ip_int_buf_tbl = sm8550_enc_ip_int_buf_tbl,
+ .enc_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_ip_int_buf_tbl),
.enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
.enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
};
@@ -1077,6 +1087,8 @@ struct iris_platform_data qcs8300_data = {
.dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
.dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_op_int_buf_tbl),
+ .enc_ip_int_buf_tbl = sm8550_enc_ip_int_buf_tbl,
+ .enc_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_ip_int_buf_tbl),
.enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
.enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
};
diff --git a/drivers/media/platform/qcom/iris/iris_venc.c b/drivers/media/platform/qcom/iris/iris_venc.c
index 6adadc89e360a6e4bebe1f839d38892990e10fa2..17a2e59e4ba8ff650895dde9fe569da39ef88093 100644
--- a/drivers/media/platform/qcom/iris/iris_venc.c
+++ b/drivers/media/platform/qcom/iris/iris_venc.c
@@ -70,6 +70,8 @@ int iris_venc_inst_init(struct iris_inst *inst)
inst->enc_raw_width = DEFAULT_WIDTH;
inst->enc_raw_height = DEFAULT_HEIGHT;
+ inst->enc_scale_width = DEFAULT_WIDTH;
+ inst->enc_scale_height = DEFAULT_HEIGHT;
memcpy(&inst->fw_caps[0], &core->inst_fw_caps_enc[0],
INST_FW_CAP_MAX * sizeof(struct platform_inst_fw_cap));
@@ -188,15 +190,32 @@ int iris_venc_try_fmt(struct iris_inst *inst, struct v4l2_format *f)
static int iris_venc_s_fmt_output(struct iris_inst *inst, struct v4l2_format *f)
{
+ const struct iris_fmt *venc_fmt;
struct v4l2_format *fmt;
+ u32 codec_align;
iris_venc_try_fmt(inst, f);
- if (!(find_format(inst, f->fmt.pix_mp.pixelformat, f->type)))
+ venc_fmt = find_format(inst, f->fmt.pix_mp.pixelformat, f->type);
+ if (!venc_fmt)
return -EINVAL;
+ codec_align = venc_fmt->pixfmt == V4L2_PIX_FMT_HEVC ? 32 : 16;
+
fmt = inst->fmt_dst;
fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ /*
+ * If output format size != input format size,
+ * it is considered a scaling case,
+ * and the scaled size needs to be saved.
+ */
+ if (f->fmt.pix_mp.width != fmt->fmt.pix_mp.width ||
+ f->fmt.pix_mp.height != fmt->fmt.pix_mp.height) {
+ fmt->fmt.pix_mp.width = ALIGN(f->fmt.pix_mp.width, codec_align);
+ fmt->fmt.pix_mp.height = ALIGN(f->fmt.pix_mp.height, codec_align);
+ inst->enc_scale_width = f->fmt.pix_mp.width;
+ inst->enc_scale_height = f->fmt.pix_mp.height;
+ }
fmt->fmt.pix_mp.num_planes = 1;
fmt->fmt.pix_mp.plane_fmt[0].bytesperline = 0;
fmt->fmt.pix_mp.plane_fmt[0].sizeimage = iris_get_buffer_size(inst, BUF_OUTPUT);
@@ -254,6 +273,8 @@ static int iris_venc_s_fmt_input(struct iris_inst *inst, struct v4l2_format *f)
inst->enc_raw_width = f->fmt.pix_mp.width;
inst->enc_raw_height = f->fmt.pix_mp.height;
+ inst->enc_scale_width = f->fmt.pix_mp.width;
+ inst->enc_scale_height = f->fmt.pix_mp.height;
if (f->fmt.pix_mp.width != inst->crop.width ||
f->fmt.pix_mp.height != inst->crop.height) {
diff --git a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
index 4463be05ce165adef6b152eb0c155d2e6a7b3c36..db5adadd1b39c06bc41ae6f1b3d2f924b3ebf150 100644
--- a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
+++ b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
@@ -1131,10 +1131,11 @@ static u32 iris_vpu_enc_arp_size(struct iris_inst *inst)
inline bool is_scaling_enabled(struct iris_inst *inst)
{
- return inst->crop.left != inst->compose.left ||
- inst->crop.top != inst->compose.top ||
- inst->crop.width != inst->compose.width ||
- inst->crop.height != inst->compose.height;
+ struct v4l2_pix_format_mplane *dst_fmt = &inst->fmt_dst->fmt.pix_mp;
+ struct v4l2_pix_format_mplane *src_fmt = &inst->fmt_src->fmt.pix_mp;
+
+ return dst_fmt->width != src_fmt->width ||
+ dst_fmt->height != src_fmt->height;
}
static inline
--
2.43.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 3/5] media: qcom: iris: Add rotation support for encoder
2025-10-31 9:50 [PATCH v2 0/5] media: qcom: iris: encoder feature enhancements Wangao Wang
2025-10-31 9:50 ` [PATCH v2 1/5] media: qcom: iris: Improve format alignment for encoder Wangao Wang
2025-10-31 9:50 ` [PATCH v2 2/5] media: qcom: iris: Add scale support " Wangao Wang
@ 2025-10-31 9:50 ` Wangao Wang
2025-10-31 11:30 ` Neil Armstrong
2025-10-31 9:50 ` [PATCH v2 4/5] media: qcom: iris: Add flip " Wangao Wang
` (2 subsequent siblings)
5 siblings, 1 reply; 13+ messages in thread
From: Wangao Wang @ 2025-10-31 9:50 UTC (permalink / raw)
To: Vikash Garodia, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab
Cc: linux-media, linux-arm-msm, linux-kernel, Wangao Wang,
quic_qiweil, quic_renjiang
Add rotation control for encoder, enabling V4L2_CID_ROTATE and handling
90/180/270 degree rotation.
Signed-off-by: Wangao Wang <wangao.wang@oss.qualcomm.com>
---
drivers/media/platform/qcom/iris/iris_ctrls.c | 34 ++++++++++++++++
drivers/media/platform/qcom/iris/iris_ctrls.h | 1 +
.../platform/qcom/iris/iris_hfi_gen2_command.c | 41 ++++++++++++++-----
.../platform/qcom/iris/iris_hfi_gen2_defines.h | 9 +++++
.../platform/qcom/iris/iris_platform_common.h | 1 +
.../media/platform/qcom/iris/iris_platform_gen2.c | 10 +++++
drivers/media/platform/qcom/iris/iris_utils.c | 6 +++
drivers/media/platform/qcom/iris/iris_utils.h | 1 +
drivers/media/platform/qcom/iris/iris_vpu_buffer.c | 46 +++++++++++++---------
9 files changed, 121 insertions(+), 28 deletions(-)
diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/platform/qcom/iris/iris_ctrls.c
index 754a5ad718bc37630bb861012301df7a2e7342a1..00949c207ddb0203e51df359214bf23c3d8265d0 100644
--- a/drivers/media/platform/qcom/iris/iris_ctrls.c
+++ b/drivers/media/platform/qcom/iris/iris_ctrls.c
@@ -98,6 +98,8 @@ static enum platform_inst_fw_cap_type iris_get_cap_id(u32 id)
return B_FRAME_QP_H264;
case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP:
return B_FRAME_QP_HEVC;
+ case V4L2_CID_ROTATE:
+ return ROTATION;
default:
return INST_FW_CAP_MAX;
}
@@ -185,6 +187,8 @@ static u32 iris_get_v4l2_id(enum platform_inst_fw_cap_type cap_id)
return V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP;
case B_FRAME_QP_HEVC:
return V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP;
+ case ROTATION:
+ return V4L2_CID_ROTATE;
default:
return 0;
}
@@ -883,6 +887,36 @@ 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_properties(struct iris_inst *inst, u32 plane)
{
const struct iris_hfi_command_ops *hfi_ops = inst->core->hfi_ops;
diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.h b/drivers/media/platform/qcom/iris/iris_ctrls.h
index 30af333cc4941e737eb1ae83a6944b4192896e23..3ea0a00c7587a516f19bb7307a0eb9a60c856ab0 100644
--- a/drivers/media/platform/qcom/iris/iris_ctrls.h
+++ b/drivers/media/platform/qcom/iris/iris_ctrls.h
@@ -32,6 +32,7 @@ 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_properties(struct iris_inst *inst, u32 plane);
#endif
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
index 6ec217268a2bc1f939fa33820c1ae19adaad2e96..4e88239351bb5adf1ed3260ad4d3ba2fe1df7555 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
@@ -180,22 +180,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->enc_scale_width, codec_align) << 16 |
- ALIGN(inst->enc_scale_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;
}
@@ -234,10 +248,17 @@ static int iris_hfi_gen2_set_crop_offsets(struct iris_inst *inst, u32 plane)
}
} else {
if (V4L2_TYPE_IS_CAPTURE(plane)) {
- bottom_offset = (ALIGN(inst->enc_raw_height, codec_align) -
- inst->enc_raw_height);
- right_offset = (ALIGN(inst->enc_raw_width, codec_align) -
- inst->enc_raw_width);
+ 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 = inst->crop.left;
top_offset = inst->crop.top;
}
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
index aa1f795f5626c1f76a32dd650302633877ce67be..4edcce7faf5e2f74bfecfdbf574391d5b1c9cca5 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
@@ -83,6 +83,15 @@ 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
#define HFI_PROP_SIGNAL_COLOR_INFO 0x03000155
#define HFI_PROP_PICTURE_TYPE 0x03000162
#define HFI_PROP_DEC_DEFAULT_HEADER 0x03000168
diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h
index 58d05e0a112eed25faea027a34c719c89d6c3897..9a4232b1c64eea6ce909e1e311769dd958b84c6e 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_common.h
+++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
@@ -140,6 +140,7 @@ enum platform_inst_fw_cap_type {
P_FRAME_QP_HEVC,
B_FRAME_QP_H264,
B_FRAME_QP_HEVC,
+ ROTATION,
INST_FW_CAP_MAX,
};
diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen2.c b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
index d3306189d902a1f42666010468c9e4e4316a66e1..c1f83e179d441c45df8d6487dc87e137e482fb63 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_gen2.c
+++ b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
@@ -588,6 +588,16 @@ static struct platform_inst_fw_cap inst_fw_cap_sm8550_enc[] = {
.flags = CAP_FLAG_OUTPUT_PORT,
.set = iris_set_u32,
},
+ {
+ .cap_id = ROTATION,
+ .min = 0,
+ .max = 270,
+ .step_or_mask = 90,
+ .value = 0,
+ .hfi_id = HFI_PROP_ROTATION,
+ .flags = CAP_FLAG_OUTPUT_PORT,
+ .set = iris_set_rotation,
+ },
};
static struct platform_inst_caps platform_inst_cap_sm8550 = {
diff --git a/drivers/media/platform/qcom/iris/iris_utils.c b/drivers/media/platform/qcom/iris/iris_utils.c
index 85c70a62b1fd2c409fc18b28f64771cb0097a7fd..97465dfbdec1497b1111b9069fd56dff286b2d0e 100644
--- a/drivers/media/platform/qcom/iris/iris_utils.c
+++ b/drivers/media/platform/qcom/iris/iris_utils.c
@@ -124,3 +124,9 @@ int iris_check_core_mbps(struct iris_inst *inst)
return 0;
}
+
+bool is_rotation_90_or_270(struct iris_inst *inst)
+{
+ return inst->fw_caps[ROTATION].value == 90 ||
+ inst->fw_caps[ROTATION].value == 270;
+}
diff --git a/drivers/media/platform/qcom/iris/iris_utils.h b/drivers/media/platform/qcom/iris/iris_utils.h
index 75740181122f5bdf93d64d3f43b3a26a9fe97919..b5705d156431a5cf59d645ce988bc3a3c9b9c5e2 100644
--- a/drivers/media/platform/qcom/iris/iris_utils.h
+++ b/drivers/media/platform/qcom/iris/iris_utils.h
@@ -51,5 +51,6 @@ void iris_helper_buffers_done(struct iris_inst *inst, unsigned int type,
int iris_wait_for_session_response(struct iris_inst *inst, bool is_flush);
int iris_check_core_mbpf(struct iris_inst *inst);
int iris_check_core_mbps(struct iris_inst *inst);
+bool is_rotation_90_or_270(struct iris_inst *inst);
#endif
diff --git a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
index db5adadd1b39c06bc41ae6f1b3d2f924b3ebf150..be8b8588a39fb02d8dd9f1f1f6765ec76dc7d08f 100644
--- a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
+++ b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
@@ -556,6 +556,22 @@ static u32 iris_vpu_dec_scratch1_size(struct iris_inst *inst)
iris_vpu_dec_line_size(inst);
}
+static inline u32 iris_vpu_enc_get_bitstream_width(struct iris_inst *inst)
+{
+ if (is_rotation_90_or_270(inst))
+ return inst->fmt_dst->fmt.pix_mp.height;
+ else
+ return inst->fmt_dst->fmt.pix_mp.width;
+}
+
+static inline u32 iris_vpu_enc_get_bitstream_height(struct iris_inst *inst)
+{
+ if (is_rotation_90_or_270(inst))
+ return inst->fmt_dst->fmt.pix_mp.width;
+ else
+ return inst->fmt_dst->fmt.pix_mp.height;
+}
+
static inline u32 size_bin_bitstream_enc(u32 width, u32 height,
u32 rc_type)
{
@@ -638,10 +654,9 @@ static inline u32 hfi_buffer_bin_enc(u32 width, u32 height,
static u32 iris_vpu_enc_bin_size(struct iris_inst *inst)
{
u32 num_vpp_pipes = inst->core->iris_platform_data->num_vpp_pipe;
+ u32 height = iris_vpu_enc_get_bitstream_height(inst);
+ u32 width = iris_vpu_enc_get_bitstream_width(inst);
u32 stage = inst->fw_caps[STAGE].value;
- struct v4l2_format *f = inst->fmt_dst;
- u32 height = f->fmt.pix_mp.height;
- u32 width = f->fmt.pix_mp.width;
u32 lcu_size;
if (inst->codec == V4L2_PIX_FMT_HEVC)
@@ -676,9 +691,8 @@ u32 hfi_buffer_comv_enc(u32 frame_width, u32 frame_height, u32 lcu_size,
static u32 iris_vpu_enc_comv_size(struct iris_inst *inst)
{
- struct v4l2_format *f = inst->fmt_dst;
- u32 height = f->fmt.pix_mp.height;
- u32 width = f->fmt.pix_mp.width;
+ u32 height = iris_vpu_enc_get_bitstream_height(inst);
+ u32 width = iris_vpu_enc_get_bitstream_width(inst);
u32 num_recon = 1;
u32 lcu_size = 16;
@@ -958,9 +972,8 @@ u32 hfi_buffer_non_comv_enc(u32 frame_width, u32 frame_height,
static u32 iris_vpu_enc_non_comv_size(struct iris_inst *inst)
{
u32 num_vpp_pipes = inst->core->iris_platform_data->num_vpp_pipe;
- struct v4l2_format *f = inst->fmt_dst;
- u32 height = f->fmt.pix_mp.height;
- u32 width = f->fmt.pix_mp.width;
+ u32 height = iris_vpu_enc_get_bitstream_height(inst);
+ u32 width = iris_vpu_enc_get_bitstream_width(inst);
u32 lcu_size = 16;
if (inst->codec == V4L2_PIX_FMT_HEVC) {
@@ -1051,9 +1064,8 @@ u32 hfi_buffer_line_enc_vpu33(u32 frame_width, u32 frame_height, bool is_ten_bit
static u32 iris_vpu_enc_line_size(struct iris_inst *inst)
{
u32 num_vpp_pipes = inst->core->iris_platform_data->num_vpp_pipe;
- struct v4l2_format *f = inst->fmt_dst;
- u32 height = f->fmt.pix_mp.height;
- u32 width = f->fmt.pix_mp.width;
+ u32 height = iris_vpu_enc_get_bitstream_height(inst);
+ u32 width = iris_vpu_enc_get_bitstream_width(inst);
u32 lcu_size = 16;
if (inst->codec == V4L2_PIX_FMT_HEVC) {
@@ -1292,9 +1304,8 @@ static inline u32 hfi_buffer_scratch1_enc(u32 frame_width, u32 frame_height,
static u32 iris_vpu_enc_scratch1_size(struct iris_inst *inst)
{
u32 num_vpp_pipes = inst->core->iris_platform_data->num_vpp_pipe;
- struct v4l2_format *f = inst->fmt_dst;
- u32 frame_height = f->fmt.pix_mp.height;
- u32 frame_width = f->fmt.pix_mp.width;
+ u32 frame_height = iris_vpu_enc_get_bitstream_height(inst);
+ u32 frame_width = iris_vpu_enc_get_bitstream_width(inst);
u32 num_ref = 1;
u32 lcu_size;
bool is_h265;
@@ -1390,9 +1401,8 @@ static inline u32 hfi_buffer_scratch2_enc(u32 frame_width, u32 frame_height,
static u32 iris_vpu_enc_scratch2_size(struct iris_inst *inst)
{
- struct v4l2_format *f = inst->fmt_dst;
- u32 frame_width = f->fmt.pix_mp.width;
- u32 frame_height = f->fmt.pix_mp.height;
+ u32 frame_height = iris_vpu_enc_get_bitstream_height(inst);
+ u32 frame_width = iris_vpu_enc_get_bitstream_width(inst);
u32 num_ref = 1;
return hfi_buffer_scratch2_enc(frame_width, frame_height, num_ref,
--
2.43.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 4/5] media: qcom: iris: Add flip support for encoder
2025-10-31 9:50 [PATCH v2 0/5] media: qcom: iris: encoder feature enhancements Wangao Wang
` (2 preceding siblings ...)
2025-10-31 9:50 ` [PATCH v2 3/5] media: qcom: iris: Add rotation " Wangao Wang
@ 2025-10-31 9:50 ` Wangao Wang
2025-10-31 10:54 ` Neil Armstrong
2025-10-31 9:50 ` [PATCH v2 5/5] media: qcom: iris: Add intra refresh " Wangao Wang
2025-10-31 10:54 ` [PATCH v2 0/5] media: qcom: iris: encoder feature enhancements Neil Armstrong
5 siblings, 1 reply; 13+ messages in thread
From: Wangao Wang @ 2025-10-31 9:50 UTC (permalink / raw)
To: Vikash Garodia, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab
Cc: linux-media, linux-arm-msm, linux-kernel, Wangao Wang,
quic_qiweil, quic_renjiang
Add support for V4L2_CID_HFLIP and V4L2_CID_VFLIP controls in encoder.
Signed-off-by: Wangao Wang <wangao.wang@oss.qualcomm.com>
---
drivers/media/platform/qcom/iris/iris_ctrls.c | 27 ++++++++++++++++++++++
drivers/media/platform/qcom/iris/iris_ctrls.h | 1 +
.../platform/qcom/iris/iris_hfi_gen2_defines.h | 8 +++++++
.../platform/qcom/iris/iris_platform_common.h | 2 ++
.../media/platform/qcom/iris/iris_platform_gen2.c | 22 ++++++++++++++++++
5 files changed, 60 insertions(+)
diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/platform/qcom/iris/iris_ctrls.c
index 00949c207ddb0203e51df359214bf23c3d8265d0..8f74c12f2f41f23d75424819c707aff61ea61b33 100644
--- a/drivers/media/platform/qcom/iris/iris_ctrls.c
+++ b/drivers/media/platform/qcom/iris/iris_ctrls.c
@@ -100,6 +100,10 @@ static enum platform_inst_fw_cap_type iris_get_cap_id(u32 id)
return B_FRAME_QP_HEVC;
case V4L2_CID_ROTATE:
return ROTATION;
+ case V4L2_CID_HFLIP:
+ return HFLIP;
+ case V4L2_CID_VFLIP:
+ return VFLIP;
default:
return INST_FW_CAP_MAX;
}
@@ -189,6 +193,10 @@ static u32 iris_get_v4l2_id(enum platform_inst_fw_cap_type cap_id)
return V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP;
case ROTATION:
return V4L2_CID_ROTATE;
+ case HFLIP:
+ return V4L2_CID_HFLIP;
+ case VFLIP:
+ return V4L2_CID_VFLIP;
default:
return 0;
}
@@ -917,6 +925,25 @@ int iris_set_rotation(struct iris_inst *inst, enum platform_inst_fw_cap_type cap
&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_properties(struct iris_inst *inst, u32 plane)
{
const struct iris_hfi_command_ops *hfi_ops = inst->core->hfi_ops;
diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.h b/drivers/media/platform/qcom/iris/iris_ctrls.h
index 3ea0a00c7587a516f19bb7307a0eb9a60c856ab0..355a592049f3fcc715a1b9df44b4d1398b052653 100644
--- a/drivers/media/platform/qcom/iris/iris_ctrls.h
+++ b/drivers/media/platform/qcom/iris/iris_ctrls.h
@@ -33,6 +33,7 @@ int iris_set_max_qp(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_i
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_properties(struct iris_inst *inst, u32 plane);
#endif
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
index 4edcce7faf5e2f74bfecfdbf574391d5b1c9cca5..0f92468dca91cbb2ca9b451ebce255180066b3a4 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
@@ -92,6 +92,14 @@ enum hfi_rotation {
};
#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
diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h
index 9a4232b1c64eea6ce909e1e311769dd958b84c6e..284d6bde6d6bcdf70016646d1c92e6ae7f067efc 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_common.h
+++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
@@ -141,6 +141,8 @@ enum platform_inst_fw_cap_type {
B_FRAME_QP_H264,
B_FRAME_QP_HEVC,
ROTATION,
+ HFLIP,
+ VFLIP,
INST_FW_CAP_MAX,
};
diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen2.c b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
index c1f83e179d441c45df8d6487dc87e137e482fb63..e74bdd00a4bb2f457ec9352e0acaebc820dae235 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_gen2.c
+++ b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
@@ -598,6 +598,28 @@ static struct platform_inst_fw_cap inst_fw_cap_sm8550_enc[] = {
.flags = CAP_FLAG_OUTPUT_PORT,
.set = iris_set_rotation,
},
+ {
+ .cap_id = HFLIP,
+ .min = 0,
+ .max = 1,
+ .step_or_mask = 1,
+ .value = 0,
+ .hfi_id = HFI_PROP_FLIP,
+ .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
+ CAP_FLAG_DYNAMIC_ALLOWED,
+ .set = iris_set_flip,
+ },
+ {
+ .cap_id = VFLIP,
+ .min = 0,
+ .max = 1,
+ .step_or_mask = 1,
+ .value = 0,
+ .hfi_id = HFI_PROP_FLIP,
+ .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
+ CAP_FLAG_DYNAMIC_ALLOWED,
+ .set = iris_set_flip,
+ },
};
static struct platform_inst_caps platform_inst_cap_sm8550 = {
--
2.43.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 5/5] media: qcom: iris: Add intra refresh support for encoder
2025-10-31 9:50 [PATCH v2 0/5] media: qcom: iris: encoder feature enhancements Wangao Wang
` (3 preceding siblings ...)
2025-10-31 9:50 ` [PATCH v2 4/5] media: qcom: iris: Add flip " Wangao Wang
@ 2025-10-31 9:50 ` Wangao Wang
2025-10-31 10:54 ` [PATCH v2 0/5] media: qcom: iris: encoder feature enhancements Neil Armstrong
5 siblings, 0 replies; 13+ messages in thread
From: Wangao Wang @ 2025-10-31 9:50 UTC (permalink / raw)
To: Vikash Garodia, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab
Cc: linux-media, linux-arm-msm, linux-kernel, Wangao Wang,
quic_qiweil, quic_renjiang
Add support for V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD and
V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE controls.
Signed-off-by: Wangao Wang <wangao.wang@oss.qualcomm.com>
---
drivers/media/platform/qcom/iris/iris_ctrls.c | 33 ++++++++++++++++++++++
drivers/media/platform/qcom/iris/iris_ctrls.h | 1 +
.../platform/qcom/iris/iris_hfi_gen2_defines.h | 2 ++
.../platform/qcom/iris/iris_platform_common.h | 2 ++
.../media/platform/qcom/iris/iris_platform_gen2.c | 19 +++++++++++++
5 files changed, 57 insertions(+)
diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/platform/qcom/iris/iris_ctrls.c
index 8f74c12f2f41f23d75424819c707aff61ea61b33..14891569247318aaa7b2009b737f077d1cb45095 100644
--- a/drivers/media/platform/qcom/iris/iris_ctrls.c
+++ b/drivers/media/platform/qcom/iris/iris_ctrls.c
@@ -104,6 +104,10 @@ static enum platform_inst_fw_cap_type iris_get_cap_id(u32 id)
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;
}
@@ -197,6 +201,10 @@ static u32 iris_get_v4l2_id(enum platform_inst_fw_cap_type cap_id)
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;
}
@@ -944,6 +952,31 @@ int iris_set_flip(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
&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;
diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.h b/drivers/media/platform/qcom/iris/iris_ctrls.h
index 355a592049f3fcc715a1b9df44b4d1398b052653..9518803577bc39f5c1339a49878dd0c3e8f510ad 100644
--- a/drivers/media/platform/qcom/iris/iris_ctrls.h
+++ b/drivers/media/platform/qcom/iris/iris_ctrls.h
@@ -34,6 +34,7 @@ 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_properties(struct iris_inst *inst, u32 plane);
#endif
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
index 0f92468dca91cbb2ca9b451ebce255180066b3a4..9e8fdddf2aef439e7f133c9bb2fafa6d95062b02 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
@@ -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
@@ -108,6 +109,7 @@ enum hfi_flip {
#define HFI_PROP_BUFFER_MARK 0x0300016c
#define HFI_PROP_RAW_RESOLUTION 0x03000178
#define HFI_PROP_TOTAL_PEAK_BITRATE 0x0300017C
+#define HFI_PROP_IR_CYCLIC_PERIOD 0x0300017E
#define HFI_PROP_COMV_BUFFER_COUNT 0x03000193
#define HFI_PROP_END 0x03FFFFFF
diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h
index 284d6bde6d6bcdf70016646d1c92e6ae7f067efc..30b98e769ad34c2b63dd63e7714bfeaa5b4f162c 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_common.h
+++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
@@ -143,6 +143,8 @@ enum platform_inst_fw_cap_type {
ROTATION,
HFLIP,
VFLIP,
+ IR_TYPE,
+ IR_PERIOD,
INST_FW_CAP_MAX,
};
diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen2.c b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
index e74bdd00a4bb2f457ec9352e0acaebc820dae235..ce54aac766e2bf76fa2de64c884724ca63f05dcb 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_gen2.c
+++ b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
@@ -620,6 +620,25 @@ static struct platform_inst_fw_cap inst_fw_cap_sm8550_enc[] = {
CAP_FLAG_DYNAMIC_ALLOWED,
.set = iris_set_flip,
},
+ {
+ .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 = INT_MAX,
+ .step_or_mask = 1,
+ .value = 0,
+ .flags = CAP_FLAG_OUTPUT_PORT |
+ CAP_FLAG_DYNAMIC_ALLOWED,
+ .set = iris_set_ir_period,
+ },
};
static struct platform_inst_caps platform_inst_cap_sm8550 = {
--
2.43.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v2 0/5] media: qcom: iris: encoder feature enhancements
2025-10-31 9:50 [PATCH v2 0/5] media: qcom: iris: encoder feature enhancements Wangao Wang
` (4 preceding siblings ...)
2025-10-31 9:50 ` [PATCH v2 5/5] media: qcom: iris: Add intra refresh " Wangao Wang
@ 2025-10-31 10:54 ` Neil Armstrong
5 siblings, 0 replies; 13+ messages in thread
From: Neil Armstrong @ 2025-10-31 10:54 UTC (permalink / raw)
To: Wangao Wang, Vikash Garodia, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab
Cc: linux-media, linux-arm-msm, linux-kernel, quic_qiweil,
quic_renjiang
Hi,
On 10/31/25 10:50, Wangao Wang wrote:
> Hi All,
>
> This patch series introduces several enhancements to the Qualcomm Iris
> encoder driver, improving support for V4L2 controls and enabling more
> video encoding features.
>
> All patches have been tested with v4l2-compliance, v4l2-ctl and
> on QCS8300 for encoder.
>
> Commands used for V4l2-ctl validation:
>
> Scale:
> v4l2-ctl --verbose -d /dev/video1 \
> --set-fmt-video-out=width=1920,height=1080,pixelformat=NV12 \
> --set-selection-output target=crop,width=1920,height=1080 \
> --set-fmt-video=width=1280,height=720,pixelformat=H264 \
> --stream-mmap --stream-out-mmap \
> --stream-from=input_nv12_1080p.yuv \
> --stream-to=output/scale_720p_output.h264
>
> Flip:
> v4l2-ctl --verbose -d /dev/video1 \
> --set-fmt-video-out=width=1920,height=1080,pixelformat=NV12 \
> --set-selection-output target=crop,width=1920,height=1080 \
> --set-fmt-video=pixelformat=H264 --stream-mmap --stream-out-mmap \
> --stream-from=input_nv12_1080p.yuv \
> --stream-to=output/vertical_flip.h264 \
> --set-ctrl vertical_flip=1
>
> v4l2-ctl --verbose -d /dev/video1 \
> --set-fmt-video-out=width=1920,height=1080,pixelformat=NV12 \
> --set-selection-output target=crop,width=1920,height=1080 \
> --set-fmt-video=pixelformat=H264 --stream-mmap --stream-out-mmap \
> --stream-from=input_nv12_1080p.yuv \
> --stream-to=output/horizontal_flip.h264 \
> --set-ctrl horizontal_flip=1
>
> Rotate:
> v4l2-ctl --verbose -d /dev/video1 \
> --set-fmt-video-out=width=1920,height=1080,pixelformat=NV12 \
> --set-selection-output target=crop,width=1920,height=1080 \
> --set-fmt-video=pixelformat=H264 --stream-mmap --stream-out-mmap \
> --stream-from=input_nv12_1080p.yuv \
> --stream-to=output/rotate90.h264 \
> --set-ctrl rotate=90
>
> v4l2-ctl --verbose -d /dev/video1 \
> --set-fmt-video-out=width=1920,height=1080,pixelformat=NV12 \
> --set-selection-output target=crop,width=1920,height=1080 \
> --set-fmt-video=pixelformat=H264 --stream-mmap --stream-out-mmap \
> --stream-from=input_nv12_1080p.yuv \
> --stream-to=output/rotate180.h264 \
> --set-ctrl rotate=180
>
> v4l2-ctl --verbose -d /dev/video1 \
> --set-fmt-video-out=width=1920,height=1080,pixelformat=NV12 \
> --set-selection-output target=crop,width=1920,height=1080 \
> --set-fmt-video=pixelformat=H264 --stream-mmap --stream-out-mmap \
> --stream-from=input_nv12_1080p.yuv \
> --stream-to=output/rotate270.h264 \
> --set-ctrl rotate=270
I've run this serie on SM8650-HDK, and all test works (+ visually confirmed)
except the rotate90 & rotate270 which fails with:
[ 113.494611] qcom-iris aa00000.video-codec: session error received 0x1000005: unknown
printed on dmesg.
Do you know if those operations are supposed to work on the sm8650 hw & fw ?
Neil
<snip>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 2/5] media: qcom: iris: Add scale support for encoder
2025-10-31 9:50 ` [PATCH v2 2/5] media: qcom: iris: Add scale support " Wangao Wang
@ 2025-10-31 10:54 ` Neil Armstrong
0 siblings, 0 replies; 13+ messages in thread
From: Neil Armstrong @ 2025-10-31 10:54 UTC (permalink / raw)
To: Wangao Wang, Vikash Garodia, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab
Cc: linux-media, linux-arm-msm, linux-kernel, quic_qiweil,
quic_renjiang
On 10/31/25 10:50, Wangao Wang wrote:
> Add members enc_scale_width, enc_scale_height to the struct iris_inst to
> support scale requirements.
>
> Add output width and height settings in iris_venc_s_fmt_output to
> enable scaling functionality.
>
> Add VPSS buffer to platform data, which the scale function requires.
>
> Signed-off-by: Wangao Wang <wangao.wang@oss.qualcomm.com>
> ---
> .../platform/qcom/iris/iris_hfi_gen2_command.c | 4 ++--
> .../platform/qcom/iris/iris_hfi_gen2_response.c | 2 ++
> drivers/media/platform/qcom/iris/iris_instance.h | 4 ++++
> .../media/platform/qcom/iris/iris_platform_gen2.c | 12 +++++++++++
> drivers/media/platform/qcom/iris/iris_venc.c | 23 +++++++++++++++++++++-
> drivers/media/platform/qcom/iris/iris_vpu_buffer.c | 9 +++++----
> 6 files changed, 47 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> index ada9b4d298ef10ac47a573061369828a1e150f85..6ec217268a2bc1f939fa33820c1ae19adaad2e96 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> @@ -194,8 +194,8 @@ static int iris_hfi_gen2_set_bitstream_resolution(struct iris_inst *inst, u32 pl
> 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);
> + resolution = ALIGN(inst->enc_scale_width, codec_align) << 16 |
> + ALIGN(inst->enc_scale_height, codec_align);
> inst_hfi_gen2->dst_subcr_params.bitstream_resolution = resolution;
> payload_type = HFI_PAYLOAD_32_PACKED;
> }
> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
> index 2f1f118eae4f6462ab1aa1d16844b34e6e699f1e..dc3e606b6ab429a1d15536fa8316afb1e384d674 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
> @@ -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;
> default:
> return 0;
> }
> diff --git a/drivers/media/platform/qcom/iris/iris_instance.h b/drivers/media/platform/qcom/iris/iris_instance.h
> index fbae1662947df73bb3d10b7892839fa1076b7e61..5ff01dd7177fc919d0cc69553fadede5801592a1 100644
> --- a/drivers/media/platform/qcom/iris/iris_instance.h
> +++ b/drivers/media/platform/qcom/iris/iris_instance.h
> @@ -66,6 +66,8 @@ struct iris_fmt {
> * @hfi_rc_type: rate control type
> * @enc_raw_width: raw image width for encoder instance
> * @enc_raw_height: raw image height for encoder instance
> + * @enc_scale_width: scale width for encoder instance
> + * @enc_scale_height: scale height for encoder instance
> */
>
> struct iris_inst {
> @@ -106,6 +108,8 @@ struct iris_inst {
> u32 hfi_rc_type;
> u32 enc_raw_width;
> u32 enc_raw_height;
> + u32 enc_scale_width;
> + u32 enc_scale_height;
> };
>
> #endif
> diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen2.c b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> index 36d69cc73986b74534a2912524c8553970fd862e..d3306189d902a1f42666010468c9e4e4316a66e1 100644
> --- a/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> +++ b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> @@ -729,6 +729,10 @@ static const u32 sm8550_dec_op_int_buf_tbl[] = {
> BUF_DPB,
> };
>
> +static const u32 sm8550_enc_ip_int_buf_tbl[] = {
> + BUF_VPSS,
> +};
> +
> static const u32 sm8550_enc_op_int_buf_tbl[] = {
> BUF_BIN,
> BUF_COMV,
> @@ -816,6 +820,8 @@ struct iris_platform_data sm8550_data = {
> .dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
> .dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_op_int_buf_tbl),
>
> + .enc_ip_int_buf_tbl = sm8550_enc_ip_int_buf_tbl,
> + .enc_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_ip_int_buf_tbl),
> .enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
> .enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
> };
> @@ -908,6 +914,8 @@ struct iris_platform_data sm8650_data = {
> .dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
> .dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_op_int_buf_tbl),
>
> + .enc_ip_int_buf_tbl = sm8550_enc_ip_int_buf_tbl,
> + .enc_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_ip_int_buf_tbl),
> .enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
> .enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
> };
> @@ -989,6 +997,8 @@ struct iris_platform_data sm8750_data = {
> .dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
> .dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_op_int_buf_tbl),
>
> + .enc_ip_int_buf_tbl = sm8550_enc_ip_int_buf_tbl,
> + .enc_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_ip_int_buf_tbl),
> .enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
> .enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
> };
> @@ -1077,6 +1087,8 @@ struct iris_platform_data qcs8300_data = {
> .dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
> .dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_op_int_buf_tbl),
>
> + .enc_ip_int_buf_tbl = sm8550_enc_ip_int_buf_tbl,
> + .enc_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_ip_int_buf_tbl),
> .enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
> .enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
> };
> diff --git a/drivers/media/platform/qcom/iris/iris_venc.c b/drivers/media/platform/qcom/iris/iris_venc.c
> index 6adadc89e360a6e4bebe1f839d38892990e10fa2..17a2e59e4ba8ff650895dde9fe569da39ef88093 100644
> --- a/drivers/media/platform/qcom/iris/iris_venc.c
> +++ b/drivers/media/platform/qcom/iris/iris_venc.c
> @@ -70,6 +70,8 @@ int iris_venc_inst_init(struct iris_inst *inst)
>
> inst->enc_raw_width = DEFAULT_WIDTH;
> inst->enc_raw_height = DEFAULT_HEIGHT;
> + inst->enc_scale_width = DEFAULT_WIDTH;
> + inst->enc_scale_height = DEFAULT_HEIGHT;
>
> memcpy(&inst->fw_caps[0], &core->inst_fw_caps_enc[0],
> INST_FW_CAP_MAX * sizeof(struct platform_inst_fw_cap));
> @@ -188,15 +190,32 @@ int iris_venc_try_fmt(struct iris_inst *inst, struct v4l2_format *f)
>
> static int iris_venc_s_fmt_output(struct iris_inst *inst, struct v4l2_format *f)
> {
> + const struct iris_fmt *venc_fmt;
> struct v4l2_format *fmt;
> + u32 codec_align;
>
> iris_venc_try_fmt(inst, f);
>
> - if (!(find_format(inst, f->fmt.pix_mp.pixelformat, f->type)))
> + venc_fmt = find_format(inst, f->fmt.pix_mp.pixelformat, f->type);
> + if (!venc_fmt)
> return -EINVAL;
>
> + codec_align = venc_fmt->pixfmt == V4L2_PIX_FMT_HEVC ? 32 : 16;
> +
> fmt = inst->fmt_dst;
> fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
> + /*
> + * If output format size != input format size,
> + * it is considered a scaling case,
> + * and the scaled size needs to be saved.
> + */
> + if (f->fmt.pix_mp.width != fmt->fmt.pix_mp.width ||
> + f->fmt.pix_mp.height != fmt->fmt.pix_mp.height) {
> + fmt->fmt.pix_mp.width = ALIGN(f->fmt.pix_mp.width, codec_align);
> + fmt->fmt.pix_mp.height = ALIGN(f->fmt.pix_mp.height, codec_align);
> + inst->enc_scale_width = f->fmt.pix_mp.width;
> + inst->enc_scale_height = f->fmt.pix_mp.height;
> + }
> fmt->fmt.pix_mp.num_planes = 1;
> fmt->fmt.pix_mp.plane_fmt[0].bytesperline = 0;
> fmt->fmt.pix_mp.plane_fmt[0].sizeimage = iris_get_buffer_size(inst, BUF_OUTPUT);
> @@ -254,6 +273,8 @@ static int iris_venc_s_fmt_input(struct iris_inst *inst, struct v4l2_format *f)
>
> inst->enc_raw_width = f->fmt.pix_mp.width;
> inst->enc_raw_height = f->fmt.pix_mp.height;
> + inst->enc_scale_width = f->fmt.pix_mp.width;
> + inst->enc_scale_height = f->fmt.pix_mp.height;
>
> if (f->fmt.pix_mp.width != inst->crop.width ||
> f->fmt.pix_mp.height != inst->crop.height) {
> diff --git a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
> index 4463be05ce165adef6b152eb0c155d2e6a7b3c36..db5adadd1b39c06bc41ae6f1b3d2f924b3ebf150 100644
> --- a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
> +++ b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
> @@ -1131,10 +1131,11 @@ static u32 iris_vpu_enc_arp_size(struct iris_inst *inst)
>
> inline bool is_scaling_enabled(struct iris_inst *inst)
> {
> - return inst->crop.left != inst->compose.left ||
> - inst->crop.top != inst->compose.top ||
> - inst->crop.width != inst->compose.width ||
> - inst->crop.height != inst->compose.height;
> + struct v4l2_pix_format_mplane *dst_fmt = &inst->fmt_dst->fmt.pix_mp;
> + struct v4l2_pix_format_mplane *src_fmt = &inst->fmt_src->fmt.pix_mp;
> +
> + return dst_fmt->width != src_fmt->width ||
> + dst_fmt->height != src_fmt->height;
> }
>
> static inline
>
Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8650-HDK
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 4/5] media: qcom: iris: Add flip support for encoder
2025-10-31 9:50 ` [PATCH v2 4/5] media: qcom: iris: Add flip " Wangao Wang
@ 2025-10-31 10:54 ` Neil Armstrong
0 siblings, 0 replies; 13+ messages in thread
From: Neil Armstrong @ 2025-10-31 10:54 UTC (permalink / raw)
To: Wangao Wang, Vikash Garodia, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab
Cc: linux-media, linux-arm-msm, linux-kernel, quic_qiweil,
quic_renjiang
On 10/31/25 10:50, Wangao Wang wrote:
> Add support for V4L2_CID_HFLIP and V4L2_CID_VFLIP controls in encoder.
>
> Signed-off-by: Wangao Wang <wangao.wang@oss.qualcomm.com>
> ---
> drivers/media/platform/qcom/iris/iris_ctrls.c | 27 ++++++++++++++++++++++
> drivers/media/platform/qcom/iris/iris_ctrls.h | 1 +
> .../platform/qcom/iris/iris_hfi_gen2_defines.h | 8 +++++++
> .../platform/qcom/iris/iris_platform_common.h | 2 ++
> .../media/platform/qcom/iris/iris_platform_gen2.c | 22 ++++++++++++++++++
> 5 files changed, 60 insertions(+)
>
> diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/platform/qcom/iris/iris_ctrls.c
> index 00949c207ddb0203e51df359214bf23c3d8265d0..8f74c12f2f41f23d75424819c707aff61ea61b33 100644
> --- a/drivers/media/platform/qcom/iris/iris_ctrls.c
> +++ b/drivers/media/platform/qcom/iris/iris_ctrls.c
> @@ -100,6 +100,10 @@ static enum platform_inst_fw_cap_type iris_get_cap_id(u32 id)
> return B_FRAME_QP_HEVC;
> case V4L2_CID_ROTATE:
> return ROTATION;
> + case V4L2_CID_HFLIP:
> + return HFLIP;
> + case V4L2_CID_VFLIP:
> + return VFLIP;
> default:
> return INST_FW_CAP_MAX;
> }
> @@ -189,6 +193,10 @@ static u32 iris_get_v4l2_id(enum platform_inst_fw_cap_type cap_id)
> return V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP;
> case ROTATION:
> return V4L2_CID_ROTATE;
> + case HFLIP:
> + return V4L2_CID_HFLIP;
> + case VFLIP:
> + return V4L2_CID_VFLIP;
> default:
> return 0;
> }
> @@ -917,6 +925,25 @@ int iris_set_rotation(struct iris_inst *inst, enum platform_inst_fw_cap_type cap
> &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_properties(struct iris_inst *inst, u32 plane)
> {
> const struct iris_hfi_command_ops *hfi_ops = inst->core->hfi_ops;
> diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.h b/drivers/media/platform/qcom/iris/iris_ctrls.h
> index 3ea0a00c7587a516f19bb7307a0eb9a60c856ab0..355a592049f3fcc715a1b9df44b4d1398b052653 100644
> --- a/drivers/media/platform/qcom/iris/iris_ctrls.h
> +++ b/drivers/media/platform/qcom/iris/iris_ctrls.h
> @@ -33,6 +33,7 @@ int iris_set_max_qp(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_i
> 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_properties(struct iris_inst *inst, u32 plane);
>
> #endif
> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
> index 4edcce7faf5e2f74bfecfdbf574391d5b1c9cca5..0f92468dca91cbb2ca9b451ebce255180066b3a4 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
> @@ -92,6 +92,14 @@ enum hfi_rotation {
> };
>
> #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
> diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h
> index 9a4232b1c64eea6ce909e1e311769dd958b84c6e..284d6bde6d6bcdf70016646d1c92e6ae7f067efc 100644
> --- a/drivers/media/platform/qcom/iris/iris_platform_common.h
> +++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
> @@ -141,6 +141,8 @@ enum platform_inst_fw_cap_type {
> B_FRAME_QP_H264,
> B_FRAME_QP_HEVC,
> ROTATION,
> + HFLIP,
> + VFLIP,
> INST_FW_CAP_MAX,
> };
>
> diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen2.c b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> index c1f83e179d441c45df8d6487dc87e137e482fb63..e74bdd00a4bb2f457ec9352e0acaebc820dae235 100644
> --- a/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> +++ b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> @@ -598,6 +598,28 @@ static struct platform_inst_fw_cap inst_fw_cap_sm8550_enc[] = {
> .flags = CAP_FLAG_OUTPUT_PORT,
> .set = iris_set_rotation,
> },
> + {
> + .cap_id = HFLIP,
> + .min = 0,
> + .max = 1,
> + .step_or_mask = 1,
> + .value = 0,
> + .hfi_id = HFI_PROP_FLIP,
> + .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
> + CAP_FLAG_DYNAMIC_ALLOWED,
> + .set = iris_set_flip,
> + },
> + {
> + .cap_id = VFLIP,
> + .min = 0,
> + .max = 1,
> + .step_or_mask = 1,
> + .value = 0,
> + .hfi_id = HFI_PROP_FLIP,
> + .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
> + CAP_FLAG_DYNAMIC_ALLOWED,
> + .set = iris_set_flip,
> + },
> };
>
> static struct platform_inst_caps platform_inst_cap_sm8550 = {
>
Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8650-HDK
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 3/5] media: qcom: iris: Add rotation support for encoder
2025-10-31 9:50 ` [PATCH v2 3/5] media: qcom: iris: Add rotation " Wangao Wang
@ 2025-10-31 11:30 ` Neil Armstrong
2025-11-04 7:48 ` Wangao Wang
0 siblings, 1 reply; 13+ messages in thread
From: Neil Armstrong @ 2025-10-31 11:30 UTC (permalink / raw)
To: Wangao Wang, Vikash Garodia, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab
Cc: linux-media, linux-arm-msm, linux-kernel, quic_qiweil,
quic_renjiang
On 10/31/25 10:50, Wangao Wang wrote:
> Add rotation control for encoder, enabling V4L2_CID_ROTATE and handling
> 90/180/270 degree rotation.
>
> Signed-off-by: Wangao Wang <wangao.wang@oss.qualcomm.com>
> ---
> drivers/media/platform/qcom/iris/iris_ctrls.c | 34 ++++++++++++++++
> drivers/media/platform/qcom/iris/iris_ctrls.h | 1 +
> .../platform/qcom/iris/iris_hfi_gen2_command.c | 41 ++++++++++++++-----
> .../platform/qcom/iris/iris_hfi_gen2_defines.h | 9 +++++
> .../platform/qcom/iris/iris_platform_common.h | 1 +
> .../media/platform/qcom/iris/iris_platform_gen2.c | 10 +++++
> drivers/media/platform/qcom/iris/iris_utils.c | 6 +++
> drivers/media/platform/qcom/iris/iris_utils.h | 1 +
> drivers/media/platform/qcom/iris/iris_vpu_buffer.c | 46 +++++++++++++---------
> 9 files changed, 121 insertions(+), 28 deletions(-)
>
<snip>
>
> if (inst->codec == V4L2_PIX_FMT_HEVC) {
> @@ -1051,9 +1064,8 @@ u32 hfi_buffer_line_enc_vpu33(u32 frame_width, u32 frame_height, bool is_ten_bit
> static u32 iris_vpu_enc_line_size(struct iris_inst *inst)
> {
> u32 num_vpp_pipes = inst->core->iris_platform_data->num_vpp_pipe;
> - struct v4l2_format *f = inst->fmt_dst;
> - u32 height = f->fmt.pix_mp.height;
> - u32 width = f->fmt.pix_mp.width;
> + u32 height = iris_vpu_enc_get_bitstream_height(inst);
> + u32 width = iris_vpu_enc_get_bitstream_width(inst);
I found the issue with SM8650, you did not update the vppu33 variant of iris_vpu_enc_line_size.
With this:
============================><=============================
diff --git a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
index be8b8588a39f..4a4fbcbfdb46 100644
--- a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
+++ b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
@@ -1082,8 +1082,8 @@ static u32 iris_vpu33_enc_line_size(struct iris_inst *inst)
{
u32 num_vpp_pipes = inst->core->iris_platform_data->num_vpp_pipe;
struct v4l2_format *f = inst->fmt_dst;
- u32 height = f->fmt.pix_mp.height;
- u32 width = f->fmt.pix_mp.width;
+ u32 height = iris_vpu_enc_get_bitstream_height(inst);
+ u32 width = iris_vpu_enc_get_bitstream_width(inst);
u32 lcu_size = 16;
if (inst->codec == V4L2_PIX_FMT_HEVC) {
============================><=============================
Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8650-HDK
Neil
<snip>
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v2 1/5] media: qcom: iris: Improve format alignment for encoder
2025-10-31 9:50 ` [PATCH v2 1/5] media: qcom: iris: Improve format alignment for encoder Wangao Wang
@ 2025-11-03 10:54 ` kernel test robot
2025-11-04 5:13 ` Dikshita Agarwal
1 sibling, 0 replies; 13+ messages in thread
From: kernel test robot @ 2025-11-03 10:54 UTC (permalink / raw)
To: Wangao Wang, Vikash Garodia, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab
Cc: llvm, oe-kbuild-all, linux-media, linux-arm-msm, linux-kernel,
Wangao Wang, quic_qiweil, quic_renjiang
Hi Wangao,
kernel test robot noticed the following build warnings:
[auto build test WARNING on 13863a59e410cab46d26751941980dc8f088b9b3]
url: https://github.com/intel-lab-lkp/linux/commits/Wangao-Wang/media-qcom-iris-Improve-format-alignment-for-encoder/20251031-175803
base: 13863a59e410cab46d26751941980dc8f088b9b3
patch link: https://lore.kernel.org/r/20251031-iris_encoder_enhancements-v2-1-319cd75cbb45%40oss.qualcomm.com
patch subject: [PATCH v2 1/5] media: qcom: iris: Improve format alignment for encoder
config: riscv-allmodconfig (https://download.01.org/0day-ci/archive/20251103/202511031813.c8c7mkXF-lkp@intel.com/config)
compiler: clang version 22.0.0git (https://github.com/llvm/llvm-project d2625a438020ad35330cda29c3def102c1687b1b)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251103/202511031813.c8c7mkXF-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202511031813.c8c7mkXF-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c:236:7: warning: variable 'left_offset' is used uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized]
236 | if (V4L2_TYPE_IS_CAPTURE(plane)) {
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
include/uapi/linux/videodev2.h:182:2: note: expanded from macro 'V4L2_TYPE_IS_CAPTURE'
182 | (V4L2_TYPE_IS_VALID(type) && !V4L2_TYPE_IS_OUTPUT(type))
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c:246:43: note: uninitialized use occurs here
246 | payload[0] = FIELD_PREP(GENMASK(31, 16), left_offset) | top_offset;
| ^~~~~~~~~~~
drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c:236:3: note: remove the 'if' if its condition is always true
236 | if (V4L2_TYPE_IS_CAPTURE(plane)) {
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c:236:7: warning: variable 'left_offset' is used uninitialized whenever '&&' condition is false [-Wsometimes-uninitialized]
236 | if (V4L2_TYPE_IS_CAPTURE(plane)) {
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
include/uapi/linux/videodev2.h:182:3: note: expanded from macro 'V4L2_TYPE_IS_CAPTURE'
182 | (V4L2_TYPE_IS_VALID(type) && !V4L2_TYPE_IS_OUTPUT(type))
| ^~~~~~~~~~~~~~~~~~~~~~~~
include/uapi/linux/videodev2.h:165:2: note: expanded from macro 'V4L2_TYPE_IS_VALID'
165 | ((type) >= V4L2_BUF_TYPE_VIDEO_CAPTURE &&\
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
166 | (type) <= V4L2_BUF_TYPE_META_OUTPUT)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c:246:43: note: uninitialized use occurs here
246 | payload[0] = FIELD_PREP(GENMASK(31, 16), left_offset) | top_offset;
| ^~~~~~~~~~~
drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c:236:7: note: remove the '&&' if its condition is always true
236 | if (V4L2_TYPE_IS_CAPTURE(plane)) {
| ^
include/uapi/linux/videodev2.h:182:3: note: expanded from macro 'V4L2_TYPE_IS_CAPTURE'
182 | (V4L2_TYPE_IS_VALID(type) && !V4L2_TYPE_IS_OUTPUT(type))
| ^
include/uapi/linux/videodev2.h:165:2: note: expanded from macro 'V4L2_TYPE_IS_VALID'
165 | ((type) >= V4L2_BUF_TYPE_VIDEO_CAPTURE &&\
| ^
>> drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c:236:7: warning: variable 'left_offset' is used uninitialized whenever '&&' condition is false [-Wsometimes-uninitialized]
236 | if (V4L2_TYPE_IS_CAPTURE(plane)) {
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
include/uapi/linux/videodev2.h:182:3: note: expanded from macro 'V4L2_TYPE_IS_CAPTURE'
182 | (V4L2_TYPE_IS_VALID(type) && !V4L2_TYPE_IS_OUTPUT(type))
| ^~~~~~~~~~~~~~~~~~~~~~~~
include/uapi/linux/videodev2.h:165:3: note: expanded from macro 'V4L2_TYPE_IS_VALID'
165 | ((type) >= V4L2_BUF_TYPE_VIDEO_CAPTURE &&\
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c:246:43: note: uninitialized use occurs here
246 | payload[0] = FIELD_PREP(GENMASK(31, 16), left_offset) | top_offset;
| ^~~~~~~~~~~
drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c:236:7: note: remove the '&&' if its condition is always true
236 | if (V4L2_TYPE_IS_CAPTURE(plane)) {
| ^
include/uapi/linux/videodev2.h:182:3: note: expanded from macro 'V4L2_TYPE_IS_CAPTURE'
182 | (V4L2_TYPE_IS_VALID(type) && !V4L2_TYPE_IS_OUTPUT(type))
| ^
include/uapi/linux/videodev2.h:165:3: note: expanded from macro 'V4L2_TYPE_IS_VALID'
165 | ((type) >= V4L2_BUF_TYPE_VIDEO_CAPTURE &&\
| ^
drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c:217:17: note: initialize the variable 'left_offset' to silence this warning
217 | u32 left_offset, top_offset;
| ^
| = 0
3 warnings generated.
vim +236 drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
211
212 static int iris_hfi_gen2_set_crop_offsets(struct iris_inst *inst, u32 plane)
213 {
214 struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
215 u32 port = iris_hfi_gen2_get_port(inst, plane);
216 u32 bottom_offset, right_offset;
217 u32 left_offset, top_offset;
218 u32 codec_align;
219 u32 payload[2];
220
221 codec_align = inst->codec == V4L2_PIX_FMT_HEVC ? 32 : 16;
222
223 if (inst->domain == DECODER) {
224 if (V4L2_TYPE_IS_OUTPUT(plane)) {
225 bottom_offset = (inst->fmt_src->fmt.pix_mp.height - inst->crop.height);
226 right_offset = (inst->fmt_src->fmt.pix_mp.width - inst->crop.width);
227 left_offset = inst->crop.left;
228 top_offset = inst->crop.top;
229 } else {
230 bottom_offset = (inst->fmt_dst->fmt.pix_mp.height - inst->compose.height);
231 right_offset = (inst->fmt_dst->fmt.pix_mp.width - inst->compose.width);
232 left_offset = inst->compose.left;
233 top_offset = inst->compose.top;
234 }
235 } else {
> 236 if (V4L2_TYPE_IS_CAPTURE(plane)) {
237 bottom_offset = (ALIGN(inst->enc_raw_height, codec_align) -
238 inst->enc_raw_height);
239 right_offset = (ALIGN(inst->enc_raw_width, codec_align) -
240 inst->enc_raw_width);
241 left_offset = inst->crop.left;
242 top_offset = inst->crop.top;
243 }
244 }
245
246 payload[0] = FIELD_PREP(GENMASK(31, 16), left_offset) | top_offset;
247 payload[1] = FIELD_PREP(GENMASK(31, 16), right_offset) | bottom_offset;
248 inst_hfi_gen2->src_subcr_params.crop_offsets[0] = payload[0];
249 inst_hfi_gen2->src_subcr_params.crop_offsets[1] = payload[1];
250
251 return iris_hfi_gen2_session_set_property(inst,
252 HFI_PROP_CROP_OFFSETS,
253 HFI_HOST_FLAGS_NONE,
254 port,
255 HFI_PAYLOAD_64_PACKED,
256 &payload,
257 sizeof(u64));
258 }
259
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 1/5] media: qcom: iris: Improve format alignment for encoder
2025-10-31 9:50 ` [PATCH v2 1/5] media: qcom: iris: Improve format alignment for encoder Wangao Wang
2025-11-03 10:54 ` kernel test robot
@ 2025-11-04 5:13 ` Dikshita Agarwal
1 sibling, 0 replies; 13+ messages in thread
From: Dikshita Agarwal @ 2025-11-04 5:13 UTC (permalink / raw)
To: Wangao Wang, Vikash Garodia, Abhinav Kumar, Bryan O'Donoghue,
Mauro Carvalho Chehab
Cc: linux-media, linux-arm-msm, linux-kernel, quic_qiweil,
quic_renjiang
On 10/31/2025 3:20 PM, Wangao Wang wrote:
> Add members enc_raw_width, enc_raw_height to the struct iris_inst to
> support codec alignment requirements.
>
> HFI_PROP_CROP_OFFSETS is used to inform the firmware of the region
> of interest, rather than indicating that the codec supports crop.
> Therefore, the crop handling has been corrected accordingly.
>
> Signed-off-by: Wangao Wang <wangao.wang@oss.qualcomm.com>
> ---
> .../media/platform/qcom/iris/iris_hfi_gen2_command.c | 18 ++++++++++++------
> drivers/media/platform/qcom/iris/iris_instance.h | 4 ++++
> drivers/media/platform/qcom/iris/iris_venc.c | 10 +++++++---
> 3 files changed, 23 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> index 4ce71a14250832440099e4cf3835b4aedfb749e8..ada9b4d298ef10ac47a573061369828a1e150f85 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> @@ -168,8 +168,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,
> @@ -216,8 +215,11 @@ 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 codec_align;
> u32 payload[2];
>
> + codec_align = inst->codec == V4L2_PIX_FMT_HEVC ? 32 : 16;
> +
> if (inst->domain == DECODER) {
> if (V4L2_TYPE_IS_OUTPUT(plane)) {
> bottom_offset = (inst->fmt_src->fmt.pix_mp.height - inst->crop.height);
> @@ -231,10 +233,14 @@ 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;
> + if (V4L2_TYPE_IS_CAPTURE(plane)) {
> + bottom_offset = (ALIGN(inst->enc_raw_height, codec_align) -
> + inst->enc_raw_height);
> + right_offset = (ALIGN(inst->enc_raw_width, codec_align) -
> + inst->enc_raw_width);
> + left_offset = inst->crop.left;
> + top_offset = inst->crop.top;
As you mentioned this prop is not meant to set CROP so left offset and top
offset can be assigned to 0 directly?
> + }
> }
>
> payload[0] = FIELD_PREP(GENMASK(31, 16), left_offset) | top_offset;
> diff --git a/drivers/media/platform/qcom/iris/iris_instance.h b/drivers/media/platform/qcom/iris/iris_instance.h
> index 5982d7adefeab80905478b32cddba7bd4651a691..fbae1662947df73bb3d10b7892839fa1076b7e61 100644
> --- a/drivers/media/platform/qcom/iris/iris_instance.h
> +++ b/drivers/media/platform/qcom/iris/iris_instance.h
> @@ -64,6 +64,8 @@ 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: raw image width for encoder instance
> + * @enc_raw_height: raw image height for encoder instance
> */
>
> struct iris_inst {
> @@ -102,6 +104,8 @@ struct iris_inst {
> u32 frame_rate;
> u32 operating_rate;
> u32 hfi_rc_type;
> + u32 enc_raw_width;
> + u32 enc_raw_height;
> };
>
> #endif
> diff --git a/drivers/media/platform/qcom/iris/iris_venc.c b/drivers/media/platform/qcom/iris/iris_venc.c
> index 099bd5ed4ae0294725860305254c4cad1ec88d7e..6adadc89e360a6e4bebe1f839d38892990e10fa2 100644
> --- a/drivers/media/platform/qcom/iris/iris_venc.c
> +++ b/drivers/media/platform/qcom/iris/iris_venc.c
> @@ -68,6 +68,9 @@ int iris_venc_inst_init(struct iris_inst *inst)
> inst->operating_rate = DEFAULT_FPS;
> inst->frame_rate = DEFAULT_FPS;
>
> + inst->enc_raw_width = DEFAULT_WIDTH;
> + inst->enc_raw_height = DEFAULT_HEIGHT;
> +
> memcpy(&inst->fw_caps[0], &core->inst_fw_caps_enc[0],
> INST_FW_CAP_MAX * sizeof(struct platform_inst_fw_cap));
>
> @@ -249,6 +252,9 @@ static int iris_venc_s_fmt_input(struct iris_inst *inst, struct v4l2_format *f)
> inst->buffers[BUF_INPUT].min_count = iris_vpu_buf_count(inst, BUF_INPUT);
> inst->buffers[BUF_INPUT].size = fmt->fmt.pix_mp.plane_fmt[0].sizeimage;
>
> + inst->enc_raw_width = f->fmt.pix_mp.width;
> + inst->enc_raw_height = f->fmt.pix_mp.height;
> +
> if (f->fmt.pix_mp.width != inst->crop.width ||
> f->fmt.pix_mp.height != inst->crop.height) {
> inst->crop.top = 0;
> @@ -329,9 +335,7 @@ int iris_venc_s_selection(struct iris_inst *inst, struct v4l2_selection *s)
> inst->crop.top = s->r.top;
> inst->crop.width = s->r.width;
> inst->crop.height = s->r.height;
> - inst->fmt_dst->fmt.pix_mp.width = inst->crop.width;
> - inst->fmt_dst->fmt.pix_mp.height = inst->crop.height;
> - return iris_venc_s_fmt_output(inst, inst->fmt_dst);
why is this removed ?
Thanks,
Dikshita
> + return 0;
> default:
> return -EINVAL;
> }
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 3/5] media: qcom: iris: Add rotation support for encoder
2025-10-31 11:30 ` Neil Armstrong
@ 2025-11-04 7:48 ` Wangao Wang
0 siblings, 0 replies; 13+ messages in thread
From: Wangao Wang @ 2025-11-04 7:48 UTC (permalink / raw)
To: Neil Armstrong, Vikash Garodia, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab
Cc: linux-media, linux-arm-msm, linux-kernel, quic_qiweil,
quic_renjiang
On 10/31/2025 7:30 PM, Neil Armstrong wrote:
>
> I found the issue with SM8650, you did not update the vppu33 variant of
> iris_vpu_enc_line_size.
>
> With this:
> ============================><=============================
> diff --git a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c b/
> drivers/media/platform/qcom/iris/iris_vpu_buffer.c
> index be8b8588a39f..4a4fbcbfdb46 100644
> --- a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
> +++ b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
> @@ -1082,8 +1082,8 @@ static u32 iris_vpu33_enc_line_size(struct
> iris_inst *inst)
> {
> u32 num_vpp_pipes = inst->core->iris_platform_data->num_vpp_pipe;
> struct v4l2_format *f = inst->fmt_dst;
> - u32 height = f->fmt.pix_mp.height;
> - u32 width = f->fmt.pix_mp.width;
> + u32 height = iris_vpu_enc_get_bitstream_height(inst);
> + u32 width = iris_vpu_enc_get_bitstream_width(inst);
> u32 lcu_size = 16;
>
> if (inst->codec == V4L2_PIX_FMT_HEVC) {
> ============================><=============================
>
> Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8650-HDK
>
> Neil
>
>
> <snip>
>
Thank you for helping test on SM8650.
I indeed forgot to add the corresponding changes here.
This issue will be addressed in v3.
--
Best Regards,
Wangao
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2025-11-04 7:48 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-10-31 9:50 [PATCH v2 0/5] media: qcom: iris: encoder feature enhancements Wangao Wang
2025-10-31 9:50 ` [PATCH v2 1/5] media: qcom: iris: Improve format alignment for encoder Wangao Wang
2025-11-03 10:54 ` kernel test robot
2025-11-04 5:13 ` Dikshita Agarwal
2025-10-31 9:50 ` [PATCH v2 2/5] media: qcom: iris: Add scale support " Wangao Wang
2025-10-31 10:54 ` Neil Armstrong
2025-10-31 9:50 ` [PATCH v2 3/5] media: qcom: iris: Add rotation " Wangao Wang
2025-10-31 11:30 ` Neil Armstrong
2025-11-04 7:48 ` Wangao Wang
2025-10-31 9:50 ` [PATCH v2 4/5] media: qcom: iris: Add flip " Wangao Wang
2025-10-31 10:54 ` Neil Armstrong
2025-10-31 9:50 ` [PATCH v2 5/5] media: qcom: iris: Add intra refresh " Wangao Wang
2025-10-31 10:54 ` [PATCH v2 0/5] media: qcom: iris: encoder feature enhancements Neil Armstrong
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).