All of lore.kernel.org
 help / color / mirror / Atom feed
From: Neil Armstrong <narmstrong@baylibre.com>
To: Sean Paul <sean@poorly.run>, Matthias Kaehlcke <mka@chromium.org>
Cc: Andrzej Hajda <a.hajda@samsung.com>,
	Laurent Pinchart <Laurent.pinchart@ideasonboard.com>,
	David Airlie <airlied@linux.ie>, Daniel Vetter <daniel@ffwll.ch>,
	dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
	Jose Abreu <Jose.Abreu@synopsys.com>,
	Douglas Anderson <dianders@chromium.org>,
	Adam Jackson <ajax@redhat.com>
Subject: Re: [PATCH v2] drm/bridge: dw-hdmi: Refuse DDC/CI transfers on the internal I2C controller
Date: Tue, 30 Jul 2019 15:38:23 +0200	[thread overview]
Message-ID: <ea3219fd-b8eb-279b-aa08-c77705a31249@baylibre.com> (raw)
In-Reply-To: <20190725174927.GN104440@art_vandelay>

Hi,

On 25/07/2019 19:49, Sean Paul wrote:
> On Mon, Jul 22, 2019 at 02:02:07PM -0700, Matthias Kaehlcke wrote:
>> On Mon, Jul 22, 2019 at 04:24:26PM -0400, Sean Paul wrote:
>>> On Mon, Jul 22, 2019 at 11:19:45AM -0700, Matthias Kaehlcke wrote:
>>>> The DDC/CI protocol involves sending a multi-byte request to the
>>>> display via I2C, which is typically followed by a multi-byte
>>>> response. The internal I2C controller only allows single byte
>>>> reads/writes or reads of 8 sequential bytes, hence DDC/CI is not
>>>> supported when the internal I2C controller is used. The I2C
>>>
>>> This is very likely a stupid question, but I didn't see an answer for it, so
>>> I'll just ask :)
>>>
>>> If the controller supports xfers of 8 bytes and 1 bytes, could you just split
>>> up any of these transactions into len/8+len%8 transactions?
>>
>> The controller interprets all transfers to be register accesses. It is
>> not possible to just send the sequence '0x0a 0x0b 0x0c' as three byte
>> transfers, the controller expects an address for each byte and
>> (supposedly) sends it over the wire, which typically isn't what you
>> want.
>>
>> Also the 8-byte reads only seem to be supported in certain
>> configurations ("when the DWC_HDMI_TX_20 parameter is enabled").
> 
> Thanks for the detailed answers (both you and Doug)!
> 
> This change looks good to me, but I'll leave it to a dw-hdmi expert to apply. So
> fwiw,

I'm not qualified as a dw-hdmi expert but until the internal i2c controller
is exposed as a "standard" i2c adapter (which is a valuable feature),
blacklisting a fixed address is wrong, and we should detect invalid/malformed
transactions instead that doesn't fit in the HW model OR really stop emulating
an i2c adapter.

Moving to drm_do_get_edid() would need to entirely rewrite or refactor communication
code to handle the SCDC transactions, since they use an i2c adapter...

Neil

> 
> Reviewed-by: Sean Paul <sean@poorly.run>
> 
> 
>>
>>>> transfers complete without errors, however the data in the response
>>>> is garbage. Abort transfers to/from slave address 0x37 (DDC) with
>>>> -EOPNOTSUPP, to make it evident that the communication is failing.
>>>>
>>>> Signed-off-by: Matthias Kaehlcke <mka@chromium.org>
>>>> ---
>>>> Changes in v2:
>>>> - changed DDC_I2C_ADDR to DDC_CI_ADDR
>>>> ---
>>>>  drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 8 ++++++++
>>>>  1 file changed, 8 insertions(+)
>>>>
>>>> diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
>>>> index 045b1b13fd0e..28933629f3c7 100644
>>>> --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
>>>> +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
>>>> @@ -35,6 +35,7 @@
>>>>  
>>>>  #include <media/cec-notifier.h>
>>>>  
>>>> +#define DDC_CI_ADDR		0x37
>>>>  #define DDC_SEGMENT_ADDR	0x30
>>>>  
>>>>  #define HDMI_EDID_LEN		512
>>>> @@ -322,6 +323,13 @@ static int dw_hdmi_i2c_xfer(struct i2c_adapter *adap,
>>>>  	u8 addr = msgs[0].addr;
>>>>  	int i, ret = 0;
>>>>  
>>>> +	if (addr == DDC_CI_ADDR)
>>>> +		/*
>>>> +		 * The internal I2C controller does not support the multi-byte
>>>> +		 * read and write operations needed for DDC/CI.
>>>> +		 */
>>>> +		return -EOPNOTSUPP;
>>>> +
>>>>  	dev_dbg(hdmi->dev, "xfer: num: %d, addr: %#x\n", num, addr);
>>>>  
>>>>  	for (i = 0; i < num; i++) {
>>>
> 


  reply	other threads:[~2019-07-30 13:38 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-07-22 18:19 [PATCH v2] drm/bridge: dw-hdmi: Refuse DDC/CI transfers on the internal I2C controller Matthias Kaehlcke
2019-07-22 20:12 ` Doug Anderson
2019-07-22 20:54   ` Matthias Kaehlcke
2019-07-22 20:24 ` Sean Paul
2019-07-22 20:24   ` Sean Paul
2019-07-22 20:57   ` Doug Anderson
2019-07-22 21:02   ` Matthias Kaehlcke
2019-07-22 21:02     ` Matthias Kaehlcke
2019-07-25 17:49     ` Sean Paul
2019-07-30 13:38       ` Neil Armstrong [this message]
2019-07-30 16:14         ` Sean Paul
2019-07-31  7:38           ` Neil Armstrong
2019-10-02 19:44 Matthias Kaehlcke
2019-10-07 11:54 ` Neil Armstrong
2019-10-07 11:54   ` Neil Armstrong

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ea3219fd-b8eb-279b-aa08-c77705a31249@baylibre.com \
    --to=narmstrong@baylibre.com \
    --cc=Jose.Abreu@synopsys.com \
    --cc=Laurent.pinchart@ideasonboard.com \
    --cc=a.hajda@samsung.com \
    --cc=airlied@linux.ie \
    --cc=ajax@redhat.com \
    --cc=daniel@ffwll.ch \
    --cc=dianders@chromium.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mka@chromium.org \
    --cc=sean@poorly.run \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.