Thank you for your contribution! Sashiko AI review found 1 potential issue(s) 
to consider:
- [Medium] drm/rockchip: missing s->color_space update in dw_hdmi_qp 
atomic_check()
--

commit 43d044058730a347faa3ac82bf806a1a71fe7cd1
Author: Jan Claußen <[email protected]>

drm/rockchip: dw_hdmi_qp: Advertise BT.709 and BT.2020 colorimetries

This commit populates plat_data.supported_colorspaces in
dw_hdmi_qp_rockchip_bind() to advertise BT.709 YCC, BT.2020 RGB, and
BT.2020 YCC colorimetries on the Rockchip DW HDMI QP connector.

> diff --git a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c 
> b/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c
> index 9c4cf68d79d50..dbb87dfd000c2 100644
> --- a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c
> +++ b/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c
> @@ -605,6 +605,10 @@ static int dw_hdmi_qp_rockchip_bind(struct device *dev, 
> struct device *master,
>                                     BIT(DRM_OUTPUT_COLOR_FORMAT_YCBCR444) |
>                                     BIT(DRM_OUTPUT_COLOR_FORMAT_YCBCR422);
>  
> +     plat_data.supported_colorspaces = BIT(DRM_MODE_COLORIMETRY_BT709_YCC) |
> +                                   BIT(DRM_MODE_COLORIMETRY_BT2020_RGB) |
> +                                   BIT(DRM_MODE_COLORIMETRY_BT2020_YCC);
> +

[Severity: Medium]
When userspace selects DRM_MODE_COLORIMETRY_BT2020_YCC or
DRM_MODE_COLORIMETRY_BT2020_RGB while the HDMI output format is YCbCr
(DRM_OUTPUT_COLOR_FORMAT_YCBCR444 or DRM_OUTPUT_COLOR_FORMAT_YCBCR422),
should dw_hdmi_qp_rockchip_encoder_atomic_check() also update s->color_space
from conn_state->colorspace?

On RK3588 and RK3576, RGB-to-YCbCr conversion is performed by VOP2 when the
bridge requests a YUV bus format (such as MEDIA_BUS_FMT_YUV8_1X24,
MEDIA_BUS_FMT_YUV10_1X30, or MEDIA_BUS_FMT_UYVY8_1X16). Both
vop2_setup_csc_mode() and vop2_bgcolor_setup() in
drivers/gpu/drm/rockchip/rockchip_drm_vop2.c rely on vcstate->color_space to
choose between CSC_BT2020L (for V4L2_COLORSPACE_BT2020) and CSC_BT709L:

drivers/gpu/drm/rockchip/rockchip_drm_vop2.c:vop2_setup_csc_mode() {
        int output_csc = vcstate->color_space;
        ...
        } else if (!is_input_yuv && is_output_yuv) {
                y2r_en = false;
                r2y_en = true;
                csc_mode = vop2_convert_csc_mode(output_csc);
        }
}

drivers/gpu/drm/rockchip/rockchip_drm_vop2.c:vop2_bgcolor_setup() {
        if (new_vcstate->yuv_overlay) {
                vop2_rgb16_to_yuv16(new_vcstate->color_space,
                                    DRM_ARGB64_GETR(bgcolor),
                                    DRM_ARGB64_GETG(bgcolor),
                                    DRM_ARGB64_GETB(bgcolor),
                                    &y, &cb, &cr);
}

Currently, dw_hdmi_qp_rockchip_encoder_atomic_check() never sets
s->color_space, and its early return check only compares tmds_char_rate,
output_bpc, and bus_format:

drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c:dw_hdmi_qp_rockchip_encoder_atomic_check()
 {
        if (hdmi->tmds_char_rate == conn_state->hdmi.tmds_char_rate &&
            s->output_bpc == conn_state->hdmi.output_bpc &&
            s->bus_format == ingest_fmt)
                return 0;
        ...
        if (!ret) {
                hdmi->tmds_char_rate = conn_state->hdmi.tmds_char_rate;
                s->output_type = DRM_MODE_CONNECTOR_HDMIA;
                s->output_bpc = conn_state->hdmi.output_bpc;
                s->bus_format = ingest_fmt;
        }
}

Without updating s->color_space, won't VOP2 leave vcstate->color_space at 0
(V4L2_COLORSPACE_DEFAULT) and convert RGB planes and the background color to
YCbCr using the Rec. 709 matrix (CSC_BT709L) while the HDMI AVI InfoFrame
signals BT.2020 colorimetry to the sink?

>       encoder = &hdmi->encoder.encoder;
>       encoder->possible_crtcs = drm_of_find_possible_crtcs(drm, dev->of_node);
>

-- 
Sashiko AI review · 
https://sashiko.dev/#/patchset/[email protected]?part=6

Reply via email to