drm: parse color format support for digital displays
Jesse Barnes [Fri, 15 Apr 2011 20:48:57 +0000 (13:48 -0700)]
EDID 1.4 digital displays report the color spaces they support in the
features block.  Add support for grabbing this data and stuffing it into
the display_info struct for driver use.

Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Reviewed-by: Alex Deucher <alexdeucher@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>

drivers/gpu/drm/drm_edid.c
include/drm/drm_crtc.h
include/drm/drm_edid.h

index fe0d3dc..0a9357c 100644 (file)
@@ -1429,6 +1429,7 @@ static void drm_add_display_info(struct edid *edid,
 
        /* driver figures it out in this case */
        info->bpc = 0;
+       info->color_formats = 0;
 
        /* Only defined for 1.4 with digital displays */
        if (edid->revision < 4)
@@ -1461,6 +1462,12 @@ static void drm_add_display_info(struct edid *edid,
                info->bpc = 0;
                break;
        }
+
+       info->color_formats = DRM_COLOR_FORMAT_RGB444;
+       if (info->color_formats & DRM_EDID_FEATURE_RGB_YCRCB444)
+               info->color_formats = DRM_COLOR_FORMAT_YCRCB444;
+       if (info->color_formats & DRM_EDID_FEATURE_RGB_YCRCB422)
+               info->color_formats = DRM_COLOR_FORMAT_YCRCB422;
 }
 
 /**
index ee1cb70..9573e0c 100644 (file)
@@ -183,7 +183,9 @@ enum subpixel_order {
        SubPixelNone,
 };
 
-
+#define DRM_COLOR_FORMAT_RGB444                (1<<0)
+#define DRM_COLOR_FORMAT_YCRCB444      (1<<1)
+#define DRM_COLOR_FORMAT_YCRCB422      (1<<2)
 /*
  * Describes a given display (e.g. CRT or flat panel) and its limitations.
  */
@@ -201,6 +203,7 @@ struct drm_display_info {
        unsigned int bpc;
 
        enum subpixel_order subpixel_order;
+       u32 color_formats;
 
        char *raw_edid; /* if any */
 };
index 9b9bf94..eacb415 100644 (file)
@@ -175,7 +175,15 @@ struct detailed_timing {
 #define DRM_EDID_FEATURE_DEFAULT_GTF      (1 << 0)
 #define DRM_EDID_FEATURE_PREFERRED_TIMING (1 << 1)
 #define DRM_EDID_FEATURE_STANDARD_COLOR   (1 << 2)
+/* If analog */
 #define DRM_EDID_FEATURE_DISPLAY_TYPE     (3 << 3) /* 00=mono, 01=rgb, 10=non-rgb, 11=unknown */
+/* If digital */
+#define DRM_EDID_FEATURE_COLOR_MASK      (3 << 3)
+#define DRM_EDID_FEATURE_RGB             (0 << 3)
+#define DRM_EDID_FEATURE_RGB_YCRCB444    (1 << 3)
+#define DRM_EDID_FEATURE_RGB_YCRCB422    (2 << 3)
+#define DRM_EDID_FEATURE_RGB_YCRCB       (3 << 3) /* both 4:4:4 and 4:2:2 */
+
 #define DRM_EDID_FEATURE_PM_ACTIVE_OFF    (1 << 5)
 #define DRM_EDID_FEATURE_PM_SUSPEND       (1 << 6)
 #define DRM_EDID_FEATURE_PM_STANDBY       (1 << 7)