[PATCH 2/2] drm/edid: Implement SCDC support detection

Ville Syrjälä ville.syrjala at linux.intel.com
Fri Sep 25 04:37:46 PDT 2015


On Thu, Sep 24, 2015 at 06:51:35PM +0200, Thierry Reding wrote:
> From: Thierry Reding <treding at nvidia.com>
> 
> Sinks compliant with the HDMI 2.0 specification may support SCDC, a
> mechanism for the source and the sink to communicate. Sinks advertise
> support for this feature in the HDMI Forum Vendor Specific Data Block
> as defined in the HDMI 2.0 specification, section 10.4 "Status and
> Control Data Channel". Implement a small helper that find the HF-VSDB
> and parses it to check if the sink supports SCDC.
> 
> Signed-off-by: Thierry Reding <treding at nvidia.com>
> ---
>  drivers/gpu/drm/drm_edid.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++
>  include/drm/drm_crtc.h     |  1 +
>  include/linux/hdmi.h       |  1 +
>  3 files changed, 51 insertions(+)
> 
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index d895556be4f0..af4da105d66e 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -3059,6 +3059,21 @@ static bool cea_db_is_hdmi_vsdb(const u8 *db)
>  	return hdmi_id == HDMI_IEEE_OUI;
>  }
>  
> +static bool cea_db_is_hf_vsdb(const u8 *db)

I would spell out the hdmi_forum here. Otherwise it's starting to look
like random alphabet soup.

> +{
> +	unsigned int oui;
> +
> +	if (cea_db_tag(db) != VENDOR_BLOCK)
> +		return false;
> +
> +	if (cea_db_payload_len(db) < 7)
> +		return false;
> +
> +	oui = db[3] << 16 | db[2] << 8 | db[1];
> +
> +	return oui == HDMI_FORUM_IEEE_OUI;
> +}
> +
>  #define for_each_cea_db(cea, i, start, end) \
>  	for ((i) = (start); (i) < (end) && (i) + cea_db_payload_len(&(cea)[(i)]) < (end); (i) += cea_db_payload_len(&(cea)[(i)]) + 1)
>  
> @@ -3454,6 +3469,40 @@ bool drm_detect_hdmi_monitor(struct edid *edid)
>  EXPORT_SYMBOL(drm_detect_hdmi_monitor);
>  
>  /**
> + * drm_detect_hdmi_scdc - detect whether an HDMI sink supports SCDC
> + * @edid: sink EDID information
> + *
> + * Parse the CEA extension according to CEA-861-B to find an HF-VSDB as
> + * defined in HDMI 2.0, section 10.3.2 "HDMI Forum Vendor Specific Data
> + * Block" and checks if the SCDC_Present bit (bit 7 of byte 6) is set.
> + *
> + * Returns:
> + * True if the sink supports SCDC, false otherwise.
> + */
> +bool drm_detect_hdmi_scdc(struct edid *edid)
> +{
> +	unsigned int start, end, i;
> +	const u8 *cea;
> +
> +	cea = drm_find_cea_extension(edid);
> +	if (!cea)
> +		return false;
> +
> +	if (cea_db_offsets(cea, &start, &end))
> +		return false;
> +
> +	for_each_cea_db(cea, i, start, end) {
> +		if (cea_db_is_hf_vsdb(&cea[i])) {
> +			if (cea[i + 6] & 0x80)
> +				return true;
> +		}
> +	}
> +
> +	return false;
> +}
> +EXPORT_SYMBOL(drm_detect_hdmi_scdc);
> +
> +/**
>   * drm_detect_monitor_audio - check monitor audio capability
>   * @edid: EDID block to scan
>   *
> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> index 53a6f2455f35..5d0b88e4a80b 100644
> --- a/include/drm/drm_crtc.h
> +++ b/include/drm/drm_crtc.h
> @@ -1513,6 +1513,7 @@ extern enum hdmi_picture_aspect drm_get_cea_aspect_ratio(const u8 video_code);
>  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 bool drm_detect_hdmi_scdc(struct edid *edid);
>  extern int drm_mode_page_flip_ioctl(struct drm_device *dev,
>  				    void *data, struct drm_file *file_priv);
>  extern int drm_add_modes_noedid(struct drm_connector *connector,
> diff --git a/include/linux/hdmi.h b/include/linux/hdmi.h
> index e9744202fa29..f860071e2d5a 100644
> --- a/include/linux/hdmi.h
> +++ b/include/linux/hdmi.h
> @@ -35,6 +35,7 @@ enum hdmi_infoframe_type {
>  };
>  
>  #define HDMI_IEEE_OUI 0x000c03
> +#define HDMI_FORUM_IEEE_OUI 0xc45dd8
>  #define HDMI_INFOFRAME_HEADER_SIZE  4
>  #define HDMI_AVI_INFOFRAME_SIZE    13
>  #define HDMI_SPD_INFOFRAME_SIZE    25
> -- 
> 2.5.0
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel

-- 
Ville Syrjälä
Intel OTC


More information about the dri-devel mailing list