svn commit: r362029 - head/sys/dev/hdmi

Rodney W. Grimes freebsd at gndrsh.dnsmgr.net
Thu Jun 11 13:45:06 UTC 2020


> Author: gonzo
> Date: Wed Jun 10 21:38:35 2020
> New Revision: 362029
> URL: https://svnweb.freebsd.org/changeset/base/362029
> 
> Log:
>   Fix reading EDID on TVs/monitors without E-DCC support
>   
>   Writing segment id to I2C device 0x30 only required if the segment is
>   non-zero. On the devices without E-DCC support writing to that address
>   fails and whole transaction then fails too. To avoid this do
>   not attempt write to the segment selection device unless required.
>   
>   MFC after:	2 weeks

Is it possible that this bad write is what has caused me to corrupt
the EDID of 3 monitors over the last year while using a Display
Port to HDMI cable on them?

> Modified:
>   head/sys/dev/hdmi/dwc_hdmi.c
> 
> Modified: head/sys/dev/hdmi/dwc_hdmi.c
> ==============================================================================
> --- head/sys/dev/hdmi/dwc_hdmi.c	Wed Jun 10 21:18:19 2020	(r362028)
> +++ head/sys/dev/hdmi/dwc_hdmi.c	Wed Jun 10 21:38:35 2020	(r362029)
> @@ -658,6 +658,11 @@ hdmi_edid_read(struct dwc_hdmi_softc *sc, int block, u
>  	int result;
>  	uint8_t addr = block & 1 ? EDID_LENGTH : 0;
>  	uint8_t segment = block >> 1;
> +	/*
> +	 * Some devices do not support E-DDC so attempt
> +	 * writing segment address only if it's neccessary
> +	 */
> +	unsigned char xfers = segment ? 3 : 2;
>  	struct iic_msg msg[] = {
>  		{ I2C_DDC_SEGADDR, IIC_M_WR, 1, &segment },
>  		{ I2C_DDC_ADDR, IIC_M_WR, 1, &addr },
> @@ -687,7 +692,7 @@ hdmi_edid_read(struct dwc_hdmi_softc *sc, int block, u
>  		return (result);
>  	}
>  
> -	result = iicbus_transfer(i2c_dev, msg, 3);
> +	result = iicbus_transfer(i2c_dev, &msg[3 - xfers], xfers);
>  	iicbus_release_bus(i2c_dev, sc->sc_dev);
>  
>  	if (result) {
> 

-- 
Rod Grimes                                                 rgrimes at freebsd.org


More information about the svn-src-head mailing list