Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp4044660pxf; Mon, 29 Mar 2021 19:56:07 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzERpGnM/eMeRkw/yBvFRJig1E7qwZAO2n4F0OhHmACHyUdNua6CTRhiioobLMSGpDaRsNE X-Received: by 2002:a17:906:f9cc:: with SMTP id lj12mr30510445ejb.544.1617072967384; Mon, 29 Mar 2021 19:56:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1617072967; cv=none; d=google.com; s=arc-20160816; b=MAXSHH7x4gxN//nRgt+ERtI6NeqWt/DD5lnAfDrLgRgi3DgnIcz4a/mA4pW12umUdZ qh8dMhG9t15+P7fbPPbbrnnPUo/Ag+09nfS9hoXvkLoddUTAD2H5WCZn60r5mRKZOdvj EjZBVGbsh1mmfIneFZbKdKyqutrwFEO1EZszEw05BQ8qnh6GkbAgkJ7QUbn4Gb6iqhkD Vz1nlQy1GL00/p6QmWbZdg5tXabZTJApicRwg+YyrzU7DPo1QcI6dXQyLank2CNtS0Fe HtLn0L5eECguad6KVWm/KTJOfAiDLTieKIg+CjU+FwSnp30oCtlZ85Sb2CuBJa7RtW3g QJVw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=BEKsKLyxs1+v0ZxDrM7HVhKxECDMgvUxXPP2eTukK2o=; b=H38X1haHFLGalXaTx794/PJ97uTeKVwdatJt+ds9Yl8fDxei3CuLSaqf8/M52pllel 5DV6JoGclkW9wJaEErpBjIQp/QxRA1dKhoMSGaS28fLd5jmV8GyljP954BjVDxEWJW1i rGubclK4CTQ3RfpoWokXVk9NeiqOrW8F01hImFj1bPgLVDuLLtUNagNz4n8exQX0hg/s j6v+ufcwiBWtJHl5Y9djWCclLlFYpeaZ0k8so8zwEvLQlRbvMnXYlO9RwBUGdpy2rDWq r0dl0qbLckkKpuVGVa1v5D4MvIQTxpt3P6OaI5clmZLwe0yLsNETtV1BvFByjbX9X2vx JxIg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=Uw2K3tYx; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id bt20si14546860edb.201.2021.03.29.19.55.44; Mon, 29 Mar 2021 19:56:07 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=Uw2K3tYx; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231451AbhC3Cyu (ORCPT + 99 others); Mon, 29 Mar 2021 22:54:50 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36438 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230329AbhC3CyR (ORCPT ); Mon, 29 Mar 2021 22:54:17 -0400 Received: from mail-pg1-x532.google.com (mail-pg1-x532.google.com [IPv6:2607:f8b0:4864:20::532]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E86A9C061764 for ; Mon, 29 Mar 2021 19:54:16 -0700 (PDT) Received: by mail-pg1-x532.google.com with SMTP id p12so6033252pgj.10 for ; Mon, 29 Mar 2021 19:54:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=BEKsKLyxs1+v0ZxDrM7HVhKxECDMgvUxXPP2eTukK2o=; b=Uw2K3tYxkMnEPqt9yGgUQVzYBYDnNm7MC9I+61puu5TEYXLVh24tHZAbiDeW4v1ABO lGkIdnuwHF0cQokbjkRoWcjmjEpKlc+ph12Sbqo9gTn+ejwL7NFFjLPfpJMnv4EcGtdv 3qKfSmbEv4ZtmHx9pqTWLHJJl9zjCYxw5Y7Io= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=BEKsKLyxs1+v0ZxDrM7HVhKxECDMgvUxXPP2eTukK2o=; b=H+rhP9G+JUlAd6y+xAAhe3AUQSCvOrSB1D89qVjyBv2yU8RG0Orf2tceHO/dacj8Va LjHtqzCRzuGTo6vNtbUD9kDGtZbDeBk4TcDDLZ2XUoyWEX37OHip6R1h/+5DTbZdMrhv /Yy5tv2EoVEC5GA1+mHEE7ie2Kp73YGNuJek7fQVzsqNTlVuma4JQDf3M9M5VkWBzL3u eWw3H2/xRjAPfaGGNLI8B2N0XRUCOwgwdaDqEI8/gHGp4jmjZgLbGRiYQnuJNBBBn1AM IxqF0s930BfLgwnagc/x7FJyB0NQKTwffGKhJ5hk0e+Vd4PcZv9c7dni86m0FuBx7gUB n1wA== X-Gm-Message-State: AOAM530UDgAUwA2hKYMJIBUnl36VC380TQsVFkRiHTuYm4kPc62KXlfr sgqzGMGEngXYcsesKZIA//PV6g== X-Received: by 2002:a05:6a00:1585:b029:203:6bc9:3ca6 with SMTP id u5-20020a056a001585b02902036bc93ca6mr27842566pfk.79.1617072856430; Mon, 29 Mar 2021 19:54:16 -0700 (PDT) Received: from tictac2.mtv.corp.google.com ([2620:15c:202:201:f599:1ca7:742d:6b50]) by smtp.gmail.com with ESMTPSA id t17sm19152706pgk.25.2021.03.29.19.54.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Mar 2021 19:54:16 -0700 (PDT) From: Douglas Anderson To: Andrzej Hajda , Neil Armstrong , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Sam Ravnborg Cc: Bjorn Andersson , Stephen Boyd , Maarten Lankhorst , robdclark@chromium.org, Stanislav Lisovskiy , linux-arm-msm@vger.kernel.org, Steev Klimaszewski , Linus W , Douglas Anderson , Daniel Vetter , David Airlie , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 09/14] drm/edid: Use the cached EDID in drm_get_edid() if eDP Date: Mon, 29 Mar 2021 19:53:40 -0700 Message-Id: <20210329195255.v2.9.Ia7e9bb7cf6c51d960b9455fb0fa447cc68ece99d@changeid> X-Mailer: git-send-email 2.31.0.291.g576ba9dcdaf-goog In-Reply-To: <20210330025345.3980086-1-dianders@chromium.org> References: <20210330025345.3980086-1-dianders@chromium.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Each time we call drm_get_edid() we: 1. Go out to the bus and ask for the EDID. 2. Cache the EDID. We can improve this to actually use the cached EDID so that if drm_get_edid() is called multiple times then we don't need to go out to the bus over and over again. In normal DP/HDMI cases reading the EDID over and over again isn't _that_ expensive so, presumably, this wasn't that critical in the past. However for eDP going out to the bus can be expensive. This is because eDP panels might be powered off before the EDID was requested so we need to do power sequencing in addition to the transfer. In theory we should be able to cache the EDID for all types of displays. There is already code throwing the cache away when we detect that a display was unplugged. However, it can be noted that it's _extra_ safe to cache the EDID for eDP since eDP isn't a hot-pluggable interface. If we get the EDID once then we've got the EDID and we should never need to read it again. For now we'll only use the cache for eDP both because it's more important and extra safe. Signed-off-by: Douglas Anderson --- (no changes since v1) drivers/gpu/drm/drm_edid.c | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index c2bbe7bee7b6..fcbf468d73c9 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -2049,15 +2049,39 @@ struct edid *drm_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter) { struct edid *edid; + size_t old_edid_size; + const struct edid *old_edid; if (connector->force == DRM_FORCE_OFF) return NULL; - if (connector->force == DRM_FORCE_UNSPECIFIED && !drm_probe_ddc(adapter)) - return NULL; + if (connector->connector_type == DRM_MODE_CONNECTOR_eDP && + connector->edid_blob_ptr) { + /* + * eDP devices are non-removable, or at least not something + * that's expected to be hot-pluggable. We can freely use + * the cached EDID. + * + * NOTE: technically we could probably even use the cached + * EDID even for non-eDP because the cached EDID should be + * cleared if we ever notice a display is not connected, but + * we'll use an abundance of caution and only do it for eDP. + * It's more important for eDP anyway because the EDID may not + * always be readable, like when the panel is powered down. + */ + old_edid = (const struct edid *)connector->edid_blob_ptr->data; + old_edid_size = ksize(old_edid); + edid = kmalloc(old_edid_size, GFP_KERNEL); + if (edid) + memcpy(edid, old_edid, old_edid_size); + } else { + if (connector->force == DRM_FORCE_UNSPECIFIED && !drm_probe_ddc(adapter)) + return NULL; + + edid = drm_do_get_edid(connector, drm_do_probe_ddc_edid, adapter); + drm_connector_update_edid_property(connector, edid); + } - edid = drm_do_get_edid(connector, drm_do_probe_ddc_edid, adapter); - drm_connector_update_edid_property(connector, edid); return edid; } EXPORT_SYMBOL(drm_get_edid); -- 2.31.0.291.g576ba9dcdaf-goog