[PATCH v2 13/29] drm: bridge: dw-hdmi: Reject invalid product IDs

Jose Abreu Jose.Abreu at synopsys.com
Tue Dec 20 10:59:38 UTC 2016


Hi Laurent,


On 20-12-2016 01:33, Laurent Pinchart wrote:
> The DWC HDMI TX can be recognized by the two product identification
> registers. If the registers don't read as expect the IP will be very
> different than what the driver has been designed for, or will be
> misconfigured in a way that makes it non-operational (invalid memory
> address, incorrect clocks, ...). We should reject this situation with an
> error.
>
> While this isn't critical for proper operation with supported IPs at the
> moment, the driver will soon gain automatic device-specific handling
> based on runtime device identification. This change makes it easier to
> implement that without having to default to a random guess in case the
> device can't be identified.
>
> While at it print a readable version number in the device identification
> message instead of raw register values.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas at ideasonboard.com>

Reviewed-by: Jose Abreu <joabreu at synopsys.com>

> ---
>  drivers/gpu/drm/bridge/dw-hdmi.c | 25 +++++++++++++++++++------
>  drivers/gpu/drm/bridge/dw-hdmi.h |  8 ++++++++
>  2 files changed, 27 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/dw-hdmi.c b/drivers/gpu/drm/bridge/dw-hdmi.c
> index 06c252f560ad..1809247745b8 100644
> --- a/drivers/gpu/drm/bridge/dw-hdmi.c
> +++ b/drivers/gpu/drm/bridge/dw-hdmi.c
> @@ -1832,6 +1832,9 @@ __dw_hdmi_probe(struct platform_device *pdev,
>  	int irq;
>  	int ret;
>  	u32 val = 1;
> +	u16 version;
> +	u8 prod_id0;
> +	u8 prod_id1;
>  	u8 config0;
>  	u8 config1;
>  
> @@ -1914,12 +1917,22 @@ __dw_hdmi_probe(struct platform_device *pdev,
>  	}
>  
>  	/* Product and revision IDs */
> -	dev_info(dev,
> -		 "Detected HDMI controller 0x%x:0x%x:0x%x:0x%x\n",
> -		 hdmi_readb(hdmi, HDMI_DESIGN_ID),
> -		 hdmi_readb(hdmi, HDMI_REVISION_ID),
> -		 hdmi_readb(hdmi, HDMI_PRODUCT_ID0),
> -		 hdmi_readb(hdmi, HDMI_PRODUCT_ID1));
> +	version = (hdmi_readb(hdmi, HDMI_DESIGN_ID) << 8)
> +		| (hdmi_readb(hdmi, HDMI_REVISION_ID) << 0);
> +	prod_id0 = hdmi_readb(hdmi, HDMI_PRODUCT_ID0);
> +	prod_id1 = hdmi_readb(hdmi, HDMI_PRODUCT_ID1);
> +
> +	if (prod_id0 != HDMI_PRODUCT_ID0_HDMI_TX ||
> +	    (prod_id1 & ~HDMI_PRODUCT_ID1_HDCP) != HDMI_PRODUCT_ID1_HDMI_TX) {
> +		dev_err(dev, "Unsupported HDMI controller (%04x:%02x:%02x)\n",
> +			version, prod_id0, prod_id1);
> +		ret = -ENODEV;
> +		goto err_iahb;
> +	}
> +
> +	dev_info(dev, "Detected HDMI TX controller v%x.%03x %s HDCP\n",
> +		 version >> 12, version & 0xfff,
> +		 prod_id1 & HDMI_PRODUCT_ID1_HDCP ? "with" : "without");
>  
>  	initialize_hdmi_ih_mutes(hdmi);
>  
> diff --git a/drivers/gpu/drm/bridge/dw-hdmi.h b/drivers/gpu/drm/bridge/dw-hdmi.h
> index 08235aef2fa3..91d7fabbd6e5 100644
> --- a/drivers/gpu/drm/bridge/dw-hdmi.h
> +++ b/drivers/gpu/drm/bridge/dw-hdmi.h
> @@ -545,6 +545,14 @@
>  #define HDMI_I2CM_FS_SCL_LCNT_0_ADDR            0x7E12
>  
>  enum {
> +/* PRODUCT_ID0 field values */
> +	HDMI_PRODUCT_ID0_HDMI_TX = 0xa0,
> +
> +/* PRODUCT_ID1 field values */
> +	HDMI_PRODUCT_ID1_HDCP = 0xc0,
> +	HDMI_PRODUCT_ID1_HDMI_RX = 0x02,
> +	HDMI_PRODUCT_ID1_HDMI_TX = 0x01,
> +
>  /* CONFIG0_ID field values */
>  	HDMI_CONFIG0_I2S = 0x10,
>  



More information about the dri-devel mailing list