Message ID | 1358356365-23191-4-git-send-email-ville.syrjala@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi 2013/1/16 <ville.syrjala@linux.intel.com>: > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > drm_rgb_quant_range_selectable() will report whether the monitor > claims to support for RGB quantization range selection. > > The information can be found in the CEA Video capability block. Looks correct (checked against the spec, did not really test). Reviewed-by: Paulo Zanoni <paulo.r.zanoni@intel.com> See below for optional bikeshedding: > > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > --- > drivers/gpu/drm/drm_edid.c | 33 +++++++++++++++++++++++++++++++++ > include/drm/drm_crtc.h | 1 + > 2 files changed, 34 insertions(+), 0 deletions(-) > > diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c > index 5a3770f..deba722 100644 > --- a/drivers/gpu/drm/drm_edid.c > +++ b/drivers/gpu/drm/drm_edid.c > @@ -1483,9 +1483,11 @@ add_detailed_modes(struct drm_connector *connector, struct edid *edid, > #define VIDEO_BLOCK 0x02 > #define VENDOR_BLOCK 0x03 > #define SPEAKER_BLOCK 0x04 > +#define VIDEO_CAPABILITY_BLOCK 0x07 > #define EDID_BASIC_AUDIO (1 << 6) > #define EDID_CEA_YCRCB444 (1 << 5) > #define EDID_CEA_YCRCB422 (1 << 4) > +#define EDID_CEA_VCDB_QS (1 << 6) > > /** > * Search EDID for CEA extension block. > @@ -1902,6 +1904,37 @@ end: > EXPORT_SYMBOL(drm_detect_monitor_audio); > > /** > + * drm_rgb_quant_range_selectable - is RGB quantization range selectable? > + * > + * Check whether the monitor reports the RGB quantization range selection > + * as supported. The AVI infoframe can then be used to inform the monitor > + * which quantzation range (full or limited) is used. s/quantzation/quantization/ > + */ > +bool drm_rgb_quant_range_selectable(struct edid *edid) > +{ > + u8 *edid_ext; > + int i, start, end; > + > + edid_ext = drm_find_cea_extension(edid); > + if (!edid_ext) > + return false; > + > + if (cea_db_offsets(edid_ext, &start, &end)) > + return false; > + > + for_each_cea_db(edid_ext, i, start, end) { > + if (cea_db_tag(&edid_ext[i]) == VIDEO_CAPABILITY_BLOCK && > + cea_db_payload_len(&edid_ext[i]) == 2) { > + DRM_DEBUG_KMS("CEA VCDB 0x%02x\n", edid_ext[i + 2]); > + return edid_ext[i + 2] & EDID_CEA_VCDB_QS; > + } > + } > + > + return false; > +} > +EXPORT_SYMBOL(drm_rgb_quant_range_selectable); > + > +/** > * drm_add_display_info - pull display info out if present > * @edid: EDID data > * @info: display info (attached to connector) > diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h > index 00d78b5..30892dc 100644 > --- a/include/drm/drm_crtc.h > +++ b/include/drm/drm_crtc.h > @@ -1033,6 +1033,7 @@ extern u8 *drm_find_cea_extension(struct edid *edid); > extern u8 drm_match_cea_mode(struct drm_display_mode *to_match); > extern bool drm_detect_hdmi_monitor(struct edid *edid); > extern bool drm_detect_monitor_audio(struct edid *edid); > +extern bool drm_rgb_quant_range_selectable(struct edid *edid); > extern int drm_mode_page_flip_ioctl(struct drm_device *dev, > void *data, struct drm_file *file_priv); > extern struct drm_display_mode *drm_cvt_mode(struct drm_device *dev, > -- > 1.7.8.6 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/intel-gfx
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 5a3770f..deba722 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -1483,9 +1483,11 @@ add_detailed_modes(struct drm_connector *connector, struct edid *edid, #define VIDEO_BLOCK 0x02 #define VENDOR_BLOCK 0x03 #define SPEAKER_BLOCK 0x04 +#define VIDEO_CAPABILITY_BLOCK 0x07 #define EDID_BASIC_AUDIO (1 << 6) #define EDID_CEA_YCRCB444 (1 << 5) #define EDID_CEA_YCRCB422 (1 << 4) +#define EDID_CEA_VCDB_QS (1 << 6) /** * Search EDID for CEA extension block. @@ -1902,6 +1904,37 @@ end: EXPORT_SYMBOL(drm_detect_monitor_audio); /** + * drm_rgb_quant_range_selectable - is RGB quantization range selectable? + * + * Check whether the monitor reports the RGB quantization range selection + * as supported. The AVI infoframe can then be used to inform the monitor + * which quantzation range (full or limited) is used. + */ +bool drm_rgb_quant_range_selectable(struct edid *edid) +{ + u8 *edid_ext; + int i, start, end; + + edid_ext = drm_find_cea_extension(edid); + if (!edid_ext) + return false; + + if (cea_db_offsets(edid_ext, &start, &end)) + return false; + + for_each_cea_db(edid_ext, i, start, end) { + if (cea_db_tag(&edid_ext[i]) == VIDEO_CAPABILITY_BLOCK && + cea_db_payload_len(&edid_ext[i]) == 2) { + DRM_DEBUG_KMS("CEA VCDB 0x%02x\n", edid_ext[i + 2]); + return edid_ext[i + 2] & EDID_CEA_VCDB_QS; + } + } + + return false; +} +EXPORT_SYMBOL(drm_rgb_quant_range_selectable); + +/** * drm_add_display_info - pull display info out if present * @edid: EDID data * @info: display info (attached to connector) diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index 00d78b5..30892dc 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h @@ -1033,6 +1033,7 @@ extern u8 *drm_find_cea_extension(struct edid *edid); extern u8 drm_match_cea_mode(struct drm_display_mode *to_match); extern bool drm_detect_hdmi_monitor(struct edid *edid); extern bool drm_detect_monitor_audio(struct edid *edid); +extern bool drm_rgb_quant_range_selectable(struct edid *edid); extern int drm_mode_page_flip_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv); extern struct drm_display_mode *drm_cvt_mode(struct drm_device *dev,