diff mbox

drm: Prefer noninterlace cmdline mode unless explicitly specified

Message ID 1395237193-12850-1-git-send-email-tiwai@suse.de (mailing list archive)
State Accepted
Headers show

Commit Message

Takashi Iwai March 19, 2014, 1:53 p.m. UTC
Currently drm_pick_cmdline_mode() doesn't care about the interlace
when the given mode line has no "i" suffix.  That is, when there are
multiple entries for the same resolution, an interlace mode might be
picked up just depending on the assigned order, and there is no way to
exclude it.

This patch changes the logic for the mode selection, to prefer the
noninterlace mode unless the interlace mode is explicitly given.
When no matching mode is found, it still tries the interlace mode as
fallback.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 drivers/gpu/drm/drm_fb_helper.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

Comments

Daniel Vetter March 19, 2014, 2:17 p.m. UTC | #1
On Wed, Mar 19, 2014 at 02:53:13PM +0100, Takashi Iwai wrote:
> Currently drm_pick_cmdline_mode() doesn't care about the interlace
> when the given mode line has no "i" suffix.  That is, when there are
> multiple entries for the same resolution, an interlace mode might be
> picked up just depending on the assigned order, and there is no way to
> exclude it.
> 
> This patch changes the logic for the mode selection, to prefer the
> noninterlace mode unless the interlace mode is explicitly given.
> When no matching mode is found, it still tries the interlace mode as
> fallback.
> 
> Signed-off-by: Takashi Iwai <tiwai@suse.de>

Yeah, makes sense. Do you have some bz or something for reference?

Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>

Cheers, Daniel
> ---
>  drivers/gpu/drm/drm_fb_helper.c | 11 +++++++++++
>  1 file changed, 11 insertions(+)
> 
> diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
> index 98a03639b413..0a4b0a24359f 100644
> --- a/drivers/gpu/drm/drm_fb_helper.c
> +++ b/drivers/gpu/drm/drm_fb_helper.c
> @@ -1162,6 +1162,7 @@ static struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_conne
>  {
>  	struct drm_cmdline_mode *cmdline_mode;
>  	struct drm_display_mode *mode = NULL;
> +	bool prefer_non_interlace;
>  
>  	cmdline_mode = &fb_helper_conn->cmdline_mode;
>  	if (cmdline_mode->specified == false)
> @@ -1173,6 +1174,8 @@ static struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_conne
>  	if (cmdline_mode->rb || cmdline_mode->margins)
>  		goto create_mode;
>  
> +	prefer_non_interlace = !cmdline_mode->interlace;
> + again:
>  	list_for_each_entry(mode, &fb_helper_conn->connector->modes, head) {
>  		/* check width/height */
>  		if (mode->hdisplay != cmdline_mode->xres ||
> @@ -1187,10 +1190,18 @@ static struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_conne
>  		if (cmdline_mode->interlace) {
>  			if (!(mode->flags & DRM_MODE_FLAG_INTERLACE))
>  				continue;
> +		} else if (prefer_non_interlace) {
> +			if (mode->flags & DRM_MODE_FLAG_INTERLACE)
> +				continue;
>  		}
>  		return mode;
>  	}
>  
> +	if (prefer_non_interlace) {
> +		prefer_non_interlace = false;
> +		goto again;
> +	}
> +
>  create_mode:
>  	mode = drm_mode_create_from_cmdline_mode(fb_helper_conn->connector->dev,
>  						 cmdline_mode);
> -- 
> 1.9.0
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
Takashi Iwai March 19, 2014, 2:24 p.m. UTC | #2
At Wed, 19 Mar 2014 15:17:50 +0100,
Daniel Vetter wrote:
> 
> On Wed, Mar 19, 2014 at 02:53:13PM +0100, Takashi Iwai wrote:
> > Currently drm_pick_cmdline_mode() doesn't care about the interlace
> > when the given mode line has no "i" suffix.  That is, when there are
> > multiple entries for the same resolution, an interlace mode might be
> > picked up just depending on the assigned order, and there is no way to
> > exclude it.
> > 
> > This patch changes the logic for the mode selection, to prefer the
> > noninterlace mode unless the interlace mode is explicitly given.
> > When no matching mode is found, it still tries the interlace mode as
> > fallback.
> > 
> > Signed-off-by: Takashi Iwai <tiwai@suse.de>
> 
> Yeah, makes sense. Do you have some bz or something for reference?

https://bugzilla.novell.com/show_bug.cgi?id=853350

A reporter hits a problem with an LCD monitor connected to VGA.
1024x768i is broken but other modes couldn't be chosen.


Takashi

> 
> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
> 
> Cheers, Daniel
> > ---
> >  drivers/gpu/drm/drm_fb_helper.c | 11 +++++++++++
> >  1 file changed, 11 insertions(+)
> > 
> > diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
> > index 98a03639b413..0a4b0a24359f 100644
> > --- a/drivers/gpu/drm/drm_fb_helper.c
> > +++ b/drivers/gpu/drm/drm_fb_helper.c
> > @@ -1162,6 +1162,7 @@ static struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_conne
> >  {
> >  	struct drm_cmdline_mode *cmdline_mode;
> >  	struct drm_display_mode *mode = NULL;
> > +	bool prefer_non_interlace;
> >  
> >  	cmdline_mode = &fb_helper_conn->cmdline_mode;
> >  	if (cmdline_mode->specified == false)
> > @@ -1173,6 +1174,8 @@ static struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_conne
> >  	if (cmdline_mode->rb || cmdline_mode->margins)
> >  		goto create_mode;
> >  
> > +	prefer_non_interlace = !cmdline_mode->interlace;
> > + again:
> >  	list_for_each_entry(mode, &fb_helper_conn->connector->modes, head) {
> >  		/* check width/height */
> >  		if (mode->hdisplay != cmdline_mode->xres ||
> > @@ -1187,10 +1190,18 @@ static struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_conne
> >  		if (cmdline_mode->interlace) {
> >  			if (!(mode->flags & DRM_MODE_FLAG_INTERLACE))
> >  				continue;
> > +		} else if (prefer_non_interlace) {
> > +			if (mode->flags & DRM_MODE_FLAG_INTERLACE)
> > +				continue;
> >  		}
> >  		return mode;
> >  	}
> >  
> > +	if (prefer_non_interlace) {
> > +		prefer_non_interlace = false;
> > +		goto again;
> > +	}
> > +
> >  create_mode:
> >  	mode = drm_mode_create_from_cmdline_mode(fb_helper_conn->connector->dev,
> >  						 cmdline_mode);
> > -- 
> > 1.9.0
> > 
> > _______________________________________________
> > dri-devel mailing list
> > dri-devel@lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/dri-devel
> 
> -- 
> Daniel Vetter
> Software Engineer, Intel Corporation
> +41 (0) 79 365 57 48 - http://blog.ffwll.ch
>
Takashi Iwai April 1, 2014, 7:14 a.m. UTC | #3
At Wed, 19 Mar 2014 15:17:50 +0100,
Daniel Vetter wrote:
> 
> On Wed, Mar 19, 2014 at 02:53:13PM +0100, Takashi Iwai wrote:
> > Currently drm_pick_cmdline_mode() doesn't care about the interlace
> > when the given mode line has no "i" suffix.  That is, when there are
> > multiple entries for the same resolution, an interlace mode might be
> > picked up just depending on the assigned order, and there is no way to
> > exclude it.
> > 
> > This patch changes the logic for the mode selection, to prefer the
> > noninterlace mode unless the interlace mode is explicitly given.
> > When no matching mode is found, it still tries the interlace mode as
> > fallback.
> > 
> > Signed-off-by: Takashi Iwai <tiwai@suse.de>
> 
> Yeah, makes sense. Do you have some bz or something for reference?
> 
> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
> 
> Cheers, Daniel

Dave, could you check this patch for 3.15?  I can resend if needed.


thanks,

Takashi


> > ---
> >  drivers/gpu/drm/drm_fb_helper.c | 11 +++++++++++
> >  1 file changed, 11 insertions(+)
> > 
> > diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
> > index 98a03639b413..0a4b0a24359f 100644
> > --- a/drivers/gpu/drm/drm_fb_helper.c
> > +++ b/drivers/gpu/drm/drm_fb_helper.c
> > @@ -1162,6 +1162,7 @@ static struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_conne
> >  {
> >  	struct drm_cmdline_mode *cmdline_mode;
> >  	struct drm_display_mode *mode = NULL;
> > +	bool prefer_non_interlace;
> >  
> >  	cmdline_mode = &fb_helper_conn->cmdline_mode;
> >  	if (cmdline_mode->specified == false)
> > @@ -1173,6 +1174,8 @@ static struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_conne
> >  	if (cmdline_mode->rb || cmdline_mode->margins)
> >  		goto create_mode;
> >  
> > +	prefer_non_interlace = !cmdline_mode->interlace;
> > + again:
> >  	list_for_each_entry(mode, &fb_helper_conn->connector->modes, head) {
> >  		/* check width/height */
> >  		if (mode->hdisplay != cmdline_mode->xres ||
> > @@ -1187,10 +1190,18 @@ static struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_conne
> >  		if (cmdline_mode->interlace) {
> >  			if (!(mode->flags & DRM_MODE_FLAG_INTERLACE))
> >  				continue;
> > +		} else if (prefer_non_interlace) {
> > +			if (mode->flags & DRM_MODE_FLAG_INTERLACE)
> > +				continue;
> >  		}
> >  		return mode;
> >  	}
> >  
> > +	if (prefer_non_interlace) {
> > +		prefer_non_interlace = false;
> > +		goto again;
> > +	}
> > +
> >  create_mode:
> >  	mode = drm_mode_create_from_cmdline_mode(fb_helper_conn->connector->dev,
> >  						 cmdline_mode);
> > -- 
> > 1.9.0
> > 
> > _______________________________________________
> > dri-devel mailing list
> > dri-devel@lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/dri-devel
> 
> -- 
> Daniel Vetter
> Software Engineer, Intel Corporation
> +41 (0) 79 365 57 48 - http://blog.ffwll.ch
>
diff mbox

Patch

diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index 98a03639b413..0a4b0a24359f 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -1162,6 +1162,7 @@  static struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_conne
 {
 	struct drm_cmdline_mode *cmdline_mode;
 	struct drm_display_mode *mode = NULL;
+	bool prefer_non_interlace;
 
 	cmdline_mode = &fb_helper_conn->cmdline_mode;
 	if (cmdline_mode->specified == false)
@@ -1173,6 +1174,8 @@  static struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_conne
 	if (cmdline_mode->rb || cmdline_mode->margins)
 		goto create_mode;
 
+	prefer_non_interlace = !cmdline_mode->interlace;
+ again:
 	list_for_each_entry(mode, &fb_helper_conn->connector->modes, head) {
 		/* check width/height */
 		if (mode->hdisplay != cmdline_mode->xres ||
@@ -1187,10 +1190,18 @@  static struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_conne
 		if (cmdline_mode->interlace) {
 			if (!(mode->flags & DRM_MODE_FLAG_INTERLACE))
 				continue;
+		} else if (prefer_non_interlace) {
+			if (mode->flags & DRM_MODE_FLAG_INTERLACE)
+				continue;
 		}
 		return mode;
 	}
 
+	if (prefer_non_interlace) {
+		prefer_non_interlace = false;
+		goto again;
+	}
+
 create_mode:
 	mode = drm_mode_create_from_cmdline_mode(fb_helper_conn->connector->dev,
 						 cmdline_mode);