All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jani Nikula <jani.nikula@linux.intel.com>
To: airlied@redhat.com
Cc: Robert Tarasov <tutankhamen@chromium.org>,
	dri-devel@lists.freedesktop.org
Subject: Re: [PATCH] drm/udl: Refactor edid retreiving in UDL driver
Date: Wed, 13 Mar 2019 11:27:57 +0200	[thread overview]
Message-ID: <87sgvri0o2.fsf@intel.com> (raw)
In-Reply-To: <20190313010428.116678-1-tutankhamen@chromium.org>

On Tue, 12 Mar 2019, Robert Tarasov <tutankhamen@chromium.org> wrote:
> Now drm/udl driver uses drm_do_get_edid() function to retreive and
> validate all blocks of EDID data. Old approach had insufficient
> validation routine and had problems with retreiving of extra blocks

You'll also get support for debugfs and firmware loader EDID override
mechanisms for free.

Fixes: 75c65ee20ade ("drm/udl: Reading all edid blocks in DRM/UDL driver")

Signed-off-by missing!

> ---
>  drivers/gpu/drm/udl/udl_connector.c | 72 +++++------------------------
>  1 file changed, 11 insertions(+), 61 deletions(-)
>
> diff --git a/drivers/gpu/drm/udl/udl_connector.c b/drivers/gpu/drm/udl/udl_connector.c
> index c3dc1fd20cb4..c7f8ac2cdbe5 100644
> --- a/drivers/gpu/drm/udl/udl_connector.c
> +++ b/drivers/gpu/drm/udl/udl_connector.c
> @@ -17,18 +17,19 @@
>  #include "udl_connector.h"
>  #include "udl_drv.h"
>  
> -static bool udl_get_edid_block(struct udl_device *udl, int block_idx,
> -							   u8 *buff)
> +static int udl_get_edid_block(void *data, u8 *buf, unsigned int block,
> +				size_t len)
>  {
>  	int ret, i;
>  	u8 *read_buff;
> +	struct udl_device *udl = data;
>  
>  	read_buff = kmalloc(2, GFP_KERNEL);

A follow-up cleanup might be to switch to using "u8 read_buff[2];"
instead of kmallocing it.

I don't claim to understand how the usb stuff works, but otherwise the
patch looks good to me. Nice refactoring!

Reviewed-by: Jani Nikula <jani.nikula@intel.com>

>  	if (!read_buff)
> -		return false;
> +		return -1;
>  
> -	for (i = 0; i < EDID_LENGTH; i++) {
> -		int bval = (i + block_idx * EDID_LENGTH) << 8;
> +	for (i = 0; i < len; i++) {
> +		int bval = (i + block * EDID_LENGTH) << 8;
>  		ret = usb_control_msg(udl->udev,
>  				      usb_rcvctrlpipe(udl->udev, 0),
>  					  (0x02), (0x80 | (0x02 << 5)), bval,
> @@ -36,60 +37,13 @@ static bool udl_get_edid_block(struct udl_device *udl, int block_idx,
>  		if (ret < 1) {
>  			DRM_ERROR("Read EDID byte %d failed err %x\n", i, ret);
>  			kfree(read_buff);
> -			return false;
> +			return -1;
>  		}
> -		buff[i] = read_buff[1];
> +		buf[i] = read_buff[1];
>  	}
>  
>  	kfree(read_buff);
> -	return true;
> -}
> -
> -static bool udl_get_edid(struct udl_device *udl, u8 **result_buff,
> -			 int *result_buff_size)
> -{
> -	int i, extensions;
> -	u8 *block_buff = NULL, *buff_ptr;
> -
> -	block_buff = kmalloc(EDID_LENGTH, GFP_KERNEL);
> -	if (block_buff == NULL)
> -		return false;
> -
> -	if (udl_get_edid_block(udl, 0, block_buff) &&
> -	    memchr_inv(block_buff, 0, EDID_LENGTH)) {
> -		extensions = ((struct edid *)block_buff)->extensions;
> -		if (extensions > 0) {
> -			/* we have to read all extensions one by one */
> -			*result_buff_size = EDID_LENGTH * (extensions + 1);
> -			*result_buff = kmalloc(*result_buff_size, GFP_KERNEL);
> -			buff_ptr = *result_buff;
> -			if (buff_ptr == NULL) {
> -				kfree(block_buff);
> -				return false;
> -			}
> -			memcpy(buff_ptr, block_buff, EDID_LENGTH);
> -			kfree(block_buff);
> -			buff_ptr += EDID_LENGTH;
> -			for (i = 1; i < extensions; ++i) {
> -				if (udl_get_edid_block(udl, i, buff_ptr)) {
> -					buff_ptr += EDID_LENGTH;
> -				} else {
> -					kfree(*result_buff);
> -					*result_buff = NULL;
> -					return false;
> -				}
> -			}
> -			return true;
> -		}
> -		/* we have only base edid block */
> -		*result_buff = block_buff;
> -		*result_buff_size = EDID_LENGTH;
> -		return true;
> -	}
> -
> -	kfree(block_buff);
> -
> -	return false;
> +	return 0;
>  }
>  
>  static int udl_get_modes(struct drm_connector *connector)
> @@ -121,8 +75,6 @@ static int udl_mode_valid(struct drm_connector *connector,
>  static enum drm_connector_status
>  udl_detect(struct drm_connector *connector, bool force)
>  {
> -	u8 *edid_buff = NULL;
> -	int edid_buff_size = 0;
>  	struct udl_device *udl = connector->dev->dev_private;
>  	struct udl_drm_connector *udl_connector =
>  					container_of(connector,
> @@ -135,12 +87,10 @@ udl_detect(struct drm_connector *connector, bool force)
>  		udl_connector->edid = NULL;
>  	}
>  
> -
> -	if (!udl_get_edid(udl, &edid_buff, &edid_buff_size))
> +	udl_connector->edid = drm_do_get_edid(connector, udl_get_edid_block, udl);
> +	if (!udl_connector->edid)
>  		return connector_status_disconnected;
>  
> -	udl_connector->edid = (struct edid *)edid_buff;
> -	
>  	return connector_status_connected;
>  }

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

  reply	other threads:[~2019-03-13  9:26 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-03-13  1:04 [PATCH] drm/udl: Refactor edid retreiving in UDL driver Robert Tarasov
2019-03-13  9:27 ` Jani Nikula [this message]
2019-03-13 18:36   ` Robert Tarasov
2019-03-14 10:00     ` Jani Nikula
2019-03-14 10:46       ` Hans de Goede
  -- strict thread matches above, loose matches on Subject: below --
2019-03-13 18:38 Robert Tarasov
2019-03-15  2:04 ` Dave Airlie
2019-03-15  9:55   ` Jani Nikula

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=87sgvri0o2.fsf@intel.com \
    --to=jani.nikula@linux.intel.com \
    --cc=airlied@redhat.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=tutankhamen@chromium.org \
    /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.