Provide the necessary constraints verification in
sink_supports_format_bpc() in order to support handling of YUV420
output format.

Signed-off-by: Cristian Ciocaltea <cristian.ciocal...@collabora.com>
---
 drivers/gpu/drm/display/drm_hdmi_state_helper.c | 39 +++++++++++++++++++++++--
 1 file changed, 36 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/display/drm_hdmi_state_helper.c 
b/drivers/gpu/drm/display/drm_hdmi_state_helper.c
index 
45b154c8abb2cc731bf4be472e58815cf47463d4..eb284032ea794838f333ce639243540fca91dbdb
 100644
--- a/drivers/gpu/drm/display/drm_hdmi_state_helper.c
+++ b/drivers/gpu/drm/display/drm_hdmi_state_helper.c
@@ -3,6 +3,7 @@
 #include <drm/drm_atomic.h>
 #include <drm/drm_connector.h>
 #include <drm/drm_edid.h>
+#include <drm/drm_modes.h>
 #include <drm/drm_print.h>
 
 #include <drm/display/drm_hdmi_audio_helper.h>
@@ -407,6 +408,11 @@ sink_supports_format_bpc(const struct drm_connector 
*connector,
                return false;
        }
 
+       if (drm_mode_is_420_only(info, mode) && format != 
HDMI_COLORSPACE_YUV420) {
+               drm_dbg_kms(dev, "Mode can be only supported in YUV420 
format.\n");
+               return false;
+       }
+
        switch (format) {
        case HDMI_COLORSPACE_RGB:
                drm_dbg_kms(dev, "RGB Format, checking the constraints.\n");
@@ -437,9 +443,36 @@ sink_supports_format_bpc(const struct drm_connector 
*connector,
                return true;
 
        case HDMI_COLORSPACE_YUV420:
-               /* TODO: YUV420 is unsupported at the moment. */
-               drm_dbg_kms(dev, "YUV420 format isn't supported yet.\n");
-               return false;
+               drm_dbg_kms(dev, "YUV420 format, checking the constraints.\n");
+
+               if (!(info->color_formats & DRM_COLOR_FORMAT_YCBCR420)) {
+                       drm_dbg_kms(dev, "Sink doesn't support YUV420.\n");
+                       return false;
+               }
+
+               if (!drm_mode_is_420(info, mode)) {
+                       drm_dbg_kms(dev, "Mode cannot be supported in YUV420 
format.\n");
+                       return false;
+               }
+
+               if (bpc == 10 && !(info->hdmi.y420_dc_modes & 
DRM_EDID_YCBCR420_DC_30)) {
+                       drm_dbg_kms(dev, "10 BPC but sink doesn't support Deep 
Color 30.\n");
+                       return false;
+               }
+
+               if (bpc == 12 && !(info->hdmi.y420_dc_modes & 
DRM_EDID_YCBCR420_DC_36)) {
+                       drm_dbg_kms(dev, "12 BPC but sink doesn't support Deep 
Color 36.\n");
+                       return false;
+               }
+
+               if (bpc == 16 && !(info->hdmi.y420_dc_modes & 
DRM_EDID_YCBCR420_DC_48)) {
+                       drm_dbg_kms(dev, "16 BPC but sink doesn't support Deep 
Color 48.\n");
+                       return false;
+               }
+
+               drm_dbg_kms(dev, "YUV420 format supported in that 
configuration.\n");
+
+               return true;
 
        case HDMI_COLORSPACE_YUV422:
                drm_dbg_kms(dev, "YUV422 format, checking the constraints.\n");

-- 
2.49.0

Reply via email to