Skip to content

Commit 3ea0343

Browse files
superna9999Bryan O'Donoghue
authored andcommitted
media: qcom: iris: gen2: add support for 10bit decoding
Add the necessary plumbing into the HFi Gen2 to signal the decoder the right 10bit pixel format and stride when in compressed mode. Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com> Tested-by: Wangao Wang <wangao.wang@oss.qualcomm.com> Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org> Signed-off-by: Bryan O'Donoghue <bod@kernel.org>
1 parent 7aa4969 commit 3ea0343

3 files changed

Lines changed: 76 additions & 4 deletions

File tree

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

Lines changed: 72 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -480,8 +480,20 @@ static int iris_hfi_gen2_set_colorformat(struct iris_inst *inst, u32 plane)
480480

481481
if (inst->domain == DECODER) {
482482
pixelformat = inst->fmt_dst->fmt.pix_mp.pixelformat;
483-
hfi_colorformat = pixelformat == V4L2_PIX_FMT_NV12 ?
484-
HFI_COLOR_FMT_NV12 : HFI_COLOR_FMT_NV12_UBWC;
483+
switch (pixelformat) {
484+
case V4L2_PIX_FMT_NV12:
485+
hfi_colorformat = HFI_COLOR_FMT_NV12;
486+
break;
487+
case V4L2_PIX_FMT_QC08C:
488+
hfi_colorformat = HFI_COLOR_FMT_NV12_UBWC;
489+
break;
490+
case V4L2_PIX_FMT_P010:
491+
hfi_colorformat = HFI_COLOR_FMT_P010;
492+
break;
493+
case V4L2_PIX_FMT_QC10C:
494+
hfi_colorformat = HFI_COLOR_FMT_TP10_UBWC;
495+
break;
496+
}
485497
} else {
486498
pixelformat = inst->fmt_src->fmt.pix_mp.pixelformat;
487499
hfi_colorformat = pixelformat == V4L2_PIX_FMT_NV12 ?
@@ -516,7 +528,8 @@ static int iris_hfi_gen2_set_linear_stride_scanline(struct iris_inst *inst, u32
516528
stride_uv = stride_y;
517529
scanline_uv = scanline_y / 2;
518530

519-
if (pixelformat != V4L2_PIX_FMT_NV12)
531+
if (pixelformat != V4L2_PIX_FMT_NV12 &&
532+
pixelformat != V4L2_PIX_FMT_P010)
520533
return 0;
521534

522535
payload[0] = stride_y << 16 | scanline_y;
@@ -531,6 +544,61 @@ static int iris_hfi_gen2_set_linear_stride_scanline(struct iris_inst *inst, u32
531544
sizeof(u64));
532545
}
533546

547+
static int iris_hfi_gen2_set_ubwc_stride_scanline(struct iris_inst *inst, u32 plane)
548+
{
549+
u32 meta_stride_y, meta_scanline_y, meta_stride_uv, meta_scanline_uv;
550+
u32 stride_y, scanline_y, stride_uv, scanline_uv;
551+
u32 port = iris_hfi_gen2_get_port(inst, plane);
552+
u32 pixelformat, width, height;
553+
u32 payload[4];
554+
555+
if (inst->domain != DECODER ||
556+
inst->fmt_src->fmt.pix_mp.pixelformat != V4L2_PIX_FMT_AV1)
557+
return 0;
558+
559+
pixelformat = inst->fmt_dst->fmt.pix_mp.pixelformat;
560+
width = inst->fmt_dst->fmt.pix_mp.width;
561+
height = inst->fmt_dst->fmt.pix_mp.height;
562+
563+
switch (pixelformat) {
564+
case V4L2_PIX_FMT_QC08C:
565+
stride_y = ALIGN(width, 128);
566+
scanline_y = ALIGN(height, 32);
567+
stride_uv = ALIGN(width, 128);
568+
scanline_uv = ALIGN((height + 1) >> 1, 32);
569+
meta_stride_y = ALIGN(DIV_ROUND_UP(width, 32), 64);
570+
meta_scanline_y = ALIGN(DIV_ROUND_UP(height, 8), 16);
571+
meta_stride_uv = ALIGN(DIV_ROUND_UP((width + 1) >> 1, 16), 64);
572+
meta_scanline_uv = ALIGN(DIV_ROUND_UP((height + 1) >> 1, 8), 16);
573+
break;
574+
case V4L2_PIX_FMT_QC10C:
575+
stride_y = ALIGN(width * 4 / 3, 256);
576+
scanline_y = ALIGN(height, 16);
577+
stride_uv = ALIGN(width * 4 / 3, 256);
578+
scanline_uv = ALIGN((height + 1) >> 1, 16);
579+
meta_stride_y = ALIGN(DIV_ROUND_UP(width, 48), 64);
580+
meta_scanline_y = ALIGN(DIV_ROUND_UP(height, 4), 16);
581+
meta_stride_uv = ALIGN(DIV_ROUND_UP((width + 1) >> 1, 24), 64);
582+
meta_scanline_uv = ALIGN(DIV_ROUND_UP((height + 1) >> 1, 4), 16);
583+
break;
584+
default:
585+
return 0;
586+
}
587+
588+
payload[0] = stride_y << 16 | scanline_y;
589+
payload[1] = stride_uv << 16 | scanline_uv;
590+
payload[2] = meta_stride_y << 16 | meta_scanline_y;
591+
payload[3] = meta_stride_uv << 16 | meta_scanline_uv;
592+
593+
return iris_hfi_gen2_session_set_property(inst,
594+
HFI_PROP_UBWC_STRIDE_SCANLINE,
595+
HFI_HOST_FLAGS_NONE,
596+
port,
597+
HFI_PAYLOAD_U32_ARRAY,
598+
&payload[0],
599+
sizeof(u32) * 4);
600+
}
601+
534602
static int iris_hfi_gen2_set_tier(struct iris_inst *inst, u32 plane)
535603
{
536604
u32 port = iris_hfi_gen2_get_port(inst, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
@@ -619,6 +687,7 @@ static int iris_hfi_gen2_session_set_config_params(struct iris_inst *inst, u32 p
619687
{HFI_PROP_OPB_ENABLE, iris_hfi_gen2_set_opb_enable },
620688
{HFI_PROP_COLOR_FORMAT, iris_hfi_gen2_set_colorformat },
621689
{HFI_PROP_LINEAR_STRIDE_SCANLINE, iris_hfi_gen2_set_linear_stride_scanline },
690+
{HFI_PROP_UBWC_STRIDE_SCANLINE, iris_hfi_gen2_set_ubwc_stride_scanline },
622691
{HFI_PROP_TIER, iris_hfi_gen2_set_tier },
623692
{HFI_PROP_FRAME_RATE, iris_hfi_gen2_set_frame_rate },
624693
{HFI_PROP_AV1_FILM_GRAIN_PRESENT, iris_hfi_gen2_set_film_grain },

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ enum hfi_flip {
136136
#define HFI_PROP_OPB_ENABLE 0x03000184
137137
#define HFI_PROP_AV1_TILE_ROWS_COLUMNS 0x03000187
138138
#define HFI_PROP_AV1_DRAP_CONFIG 0x03000189
139+
#define HFI_PROP_UBWC_STRIDE_SCANLINE 0x03000190
139140
#define HFI_PROP_COMV_BUFFER_COUNT 0x03000193
140141
#define HFI_PROP_AV1_UNIFORM_TILE_SPACING 0x03000197
141142
#define HFI_PROP_END 0x03FFFFFF

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ int iris_get_mbpf(struct iris_inst *inst)
3535
bool iris_split_mode_enabled(struct iris_inst *inst)
3636
{
3737
return inst->fmt_dst->fmt.pix_mp.pixelformat == V4L2_PIX_FMT_NV12 ||
38-
inst->fmt_dst->fmt.pix_mp.pixelformat == V4L2_PIX_FMT_QC08C;
38+
inst->fmt_dst->fmt.pix_mp.pixelformat == V4L2_PIX_FMT_QC08C ||
39+
inst->fmt_dst->fmt.pix_mp.pixelformat == V4L2_PIX_FMT_P010 ||
40+
inst->fmt_dst->fmt.pix_mp.pixelformat == V4L2_PIX_FMT_QC10C;
3941
}
4042

4143
bool iris_fmt_is_8bit(u32 pixelformat)

0 commit comments

Comments
 (0)