diff mbox

[2/2] drm: parse color format support for digital displays

Message ID 1302896964-25462-2-git-send-email-jbarnes@virtuousgeek.org (mailing list archive)
State New, archived
Headers show

Commit Message

Jesse Barnes April 15, 2011, 7:49 p.m. UTC
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>
---
 drivers/gpu/drm/drm_edid.c |    6 ++++++
 include/drm/drm_crtc.h     |    5 ++++-
 include/drm/drm_edid.h     |    8 ++++++++
 3 files changed, 18 insertions(+), 1 deletions(-)

Comments

Dave Airlie April 15, 2011, 8:10 p.m. UTC | #1
> -
> +#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;
> +       unsigned long color_formats;

^ wtf?

unsigned long? its 2011.

Dave.
Jesse Barnes April 15, 2011, 8:39 p.m. UTC | #2
On Sat, 16 Apr 2011 06:10:07 +1000
Dave Airlie <airlied@gmail.com> wrote:

> > -
> > +#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;
> > +       unsigned long color_formats;
> 
> ^ wtf?
> 
> unsigned long? its 2011.

That doesn't tell me much about what you'd prefer...  I figured a
bitfield would be fairly extensible if new surface formats were added.
Maybe you're thinking it's not enough to support all the misc ones out
there though?
Dave Airlie April 15, 2011, 8:42 p.m. UTC | #3
On Sat, Apr 16, 2011 at 6:39 AM, Jesse Barnes <jbarnes@virtuousgeek.org> wrote:
> On Sat, 16 Apr 2011 06:10:07 +1000
> Dave Airlie <airlied@gmail.com> wrote:
>
>> > -
>> > +#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;
>> > +       unsigned long color_formats;
>>
>> ^ wtf?
>>
>> unsigned long? its 2011.
>
> That doesn't tell me much about what you'd prefer...  I figured a
> bitfield would be fairly extensible if new surface formats were added.
> Maybe you're thinking it's not enough to support all the misc ones out
> there though?

Its unsigned long, its a different size on 32 and 64-bit, not
something I want to fall
over when you add the 33rd bit field.

Dave.
Jesse Barnes April 15, 2011, 8:45 p.m. UTC | #4
On Sat, 16 Apr 2011 06:42:44 +1000
Dave Airlie <airlied@gmail.com> wrote:

> On Sat, Apr 16, 2011 at 6:39 AM, Jesse Barnes <jbarnes@virtuousgeek.org> wrote:
> > On Sat, 16 Apr 2011 06:10:07 +1000
> > Dave Airlie <airlied@gmail.com> wrote:
> >
> >> > -
> >> > +#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;
> >> > +       unsigned long color_formats;
> >>
> >> ^ wtf?
> >>
> >> unsigned long? its 2011.
> >
> > That doesn't tell me much about what you'd prefer...  I figured a
> > bitfield would be fairly extensible if new surface formats were added.
> > Maybe you're thinking it's not enough to support all the misc ones out
> > there though?
> 
> Its unsigned long, its a different size on 32 and 64-bit, not
> something I want to fall
> over when you add the 33rd bit field.

I hope we don't get to more than 32, but sure I'll change it to u32 to
match some of the other flags.
diff mbox

Patch

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 3518e1e..0a9357c 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -1462,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;
 }
 
 /**
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index 4d8fbb0..d20aecb 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -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;
+	unsigned long color_formats;
 
 	char *raw_edid; /* if any */
 };
diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h
index 9b9bf94..eacb415 100644
--- a/include/drm/drm_edid.h
+++ b/include/drm/drm_edid.h
@@ -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)