Skip to content

Commit d5780ea

Browse files
author
Dikshita Agarwal
committed
FROMLIST: media: iris: Add platform capabilities for HEVC and VP9 decoders
Add platform capabilities for HEVC and VP9 codecs in decoder driver with related hooks. Link: https://lore.kernel.org/linux-arm-msm/20250509-video-iris-hevc-vp9-v5-23-59b4ff7d331c@quicinc.com/ Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> 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 Tested-by: Vikash Garodia <quic_vgarodia@quicinc.com> # on sa8775p-ride Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
1 parent 5bec609 commit d5780ea

File tree

7 files changed

+266
-39
lines changed

7 files changed

+266
-39
lines changed

drivers/media/platform/qcom/iris/iris_ctrls.c

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,19 @@ static enum platform_inst_fw_cap_type iris_get_cap_id(u32 id)
1818
{
1919
switch (id) {
2020
case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
21-
return PROFILE;
21+
return PROFILE_H264;
22+
case V4L2_CID_MPEG_VIDEO_HEVC_PROFILE:
23+
return PROFILE_HEVC;
24+
case V4L2_CID_MPEG_VIDEO_VP9_PROFILE:
25+
return PROFILE_VP9;
2226
case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
23-
return LEVEL;
27+
return LEVEL_H264;
28+
case V4L2_CID_MPEG_VIDEO_HEVC_LEVEL:
29+
return LEVEL_HEVC;
30+
case V4L2_CID_MPEG_VIDEO_VP9_LEVEL:
31+
return LEVEL_VP9;
32+
case V4L2_CID_MPEG_VIDEO_HEVC_TIER:
33+
return TIER;
2434
default:
2535
return INST_FW_CAP_MAX;
2636
}
@@ -32,10 +42,20 @@ static u32 iris_get_v4l2_id(enum platform_inst_fw_cap_type cap_id)
3242
return 0;
3343

3444
switch (cap_id) {
35-
case PROFILE:
45+
case PROFILE_H264:
3646
return V4L2_CID_MPEG_VIDEO_H264_PROFILE;
37-
case LEVEL:
47+
case PROFILE_HEVC:
48+
return V4L2_CID_MPEG_VIDEO_HEVC_PROFILE;
49+
case PROFILE_VP9:
50+
return V4L2_CID_MPEG_VIDEO_VP9_PROFILE;
51+
case LEVEL_H264:
3852
return V4L2_CID_MPEG_VIDEO_H264_LEVEL;
53+
case LEVEL_HEVC:
54+
return V4L2_CID_MPEG_VIDEO_HEVC_LEVEL;
55+
case LEVEL_VP9:
56+
return V4L2_CID_MPEG_VIDEO_VP9_LEVEL;
57+
case TIER:
58+
return V4L2_CID_MPEG_VIDEO_HEVC_TIER;
3959
default:
4060
return 0;
4161
}

drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,19 @@ static int iris_hfi_gen2_set_profile(struct iris_inst *inst)
295295
{
296296
struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
297297
u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
298-
u32 profile = inst->fw_caps[PROFILE].value;
298+
u32 profile = 0;
299+
300+
switch (inst->codec) {
301+
case V4L2_PIX_FMT_HEVC:
302+
profile = inst->fw_caps[PROFILE_HEVC].value;
303+
break;
304+
case V4L2_PIX_FMT_VP9:
305+
profile = inst->fw_caps[PROFILE_VP9].value;
306+
break;
307+
case V4L2_PIX_FMT_H264:
308+
profile = inst->fw_caps[PROFILE_H264].value;
309+
break;
310+
}
299311

300312
inst_hfi_gen2->src_subcr_params.profile = profile;
301313

@@ -312,7 +324,19 @@ static int iris_hfi_gen2_set_level(struct iris_inst *inst)
312324
{
313325
struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
314326
u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
315-
u32 level = inst->fw_caps[LEVEL].value;
327+
u32 level = 0;
328+
329+
switch (inst->codec) {
330+
case V4L2_PIX_FMT_HEVC:
331+
level = inst->fw_caps[LEVEL_HEVC].value;
332+
break;
333+
case V4L2_PIX_FMT_VP9:
334+
level = inst->fw_caps[LEVEL_VP9].value;
335+
break;
336+
case V4L2_PIX_FMT_H264:
337+
level = inst->fw_caps[LEVEL_H264].value;
338+
break;
339+
}
316340

317341
inst_hfi_gen2->src_subcr_params.level = level;
318342

drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
#define HFI_PROP_CROP_OFFSETS 0x03000105
4747
#define HFI_PROP_PROFILE 0x03000107
4848
#define HFI_PROP_LEVEL 0x03000108
49+
#define HFI_PROP_TIER 0x03000109
4950
#define HFI_PROP_STAGE 0x0300010a
5051
#define HFI_PROP_PIPE 0x0300010b
5152
#define HFI_PROP_LUMA_CHROMA_BIT_DEPTH 0x0300010f

drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -571,8 +571,21 @@ static void iris_hfi_gen2_read_input_subcr_params(struct iris_inst *inst)
571571
inst->crop.width = pixmp_ip->width -
572572
((subsc_params.crop_offsets[1] >> 16) & 0xFFFF) - inst->crop.left;
573573

574-
inst->fw_caps[PROFILE].value = subsc_params.profile;
575-
inst->fw_caps[LEVEL].value = subsc_params.level;
574+
switch (inst->codec) {
575+
case V4L2_PIX_FMT_HEVC:
576+
inst->fw_caps[PROFILE_HEVC].value = subsc_params.profile;
577+
inst->fw_caps[LEVEL_HEVC].value = subsc_params.level;
578+
break;
579+
case V4L2_PIX_FMT_VP9:
580+
inst->fw_caps[PROFILE_VP9].value = subsc_params.profile;
581+
inst->fw_caps[LEVEL_VP9].value = subsc_params.level;
582+
break;
583+
case V4L2_PIX_FMT_H264:
584+
inst->fw_caps[PROFILE_H264].value = subsc_params.profile;
585+
inst->fw_caps[LEVEL_H264].value = subsc_params.level;
586+
break;
587+
}
588+
576589
inst->fw_caps[POC].value = subsc_params.pic_order_cnt;
577590

578591
if (subsc_params.bit_depth != BIT_DEPTH_8 ||
@@ -796,8 +809,21 @@ static void iris_hfi_gen2_init_src_change_param(struct iris_inst *inst)
796809
full_range, video_format,
797810
video_signal_type_present_flag);
798811

799-
subsc_params->profile = inst->fw_caps[PROFILE].value;
800-
subsc_params->level = inst->fw_caps[LEVEL].value;
812+
switch (inst->codec) {
813+
case V4L2_PIX_FMT_HEVC:
814+
subsc_params->profile = inst->fw_caps[PROFILE_HEVC].value;
815+
subsc_params->level = inst->fw_caps[LEVEL_HEVC].value;
816+
break;
817+
case V4L2_PIX_FMT_VP9:
818+
subsc_params->profile = inst->fw_caps[PROFILE_VP9].value;
819+
subsc_params->level = inst->fw_caps[LEVEL_VP9].value;
820+
break;
821+
case V4L2_PIX_FMT_H264:
822+
subsc_params->profile = inst->fw_caps[PROFILE_H264].value;
823+
subsc_params->level = inst->fw_caps[LEVEL_H264].value;
824+
break;
825+
}
826+
801827
subsc_params->pic_order_cnt = inst->fw_caps[POC].value;
802828
subsc_params->bit_depth = inst->fw_caps[BIT_DEPTH].value;
803829
if (inst->fw_caps[CODED_FRAMES].value ==

drivers/media/platform/qcom/iris/iris_platform_common.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,12 @@ struct platform_inst_caps {
8181
};
8282

8383
enum platform_inst_fw_cap_type {
84-
PROFILE = 1,
85-
LEVEL,
84+
PROFILE_H264 = 1,
85+
PROFILE_HEVC,
86+
PROFILE_VP9,
87+
LEVEL_H264,
88+
LEVEL_HEVC,
89+
LEVEL_VP9,
8690
INPUT_BUF_HOST_MAX_COUNT,
8791
STAGE,
8892
PIPE,

drivers/media/platform/qcom/iris/iris_platform_gen2.c

Lines changed: 78 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
static struct platform_inst_fw_cap inst_fw_cap_sm8550[] = {
1919
{
20-
.cap_id = PROFILE,
20+
.cap_id = PROFILE_H264,
2121
.min = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE,
2222
.max = V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH,
2323
.step_or_mask = BIT(V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) |
@@ -31,7 +31,29 @@ static struct platform_inst_fw_cap inst_fw_cap_sm8550[] = {
3131
.set = iris_set_u32_enum,
3232
},
3333
{
34-
.cap_id = LEVEL,
34+
.cap_id = PROFILE_HEVC,
35+
.min = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN,
36+
.max = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE,
37+
.step_or_mask = BIT(V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN) |
38+
BIT(V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE),
39+
.value = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN,
40+
.hfi_id = HFI_PROP_PROFILE,
41+
.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
42+
.set = iris_set_u32_enum,
43+
},
44+
{
45+
.cap_id = PROFILE_VP9,
46+
.min = V4L2_MPEG_VIDEO_VP9_PROFILE_0,
47+
.max = V4L2_MPEG_VIDEO_VP9_PROFILE_2,
48+
.step_or_mask = BIT(V4L2_MPEG_VIDEO_VP9_PROFILE_0) |
49+
BIT(V4L2_MPEG_VIDEO_VP9_PROFILE_2),
50+
.value = V4L2_MPEG_VIDEO_VP9_PROFILE_0,
51+
.hfi_id = HFI_PROP_PROFILE,
52+
.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
53+
.set = iris_set_u32_enum,
54+
},
55+
{
56+
.cap_id = LEVEL_H264,
3557
.min = V4L2_MPEG_VIDEO_H264_LEVEL_1_0,
3658
.max = V4L2_MPEG_VIDEO_H264_LEVEL_6_2,
3759
.step_or_mask = BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_0) |
@@ -59,6 +81,60 @@ static struct platform_inst_fw_cap inst_fw_cap_sm8550[] = {
5981
.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
6082
.set = iris_set_u32_enum,
6183
},
84+
{
85+
.cap_id = LEVEL_HEVC,
86+
.min = V4L2_MPEG_VIDEO_HEVC_LEVEL_1,
87+
.max = V4L2_MPEG_VIDEO_HEVC_LEVEL_6_2,
88+
.step_or_mask = BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_1) |
89+
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_2) |
90+
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_2_1) |
91+
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_3) |
92+
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_3_1) |
93+
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_4) |
94+
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_4_1) |
95+
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_5) |
96+
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1) |
97+
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_5_2) |
98+
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_6) |
99+
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_6_1) |
100+
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_6_2),
101+
.value = V4L2_MPEG_VIDEO_HEVC_LEVEL_6_1,
102+
.hfi_id = HFI_PROP_LEVEL,
103+
.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
104+
.set = iris_set_u32_enum,
105+
},
106+
{
107+
.cap_id = LEVEL_VP9,
108+
.min = V4L2_MPEG_VIDEO_VP9_LEVEL_1_0,
109+
.max = V4L2_MPEG_VIDEO_VP9_LEVEL_6_0,
110+
.step_or_mask = BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_1_0) |
111+
BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_1_1) |
112+
BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_2_0) |
113+
BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_2_1) |
114+
BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_3_0) |
115+
BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_3_1) |
116+
BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_4_0) |
117+
BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_4_1) |
118+
BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_5_0) |
119+
BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_5_1) |
120+
BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_5_2) |
121+
BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_6_0),
122+
.value = V4L2_MPEG_VIDEO_VP9_LEVEL_6_0,
123+
.hfi_id = HFI_PROP_LEVEL,
124+
.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
125+
.set = iris_set_u32_enum,
126+
},
127+
{
128+
.cap_id = TIER,
129+
.min = V4L2_MPEG_VIDEO_HEVC_TIER_MAIN,
130+
.max = V4L2_MPEG_VIDEO_HEVC_TIER_HIGH,
131+
.step_or_mask = BIT(V4L2_MPEG_VIDEO_HEVC_TIER_MAIN) |
132+
BIT(V4L2_MPEG_VIDEO_HEVC_TIER_HIGH),
133+
.value = V4L2_MPEG_VIDEO_HEVC_TIER_HIGH,
134+
.hfi_id = HFI_PROP_TIER,
135+
.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
136+
.set = iris_set_u32_enum,
137+
},
62138
{
63139
.cap_id = INPUT_BUF_HOST_MAX_COUNT,
64140
.min = DEFAULT_MAX_HOST_BUF_COUNT,

0 commit comments

Comments
 (0)