]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
media: qcom: iris: Add intra refresh support for encoder
authorWangao Wang <wangao.wang@oss.qualcomm.com>
Fri, 14 Nov 2025 03:09:03 +0000 (11:09 +0800)
committerHans Verkuil <hverkuil+cisco@kernel.org>
Tue, 20 Jan 2026 15:22:24 +0000 (16:22 +0100)
Add support for V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD and
V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE controls.

Reviewed-by: Dikshita Agarwal <dikshita.agarwal@oss.qualcomm.com>
Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8650-HDK
Signed-off-by: Wangao Wang <wangao.wang@oss.qualcomm.com>
Signed-off-by: Bryan O'Donoghue <bod@kernel.org>
Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
drivers/media/platform/qcom/iris/iris_ctrls.c
drivers/media/platform/qcom/iris/iris_ctrls.h
drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
drivers/media/platform/qcom/iris/iris_platform_common.h
drivers/media/platform/qcom/iris/iris_platform_gen2.c

index d7bd7f6dcc216a07532c69058a68ce2620ccf55d..3cec957580f5ebbc8d6a7a613866fd0377fe213a 100644 (file)
@@ -108,6 +108,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;
        }
@@ -205,6 +209,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;
        }
@@ -962,6 +970,32 @@ 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;
index 355a592049f3fcc715a1b9df44b4d1398b052653..9518803577bc39f5c1339a49878dd0c3e8f510ad 100644 (file)
@@ -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
index 864162364b312112d93bbc633f4b61e710ae9e4c..cecf771c55dd36a13616344ff4583bf1d0544e17 100644 (file)
@@ -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
@@ -113,6 +114,7 @@ enum hfi_flip {
 #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
index b3bf25ed2dd0495ffbfa1d1c741671e35b7f1825..a24ed2d03a61d3d7a3f9197140f8f6a5c7fea3d6 100644 (file)
@@ -153,6 +153,8 @@ enum platform_inst_fw_cap_type {
        ROTATION,
        HFLIP,
        VFLIP,
+       IR_TYPE,
+       IR_PERIOD,
        INST_FW_CAP_MAX,
 };
 
index 034c67341694b4626309e23717a284167a3b49c3..753ebf0a42c59debb2c8e7a0c60cbbae4b79edaa 100644 (file)
@@ -721,6 +721,25 @@ static const 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 = {