Received: by 2002:a25:7ec1:0:0:0:0:0 with SMTP id z184csp5342239ybc; Wed, 27 Nov 2019 02:33:14 -0800 (PST) X-Google-Smtp-Source: APXvYqyGSVol+CHViULhpENcjM/zh8zW8boGo3NKeTfAdXD5MA41giZgk5JDcnGwIDrLIaErwISi X-Received: by 2002:a50:ef08:: with SMTP id m8mr31477629eds.14.1574850794854; Wed, 27 Nov 2019 02:33:14 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1574850794; cv=none; d=google.com; s=arc-20160816; b=tA3asIVYGJv81ObIO7btCsnrPj/jdGUU2w1DjAa6A5BKjJOlI4bdo36aaY9eIkqauj x6ZUl7QkiXF0ctEaDCHzLd1rG3CNKn5tmawFnaX64Qtra/ZVdE20M9yp5bIMQw/ZrG5W gOW218ytv4ZxKZqf+amapM9Q6q6SSCh+RwernycQWk24tRQeOCUuyMMYUOHIA9pRW5YX V0atR1p0HdvqJUHa1bNG1OzmWyvZcbcuS+mUFxbVtGadaacsvQjTY5pk2to5x9ObuYJo UB95AIvsPH9iacx+qo9VdwcND5+jfl0O3lqNHNZeDu5wPSf+jNzCEL4yke0SoTakMrfT OLyQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:message-id:date:references :organization:in-reply-to:subject:cc:to:from; bh=20TPX28l+rlDeEQLFGU4QIRh4SjpBkz/YQvvpQOBVEo=; b=a/itO0BulBBEcTpXEST4J1Ms0O/vn0VfyfaBHClRFMJab9543Z0Wxp7g90isXOQMVJ B6Ru0eAnTVg5t8YFWqViw71eeqy2aQe9s6Wxel/CHSCaZq1oyTITfAsVtM0aPMt3w9P7 T3T4KJidIn7Va3JrvinfxWC1fyABd1LrgwvGe2G4sZotXqQEm56Nqiy0t1Qt1o/tKiiv qJL/5OhidJQZtgp/wQWq19341nBcpX3DilIwiQpYmC9JVRs3VFqldeNgt9hsZjh3UMYi QBZVEB9YLxRb3bC6w4IdJa18mx9lMkBa/9iLuiK0YzCIJmKlkQk0ATw+zUOPA6t9OI/T WHHw== 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w26si9327444ejn.212.2019.11.27.02.32.50; Wed, 27 Nov 2019 02:33:14 -0800 (PST) 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727059AbfK0K3S (ORCPT + 99 others); Wed, 27 Nov 2019 05:29:18 -0500 Received: from mga14.intel.com ([192.55.52.115]:65447 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726520AbfK0K3R (ORCPT ); Wed, 27 Nov 2019 05:29:17 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 27 Nov 2019 02:29:17 -0800 X-IronPort-AV: E=Sophos;i="5.69,249,1571727600"; d="scan'208";a="199142767" Received: from jnikula-mobl3.fi.intel.com (HELO localhost) ([10.237.66.161]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 27 Nov 2019 02:29:13 -0800 From: Jani Nikula To: allen Cc: Jau-Chih Tseng , Maxime Ripard , Allen Chen , open list , "open list\:DRM DRIVERS" , David Airlie , Pi-Hsun Shih , Sean Paul Subject: Re: [PATCH] drm/edid: fixup EDID 1.3 and 1.4 judge reduced-blanking timings logic In-Reply-To: <1574761572-26585-1-git-send-email-allen.chen@ite.com.tw> Organization: Intel Finland Oy - BIC 0357606-4 - Westendinkatu 7, 02160 Espoo References: <1574761572-26585-1-git-send-email-allen.chen@ite.com.tw> Date: Wed, 27 Nov 2019 12:29:11 +0200 Message-ID: <87pnhdobns.fsf@intel.com> MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, 26 Nov 2019, allen wrote: > According to VESA ENHANCED EXTENDED DISPLAY IDENTIFICATION DATA STANDARD > (Defines EDID Structure Version 1, Revision 4) page: 39 > How to determine whether the monitor support RB timing or not? > EDID 1.4 > First: read detailed timing descriptor and make sure byte 0 = 0x00, > byte 1 = 0x00, byte 2 = 0x00 and byte 3 = 0xFD > Second: read EDID bit 0 in feature support byte at address 18h = 1 > and detailed timing descriptor byte 10 = 0x04 > Third: if EDID bit 0 in feature support byte = 1 && > detailed timing descriptor byte 10 = 0x04 > then we can check byte 15, if bit 4 in byte 15 = 1 is support RB > if EDID bit 0 in feature support byte != 1 || > detailed timing descriptor byte 10 != 0x04, > then byte 15 can not be used > > The linux code is_rb function not follow the VESA's rule > > Signed-off-by: Allen Chen > Reported-by: kbuild test robot > --- > drivers/gpu/drm/drm_edid.c | 36 ++++++++++++++++++++++++++++++------ > 1 file changed, 30 insertions(+), 6 deletions(-) > > diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c > index f5926bf..e11e585 100644 > --- a/drivers/gpu/drm/drm_edid.c > +++ b/drivers/gpu/drm/drm_edid.c > @@ -93,6 +93,12 @@ struct detailed_mode_closure { > int modes; > }; > > +struct edid_support_rb_closure { > + struct edid *edid; > + bool valid_support_rb; > + bool support_rb; > +}; > + > #define LEVEL_DMT 0 > #define LEVEL_GTF 1 > #define LEVEL_GTF2 2 > @@ -2017,23 +2023,41 @@ struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev, > } > } > > +static bool > +is_display_descriptor(const u8 *r, u8 tag) > +{ > + return (!r[0] && !r[1] && !r[2] && r[3] == tag) ? true : false; > +} > + > static void > is_rb(struct detailed_timing *t, void *data) > { > u8 *r = (u8 *)t; > - if (r[3] == EDID_DETAIL_MONITOR_RANGE) > - if (r[15] & 0x10) > - *(bool *)data = true; > + struct edid_support_rb_closure *closure = data; > + struct edid *edid = closure->edid; > + > + if (is_display_descriptor(r, EDID_DETAIL_MONITOR_RANGE)) { > + if (edid->features & BIT(0) && r[10] == BIT(2)) { > + closure->valid_support_rb = true; > + closure->support_rb = (r[15] & 0x10) ? true : false; > + } > + } > } > > /* EDID 1.4 defines this explicitly. For EDID 1.3, we guess, badly. */ > static bool > drm_monitor_supports_rb(struct edid *edid) > { > + struct edid_support_rb_closure closure = { > + .edid = edid, > + .valid_support_rb = false, > + .support_rb = false, > + }; > + > if (edid->revision >= 4) { > - bool ret = false; > - drm_for_each_detailed_block((u8 *)edid, is_rb, &ret); > - return ret; > + drm_for_each_detailed_block((u8 *)edid, is_rb, &closure); > + if (closure.valid_support_rb) > + return closure.support_rb; Are you planning on extending the closure use somehow? I did not look up the spec, but purely on the code changes alone, you could just move the edid->features bit check at this level, and not pass it down, and nothing would change. I.e. don't iterate the EDID at all if the bit is not set. You also don't actually use the distinction between valid_support_rb vs. support_rb for anything, so the closure just adds code. BR, Jani. > } > > return ((edid->input & DRM_EDID_INPUT_DIGITAL) != 0); -- Jani Nikula, Intel Open Source Graphics Center