Received: by 2002:a89:2c3:0:b0:1ed:23cc:44d1 with SMTP id d3csp772759lqs; Tue, 5 Mar 2024 16:44:33 -0800 (PST) X-Forwarded-Encrypted: i=3; AJvYcCXnfB2iJI/GBLi8FpXTbwS7YLgwfYrEO07IzhEVAX9kBdOjoPRbm+PK3I1s3yeVES9Kgy1NScJwDSDzh2DUOOIPXspFS9mHXajwK6uCQw== X-Google-Smtp-Source: AGHT+IHTkexi1zXQK1+qVKGBPRY+hnUQRZVQ7n4smQZUz8h1WSXIdq6imWdr9e2arENJbDlwM9Pr X-Received: by 2002:a17:906:b84e:b0:a45:3fb7:eed5 with SMTP id ga14-20020a170906b84e00b00a453fb7eed5mr5192283ejb.71.1709685873279; Tue, 05 Mar 2024 16:44:33 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1709685873; cv=pass; d=google.com; s=arc-20160816; b=WHXsmlBYo+UfOyfOYOB6MKLOrJny1Zun5P6mJFsfNrgHZsnh46s+blTLFzX5cFBrJp XwnvZmL8mAH1LH3L6ZQqCfd0axKAcV16+IVDNqgypWc/WCCs7hq/TjZCzAddOQeVUfJ5 0wrguQR6VV1cpgXEUIEnGCPVIuEnNfVndpd6uTXADuB/cCL7MIm3fMby1mOr2bQQMlox +xs8p4ETRbDTbEQLBT95RrP0xNXsyPaoO51eoyginoqp48TkyFwCxjGiITd9NQb3r36b DT4n6l4B6TkdSdFdX6kEcGqV1mAB09I2+rMct9oBKtdLBLusFQKmLKjY8FYOm9HoYapb wLFA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=j07CQ2B9VSDqAzaDJZq3q/Yl1tEHZa3IBFEiQqTUDBc=; fh=gxdbVHj0VwAq1nVY6VSbJIv0M19OtTzG+gCK1gQOyd4=; b=lB+ODMmCpzfk4aY5NKVdbzPV3PC5as6Rty3wuwj+9JpOeTBt4d7jOMJiRwe3hFqFr+ /4gzk68f4CTt3GUd7NsIf6Zljo11zAS597rhpV8uSs05mP7SA0byFY6Rh69YYXnR4czR SnbHtgxYz+PoHepmecIa54vxZLEffAd3kB0U94Dh+MlIWWLH84OnVsWGXEn0O8rxhYud Ii6MfbsS20z1Dq6OsPNSzhQOUb4IFQFLI5lofeVghP5WaCYi2KCHoISOJCDApFFXG7PU 307pXq284B2DjNol8WSQNc77r3zgZDyz8P/C4usbfdmTHSKTsP6LauEauLI5ILo9VcA3 yhqA==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=jijq+vUt; arc=pass (i=1 spf=pass spfdomain=chromium.org dkim=pass dkdomain=chromium.org dmarc=pass fromdomain=chromium.org); spf=pass (google.com: domain of linux-kernel+bounces-93178-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-93178-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [147.75.80.249]) by mx.google.com with ESMTPS id mj25-20020a170906af9900b00a3e0d508bb8si5317039ejb.609.2024.03.05.16.44.33 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 05 Mar 2024 16:44:33 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-93178-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) client-ip=147.75.80.249; Authentication-Results: mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=jijq+vUt; arc=pass (i=1 spf=pass spfdomain=chromium.org dkim=pass dkdomain=chromium.org dmarc=pass fromdomain=chromium.org); spf=pass (google.com: domain of linux-kernel+bounces-93178-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-93178-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by am.mirrors.kernel.org (Postfix) with ESMTPS id 099EF1F22603 for ; Wed, 6 Mar 2024 00:44:33 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 9EE7411CB8; Wed, 6 Mar 2024 00:43:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="jijq+vUt" Received: from mail-oi1-f170.google.com (mail-oi1-f170.google.com [209.85.167.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F0F9A79F2 for ; Wed, 6 Mar 2024 00:43:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.170 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709685836; cv=none; b=S80FBHyuD2ngQneloJ1qIBOJdmLGvyfGvYdVTQbcZgn0hC6xNs9ARpbmuTcHFjPbNGBx8eJCwR90jMnflAujCdQ+O+FX6KmcE7zIV5uv2bjCTlLmmV9bVlRGTA5bFzoiv+vw/jH1Mw5gCObk4bkxj0KuHfgEkewp1yxVCsM7bCg= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709685836; c=relaxed/simple; bh=Ok/aCchxSjxpYR3ue2nZb0tuuaMyxZyT7DkB2/pntc4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AHfHMkOZ6jU/XQB0D605HQzxhpN5xad+E9tKrNsA2G02P44zEleQrURgV199DMFbjiXY6AutzUpPAfYbiQ7Ln0XotGJ6KXNGKa/UTaveCbNIW83rKDz5sUWoowgR6uZU8Da7JdQNtHR1nyt/+sVNpG1fEP2wyefkcgMj0y5hC5k= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=jijq+vUt; arc=none smtp.client-ip=209.85.167.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Received: by mail-oi1-f170.google.com with SMTP id 5614622812f47-3c1ea425a0fso1651932b6e.3 for ; Tue, 05 Mar 2024 16:43:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1709685834; x=1710290634; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=j07CQ2B9VSDqAzaDJZq3q/Yl1tEHZa3IBFEiQqTUDBc=; b=jijq+vUtOoAHKVYVnCpLTgdwx6ZQ4XP2xzgZc9UHd3svWFMatmTzIMCETTQ4ZWOxgS I2eP+gmm+eEr7qCDIjaaXPNAm4VRu9sU9680GOzphabSVKhElwjQK844mBkxYN6xIQ14 0HcldcaQ/hbWNawqUIJms9CvtTBsE3xkT6W8o= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709685834; x=1710290634; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=j07CQ2B9VSDqAzaDJZq3q/Yl1tEHZa3IBFEiQqTUDBc=; b=E83FwZ1Z+yjeIQOjGQAuJAItHfh/JiZEONRSisyvC7tUNygSQskK4isuK7PGR1erYk A3A4SYn3cUkKz0qJgxTw7LnjNOUeOo0vM2hamZZsLzHEjN7nPvoPWunUqBzaxzcTxDDp N1GR/58/OVMK0I3d1A/RBW+UCbFr3pt/fv6SGXFQQHPQZ5Q2gb4/RvjTVK0Em8TGAyqw XUIhpekrkjtdhSXkZL5sWRqXk5Bm8yWk6ytQcJ5gB4MiwvUHqe/WJCRhuJtRtfFdXUs/ RXdHRsf7asGGjHYaaeOHZw6DSfqQVRMQxgNcLOUvsVG+bnOnoR1ouj3EQaztOUWoc0AT p3fw== X-Forwarded-Encrypted: i=1; AJvYcCXrSZj2fRyh9Bw7PO1G3USvKQgDwBMEobCZgSbpj/2IRCRkSr5HltNqZgXkfspr+rfNDEdn3xsBbRNbJJ+Lw1BxNnEAsUT0IBDM9oo1 X-Gm-Message-State: AOJu0Yy53tVQh+ipX0apOp2ytAFZf4jSITkBtEcqqBnbovrPa0UJwDkE cJTdoWHWgdoA2EEdstCLmIFglYJNpGLltjNXgBF0cK1CuqEsqhPpA3ukCN1pRMaJt24e2J7Um0c = X-Received: by 2002:aca:1208:0:b0:3c1:ea81:64e9 with SMTP id 8-20020aca1208000000b003c1ea8164e9mr3292594ois.44.1709685834206; Tue, 05 Mar 2024 16:43:54 -0800 (PST) Received: from hsinyi.sjc.corp.google.com ([2620:15c:9d:2:29bc:b3d:1ba8:cf52]) by smtp.gmail.com with ESMTPSA id x37-20020a631725000000b005dc48e56191sm8512885pgl.11.2024.03.05.16.43.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 05 Mar 2024 16:43:54 -0800 (PST) From: Hsin-Yi Wang To: Jani Nikula , Dmitry Baryshkov , Douglas Anderson Cc: Neil Armstrong , Jessica Zhang , Sam Ravnborg , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Daniel Vetter , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 4/5] drm/panel-edp: Match edp_panels with panel identity Date: Tue, 5 Mar 2024 16:34:04 -0800 Message-ID: <20240306004347.974304-5-hsinyi@chromium.org> X-Mailer: git-send-email 2.44.0.278.ge034bb2e1d-goog In-Reply-To: <20240306004347.974304-1-hsinyi@chromium.org> References: <20240306004347.974304-1-hsinyi@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit It's found that some panels have variants that they share the same panel id although their EDID and names are different. When matching generic edp panels, we should first match with both panel identity, which contains both panel id and panel name. If not found, match with panel id only. Signed-off-by: Hsin-Yi Wang --- v3->v4: combine name and id to identity. --- drivers/gpu/drm/panel/panel-edp.c | 45 ++++++++++++++++--------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/drivers/gpu/drm/panel/panel-edp.c b/drivers/gpu/drm/panel/panel-edp.c index d094cfc43da8..fb70e97a2e71 100644 --- a/drivers/gpu/drm/panel/panel-edp.c +++ b/drivers/gpu/drm/panel/panel-edp.c @@ -210,15 +210,12 @@ struct panel_desc { * struct edp_panel_entry - Maps panel ID to delay / panel name. */ struct edp_panel_entry { - /** @panel_id: 32-bit ID for panel, encoded with drm_edid_encode_panel_id(). */ - u32 panel_id; + /** @ident: edid identity used for panel matching. */ + const struct drm_edid_ident ident; /** @delay: The power sequencing delays needed for this panel. */ const struct panel_delay *delay; - /** @name: Name of this panel (for printing to logs). */ - const char *name; - /** @override_edid_mode: Override the mode obtained by edid. */ const struct drm_display_mode *override_edid_mode; }; @@ -691,7 +688,7 @@ static int detected_panel_show(struct seq_file *s, void *data) else if (!p->detected_panel) seq_puts(s, "HARDCODED\n"); else - seq_printf(s, "%s\n", p->detected_panel->name); + seq_printf(s, "%s\n", p->detected_panel->ident.name); return 0; } @@ -761,7 +758,7 @@ static void panel_edp_parse_panel_timing_node(struct device *dev, dev_err(dev, "Reject override mode: No display_timing found\n"); } -static const struct edp_panel_entry *find_edp_panel(u32 panel_id); +static const struct edp_panel_entry *find_edp_panel(u32 panel_id, const struct drm_edid *edid); static int generic_edp_panel_probe(struct device *dev, struct panel_edp *panel) { @@ -799,7 +796,6 @@ static int generic_edp_panel_probe(struct device *dev, struct panel_edp *panel) base_block = drm_edid_read_base_block(panel->ddc); if (base_block) { panel_id = drm_edid_get_panel_id(base_block); - drm_edid_free(base_block); } else { dev_err(dev, "Couldn't identify panel via EDID\n"); ret = -EIO; @@ -807,7 +803,9 @@ static int generic_edp_panel_probe(struct device *dev, struct panel_edp *panel) } drm_edid_decode_panel_id(panel_id, vend, &product_id); - panel->detected_panel = find_edp_panel(panel_id); + panel->detected_panel = find_edp_panel(panel_id, base_block); + + drm_edid_free(base_block); /* * We're using non-optimized timings and want it really obvious that @@ -840,7 +838,7 @@ static int generic_edp_panel_probe(struct device *dev, struct panel_edp *panel) panel->detected_panel = ERR_PTR(-EINVAL); } else { dev_info(dev, "Detected %s %s (%#06x)\n", - vend, panel->detected_panel->name, product_id); + vend, panel->detected_panel->ident.name, product_id); /* Update the delay; everything else comes from EDID */ desc->delay = *panel->detected_panel->delay; @@ -1930,17 +1928,21 @@ static const struct panel_delay delay_200_500_e50_po2e200 = { #define EDP_PANEL_ENTRY(vend_chr_0, vend_chr_1, vend_chr_2, product_id, _delay, _name) \ { \ - .name = _name, \ - .panel_id = drm_edid_encode_panel_id(vend_chr_0, vend_chr_1, vend_chr_2, \ - product_id), \ + .ident = { \ + .name = _name, \ + .panel_id = drm_edid_encode_panel_id(vend_chr_0, vend_chr_1, vend_chr_2, \ + product_id), \ + }, \ .delay = _delay \ } #define EDP_PANEL_ENTRY2(vend_chr_0, vend_chr_1, vend_chr_2, product_id, _delay, _name, _mode) \ { \ - .name = _name, \ - .panel_id = drm_edid_encode_panel_id(vend_chr_0, vend_chr_1, vend_chr_2, \ - product_id), \ + .ident = { \ + .name = _name, \ + .panel_id = drm_edid_encode_panel_id(vend_chr_0, vend_chr_1, vend_chr_2, \ + product_id), \ + }, \ .delay = _delay, \ .override_edid_mode = _mode \ } @@ -2087,15 +2089,16 @@ static const struct edp_panel_entry edp_panels[] = { { /* sentinal */ } }; -static const struct edp_panel_entry *find_edp_panel(u32 panel_id) +static const struct edp_panel_entry *find_edp_panel(u32 panel_id, const struct drm_edid *edid) { const struct edp_panel_entry *panel; - if (!panel_id) - return NULL; + for (panel = edp_panels; panel->ident.panel_id; panel++) + if (drm_edid_match_identity(edid, &panel->ident)) + return panel; - for (panel = edp_panels; panel->panel_id; panel++) - if (panel->panel_id == panel_id) + for (panel = edp_panels; panel->ident.panel_id; panel++) + if (panel->ident.panel_id == panel_id) return panel; return NULL; -- 2.44.0.278.ge034bb2e1d-goog