On Tue, 28 Feb 2012 10:21:45 +0100
Lars-Peter Clausen <lars at metafoo.de> wrote:

> The CEA extension block has a field which describes which YCbCr modes are
> supported by the device, use it to fill the drm_display_info color_formats
> fields. Also the existence of a CEA extension block is used as indication
> that the device supports RGB.
> 
> Signed-off-by: Lars-Peter Clausen <lars at 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];
>  }
>  
>  /**

Reviewed-by: Jesse Barnes <jbarnes at virtuousgeek.org>

-- 
Jesse Barnes, Intel Open Source Technology Center
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: not available
URL: 
<http://lists.freedesktop.org/archives/dri-devel/attachments/20120228/e9744cb9/attachment.pgp>

Reply via email to