public inbox for intel-gfx@lists.freedesktop.org
 help / color / mirror / Atom feed
From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Thomas Wood <thomas.wood@intel.com>
Cc: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org
Subject: Re: [PATCH 1/2] drm/edid: split VIC display mode lookup into a separate function
Date: Thu, 28 Nov 2013 20:44:12 +0200	[thread overview]
Message-ID: <20131128184412.GD10036@intel.com> (raw)
In-Reply-To: <1385658767-24924-2-git-send-email-thomas.wood@intel.com>

On Thu, Nov 28, 2013 at 05:12:46PM +0000, Thomas Wood wrote:
> Signed-off-by: Thomas Wood <thomas.wood@intel.com>
> ---
>  drivers/gpu/drm/drm_edid.c | 67 +++++++++++++++++++++++++++-------------------
>  1 file changed, 39 insertions(+), 28 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index 52e060e..1dd82cd 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -2557,25 +2557,40 @@ add_alternate_cea_modes(struct drm_connector *connector, struct edid *edid)
>  	return modes;
>  }
>  
> -static int
> -do_cea_modes(struct drm_connector *connector, const u8 *db, u8 len)
> +static struct drm_display_mode *
> +drm_display_mode_from_vic_index(struct drm_connector *connector,
> +				const u8 *video_db, u8 video_len,
> +				u8 video_index)
>  {
>  	struct drm_device *dev = connector->dev;
> -	const u8 *mode;
> +	struct drm_display_mode *newmode;
>  	u8 cea_mode;
> -	int modes = 0;
>  
> -	for (mode = db; mode < db + len; mode++) {
> -		cea_mode = (*mode & 127) - 1; /* CEA modes are numbered 1..127 */
> -		if (cea_mode < ARRAY_SIZE(edid_cea_modes)) {
> -			struct drm_display_mode *newmode;
> -			newmode = drm_mode_duplicate(dev,
> -						     &edid_cea_modes[cea_mode]);
> -			if (newmode) {
> -				newmode->vrefresh = 0;
> -				drm_mode_probed_add(connector, newmode);
> -				modes++;
> -			}
> +	if (video_db == NULL || video_index > video_len)
> +		return NULL;

Hmm, this seems wrong. video_len is the length of the payload only,
so the check should be >=. But this bug is already present in
the current code in add_3d_struct_modes(). So maybe include another
patch to fix that up first.

The rest looks OK to me.

> +
> +	/* CEA modes are numbered 1..127 */
> +	cea_mode = (video_db[video_index] & 127) - 1;
> +	if (cea_mode >= ARRAY_SIZE(edid_cea_modes))
> +		return NULL;
> +
> +	newmode = drm_mode_duplicate(dev, &edid_cea_modes[cea_mode]);
> +	newmode->vrefresh = 0;
> +
> +	return newmode;
> +}
> +
> +static int
> +do_cea_modes(struct drm_connector *connector, const u8 *db, u8 len)
> +{
> +	int i, modes = 0;
> +
> +	for (i = 0; i < len; i++) {
> +		struct drm_display_mode *mode;
> +		mode = drm_display_mode_from_vic_index(connector, db, len, i);
> +		if (mode) {
> +			drm_mode_probed_add(connector, mode);
> +			modes++;
>  		}
>  	}
>  
> @@ -2669,21 +2684,13 @@ static int add_hdmi_mode(struct drm_connector *connector, u8 vic)
>  static int add_3d_struct_modes(struct drm_connector *connector, u16 structure,
>  			       const u8 *video_db, u8 video_len, u8 video_index)
>  {
> -	struct drm_device *dev = connector->dev;
>  	struct drm_display_mode *newmode;
>  	int modes = 0;
> -	u8 cea_mode;
> -
> -	if (video_db == NULL || video_index > video_len)
> -		return 0;
> -
> -	/* CEA modes are numbered 1..127 */
> -	cea_mode = (video_db[video_index] & 127) - 1;
> -	if (cea_mode >= ARRAY_SIZE(edid_cea_modes))
> -		return 0;
>  
>  	if (structure & (1 << 0)) {
> -		newmode = drm_mode_duplicate(dev, &edid_cea_modes[cea_mode]);
> +		newmode = drm_display_mode_from_vic_index(connector, video_db,
> +							  video_len,
> +							  video_index);
>  		if (newmode) {
>  			newmode->flags |= DRM_MODE_FLAG_3D_FRAME_PACKING;
>  			drm_mode_probed_add(connector, newmode);
> @@ -2691,7 +2698,9 @@ static int add_3d_struct_modes(struct drm_connector *connector, u16 structure,
>  		}
>  	}
>  	if (structure & (1 << 6)) {
> -		newmode = drm_mode_duplicate(dev, &edid_cea_modes[cea_mode]);
> +		newmode = drm_display_mode_from_vic_index(connector, video_db,
> +							  video_len,
> +							  video_index);
>  		if (newmode) {
>  			newmode->flags |= DRM_MODE_FLAG_3D_TOP_AND_BOTTOM;
>  			drm_mode_probed_add(connector, newmode);
> @@ -2699,7 +2708,9 @@ static int add_3d_struct_modes(struct drm_connector *connector, u16 structure,
>  		}
>  	}
>  	if (structure & (1 << 8)) {
> -		newmode = drm_mode_duplicate(dev, &edid_cea_modes[cea_mode]);
> +		newmode = drm_display_mode_from_vic_index(connector, video_db,
> +							  video_len,
> +							  video_index);
>  		if (newmode) {
>  			newmode->flags |= DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF;
>  			drm_mode_probed_add(connector, newmode);
> -- 
> 1.8.4.2
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel

-- 
Ville Syrjälä
Intel OTC

  reply	other threads:[~2013-11-28 18:44 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-11-28 17:12 Parse the list of additional 3D modes Thomas Wood
2013-11-28 17:12 ` [PATCH 1/2] drm/edid: split VIC display mode lookup into a separate function Thomas Wood
2013-11-28 18:44   ` Ville Syrjälä [this message]
2013-11-28 17:12 ` [PATCH 2/2] drm/edid: parse the list of additional 3D modes Thomas Wood
2013-11-28 18:48   ` Ville Syrjälä

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=20131128184412.GD10036@intel.com \
    --to=ville.syrjala@linux.intel.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=thomas.wood@intel.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox