From: Jani Nikula <jani.nikula@linux.intel.com>
To: Emil Abildgaard Svendsen <EMAS@bang-olufsen.dk>,
Andrzej Hajda <andrzej.hajda@intel.com>,
Neil Armstrong <neil.armstrong@linaro.org>,
Robert Foss <rfoss@kernel.org>,
Laurent Pinchart <Laurent.pinchart@ideasonboard.com>,
Jonas Karlman <jonas@kwiboo.se>,
Jernej Skrabec <jernej.skrabec@gmail.com>,
Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
Maxime Ripard <mripard@kernel.org>,
Thomas Zimmermann <tzimmermann@suse.de>,
David Airlie <airlied@gmail.com>, Daniel Vetter <daniel@ffwll.ch>
Cc: Emil Abildgaard Svendsen <EMAS@bang-olufsen.dk>,
"dri-devel@lists.freedesktop.org"
<dri-devel@lists.freedesktop.org>
Subject: Re: [PATCH] drm: bridge: adv7511: fix reading edid segments
Date: Fri, 27 Oct 2023 12:51:07 +0300 [thread overview]
Message-ID: <87y1fo5r78.fsf@intel.com> (raw)
In-Reply-To: <20231026113029.575846-1-emas@bang-olufsen.dk>
On Thu, 26 Oct 2023, Emil Abildgaard Svendsen <EMAS@bang-olufsen.dk> wrote:
> Currently reading EDID only works because usually only two EDID blocks
> of 128 bytes is used. Where an EDID segment holds 256 bytes or two EDID
> blocks. And the first EDID segment read works fine but E-EDID specifies
> up to 128 segments.
>
> The logic is broken so change EDID segment index to multiple of 256
> bytes and not 128 (block size).
>
> Also change check of DDC status. Instead of silently not reading EDID
> when in "IDLE" state [1]. Check if the DDC controller is in reset
> instead (no HPD).
"Also" in a commit message is often a good indication that the patch
should be split to do the "also" in a separate patch. One "thing" per
patch. Here, it'll be useful for debugging [1], too, to figure out which
part broken things. (I suspect it's the status handling.)
BR,
Jani.
[1] https://lore.kernel.org/r/5aa375f1-07cd-4e28-8cd5-7e10b4b05c6a@kontron.de
>
> [1]
> ADV7511 Programming Guide: Table 11: DDCController Status:
>
> 0xC8 [3:0] DDC Controller State
>
> 0000 In Reset (No Hot Plug Detected)
> 0001 Reading EDID
> 0010 IDLE (Waiting for HDCP Requested)
> 0011 Initializing HDCP
> 0100 HDCP Enabled
> 0101 Initializing HDCP Repeater
>
> Signed-off-by: Emil Svendsen <emas@bang-olufsen.dk>
> ---
> drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 24 ++++++++++++--------
> 1 file changed, 15 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
> index 8be235144f6d..c641c2ccd412 100644
> --- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
> +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
> @@ -537,6 +537,8 @@ static int adv7511_get_edid_block(void *data, u8 *buf, unsigned int block,
> size_t len)
> {
> struct adv7511 *adv7511 = data;
> + struct device* dev = &adv7511->i2c_edid->dev;
> + int edid_segment = block / 2;
> struct i2c_msg xfer[2];
> uint8_t offset;
> unsigned int i;
> @@ -545,7 +547,7 @@ static int adv7511_get_edid_block(void *data, u8 *buf, unsigned int block,
> if (len > 128)
> return -EINVAL;
>
> - if (adv7511->current_edid_segment != block / 2) {
> + if (adv7511->current_edid_segment != edid_segment) {
> unsigned int status;
>
> ret = regmap_read(adv7511->regmap, ADV7511_REG_DDC_STATUS,
> @@ -553,15 +555,19 @@ static int adv7511_get_edid_block(void *data, u8 *buf, unsigned int block,
> if (ret < 0)
> return ret;
>
> - if (status != 2) {
> - adv7511->edid_read = false;
> - regmap_write(adv7511->regmap, ADV7511_REG_EDID_SEGMENT,
> - block);
> - ret = adv7511_wait_for_edid(adv7511, 200);
> - if (ret < 0)
> - return ret;
> + if (!(status & 0x0F)) {
> + dev_dbg(dev, "DDC in reset no hot plug detected %x\n",
> + status);
> + return -EIO;
> }
>
> + adv7511->edid_read = false;
> + regmap_write(adv7511->regmap, ADV7511_REG_EDID_SEGMENT,
> + edid_segment);
> + ret = adv7511_wait_for_edid(adv7511, 200);
> + if (ret < 0)
> + return ret;
> +
> /* Break this apart, hopefully more I2C controllers will
> * support 64 byte transfers than 256 byte transfers
> */
> @@ -589,7 +595,7 @@ static int adv7511_get_edid_block(void *data, u8 *buf, unsigned int block,
> offset += 64;
> }
>
> - adv7511->current_edid_segment = block / 2;
> + adv7511->current_edid_segment = edid_segment;
> }
>
> if (block % 2 == 0)
--
Jani Nikula, Intel
prev parent reply other threads:[~2023-10-27 9:51 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-26 11:30 [PATCH] drm: bridge: adv7511: fix reading edid segments Emil Abildgaard Svendsen
2023-10-26 14:49 ` Fabio Estevam
2023-10-27 9:37 ` Emil Abildgaard Svendsen
2023-10-26 19:11 ` Frieder Schrempf
2023-10-27 9:35 ` Emil Abildgaard Svendsen
2023-10-27 9:51 ` Jani Nikula [this message]
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=87y1fo5r78.fsf@intel.com \
--to=jani.nikula@linux.intel.com \
--cc=EMAS@bang-olufsen.dk \
--cc=Laurent.pinchart@ideasonboard.com \
--cc=airlied@gmail.com \
--cc=andrzej.hajda@intel.com \
--cc=daniel@ffwll.ch \
--cc=dri-devel@lists.freedesktop.org \
--cc=jernej.skrabec@gmail.com \
--cc=jonas@kwiboo.se \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mripard@kernel.org \
--cc=neil.armstrong@linaro.org \
--cc=rfoss@kernel.org \
--cc=tzimmermann@suse.de \
/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.