From: Sasha Levin <Alexander.Levin@microsoft.com>
To: "stable@vger.kernel.org" <stable@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Cc: Fredrik Noring <noring@nocrew.org>,
"Maciej W. Rozycki" <macro@linux-mips.org>,
Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>,
Sasha Levin <Alexander.Levin@microsoft.com>
Subject: [PATCH AUTOSEL 3.18 13/19] fbdev: Distinguish between interlaced and progressive modes
Date: Fri, 7 Sep 2018 00:39:35 +0000 [thread overview]
Message-ID: <20180907003923.58019-13-alexander.levin@microsoft.com> (raw)
In-Reply-To: <20180907003923.58019-1-alexander.levin@microsoft.com>
From: Fredrik Noring <noring@nocrew.org>
[ Upstream commit 1ba0a59cea41ea05fda92daaf2a2958a2246b9cf ]
I discovered the problem when developing a frame buffer driver for the
PlayStation 2 (not yet merged), using the following video modes for the
PlayStation 3 in drivers/video/fbdev/ps3fb.c:
}, {
/* 1080if */
"1080if", 50, 1920, 1080, 13468, 148, 484, 36, 4, 88, 5,
FB_SYNC_BROADCAST, FB_VMODE_INTERLACED
}, {
/* 1080pf */
"1080pf", 50, 1920, 1080, 6734, 148, 484, 36, 4, 88, 5,
FB_SYNC_BROADCAST, FB_VMODE_NONINTERLACED
},
In ps3fb_probe, the mode_option module parameter is used with fb_find_mode
but it can only select the interlaced variant of 1920x1080 since the loop
matching the modes does not take the difference between interlaced and
progressive modes into account.
In short, without the patch, progressive 1920x1080 cannot be chosen as a
mode_option parameter since fb_find_mode (falsely) thinks interlace is a
perfect match.
Signed-off-by: Fredrik Noring <noring@nocrew.org>
Cc: "Maciej W. Rozycki" <macro@linux-mips.org>
[b.zolnierkie: updated patch description]
Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
---
drivers/video/fbdev/core/modedb.c | 41 ++++++++++++++++++++++---------
1 file changed, 30 insertions(+), 11 deletions(-)
diff --git a/drivers/video/fbdev/core/modedb.c b/drivers/video/fbdev/core/modedb.c
index 388f7971494b..620d9ec664e1 100644
--- a/drivers/video/fbdev/core/modedb.c
+++ b/drivers/video/fbdev/core/modedb.c
@@ -533,7 +533,7 @@ static int fb_try_mode(struct fb_var_screeninfo *var, struct fb_info *info,
*
* Valid mode specifiers for @mode_option:
*
- * <xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m] or
+ * <xres>x<yres>[M][R][-<bpp>][@<refresh>][i][p][m] or
* <name>[-<bpp>][@<refresh>]
*
* with <xres>, <yres>, <bpp> and <refresh> decimal numbers and
@@ -542,10 +542,10 @@ static int fb_try_mode(struct fb_var_screeninfo *var, struct fb_info *info,
* If 'M' is present after yres (and before refresh/bpp if present),
* the function will compute the timings using VESA(tm) Coordinated
* Video Timings (CVT). If 'R' is present after 'M', will compute with
- * reduced blanking (for flatpanels). If 'i' is present, compute
- * interlaced mode. If 'm' is present, add margins equal to 1.8%
- * of xres rounded down to 8 pixels, and 1.8% of yres. The char
- * 'i' and 'm' must be after 'M' and 'R'. Example:
+ * reduced blanking (for flatpanels). If 'i' or 'p' are present, compute
+ * interlaced or progressive mode. If 'm' is present, add margins equal
+ * to 1.8% of xres rounded down to 8 pixels, and 1.8% of yres. The chars
+ * 'i', 'p' and 'm' must be after 'M' and 'R'. Example:
*
* 1024x768MR-8@60m - Reduced blank with margins at 60Hz.
*
@@ -586,7 +586,8 @@ int fb_find_mode(struct fb_var_screeninfo *var,
unsigned int namelen = strlen(name);
int res_specified = 0, bpp_specified = 0, refresh_specified = 0;
unsigned int xres = 0, yres = 0, bpp = default_bpp, refresh = 0;
- int yres_specified = 0, cvt = 0, rb = 0, interlace = 0;
+ int yres_specified = 0, cvt = 0, rb = 0;
+ int interlace_specified = 0, interlace = 0;
int margins = 0;
u32 best, diff, tdiff;
@@ -637,9 +638,17 @@ int fb_find_mode(struct fb_var_screeninfo *var,
if (!cvt)
margins = 1;
break;
+ case 'p':
+ if (!cvt) {
+ interlace = 0;
+ interlace_specified = 1;
+ }
+ break;
case 'i':
- if (!cvt)
+ if (!cvt) {
interlace = 1;
+ interlace_specified = 1;
+ }
break;
default:
goto done;
@@ -708,11 +717,21 @@ int fb_find_mode(struct fb_var_screeninfo *var,
if ((name_matches(db[i], name, namelen) ||
(res_specified && res_matches(db[i], xres, yres))) &&
!fb_try_mode(var, info, &db[i], bpp)) {
- if (refresh_specified && db[i].refresh == refresh)
- return 1;
+ const int db_interlace = (db[i].vmode &
+ FB_VMODE_INTERLACED ? 1 : 0);
+ int score = abs(db[i].refresh - refresh);
+
+ if (interlace_specified)
+ score += abs(db_interlace - interlace);
+
+ if (!interlace_specified ||
+ db_interlace == interlace)
+ if (refresh_specified &&
+ db[i].refresh == refresh)
+ return 1;
- if (abs(db[i].refresh - refresh) < diff) {
- diff = abs(db[i].refresh - refresh);
+ if (score < diff) {
+ diff = score;
best = i;
}
}
--
2.17.1
next prev parent reply other threads:[~2018-09-07 0:42 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-09-07 0:39 [PATCH AUTOSEL 3.18 01/19] ALSA: msnd: Fix the default sample sizes Sasha Levin
2018-09-07 0:39 ` [PATCH AUTOSEL 3.18 02/19] ALSA: usb-audio: Fix multiple definitions in AU0828_DEVICE() macro Sasha Levin
2018-09-07 0:39 ` [PATCH AUTOSEL 3.18 03/19] xfrm: fix 'passing zero to ERR_PTR()' warning Sasha Levin
2018-09-07 0:39 ` [PATCH AUTOSEL 3.18 04/19] gfs2: Special-case rindex for gfs2_grow Sasha Levin
2018-09-07 0:39 ` [PATCH AUTOSEL 3.18 05/19] MIPS: ath79: fix system restart Sasha Levin
2018-09-07 0:39 ` [PATCH AUTOSEL 3.18 06/19] mtd/maps: fix solutionengine.c printk format warnings Sasha Levin
2018-09-07 0:39 ` [PATCH AUTOSEL 3.18 08/19] iio: ad9523: Fix displayed phase Sasha Levin
2018-09-07 0:39 ` [PATCH AUTOSEL 3.18 07/19] gfs2: Don't reject a supposedly full bitmap if we have blocks reserved Sasha Levin
2018-09-07 0:39 ` [PATCH AUTOSEL 3.18 09/19] fbdev: omapfb: off by one in omapfb_register_client() Sasha Levin
2018-09-07 0:39 ` [PATCH AUTOSEL 3.18 11/19] fbdev/via: fix defined but not used warning Sasha Levin
2018-09-07 0:39 ` [PATCH AUTOSEL 3.18 10/19] video: goldfishfb: fix memory leak on driver remove Sasha Levin
2018-09-07 0:39 ` [PATCH AUTOSEL 3.18 12/19] perf powerpc: Fix callchain ip filtering when return address is in a register Sasha Levin
2018-09-07 0:39 ` [PATCH AUTOSEL 3.18 14/19] perf powerpc: Fix callchain ip filtering Sasha Levin
2018-09-07 0:39 ` Sasha Levin [this message]
2018-09-07 0:39 ` [PATCH AUTOSEL 3.18 15/19] powerpc/powernv: opal_put_chars partial write fix Sasha Levin
2018-09-07 0:39 ` [PATCH AUTOSEL 3.18 17/19] s390/qeth: fix race in used-buffer accounting Sasha Levin
2018-09-07 0:39 ` [PATCH AUTOSEL 3.18 16/19] mac80211: restrict delayed tailroom needed decrement Sasha Levin
2018-09-07 0:39 ` [PATCH AUTOSEL 3.18 18/19] s390/qeth: reset layer2 attribute on layer switch Sasha Levin
2018-09-07 0:39 ` [PATCH AUTOSEL 3.18 19/19] platform/x86: toshiba_acpi: Fix defined but not used build warnings Sasha Levin
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=20180907003923.58019-13-alexander.levin@microsoft.com \
--to=alexander.levin@microsoft.com \
--cc=b.zolnierkie@samsung.com \
--cc=linux-kernel@vger.kernel.org \
--cc=macro@linux-mips.org \
--cc=noring@nocrew.org \
--cc=stable@vger.kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome