On Mon, Nov 24, 2014 at 3:29 PM, Lars-Peter Clausen lars@metafoo.de wrote:
On 11/24/2014 09:01 PM, Dave Airlie wrote:
On 25 November 2014 at 00:18, Lars-Peter Clausen lars@metafoo.de wrote:
On 11/24/2014 03:00 PM, Laurent Pinchart wrote:
Hi Daniel,
(CC'ing Rob Clark and Lars-Peter. As a reminder we're discussing the "drm: Decouple EDID parsing from I2C adapter" patch available at git://linuxtv.org/pinchartl/fbdev.git drm/next/du)
On Monday 24 November 2014 14:09:39 Daniel Vetter wrote:
On Mon, Nov 24, 2014 at 11:46:18AM +0200, Laurent Pinchart wrote:
> > > - the interface looks rather backwards: Either this still does i2c > reads, and then you'd just need a i2c-over-whatever adapter to > make > it > work. Or you have other magic means to optain an edid block, in > which > case just do that and then feed the edid drm_add_edid_modes.
I have a magic way to get EDID over I2C :-) Basically the ADV7511 controls the DDC bus, and exposes EDID data over I2C using vendor commands. To read an EDID block I have to write an ADV7511 register over I2C with the block number, wait for an interrupt, read a status register to check whether EDID data is available or whether an error occurred, and then read EDID data from the ADV7511 over I2C in 64-bytes chunks. This needs to be repeated for every block. I thus can't use drm_get_edid() directly.
Sounds familiar. See the special ddc-over-sdvo i2c bus we register in intel_sdvo.c, specifically look at intel_sdvo_init_ddc_proxy. It is a bit of boilerplate, but in the end just amounts to 3 small functions and one tiny vtable to wire it all up cleanly.
That's what I would have done as well if I had a device-specific I2C adapter connected to the DDC bus, but in this case the interface exposed by the ADV7511 to the SoC over I2C consists of higher level device-specific I2C commands to read EDID data. There is no low-level I2C read/write primitives available. I would thus need to expose a fake adapter that would receive I2C commands, parse them to detect an EDID block read, retrieve the EDID data and return them from the fake read. That doesn't make much sense to me.
The intel sdvo looks just like a simple I2C mux which will just pass-through messages from the master to the EDID EEPROM. The ADV7511 is unfortunately a bit different. You tell it to fetch the EDID information, then it will do some magic and then you can read the EDID back. Abstracting this as a this as a I2C controller will, while possible, result in a fair amount of boiler plate code that will not look particularly pretty.
It sounds also a bit like DP auxch also, or even how on UDL we get the edid over USB.
I'd rather see not pretty code that only one person had to look at though :-) with lots of comments on the hw design that demands ugly.
I'd rather not see that if I'm the person who has to look at it ;)
But looking around it appears as if this is a more common thing among external HDMI encoders though. E.g. the tda998x has the exact same issue and the current driver just copy&pastes drm_do_get_edid() and plugs in its own EDID block retrieval method.
On the other hand the patch that makes it possible to use a different backend then a raw I2C adapter to fetch the EDID is extremely trivial and doesn't make the existing code more complex in any way.
I suppose the only real disadvantage of the patch is it gives driver writers a bad alternative in cases where they really should expose their ddc as an i2c_adapter.. but perhaps we should just handle that via sufficient review ;-)
(I have seen enough downstream drivers that could use i2c_adapter but do not..)
BR, -R
dri-devel mailing list dri-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/dri-devel