Re: [PATCH v7 04/18] media: iris: Filter UBWC raw formats based on hardware capabilities
From: Vishnu Reddy
Date: Thu Jul 16 2026 - 23:47:07 EST
On 7/9/2026 7:11 PM, Dmitry Baryshkov wrote:
> From: Dikshita Agarwal <dikshita.agarwal@xxxxxxxxxxxxxxxx>
>
> The raw formats supported by Iris were previously advertised
> unconditionally, assuming UBWC support on all platforms. However, some
> platforms do not support UBWC which results in incorrect format
> capability exposure.
>
> Use the UBWC configuration provided by the platform to dynamically
> filter raw formats at runtime. If UBWC is not supported, UBWC-based
> formats are omitted from the advertised capability list, while linear
> formats remain available.
>
> Signed-off-by: Dikshita Agarwal <dikshita.agarwal@xxxxxxxxxxxxxxxx>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@xxxxxxxxxxxxxxxx>
> ---
> drivers/media/platform/qcom/iris/iris_vdec.c | 26 ++++++++++++++++++++++----
> drivers/media/platform/qcom/iris/iris_venc.c | 25 +++++++++++++++++++++----
> 2 files changed, 43 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/media/platform/qcom/iris/iris_vdec.c b/drivers/media/platform/qcom/iris/iris_vdec.c
> index 4c8bc7aac135..9fee5f28097d 100644
> --- a/drivers/media/platform/qcom/iris/iris_vdec.c
> +++ b/drivers/media/platform/qcom/iris/iris_vdec.c
> @@ -3,6 +3,7 @@
> * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
> */
>
> +#include <linux/soc/qcom/ubwc.h>
> #include <media/v4l2-event.h>
> #include <media/v4l2-mem2mem.h>
>
> @@ -69,8 +70,14 @@ static const u32 iris_vdec_formats_cap[] = {
> V4L2_PIX_FMT_QC10C,
> };
>
> +static const u32 iris_vdec_formats_noubwc_cap[] = {
> + V4L2_PIX_FMT_NV12,
> + V4L2_PIX_FMT_P010,
> +};
> +
> static bool check_format(struct iris_inst *inst, u32 pixfmt, u32 type)
> {
> + const struct qcom_ubwc_cfg_data *ubwc = inst->core->ubwc_cfg;
> unsigned int size, i;
> const u32 *fmt;
>
> @@ -80,8 +87,13 @@ static bool check_format(struct iris_inst *inst, u32 pixfmt, u32 type)
> size = inst->core->iris_platform_data->inst_iris_fmts_size;
> break;
> case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
> - fmt = iris_vdec_formats_cap;
> - size = ARRAY_SIZE(iris_vdec_formats_cap);
> + if (ubwc->ubwc_enc_version) {
> + fmt = iris_vdec_formats_cap;
> + size = ARRAY_SIZE(iris_vdec_formats_cap);
> + } else {
> + fmt = iris_vdec_formats_noubwc_cap;
> + size = ARRAY_SIZE(iris_vdec_formats_noubwc_cap);
> + }
> break;
> default:
> return false;
> @@ -110,6 +122,7 @@ static bool check_format(struct iris_inst *inst, u32 pixfmt, u32 type)
>
> static u32 find_format_by_index(struct iris_inst *inst, u32 index, u32 type)
> {
> + const struct qcom_ubwc_cfg_data *ubwc = inst->core->ubwc_cfg;
> unsigned int size;
> const u32 *fmt;
>
> @@ -119,8 +132,13 @@ static u32 find_format_by_index(struct iris_inst *inst, u32 index, u32 type)
> size = inst->core->iris_platform_data->inst_iris_fmts_size;
> break;
> case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
> - fmt = iris_vdec_formats_cap;
> - size = ARRAY_SIZE(iris_vdec_formats_cap);
> + if (ubwc->ubwc_enc_version) {
> + fmt = iris_vdec_formats_cap;
> + size = ARRAY_SIZE(iris_vdec_formats_cap);
> + } else {
> + fmt = iris_vdec_formats_noubwc_cap;
> + size = ARRAY_SIZE(iris_vdec_formats_noubwc_cap);
> + }
> break;
> default:
> return 0;
> diff --git a/drivers/media/platform/qcom/iris/iris_venc.c b/drivers/media/platform/qcom/iris/iris_venc.c
> index 16c52ad07e2c..2f2c56bf9122 100644
> --- a/drivers/media/platform/qcom/iris/iris_venc.c
> +++ b/drivers/media/platform/qcom/iris/iris_venc.c
> @@ -3,6 +3,7 @@
> * Copyright (c) 2022-2025 Qualcomm Innovation Center, Inc. All rights reserved.
> */
>
> +#include <linux/soc/qcom/ubwc.h>
> #include <media/v4l2-event.h>
> #include <media/v4l2-mem2mem.h>
>
> @@ -89,15 +90,25 @@ static const u32 iris_venc_formats_out[] = {
> V4L2_PIX_FMT_QC08C,
> };
>
> +static const u32 iris_venc_formats_noubwc_out[] = {
> + V4L2_PIX_FMT_NV12,
> +};
> +
> static bool check_format(struct iris_inst *inst, u32 pixfmt, u32 type)
> {
> + const struct qcom_ubwc_cfg_data *ubwc = inst->core->ubwc_cfg;
> unsigned int size, i;
> const u32 *fmt;
>
> switch (type) {
> case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
> - fmt = iris_venc_formats_out;
> - size = ARRAY_SIZE(iris_venc_formats_out);
> + if (ubwc->ubwc_enc_version) {
> + fmt = iris_venc_formats_out;
> + size = ARRAY_SIZE(iris_venc_formats_out);
> + } else {
> + fmt = iris_venc_formats_noubwc_out;
> + size = ARRAY_SIZE(iris_venc_formats_noubwc_out);
> + }
> break;
> case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
> fmt = iris_venc_formats_cap;
> @@ -117,13 +128,19 @@ static bool check_format(struct iris_inst *inst, u32 pixfmt, u32 type)
>
> static u32 find_format_by_index(struct iris_inst *inst, u32 index, u32 type)
> {
> + const struct qcom_ubwc_cfg_data *ubwc = inst->core->ubwc_cfg;
> unsigned int size;
> const u32 *fmt;
>
> switch (type) {
> case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
> - fmt = iris_venc_formats_out;
> - size = ARRAY_SIZE(iris_venc_formats_out);
> + if (ubwc->ubwc_enc_version) {
> + fmt = iris_venc_formats_out;
> + size = ARRAY_SIZE(iris_venc_formats_out);
> + } else {
> + fmt = iris_venc_formats_noubwc_out;
> + size = ARRAY_SIZE(iris_venc_formats_noubwc_out);
> + }
> break;
> case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
> fmt = iris_venc_formats_cap;
Reviewed-by: Vishnu Reddy <busanna.reddy@xxxxxxxxxxxxxxxx>