]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
media: iris: Set mandatory properties for HEVC and VP9 decoders.
authorDikshita Agarwal <quic_dikshita@quicinc.com>
Fri, 9 May 2025 08:39:10 +0000 (14:09 +0530)
committerHans Verkuil <hverkuil@xs4all.nl>
Thu, 3 Jul 2025 09:02:44 +0000 (11:02 +0200)
Subscribe and set mandatory properties to the firmware for HEVC and VP9
decoders.

Acked-by: Vikash Garodia <quic_vgarodia@quicinc.com>
Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8550-QRD
Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8550-HDK
Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8650-QRD
Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8650-HDK
Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
Tested-by: Vikash Garodia <quic_vgarodia@quicinc.com> # on sa8775p-ride
Signed-off-by: Bryan O'Donoghue <bod@kernel.org>
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
drivers/media/platform/qcom/iris/iris_hfi_common.h
drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
drivers/media/platform/qcom/iris/iris_platform_common.h
drivers/media/platform/qcom/iris/iris_platform_gen2.c
drivers/media/platform/qcom/iris/iris_platform_sm8250.c

index b2c541367fc6170ee06141c3de27d288a8b388ee..9e6aadb837830b46e4a68865583e28fc427cef0d 100644 (file)
@@ -140,6 +140,7 @@ struct hfi_subscription_params {
        u32     color_info;
        u32     profile;
        u32     level;
+       u32     tier;
 };
 
 u32 iris_hfi_get_v4l2_color_primaries(u32 hfi_primaries);
index dbb1b1dab09701ec614088d495f43640ecdb9f99..2e3f5a6b2ff11f273aecc4bae28399c260229af0 100644 (file)
@@ -776,8 +776,8 @@ static int iris_hfi_gen1_session_set_config_params(struct iris_inst *inst, u32 p
                        iris_hfi_gen1_set_bufsize},
        };
 
-       config_params = core->iris_platform_data->input_config_params;
-       config_params_size = core->iris_platform_data->input_config_params_size;
+       config_params = core->iris_platform_data->input_config_params_default;
+       config_params_size = core->iris_platform_data->input_config_params_default_size;
 
        if (V4L2_TYPE_IS_OUTPUT(plane)) {
                for (i = 0; i < config_params_size; i++) {
index 8c91d336ff7e25256c7d496c46a5e07f47cf1df2..7ca5ae13d62b95fdcf71ef70cb6abf446b2c6e5a 100644 (file)
@@ -391,11 +391,28 @@ static int iris_hfi_gen2_set_linear_stride_scanline(struct iris_inst *inst)
                                                  sizeof(u64));
 }
 
+static int iris_hfi_gen2_set_tier(struct iris_inst *inst)
+{
+       struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
+       u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
+       u32 tier = inst->fw_caps[TIER].value;
+
+       inst_hfi_gen2->src_subcr_params.tier = tier;
+
+       return iris_hfi_gen2_session_set_property(inst,
+                                                 HFI_PROP_TIER,
+                                                 HFI_HOST_FLAGS_NONE,
+                                                 port,
+                                                 HFI_PAYLOAD_U32_ENUM,
+                                                 &tier,
+                                                 sizeof(u32));
+}
+
 static int iris_hfi_gen2_session_set_config_params(struct iris_inst *inst, u32 plane)
 {
        struct iris_core *core = inst->core;
-       u32 config_params_size, i, j;
-       const u32 *config_params;
+       u32 config_params_size = 0, i, j;
+       const u32 *config_params = NULL;
        int ret;
 
        static const struct iris_hfi_prop_type_handle prop_type_handle_arr[] = {
@@ -410,11 +427,27 @@ static int iris_hfi_gen2_session_set_config_params(struct iris_inst *inst, u32 p
                {HFI_PROP_LEVEL,                      iris_hfi_gen2_set_level                  },
                {HFI_PROP_COLOR_FORMAT,               iris_hfi_gen2_set_colorformat            },
                {HFI_PROP_LINEAR_STRIDE_SCANLINE,     iris_hfi_gen2_set_linear_stride_scanline },
+               {HFI_PROP_TIER,                       iris_hfi_gen2_set_tier                   },
        };
 
        if (V4L2_TYPE_IS_OUTPUT(plane)) {
-               config_params = core->iris_platform_data->input_config_params;
-               config_params_size = core->iris_platform_data->input_config_params_size;
+               switch (inst->codec) {
+               case V4L2_PIX_FMT_H264:
+                       config_params = core->iris_platform_data->input_config_params_default;
+                       config_params_size =
+                               core->iris_platform_data->input_config_params_default_size;
+                       break;
+               case V4L2_PIX_FMT_HEVC:
+                       config_params = core->iris_platform_data->input_config_params_hevc;
+                       config_params_size =
+                               core->iris_platform_data->input_config_params_hevc_size;
+                       break;
+               case V4L2_PIX_FMT_VP9:
+                       config_params = core->iris_platform_data->input_config_params_vp9;
+                       config_params_size =
+                               core->iris_platform_data->input_config_params_vp9_size;
+                       break;
+               }
        } else {
                config_params = core->iris_platform_data->output_config_params;
                config_params_size = core->iris_platform_data->output_config_params_size;
@@ -584,8 +617,8 @@ static int iris_hfi_gen2_subscribe_change_param(struct iris_inst *inst, u32 plan
        struct hfi_subscription_params subsc_params;
        u32 prop_type, payload_size, payload_type;
        struct iris_core *core = inst->core;
-       const u32 *change_param;
-       u32 change_param_size;
+       const u32 *change_param = NULL;
+       u32 change_param_size = 0;
        u32 payload[32] = {0};
        u32 hfi_port = 0, i;
        int ret;
@@ -596,8 +629,23 @@ static int iris_hfi_gen2_subscribe_change_param(struct iris_inst *inst, u32 plan
                return 0;
        }
 
-       change_param = core->iris_platform_data->input_config_params;
-       change_param_size = core->iris_platform_data->input_config_params_size;
+       switch (inst->codec) {
+       case V4L2_PIX_FMT_H264:
+               change_param = core->iris_platform_data->input_config_params_default;
+               change_param_size =
+                       core->iris_platform_data->input_config_params_default_size;
+               break;
+       case V4L2_PIX_FMT_HEVC:
+               change_param = core->iris_platform_data->input_config_params_hevc;
+               change_param_size =
+                       core->iris_platform_data->input_config_params_hevc_size;
+               break;
+       case V4L2_PIX_FMT_VP9:
+               change_param = core->iris_platform_data->input_config_params_vp9;
+               change_param_size =
+                       core->iris_platform_data->input_config_params_vp9_size;
+               break;
+       }
 
        payload[0] = HFI_MODE_PORT_SETTINGS_CHANGE;
 
@@ -644,6 +692,11 @@ static int iris_hfi_gen2_subscribe_change_param(struct iris_inst *inst, u32 plan
                                payload_size = sizeof(u32);
                                payload_type = HFI_PAYLOAD_U32;
                                break;
+                       case HFI_PROP_LUMA_CHROMA_BIT_DEPTH:
+                               payload[0] = subsc_params.bit_depth;
+                               payload_size = sizeof(u32);
+                               payload_type = HFI_PAYLOAD_U32;
+                               break;
                        case HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT:
                                payload[0] = subsc_params.fw_min_count;
                                payload_size = sizeof(u32);
@@ -669,6 +722,11 @@ static int iris_hfi_gen2_subscribe_change_param(struct iris_inst *inst, u32 plan
                                payload_size = sizeof(u32);
                                payload_type = HFI_PAYLOAD_U32;
                                break;
+                       case HFI_PROP_TIER:
+                               payload[0] = subsc_params.tier;
+                               payload_size = sizeof(u32);
+                               payload_type = HFI_PAYLOAD_U32;
+                               break;
                        default:
                                prop_type = 0;
                                ret = -EINVAL;
@@ -695,8 +753,8 @@ static int iris_hfi_gen2_subscribe_change_param(struct iris_inst *inst, u32 plan
 static int iris_hfi_gen2_subscribe_property(struct iris_inst *inst, u32 plane)
 {
        struct iris_core *core = inst->core;
-       u32 subscribe_prop_size, i;
-       const u32 *subcribe_prop;
+       u32 subscribe_prop_size = 0, i;
+       const u32 *subcribe_prop = NULL;
        u32 payload[32] = {0};
 
        payload[0] = HFI_MODE_PROPERTY;
@@ -705,8 +763,23 @@ static int iris_hfi_gen2_subscribe_property(struct iris_inst *inst, u32 plane)
                subscribe_prop_size = core->iris_platform_data->dec_input_prop_size;
                subcribe_prop = core->iris_platform_data->dec_input_prop;
        } else {
-               subscribe_prop_size = core->iris_platform_data->dec_output_prop_size;
-               subcribe_prop = core->iris_platform_data->dec_output_prop;
+               switch (inst->codec) {
+               case V4L2_PIX_FMT_H264:
+                       subcribe_prop = core->iris_platform_data->dec_output_prop_avc;
+                       subscribe_prop_size =
+                               core->iris_platform_data->dec_output_prop_avc_size;
+                       break;
+               case V4L2_PIX_FMT_HEVC:
+                       subcribe_prop = core->iris_platform_data->dec_output_prop_hevc;
+                       subscribe_prop_size =
+                               core->iris_platform_data->dec_output_prop_hevc_size;
+                       break;
+               case V4L2_PIX_FMT_VP9:
+                       subcribe_prop = core->iris_platform_data->dec_output_prop_vp9;
+                       subscribe_prop_size =
+                               core->iris_platform_data->dec_output_prop_vp9_size;
+                       break;
+               }
        }
 
        for (i = 0; i < subscribe_prop_size; i++)
index 8e54962414aeb6a834980fc31d340d34b6ee0992..a8c30fc5c0d0668cc9980f2fcfcf21072cf9ef0a 100644 (file)
@@ -587,6 +587,7 @@ static void iris_hfi_gen2_read_input_subcr_params(struct iris_inst *inst)
        }
 
        inst->fw_caps[POC].value = subsc_params.pic_order_cnt;
+       inst->fw_caps[TIER].value = subsc_params.tier;
 
        if (subsc_params.bit_depth != BIT_DEPTH_8 ||
            !(subsc_params.coded_frames & HFI_BITMASK_FRAME_MBS_ONLY_FLAG)) {
@@ -668,6 +669,9 @@ static int iris_hfi_gen2_handle_session_property(struct iris_inst *inst,
                inst_hfi_gen2->src_subcr_params.crop_offsets[0] = pkt->payload[0];
                inst_hfi_gen2->src_subcr_params.crop_offsets[1] = pkt->payload[1];
                break;
+       case HFI_PROP_LUMA_CHROMA_BIT_DEPTH:
+               inst_hfi_gen2->src_subcr_params.bit_depth = pkt->payload[0];
+               break;
        case HFI_PROP_CODED_FRAMES:
                inst_hfi_gen2->src_subcr_params.coded_frames = pkt->payload[0];
                break;
@@ -686,6 +690,9 @@ static int iris_hfi_gen2_handle_session_property(struct iris_inst *inst,
        case HFI_PROP_LEVEL:
                inst_hfi_gen2->src_subcr_params.level = pkt->payload[0];
                break;
+       case HFI_PROP_TIER:
+               inst_hfi_gen2->src_subcr_params.tier = pkt->payload[0];
+               break;
        case HFI_PROP_PICTURE_TYPE:
                inst_hfi_gen2->hfi_frame_info.picture_type = pkt->payload[0];
                break;
index 71d23214f224ce55aba7c8f13e06f9b1d3e7d19e..adafdce8a856f9c661aabc5ca28f0faceaa93551 100644 (file)
@@ -179,14 +179,22 @@ struct iris_platform_data {
        u32 max_session_count;
        /* max number of macroblocks per frame supported */
        u32 max_core_mbpf;
-       const u32 *input_config_params;
-       unsigned int input_config_params_size;
+       const u32 *input_config_params_default;
+       unsigned int input_config_params_default_size;
+       const u32 *input_config_params_hevc;
+       unsigned int input_config_params_hevc_size;
+       const u32 *input_config_params_vp9;
+       unsigned int input_config_params_vp9_size;
        const u32 *output_config_params;
        unsigned int output_config_params_size;
        const u32 *dec_input_prop;
        unsigned int dec_input_prop_size;
-       const u32 *dec_output_prop;
-       unsigned int dec_output_prop_size;
+       const u32 *dec_output_prop_avc;
+       unsigned int dec_output_prop_avc_size;
+       const u32 *dec_output_prop_hevc;
+       unsigned int dec_output_prop_hevc_size;
+       const u32 *dec_output_prop_vp9;
+       unsigned int dec_output_prop_vp9_size;
        const u32 *dec_ip_int_buf_tbl;
        unsigned int dec_ip_int_buf_tbl_size;
        const u32 *dec_op_int_buf_tbl;
index c2cded2876b74afbd1cd427c91df73905f23ca3f..d3026b2bcb708c7ec31f134f628df7e57b54af4f 100644 (file)
@@ -257,9 +257,10 @@ static struct tz_cp_config tz_cp_config_sm8550 = {
        .cp_nonpixel_size = 0x24800000,
 };
 
-static const u32 sm8550_vdec_input_config_params[] = {
+static const u32 sm8550_vdec_input_config_params_default[] = {
        HFI_PROP_BITSTREAM_RESOLUTION,
        HFI_PROP_CROP_OFFSETS,
+       HFI_PROP_LUMA_CHROMA_BIT_DEPTH,
        HFI_PROP_CODED_FRAMES,
        HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT,
        HFI_PROP_PIC_ORDER_CNT_TYPE,
@@ -268,6 +269,26 @@ static const u32 sm8550_vdec_input_config_params[] = {
        HFI_PROP_SIGNAL_COLOR_INFO,
 };
 
+static const u32 sm8550_vdec_input_config_param_hevc[] = {
+       HFI_PROP_BITSTREAM_RESOLUTION,
+       HFI_PROP_CROP_OFFSETS,
+       HFI_PROP_LUMA_CHROMA_BIT_DEPTH,
+       HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT,
+       HFI_PROP_PROFILE,
+       HFI_PROP_LEVEL,
+       HFI_PROP_TIER,
+       HFI_PROP_SIGNAL_COLOR_INFO,
+};
+
+static const u32 sm8550_vdec_input_config_param_vp9[] = {
+       HFI_PROP_BITSTREAM_RESOLUTION,
+       HFI_PROP_CROP_OFFSETS,
+       HFI_PROP_LUMA_CHROMA_BIT_DEPTH,
+       HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT,
+       HFI_PROP_PROFILE,
+       HFI_PROP_LEVEL,
+};
+
 static const u32 sm8550_vdec_output_config_params[] = {
        HFI_PROP_COLOR_FORMAT,
        HFI_PROP_LINEAR_STRIDE_SCANLINE,
@@ -277,11 +298,19 @@ static const u32 sm8550_vdec_subscribe_input_properties[] = {
        HFI_PROP_NO_OUTPUT,
 };
 
-static const u32 sm8550_vdec_subscribe_output_properties[] = {
+static const u32 sm8550_vdec_subscribe_output_properties_avc[] = {
        HFI_PROP_PICTURE_TYPE,
        HFI_PROP_CABAC_SESSION,
 };
 
+static const u32 sm8550_vdec_subscribe_output_properties_hevc[] = {
+       HFI_PROP_PICTURE_TYPE,
+};
+
+static const u32 sm8550_vdec_subscribe_output_properties_vp9[] = {
+       HFI_PROP_PICTURE_TYPE,
+};
+
 static const u32 sm8550_dec_ip_int_buf_tbl[] = {
        BUF_BIN,
        BUF_COMV,
@@ -325,18 +354,33 @@ struct iris_platform_data sm8550_data = {
        .num_vpp_pipe = 4,
        .max_session_count = 16,
        .max_core_mbpf = NUM_MBS_8K * 2,
-       .input_config_params =
-               sm8550_vdec_input_config_params,
-       .input_config_params_size =
-               ARRAY_SIZE(sm8550_vdec_input_config_params),
+       .input_config_params_default =
+               sm8550_vdec_input_config_params_default,
+       .input_config_params_default_size =
+               ARRAY_SIZE(sm8550_vdec_input_config_params_default),
+       .input_config_params_hevc =
+               sm8550_vdec_input_config_param_hevc,
+       .input_config_params_hevc_size =
+               ARRAY_SIZE(sm8550_vdec_input_config_param_hevc),
+       .input_config_params_vp9 =
+               sm8550_vdec_input_config_param_vp9,
+       .input_config_params_vp9_size =
+               ARRAY_SIZE(sm8550_vdec_input_config_param_vp9),
        .output_config_params =
                sm8550_vdec_output_config_params,
        .output_config_params_size =
                ARRAY_SIZE(sm8550_vdec_output_config_params),
        .dec_input_prop = sm8550_vdec_subscribe_input_properties,
        .dec_input_prop_size = ARRAY_SIZE(sm8550_vdec_subscribe_input_properties),
-       .dec_output_prop = sm8550_vdec_subscribe_output_properties,
-       .dec_output_prop_size = ARRAY_SIZE(sm8550_vdec_subscribe_output_properties),
+       .dec_output_prop_avc = sm8550_vdec_subscribe_output_properties_avc,
+       .dec_output_prop_avc_size =
+               ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_avc),
+       .dec_output_prop_hevc = sm8550_vdec_subscribe_output_properties_hevc,
+       .dec_output_prop_hevc_size =
+               ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_hevc),
+       .dec_output_prop_vp9 = sm8550_vdec_subscribe_output_properties_vp9,
+       .dec_output_prop_vp9_size =
+               ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_vp9),
 
        .dec_ip_int_buf_tbl = sm8550_dec_ip_int_buf_tbl,
        .dec_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_ip_int_buf_tbl),
@@ -385,18 +429,33 @@ struct iris_platform_data sm8650_data = {
        .num_vpp_pipe = 4,
        .max_session_count = 16,
        .max_core_mbpf = NUM_MBS_8K * 2,
-       .input_config_params =
-               sm8550_vdec_input_config_params,
-       .input_config_params_size =
-               ARRAY_SIZE(sm8550_vdec_input_config_params),
+       .input_config_params_default =
+               sm8550_vdec_input_config_params_default,
+       .input_config_params_default_size =
+               ARRAY_SIZE(sm8550_vdec_input_config_params_default),
+       .input_config_params_hevc =
+               sm8550_vdec_input_config_param_hevc,
+       .input_config_params_hevc_size =
+               ARRAY_SIZE(sm8550_vdec_input_config_param_hevc),
+       .input_config_params_vp9 =
+               sm8550_vdec_input_config_param_vp9,
+       .input_config_params_vp9_size =
+               ARRAY_SIZE(sm8550_vdec_input_config_param_vp9),
        .output_config_params =
                sm8550_vdec_output_config_params,
        .output_config_params_size =
                ARRAY_SIZE(sm8550_vdec_output_config_params),
        .dec_input_prop = sm8550_vdec_subscribe_input_properties,
        .dec_input_prop_size = ARRAY_SIZE(sm8550_vdec_subscribe_input_properties),
-       .dec_output_prop = sm8550_vdec_subscribe_output_properties,
-       .dec_output_prop_size = ARRAY_SIZE(sm8550_vdec_subscribe_output_properties),
+       .dec_output_prop_avc = sm8550_vdec_subscribe_output_properties_avc,
+       .dec_output_prop_avc_size =
+               ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_avc),
+       .dec_output_prop_hevc = sm8550_vdec_subscribe_output_properties_hevc,
+       .dec_output_prop_hevc_size =
+               ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_hevc),
+       .dec_output_prop_vp9 = sm8550_vdec_subscribe_output_properties_vp9,
+       .dec_output_prop_vp9_size =
+               ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_vp9),
 
        .dec_ip_int_buf_tbl = sm8550_dec_ip_int_buf_tbl,
        .dec_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_ip_int_buf_tbl),
@@ -441,18 +500,33 @@ struct iris_platform_data qcs8300_data = {
        .num_vpp_pipe = 2,
        .max_session_count = 16,
        .max_core_mbpf = ((4096 * 2176) / 256) * 4,
-       .input_config_params =
-               sm8550_vdec_input_config_params,
-       .input_config_params_size =
-               ARRAY_SIZE(sm8550_vdec_input_config_params),
+       .input_config_params_default =
+               sm8550_vdec_input_config_params_default,
+       .input_config_params_default_size =
+               ARRAY_SIZE(sm8550_vdec_input_config_params_default),
+       .input_config_params_hevc =
+               sm8550_vdec_input_config_param_hevc,
+       .input_config_params_hevc_size =
+               ARRAY_SIZE(sm8550_vdec_input_config_param_hevc),
+       .input_config_params_vp9 =
+               sm8550_vdec_input_config_param_vp9,
+       .input_config_params_vp9_size =
+               ARRAY_SIZE(sm8550_vdec_input_config_param_vp9),
        .output_config_params =
                sm8550_vdec_output_config_params,
        .output_config_params_size =
                ARRAY_SIZE(sm8550_vdec_output_config_params),
        .dec_input_prop = sm8550_vdec_subscribe_input_properties,
        .dec_input_prop_size = ARRAY_SIZE(sm8550_vdec_subscribe_input_properties),
-       .dec_output_prop = sm8550_vdec_subscribe_output_properties,
-       .dec_output_prop_size = ARRAY_SIZE(sm8550_vdec_subscribe_output_properties),
+       .dec_output_prop_avc = sm8550_vdec_subscribe_output_properties_avc,
+       .dec_output_prop_avc_size =
+               ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_avc),
+       .dec_output_prop_hevc = sm8550_vdec_subscribe_output_properties_hevc,
+       .dec_output_prop_hevc_size =
+               ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_hevc),
+       .dec_output_prop_vp9 = sm8550_vdec_subscribe_output_properties_vp9,
+       .dec_output_prop_vp9_size =
+               ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_vp9),
 
        .dec_ip_int_buf_tbl = sm8550_dec_ip_int_buf_tbl,
        .dec_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_ip_int_buf_tbl),
index 8183e4e95fa4e94e3fb20ff4849084da2472f7da..8d0816a67ae0b6886204ce93fa5ccafaac10392a 100644 (file)
@@ -128,9 +128,9 @@ struct iris_platform_data sm8250_data = {
        .num_vpp_pipe = 4,
        .max_session_count = 16,
        .max_core_mbpf = NUM_MBS_8K,
-       .input_config_params =
+       .input_config_params_default =
                sm8250_vdec_input_config_param_default,
-       .input_config_params_size =
+       .input_config_params_default_size =
                ARRAY_SIZE(sm8250_vdec_input_config_param_default),
 
        .dec_ip_int_buf_tbl = sm8250_dec_ip_int_buf_tbl,