On Fri Jul 31 02:53:59 2026 +0300, Dmitry Baryshkov wrote:
> Port support for the AR50Lt video codec core (present for example on the
> Agatti platform) to the Iris driver. Unlike more recent cores this
> generation doesn't have the PIPE property (as it always has only one
> pipe). Also, unlike newer platforms, buffer sizes are requested from the
> firmware instead of being calculated by the driver.
> 
> Co-developed-by: Dikshita Agarwal <[email protected]>
> Signed-off-by: Dikshita Agarwal <[email protected]>
> Reviewed-by: Vikash Garodia <[email protected]>
> Signed-off-by: Dmitry Baryshkov <[email protected]>
> Signed-off-by: Bryan O'Donoghue <[email protected]>

Patch committed.

Thanks,
Bryan O'Donoghue

 drivers/media/platform/qcom/iris/Makefile          |   1 +
 drivers/media/platform/qcom/iris/iris_hfi_gen1.c   | 404 +++++++++++++++++++++
 .../platform/qcom/iris/iris_hfi_gen1_command.c     |   9 +
 .../platform/qcom/iris/iris_platform_common.h      |   9 +
 .../platform/qcom/iris/iris_platform_vpu_ar50lt.c  | 110 ++++++
 drivers/media/platform/qcom/iris/iris_probe.c      |   4 +
 drivers/media/platform/qcom/iris/iris_vpu_buffer.c |   5 +
 drivers/media/platform/qcom/iris/iris_vpu_buffer.h |   1 +
 8 files changed, 543 insertions(+)

---

diff --git a/drivers/media/platform/qcom/iris/Makefile 
b/drivers/media/platform/qcom/iris/Makefile
index f1b204b95694..bbd1f724963e 100644
--- a/drivers/media/platform/qcom/iris/Makefile
+++ b/drivers/media/platform/qcom/iris/Makefile
@@ -14,6 +14,7 @@ qcom-iris-objs += iris_buffer.o \
              iris_hfi_queue.o \
              iris_platform_vpu2.o \
              iris_platform_vpu3x.o \
+             iris_platform_vpu_ar50lt.o \
              iris_power.o \
              iris_probe.o \
              iris_resources.o \
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen1.c 
b/drivers/media/platform/qcom/iris/iris_hfi_gen1.c
index 0f7e7d6b25f4..548609315b85 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen1.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1.c
@@ -445,3 +445,407 @@ const struct iris_firmware_data iris_hfi_gen1_data = {
        .enc_ip_int_buf_tbl = sm8250_enc_ip_int_buf_tbl,
        .enc_ip_int_buf_tbl_size = ARRAY_SIZE(sm8250_enc_ip_int_buf_tbl),
 };
+
+static const struct platform_inst_fw_cap iris_inst_fw_cap_gen1_ar50lt_dec[] = {
+       {
+               .cap_id = STAGE,
+               .min = STAGE_1,
+               .max = STAGE_2,
+               .step_or_mask = 1,
+               .value = STAGE_2,
+               .hfi_id = HFI_PROPERTY_PARAM_WORK_MODE,
+               .set = iris_set_stage,
+       },
+};
+
+static const struct platform_inst_fw_cap inst_fw_cap_gen1_ar50lt_enc[] = {
+       {
+               .cap_id = STAGE,
+               .min = STAGE_1,
+               .max = STAGE_2,
+               .step_or_mask = 1,
+               .value = STAGE_2,
+               .hfi_id = HFI_PROPERTY_PARAM_WORK_MODE,
+               .set = iris_set_stage,
+       },
+       {
+               .cap_id = PROFILE_H264,
+               .min = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE,
+               .max = V4L2_MPEG_VIDEO_H264_PROFILE_MULTIVIEW_HIGH,
+               .step_or_mask = BIT(V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) |
+                               
BIT(V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE) |
+                               BIT(V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) |
+                               BIT(V4L2_MPEG_VIDEO_H264_PROFILE_HIGH) |
+                               BIT(V4L2_MPEG_VIDEO_H264_PROFILE_STEREO_HIGH) |
+                               
BIT(V4L2_MPEG_VIDEO_H264_PROFILE_MULTIVIEW_HIGH),
+               .value = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH,
+               .hfi_id = HFI_PROPERTY_PARAM_PROFILE_LEVEL_CURRENT,
+               .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
+               .set = iris_set_profile_level_gen1,
+       },
+       {
+               .cap_id = PROFILE_HEVC,
+               .min = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN,
+               .max = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE,
+               .step_or_mask = BIT(V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN) |
+                               
BIT(V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE),
+               .value = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN,
+               .hfi_id = HFI_PROPERTY_PARAM_PROFILE_LEVEL_CURRENT,
+               .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
+               .set = iris_set_profile_level_gen1,
+       },
+       {
+               .cap_id = LEVEL_H264,
+               .min = V4L2_MPEG_VIDEO_H264_LEVEL_1_0,
+               .max = V4L2_MPEG_VIDEO_H264_LEVEL_4_2,
+               .step_or_mask = BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_0) |
+                               BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1B) |
+                               BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_1) |
+                               BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_2) |
+                               BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_3) |
+                               BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_0) |
+                               BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_1) |
+                               BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_2) |
+                               BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_0) |
+                               BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_1) |
+                               BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_2) |
+                               BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_0) |
+                               BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_1) |
+                               BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_2),
+               .value = V4L2_MPEG_VIDEO_H264_LEVEL_1_0,
+               .hfi_id = HFI_PROPERTY_PARAM_PROFILE_LEVEL_CURRENT,
+               .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
+               .set = iris_set_profile_level_gen1,
+       },
+       {
+               .cap_id = LEVEL_HEVC,
+               .min = V4L2_MPEG_VIDEO_HEVC_LEVEL_1,
+               .max = V4L2_MPEG_VIDEO_HEVC_LEVEL_4_1,
+               .step_or_mask = BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_1) |
+                               BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_2) |
+                               BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_2_1) |
+                               BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_3) |
+                               BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_3_1) |
+                               BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_4) |
+                               BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_4_1),
+               .value = V4L2_MPEG_VIDEO_HEVC_LEVEL_1,
+               .hfi_id = HFI_PROPERTY_PARAM_PROFILE_LEVEL_CURRENT,
+               .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
+               .set = iris_set_profile_level_gen1,
+       },
+       {
+               .cap_id = HEADER_MODE,
+               .min = V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE,
+               .max = V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME,
+               .step_or_mask = BIT(V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE) |
+                               
BIT(V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME),
+               .value = V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME,
+               .hfi_id = HFI_PROPERTY_CONFIG_VENC_SYNC_FRAME_SEQUENCE_HEADER,
+               .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
+               .set = iris_set_header_mode_gen1,
+       },
+       {
+               .cap_id = BITRATE,
+               .min = BITRATE_MIN,
+               .max = BITRATE_MAX_AR50LT,
+               .step_or_mask = BITRATE_STEP,
+               .value = BITRATE_DEFAULT_AR50LT,
+               .hfi_id = HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE,
+               .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
+                       CAP_FLAG_DYNAMIC_ALLOWED,
+               .set = iris_set_bitrate_gen1,
+       },
+       {
+               .cap_id = BITRATE_MODE,
+               .min = V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
+               .max = V4L2_MPEG_VIDEO_BITRATE_MODE_CBR,
+               .step_or_mask = BIT(V4L2_MPEG_VIDEO_BITRATE_MODE_VBR) |
+                               BIT(V4L2_MPEG_VIDEO_BITRATE_MODE_CBR),
+               .value = V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
+               .hfi_id = HFI_PROPERTY_PARAM_VENC_RATE_CONTROL,
+               .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
+               .set = iris_set_bitrate_mode_gen1,
+       },
+       {
+               .cap_id = FRAME_SKIP_MODE,
+               .min = V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_DISABLED,
+               .max = V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_BUF_LIMIT,
+               .step_or_mask = BIT(V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_DISABLED) |
+                               BIT(V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_BUF_LIMIT),
+               .value = V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_DISABLED,
+               .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
+       },
+       {
+               .cap_id = FRAME_RC_ENABLE,
+               .min = 0,
+               .max = 1,
+               .step_or_mask = 1,
+               .value = 1,
+       },
+       {
+               .cap_id = GOP_SIZE,
+               .min = 0,
+               .max = (1 << 16) - 1,
+               .step_or_mask = 1,
+               .value = 30,
+               .hfi_id = HFI_PROPERTY_CONFIG_VENC_INTRA_PERIOD,
+               .flags = CAP_FLAG_OUTPUT_PORT,
+               .set = iris_set_intra_period,
+       },
+       {
+               .cap_id = ENTROPY_MODE,
+               .min = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC,
+               .max = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC,
+               .step_or_mask = BIT(V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC) |
+                               BIT(V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC),
+               .value = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC,
+               .hfi_id = HFI_PROPERTY_PARAM_VENC_H264_ENTROPY_CONTROL,
+               .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
+               .set = iris_set_entropy_mode_gen1,
+       },
+       {
+               .cap_id = MIN_FRAME_QP_H264,
+               .min = MIN_QP_8BIT_AR50LT,
+               .max = MAX_QP,
+               .step_or_mask = 1,
+               .value = MIN_QP_8BIT_AR50LT,
+               .hfi_id = HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE_V2,
+               .flags = CAP_FLAG_OUTPUT_PORT,
+               .set = iris_set_qp_range,
+       },
+       {
+               .cap_id = MIN_FRAME_QP_HEVC,
+               .min = MIN_QP_8BIT_AR50LT,
+               .max = MAX_QP_HEVC,
+               .step_or_mask = 1,
+               .value = MIN_QP_8BIT_AR50LT,
+               .hfi_id = HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE_V2,
+               .flags = CAP_FLAG_OUTPUT_PORT,
+               .set = iris_set_qp_range,
+       },
+       {
+               .cap_id = MAX_FRAME_QP_H264,
+               .min = MIN_QP_8BIT_AR50LT,
+               .max = MAX_QP,
+               .step_or_mask = 1,
+               .value = MAX_QP,
+               .hfi_id = HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE_V2,
+               .flags = CAP_FLAG_OUTPUT_PORT,
+               .set = iris_set_qp_range,
+       },
+       {
+               .cap_id = MAX_FRAME_QP_HEVC,
+               .min = MIN_QP_8BIT_AR50LT,
+               .max = MAX_QP_HEVC,
+               .step_or_mask = 1,
+               .value = MAX_QP_HEVC,
+               .hfi_id = HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE_V2,
+               .flags = CAP_FLAG_OUTPUT_PORT,
+               .set = iris_set_qp_range,
+       },
+       {
+               .cap_id = IR_TYPE,
+               .min = V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_RANDOM,
+               .max = V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_CYCLIC,
+               .step_or_mask = 
BIT(V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_RANDOM) |
+                       
BIT(V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_CYCLIC),
+               .value = V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_RANDOM,
+               .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
+       },
+       {
+               .cap_id = IR_PERIOD,
+               .min = 0,
+               .max = ((4096 * 2304) >> 8),
+               .step_or_mask = 1,
+               .value = 0,
+               .hfi_id = HFI_PROPERTY_PARAM_VENC_INTRA_REFRESH,
+               .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
+               .set = iris_set_ir_period_gen1,
+       },
+       {
+               .cap_id = LTR_COUNT,
+               .min = 0,
+               .max = MAX_LTR_FRAME_COUNT_GEN1,
+               .step_or_mask = 1,
+               .value = 0,
+               .hfi_id = HFI_PROPERTY_PARAM_VENC_LTRMODE,
+               .flags = CAP_FLAG_OUTPUT_PORT,
+               .set = iris_set_ltr_count_gen1,
+       },
+       {
+               .cap_id = USE_LTR,
+               .min = 0,
+               .max = ((1 << MAX_LTR_FRAME_COUNT_GEN1) - 1),
+               .step_or_mask = 0,
+               .value = 0,
+               .hfi_id = HFI_PROPERTY_CONFIG_VENC_USELTRFRAME,
+               .flags = CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
+               .set = iris_set_use_ltr,
+       },
+       {
+               .cap_id = MARK_LTR,
+               .min = 0,
+               .max = (MAX_LTR_FRAME_COUNT_GEN1 - 1),
+               .step_or_mask = 1,
+               .value = 0,
+               .hfi_id = HFI_PROPERTY_CONFIG_VENC_MARKLTRFRAME,
+               .flags = CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
+               .set = iris_set_mark_ltr,
+       },
+       {
+               .cap_id = B_FRAME,
+               .min = 0,
+               .max = 3,
+               .step_or_mask = 1,
+               .value = 0,
+               .flags = CAP_FLAG_OUTPUT_PORT,
+       },
+       {
+               .cap_id = LAYER_ENABLE,
+               .min = 0,
+               .max = 1,
+               .step_or_mask = 1,
+               .value = 0,
+               .flags = CAP_FLAG_OUTPUT_PORT,
+       },
+       {
+               .cap_id = LAYER_TYPE_H264,
+               .min = V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P,
+               .max = V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P,
+               .step_or_mask = BIT(V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P),
+               .value = V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P,
+               .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
+       },
+       {
+               .cap_id = LAYER_COUNT_H264,
+               .min = 0,
+               .max = MAX_HIER_CODING_LAYER_GEN1,
+               .step_or_mask = 1,
+               .value = 0,
+               .hfi_id = HFI_PROPERTY_CONFIG_VENC_HIER_P_ENH_LAYER,
+               .flags = CAP_FLAG_OUTPUT_PORT,
+               .set = iris_set_layer_count_gen1,
+       },
+       {
+               .cap_id = LAYER0_BITRATE_H264,
+               .min = 1,
+               .max = BITRATE_MAX_AR50LT,
+               .step_or_mask = 1,
+               .value = BITRATE_DEFAULT,
+               .hfi_id = HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE,
+               .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
+                       CAP_FLAG_DYNAMIC_ALLOWED,
+               .set = iris_set_bitrate_gen1,
+       },
+       {
+               .cap_id = LAYER1_BITRATE_H264,
+               .min = 1,
+               .max = BITRATE_MAX_AR50LT,
+               .step_or_mask = 1,
+               .value = BITRATE_DEFAULT,
+               .hfi_id = HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE,
+               .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
+                       CAP_FLAG_DYNAMIC_ALLOWED,
+               .set = iris_set_bitrate_gen1,
+       },
+       {
+               .cap_id = LAYER2_BITRATE_H264,
+               .min = 1,
+               .max = BITRATE_MAX_AR50LT,
+               .step_or_mask = 1,
+               .value = BITRATE_DEFAULT,
+               .hfi_id = HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE,
+               .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
+                       CAP_FLAG_DYNAMIC_ALLOWED,
+               .set = iris_set_bitrate_gen1,
+       },
+       {
+               .cap_id = LAYER3_BITRATE_H264,
+               .min = 1,
+               .max = BITRATE_MAX_AR50LT,
+               .step_or_mask = 1,
+               .value = BITRATE_DEFAULT,
+               .hfi_id = HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE,
+               .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
+                       CAP_FLAG_DYNAMIC_ALLOWED,
+               .set = iris_set_bitrate_gen1,
+       },
+       {
+               .cap_id = LAYER4_BITRATE_H264,
+               .min = 1,
+               .max = BITRATE_MAX_AR50LT,
+               .step_or_mask = 1,
+               .value = BITRATE_DEFAULT,
+               .hfi_id = HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE,
+               .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
+                       CAP_FLAG_DYNAMIC_ALLOWED,
+               .set = iris_set_bitrate_gen1,
+       },
+       {
+               .cap_id = LAYER5_BITRATE_H264,
+               .min = 1,
+               .max = BITRATE_MAX_AR50LT,
+               .step_or_mask = 1,
+               .value = BITRATE_DEFAULT,
+               .hfi_id = HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE,
+               .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
+                       CAP_FLAG_DYNAMIC_ALLOWED,
+               .set = iris_set_bitrate_gen1,
+       },
+       {
+               .cap_id = REQUEST_SYNC_FRAME,
+               .min = 0,
+               .max = 1,
+               .step_or_mask = 1,
+               .value = 0,
+               .hfi_id = HFI_PROPERTY_CONFIG_VENC_REQUEST_SYNC_FRAME,
+               .flags = CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
+               .set = iris_set_req_sync_frame,
+       },
+};
+
+static const u32 iris_hfi_gen1_ar50lt_dec_ip_int_buf_tbl[] = {
+       BUF_BIN,
+       BUF_SCRATCH_1,
+};
+
+/*
+ * Unlike sm8250, on AR50Lt the internal buffer sizes are provided by the
+ * firmware. Request HFI_PROPERTY_PARAM_BUFFER_SIZE_ACTUAL so that the encoder
+ * queries HFI_PROPERTY_CONFIG_BUFFER_REQUIREMENTS before allocating them.
+ */
+static const u32 iris_hfi_gen1_ar50lt_venc_input_config_param[] = {
+       HFI_PROPERTY_CONFIG_FRAME_RATE,
+       HFI_PROPERTY_PARAM_UNCOMPRESSED_PLANE_ACTUAL_INFO,
+       HFI_PROPERTY_PARAM_FRAME_SIZE,
+       HFI_PROPERTY_PARAM_UNCOMPRESSED_FORMAT_SELECT,
+       HFI_PROPERTY_PARAM_BUFFER_COUNT_ACTUAL,
+       HFI_PROPERTY_PARAM_BUFFER_SIZE_ACTUAL,
+};
+
+const struct iris_firmware_data iris_hfi_gen1_ar50lt_data = {
+       .init_hfi_ops = &iris_hfi_gen1_sys_ops_init,
+
+       .query_buffer_requirements = true,
+
+       .inst_fw_caps_dec = iris_inst_fw_cap_gen1_ar50lt_dec,
+       .inst_fw_caps_dec_size = ARRAY_SIZE(iris_inst_fw_cap_gen1_ar50lt_dec),
+       .inst_fw_caps_enc = inst_fw_cap_gen1_ar50lt_enc,
+       .inst_fw_caps_enc_size = ARRAY_SIZE(inst_fw_cap_gen1_ar50lt_enc),
+
+       .dec_input_config_params_default =
+               sm8250_vdec_input_config_param_default,
+       .dec_input_config_params_default_size =
+               ARRAY_SIZE(sm8250_vdec_input_config_param_default),
+       .enc_input_config_params = iris_hfi_gen1_ar50lt_venc_input_config_param,
+       .enc_input_config_params_size =
+               ARRAY_SIZE(iris_hfi_gen1_ar50lt_venc_input_config_param),
+
+       .dec_ip_int_buf_tbl = iris_hfi_gen1_ar50lt_dec_ip_int_buf_tbl,
+       .dec_ip_int_buf_tbl_size = 
ARRAY_SIZE(iris_hfi_gen1_ar50lt_dec_ip_int_buf_tbl),
+       .dec_op_int_buf_tbl = sm8250_dec_op_int_buf_tbl,
+       .dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8250_dec_op_int_buf_tbl),
+
+       .enc_ip_int_buf_tbl = sm8250_enc_ip_int_buf_tbl,
+       .enc_ip_int_buf_tbl_size = ARRAY_SIZE(sm8250_enc_ip_int_buf_tbl),
+};
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c 
b/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
index 5650645f9f65..47e9147a9b6d 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
@@ -973,6 +973,13 @@ static int iris_hfi_gen1_set_bufsize(struct iris_inst 
*inst, u32 plane)
        struct hfi_buffer_size_actual bufsz;
        int ret;
 
+       if (inst->core->iris_firmware_data->query_buffer_requirements) {
+               ret = inst->hfi_session_ops->session_get_property(inst,
+                                                                 
HFI_PROPERTY_CONFIG_BUFFER_REQUIREMENTS);
+               if (ret)
+                       return ret;
+       }
+
        if (iris_split_mode_enabled(inst)) {
                bufsz.type = HFI_BUFFER_OUTPUT;
                bufsz.size = 
inst->core->iris_firmware_desc->get_vpu_buffer_size(inst, BUF_DPB);
@@ -1087,6 +1094,8 @@ static int iris_hfi_gen1_session_set_config_params(struct 
iris_inst *inst, u32 p
                        iris_hfi_gen1_set_raw_format},
                {HFI_PROPERTY_PARAM_BUFFER_COUNT_ACTUAL,
                        iris_hfi_gen1_set_num_bufs},
+               {HFI_PROPERTY_PARAM_BUFFER_SIZE_ACTUAL,
+                       iris_hfi_gen1_set_bufsize},
        };
 
        if (inst->domain == DECODER) {
diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h 
b/drivers/media/platform/qcom/iris/iris_platform_common.h
index 4ed0709ec381..07cd02d6bfc8 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_common.h
+++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
@@ -39,6 +39,10 @@ struct iris_inst;
 #define MAX_HEVC_VBR_LAYER_HP_SLIDING_WINDOW   5
 #define MAX_HIER_CODING_LAYER_GEN1             6
 
+#define BITRATE_MAX_AR50LT             100000000
+#define BITRATE_DEFAULT_AR50LT         20000000
+#define MIN_QP_8BIT_AR50LT             0
+
 enum stage_type {
        STAGE_1 = 1,
        STAGE_2 = 2,
@@ -51,10 +55,12 @@ enum pipe_type {
 };
 
 extern const struct iris_firmware_data iris_hfi_gen1_data;
+extern const struct iris_firmware_data iris_hfi_gen1_ar50lt_data;
 extern const struct iris_firmware_data iris_hfi_gen2_data;
 extern const struct iris_firmware_data iris_hfi_milos_data;
 
 extern const struct iris_platform_data milos_data;
+extern const struct iris_platform_data qcm2290_data;
 extern const struct iris_platform_data qcs8300_data;
 extern const struct iris_platform_data sc7280_data;
 extern const struct iris_platform_data sm8250_data;
@@ -245,6 +251,9 @@ struct iris_firmware_data {
 
        u32 core_arch;
 
+       /* Query buffer sizes from the firmware (pre-Iris HFI Gen1 platforms). 
*/
+       bool query_buffer_requirements;
+
        const struct platform_inst_fw_cap *inst_fw_caps_dec;
        u32 inst_fw_caps_dec_size;
        const struct platform_inst_fw_cap *inst_fw_caps_enc;
diff --git a/drivers/media/platform/qcom/iris/iris_platform_vpu_ar50lt.c 
b/drivers/media/platform/qcom/iris/iris_platform_vpu_ar50lt.c
new file mode 100644
index 000000000000..92f7e2546539
--- /dev/null
+++ b/drivers/media/platform/qcom/iris/iris_platform_vpu_ar50lt.c
@@ -0,0 +1,110 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) Qualcomm Innovation Center, Inc. All rights reserved.
+ */
+
+#include "iris_core.h"
+#include "iris_ctrls.h"
+#include "iris_hfi_gen2.h"
+#include "iris_hfi_gen2_defines.h"
+#include "iris_platform_common.h"
+#include "iris_vpu_buffer.h"
+#include "iris_vpu_common.h"
+
+#define WRAPPER_INTR_STATUS_A2HWD_BMSK         0x10
+
+static const struct iris_firmware_desc iris_vpu_ar50lt_p1_gen1_s6_desc = {
+       .firmware_data = &iris_hfi_gen1_ar50lt_data,
+       .get_vpu_buffer_size = iris_vpu_ar50lt_gen1_buf_size,
+       .fwname = "qcom/venus-6.0/venus.mbn",
+};
+
+static const u32 iris_fmts_ar50lt_dec[] = {
+       V4L2_PIX_FMT_H264,
+       V4L2_PIX_FMT_HEVC,
+       V4L2_PIX_FMT_VP9,
+};
+
+static const struct bw_info iris_bw_table_dec_ar50lt[] = {
+       { ((1920 * 1080) / 256) * 60, 1564000, },
+       { ((1920 * 1080) / 256) * 30,  791000, },
+       { ((1280 * 720) / 256) * 60,   688000, },
+       { ((1280 * 720) / 256) * 30,   347000, },
+};
+
+static const struct icc_info iris_icc_info_ar50lt[] = {
+       { "cpu-cfg",    1000, 1000     },
+       { "video-mem",  1000, 6500000  },
+};
+
+static const char * const iris_pmdomain_table_ar50lt[] = { "venus", "vcodec0" 
};
+
+static const char * const iris_opp_pd_table_ar50lt[] = { "cx" };
+
+static const struct platform_clk_data iris_clk_table_ar50lt[] = {
+       {IRIS_CTRL_CLK,    "core"         },
+       {IRIS_AXI_CLK,     "iface"        },
+       {IRIS_AHB_CLK,     "bus"          },
+       {IRIS_HW_CLK,      "vcodec0_core" },
+       {IRIS_HW_AHB_CLK,  "vcodec0_bus"  },
+       {IRIS_THROTTLE_CLK, "throttle"    },
+};
+
+static const char * const iris_opp_clk_table_ar50lt[] = {
+       "vcodec0_core",
+       NULL,
+};
+
+static const struct tz_cp_config tz_cp_config_ar50lt[] = {
+       {
+               .cp_start = 0,
+               .cp_size = 0x25800000,
+               .cp_nonpixel_start = 0x01000000,
+               .cp_nonpixel_size = 0x24800000,
+       },
+};
+
+static struct platform_inst_caps platform_inst_cap_ar50lt = {
+       .min_frame_width = 128,
+       .max_frame_width = 1920,
+       .min_frame_height = 128,
+       .max_frame_height = 1920,
+       .max_mbpf = (1920 * 1088) / 256,
+       .mb_cycles_vpp = 440,
+       .mb_cycles_fw = 733003,
+       .mb_cycles_fw_vpp = 225975,
+       .max_frame_rate = 120,
+       .max_operating_rate = 120,
+};
+
+const struct iris_platform_data qcm2290_data = {
+       .firmware_desc_gen1 = &iris_vpu_ar50lt_p1_gen1_s6_desc,
+       .vpu_ops = &iris_vpu_ar50lt_ops,
+       .icc_tbl = iris_icc_info_ar50lt,
+       .icc_tbl_size = ARRAY_SIZE(iris_icc_info_ar50lt),
+       .bw_tbl_dec = iris_bw_table_dec_ar50lt,
+       .bw_tbl_dec_size = ARRAY_SIZE(iris_bw_table_dec_ar50lt),
+       .pmdomain_tbl = iris_pmdomain_table_ar50lt,
+       .pmdomain_tbl_size = ARRAY_SIZE(iris_pmdomain_table_ar50lt),
+       .opp_pd_tbl = iris_opp_pd_table_ar50lt,
+       .opp_pd_tbl_size = ARRAY_SIZE(iris_opp_pd_table_ar50lt),
+       .clk_tbl = iris_clk_table_ar50lt,
+       .clk_tbl_size = ARRAY_SIZE(iris_clk_table_ar50lt),
+       .opp_clk_tbl = iris_opp_clk_table_ar50lt,
+       /* Upper bound of DMA address range */
+       .dma_mask = 0xe0000000 - 1,
+       .inst_iris_fmts = iris_fmts_ar50lt_dec,
+       .inst_iris_fmts_size = ARRAY_SIZE(iris_fmts_ar50lt_dec),
+       .inst_caps = &platform_inst_cap_ar50lt,
+       .tz_cp_config_data = tz_cp_config_ar50lt,
+       .tz_cp_config_data_size = ARRAY_SIZE(tz_cp_config_ar50lt),
+       .num_vpp_pipe = 1,
+       .no_rpmh = true,
+       .wd_intr_mask = WRAPPER_INTR_STATUS_A2HWD_BMSK,
+       .icc_ib_multiplier = 2,
+       .max_session_count = 8,
+       .max_core_mbpf = ((1920 * 1088) / 256) * 4,
+       /* Concurrency: 1080p@30 decode + 1080p@30 encode */
+       /* Concurrency: 3 * 1080p@30 decode */
+       .max_core_mbps = (((1920 * 1088) / 256) * 90),
+};
diff --git a/drivers/media/platform/qcom/iris/iris_probe.c 
b/drivers/media/platform/qcom/iris/iris_probe.c
index c4b8b4be339d..41dec90f3e2b 100644
--- a/drivers/media/platform/qcom/iris/iris_probe.c
+++ b/drivers/media/platform/qcom/iris/iris_probe.c
@@ -422,6 +422,10 @@ static const struct of_device_id iris_dt_match[] = {
                .compatible = "qcom,milos-iris",
                .data = &milos_data,
        },
+       {
+               .compatible = "qcom,qcm2290-venus",
+               .data = &qcm2290_data,
+       },
        {
                .compatible = "qcom,qcs8300-iris",
                .data = &qcs8300_data,
diff --git a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c 
b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
index faebb5472866..83dc4a1db954 100644
--- a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
+++ b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
@@ -2194,6 +2194,11 @@ u32 iris_vpu4x_buf_size(struct iris_inst *inst, enum 
iris_buffer_type buffer_typ
        return size;
 }
 
+u32 iris_vpu_ar50lt_gen1_buf_size(struct iris_inst *inst, enum 
iris_buffer_type buffer_type)
+{
+       return inst->buffers[buffer_type].size;
+}
+
 static u32 internal_buffer_count(struct iris_inst *inst,
                                 enum iris_buffer_type buffer_type)
 {
diff --git a/drivers/media/platform/qcom/iris/iris_vpu_buffer.h 
b/drivers/media/platform/qcom/iris/iris_vpu_buffer.h
index 8c0d6b7b5de8..1d07137c70cd 100644
--- a/drivers/media/platform/qcom/iris/iris_vpu_buffer.h
+++ b/drivers/media/platform/qcom/iris/iris_vpu_buffer.h
@@ -288,6 +288,7 @@ static inline u32 size_av1d_qp(u32 frame_width, u32 
frame_height)
 u32 iris_vpu_buf_size(struct iris_inst *inst, enum iris_buffer_type 
buffer_type);
 u32 iris_vpu33_buf_size(struct iris_inst *inst, enum iris_buffer_type 
buffer_type);
 u32 iris_vpu4x_buf_size(struct iris_inst *inst, enum iris_buffer_type 
buffer_type);
+u32 iris_vpu_ar50lt_gen1_buf_size(struct iris_inst *inst, enum 
iris_buffer_type buffer_type);
 int iris_vpu_buf_count(struct iris_inst *inst, enum iris_buffer_type 
buffer_type);
 
 #endif
_______________________________________________
linuxtv-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to