[PATCH] drm: Prefer noninterlace cmdline mode unless explicitly specified

Takashi Iwai tiwai at suse.de
Wed Mar 19 07:24:04 PDT 2014


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 at 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 at 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 at 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
> 


More information about the dri-devel mailing list