Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp2478045imm; Mon, 24 Sep 2018 05:11:13 -0700 (PDT) X-Google-Smtp-Source: ACcGV60gqd9ZBRDsR0x5FQAuA9RYCDJNJJ1fX0C3vo4QQLE5Hx4puoFUKD+GCA4sbwoUzVkb6DII X-Received: by 2002:a63:8a41:: with SMTP id y62-v6mr9305007pgd.420.1537791073339; Mon, 24 Sep 2018 05:11:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1537791073; cv=none; d=google.com; s=arc-20160816; b=nY+1e/T5o2XmMP4Qvo5Uul3I9M9qw8QDQ7YDAX8UW6crM2FQ3CbwbrFsR6ZOvMRHOv EkmkQ5fEq+CYMA94MBdJOSS0JGaMKig5kTbWp5EdoU1p+ZV1NdVSzXRj9IXZEMKzcyPR CDSGdquYZlkH+rU9EoulygHERMsLQZchUdJ4RWEP211hqqB8DnoMPGcGup0srxV+o54m NEvcBICtS3TZqKLVnb4qiRHHFx+IQjy95wdZWrqRvMVXbYHdueKJpaQB8yqprnV5We2X fPq58peAUCsG0jcjSK8utNWjfK8nbW7mXcrnNAgkddJRsgS38UYLYQTpZNwcqFYm6xuN LM1w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from; bh=BXvSmp+yuiZwthS7u9Qf1ObwitvRss7wJvlZfew9hxA=; b=01+tuzCpUu7vZby+0LbqQUcNibfEZ3LT5rJEd+fQRSvu05jZM0vxJHcVNJGru/Y0yN d2xzs2RzjjKdTF1vif8XrqpryZwYCghi80GyaeTCs0JB11WguEgKFtE5l09jD4hFBZqV mPk6Yqkt3fvfQoVwYBZpS9Jj/V8S8h65oOvbUpQqnGjR1GDxsDmbLKmpvklcxCt4e4Zr QbIEs9l53LXh5Gu4vxJFbyFAM7uISfFmUeYmwrPLFOLi3EfiDMZhlOtqY+3FvBV8rX2U yVBm0RAmdP2B2SOgmOvZ/rzIzl9uSfEwDT7As0nzzp6wkKiKkpjXl7qsvv32NJAI0JKi z78Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 98-v6si6935546pla.59.2018.09.24.05.10.58; Mon, 24 Sep 2018 05:11:13 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730617AbeIXSC2 (ORCPT + 99 others); Mon, 24 Sep 2018 14:02:28 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:53250 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730000AbeIXSC1 (ORCPT ); Mon, 24 Sep 2018 14:02:27 -0400 Received: from localhost (ip-213-127-77-73.ip.prioritytelecom.net [213.127.77.73]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id 8D1411081; Mon, 24 Sep 2018 12:00:24 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Fredrik Noring , "Maciej W. Rozycki" , Bartlomiej Zolnierkiewicz , Sasha Levin Subject: [PATCH 4.9 026/111] fbdev: Distinguish between interlaced and progressive modes Date: Mon, 24 Sep 2018 13:51:53 +0200 Message-Id: <20180924113107.095092566@linuxfoundation.org> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180924113103.337261320@linuxfoundation.org> References: <20180924113103.337261320@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.9-stable review patch. If anyone has any objections, please let me know. ------------------ From: Fredrik Noring [ 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 Cc: "Maciej W. Rozycki" [b.zolnierkie: updated patch description] Signed-off-by: Bartlomiej Zolnierkiewicz Signed-off-by: Sasha Levin Signed-off-by: Greg Kroah-Hartman --- drivers/video/fbdev/core/modedb.c | 41 +++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) --- a/drivers/video/fbdev/core/modedb.c +++ b/drivers/video/fbdev/core/modedb.c @@ -644,7 +644,7 @@ static int fb_try_mode(struct fb_var_scr * * Valid mode specifiers for @mode_option: * - * x[M][R][-][@][i][m] or + * x[M][R][-][@][i][p][m] or * [-][@] * * with , , and decimal numbers and @@ -653,10 +653,10 @@ static int fb_try_mode(struct fb_var_scr * 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. * @@ -697,7 +697,8 @@ int fb_find_mode(struct fb_var_screeninf 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; @@ -748,9 +749,17 @@ int fb_find_mode(struct fb_var_screeninf 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; @@ -819,11 +828,21 @@ done: 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; } }