All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jani Nikula <jani.nikula@linux.intel.com>
To: dri-devel@lists.freedesktop.org
Cc: stefan.bruens@rwth-aachen.de
Subject: Re: [PATCH 3/3] drm/edid: Tighten checksum conditions for CEA blocks
Date: Fri, 21 Nov 2014 15:39:40 +0200	[thread overview]
Message-ID: <87389csmeb.fsf@intel.com> (raw)
In-Reply-To: <75b98802-5906-49c2-8c04-9f613d328ec2@HUB1.rwth-ad.de>

On Thu, 20 Nov 2014, Stefan Brüns <stefan.bruens@rwth-aachen.de> wrote:
> Checksumming was disabled for CEA blocks by
>
> commit 4a638b4e38234233f5c7e6705662fbc0b58d80c2
> Author: Adam Jackson <ajax@redhat.com>
> Date:   Tue May 25 16:33:09 2010 -0400
>
>     drm/edid: Allow non-fatal checksum errors in CEA blocks
>
> If only the checksum is wrong, reading twice should result in identical
> data, whereas a bad transfer will most likely corrupt different bytes.
> Comparing checksums is not sufficient, as there is a considerable chance
> of two bad transfers having the same checksum.
>
> Signed-off-by: Stefan Brüns <stefan.bruens@rwth-aachen.de>
> ---
>  drivers/gpu/drm/drm_edid.c | 22 +++++++++++++++++++++-
>  1 file changed, 21 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index 3a10f3f..55963d5 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -1203,6 +1203,7 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter)
>  {
>  	int i, j = 0, valid_extensions = 0;
>  	u8 *block, *new;
> +	u8 *saved_block = NULL;
>  	bool print_bad_edid = !connector->bad_edid_counter || (drm_debug & DRM_UT_KMS);
>  
>  	if ((block = kmalloc(EDID_LENGTH, GFP_KERNEL)) == NULL)
> @@ -1233,12 +1234,27 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter)
>  
>  	for (j = 1; j <= block[0x7e]; j++) {
>  		u8 *ext_block = block + (valid_extensions + 1) * EDID_LENGTH;
> +		u8 csum, last_csum = 0;
>  		for (i = 0; i < 4; i++) {
>  			if (drm_do_probe_ddc_edid(adapter, ext_block, j, EDID_LENGTH))
>  				goto out;
> -			if (drm_edid_block_valid(ext_block, j, print_bad_edid)) {
> +			csum = drm_edid_block_csum(ext_block);
> +			if (!csum) {
>  				valid_extensions++;
>  				break;
> +			} else if (ext_block[0] == CEA_EXT) {
> +			/*
> +			 * Some switches mangle CEA contents without fixing the checksum.
> +			 * Accept CEA blocks when two reads return identical data.
> +			 */
> +				if (saved_block && csum == last_csum &&
> +				    !memcmp(ext_block, saved_block, EDID_LENGTH)) {
> +					valid_extensions++;
> +					break;
> +				}
> +				kfree(saved_block);
> +				saved_block = kmemdup(ext_block, EDID_LENGTH, GFP_KERNEL);
> +				last_csum = csum;

I still feel like this should be embedded in drm_edid_block_valid
somehow. Who's going to print the bad edid now? Is it simply no longer
printed in this loop?

I'll defer to others; any better suggestions?

Jani.

>  			}
>  		}
>  
> @@ -1249,6 +1265,9 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter)
>  
>  			connector->bad_edid_counter++;
>  		}
> +
> +		kfree(saved_block);
> +		saved_block = NULL;
>  	}
>  
>  	if (valid_extensions != block[0x7e]) {
> @@ -1270,6 +1289,7 @@ carp:
>  	connector->bad_edid_counter++;
>  
>  out:
> +	kfree(saved_block);
>  	kfree(block);
>  	return NULL;
>  }
> -- 
> 2.1.2
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel

-- 
Jani Nikula, Intel Open Source Technology Center
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2014-11-21 13:39 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <1416103472-16923-1-git-send-email-stefan.bruens@rwth-aachen.de>
2014-11-20  2:25 ` [PATCH] drm/edid: shorten log output in case of all zeroes edid block Stefan Brüns
2014-11-21 13:32   ` Jani Nikula
2014-11-23  2:21     ` [PATCH 1/2] drm/edid: move drm_edid_is_zero to top, make edid argument const Stefan Brüns
     [not found]     ` <1416709265-31437-1-git-send-email-stefan.bruens@rwth-aachen.de>
2014-11-23  2:21       ` [PATCH 2/2] drm/edid: shorten log output in case of all zeroes edid block V2 Stefan Brüns
2014-11-20  2:27 ` [PATCH 1/3] drm/edid: new drm_edid_block_checksum helper function Stefan Brüns
2014-11-21 13:34   ` Jani Nikula
2014-11-23  2:40     ` [PATCH 1/3] drm/edid: new drm_edid_block_checksum helper function V2 Stefan Brüns
2014-11-24  7:50       ` Jani Nikula
     [not found] ` <1416450460-3692-1-git-send-email-stefan.bruens@rwth-aachen.de>
2014-11-20  2:27   ` [PATCH 2/3] drm/edid: calculate address of current extension block only once Stefan Brüns
2014-11-21 13:35     ` Jani Nikula
2014-11-20  2:27   ` [PATCH 3/3] drm/edid: Tighten checksum conditions for CEA blocks Stefan Brüns
2014-11-21 13:39     ` Jani Nikula [this message]
2014-11-23  2:53       ` Stefan Bruens

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=87389csmeb.fsf@intel.com \
    --to=jani.nikula@linux.intel.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=stefan.bruens@rwth-aachen.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.