The CEA extension block has a field which contains the YCbCr modes supported by
the device. Use the information from this field to initialize the
drm_display_info color_formats. Also the existence of a CEA extension block
should allow us to assume that the device supports RGB.

Signed-off-by: Lars-Peter Clausen <l...@metafoo.de>
---
 drivers/gpu/drm/drm_edid.c |   31 +++++++++++++++++++++----------
 1 files changed, 21 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index a6bb2f5..390aeca 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -1313,6 +1313,8 @@ add_detailed_modes(struct drm_connector *connector, 
struct edid *edid,
 #define VENDOR_BLOCK    0x03
 #define SPEAKER_BLOCK  0x04
 #define EDID_BASIC_AUDIO       (1 << 6)
+#define EDID_CEA_YCRCB444      (1 << 5)
+#define EDID_CEA_YCRCB422      (1 << 4)
 
 /**
  * Search EDID for CEA extension block.
@@ -1667,13 +1669,29 @@ static void drm_add_display_info(struct edid *edid,
        info->bpc = 0;
        info->color_formats = 0;
 
-       /* Only defined for 1.4 with digital displays */
-       if (edid->revision < 4)
+       if (edid->revision < 3)
                return;
 
        if (!(edid->input & DRM_EDID_INPUT_DIGITAL))
                return;
 
+       /* Get data from CEA blocks if present */
+       edid_ext = drm_find_cea_extension(edid);
+       if (edid_ext) {
+               info->cea_rev = edid_ext[1];
+
+               /* The existence of a CEA block should imply RGB support */
+               info->color_formats = DRM_COLOR_FORMAT_RGB444;
+               if (edid_ext[3] & EDID_CEA_YCRCB444)
+                       info->color_formats |= DRM_COLOR_FORMAT_YCRCB444;
+               if (edid_ext[3] & EDID_CEA_YCRCB422)
+                       info->color_formats |= DRM_COLOR_FORMAT_YCRCB422;
+       }
+
+       /* Only defined for 1.4 with digital displays */
+       if (edid->revision < 4)
+               return;
+
        switch (edid->input & DRM_EDID_DIGITAL_DEPTH_MASK) {
        case DRM_EDID_DIGITAL_DEPTH_6:
                info->bpc = 6;
@@ -1699,18 +1717,11 @@ static void drm_add_display_info(struct edid *edid,
                break;
        }
 
-       info->color_formats = DRM_COLOR_FORMAT_RGB444;
+       info->color_formats |= DRM_COLOR_FORMAT_RGB444;
        if (edid->features & DRM_EDID_FEATURE_RGB_YCRCB444)
                info->color_formats |= DRM_COLOR_FORMAT_YCRCB444;
        if (edid->features & DRM_EDID_FEATURE_RGB_YCRCB422)
                info->color_formats |= DRM_COLOR_FORMAT_YCRCB422;
-
-       /* Get data from CEA blocks if present */
-       edid_ext = drm_find_cea_extension(edid);
-       if (!edid_ext)
-               return;
-
-       info->cea_rev = edid_ext[1];
 }
 
 /**
-- 
1.7.9

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to