From patchwork Thu Mar 5 01:23:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rajat Jain X-Patchwork-Id: 11421015 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 51B8C924 for ; Thu, 5 Mar 2020 01:23:50 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 307B320866 for ; Thu, 5 Mar 2020 01:23:50 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=google.com header.i=@google.com header.b="ZYUFsof2" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 307B320866 Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id CF5E86E11C; Thu, 5 Mar 2020 01:23:47 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mail-pg1-x54a.google.com (mail-pg1-x54a.google.com [IPv6:2607:f8b0:4864:20::54a]) by gabe.freedesktop.org (Postfix) with ESMTPS id 1AB006E11C for ; Thu, 5 Mar 2020 01:23:47 +0000 (UTC) Received: by mail-pg1-x54a.google.com with SMTP id l17so2263000pgh.21 for ; Wed, 04 Mar 2020 17:23:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=C9EkwJ1gUg61QN8k194CxCHcCIG0/y+uw6Hl1AyDtGU=; b=ZYUFsof2AdnN/vxqOFzeKiPT7SkzpB/41s6WTfPp++cAv0qbgdDjJ6g5Rga20zTPBf gVsTD4MeMUoXCcB+Yigcrgnk5XZFiAVW/wNHUFEQSxUBuWOc4VMLHC9HhaNdfPSo4ZPe 4Kc4pufQiFjyEB3orS6YAYWNQpQ/Dop2rQPcJtiRb11ektKq1x/7kQKp8Y8GjqGzwOgC EqqXorAOfzF4xN26+FaMtotHiNvsBJ/EmkGcx1l0Iq/CSDkgdarDn6oWTsh6VXUn38Dq l0C46YIBY9maN/qy1VA09qYcXLwOQPUjkIqftU3r+2Wa2+AZQrPHmTpatnf476pjTwrI CSXA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=C9EkwJ1gUg61QN8k194CxCHcCIG0/y+uw6Hl1AyDtGU=; b=jb/+Y/9GvyHNcISrjcuPQ6xTuaQuBg5gBBJ1fqc2t6GA/5+r99qq+ifOkHMyanOTUU A0Ltq528Dmeuf78Pby9IOWM9+43IGO0nJrAJ2FWmIk6wWmOuoubcqT3aghDS0T5QkEtq O7XFD5C+NlWDpgfMOXX+1wEIWNY3mKB+ucI5T0RHjXJsyNP+smGDaxE6LEBHs6zbrMbX w+CBHWmfjHHazT83X/ALTBoj1amiMI4+7lVaXHz4EggWN+ovmN7fTp8rMmSpFPbFBhOL zTKRVx/aP7x7rMSt180/usgV1BJmvnyQTmgaJdzfifpMnsu5DINHeGaN+MC7B7YcivBC 6lvA== X-Gm-Message-State: ANhLgQ2tDyd08JrlVtYh/5EXUWFKV0QtsKBM+DYEuWYDZ9wR3g38Ggdc 0idR5J+YknYwnRqsb1weUslnpUfoe6Fb X-Google-Smtp-Source: ADFU+vt22Y/ktG0yM2E5RHf9kr3+rTtxgnQJRQ51fjn3zDr8ksVD4tQhfSFd9ZOr4BIHrnKtguZNIHHL5bU7 X-Received: by 2002:a63:2166:: with SMTP id s38mr4787838pgm.83.1583371426342; Wed, 04 Mar 2020 17:23:46 -0800 (PST) Date: Wed, 4 Mar 2020 17:23:36 -0800 In-Reply-To: <20200305012338.219746-1-rajatja@google.com> Message-Id: <20200305012338.219746-2-rajatja@google.com> Mime-Version: 1.0 References: <20200305012338.219746-1-rajatja@google.com> X-Mailer: git-send-email 2.25.0.265.gbab2e86ba0-goog From: Rajat Jain To: Maarten Lankhorst , Maxime Ripard , Sean Paul , David Airlie , Daniel Vetter , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , " =?utf-8?b?VmlsbGUgU3lyasOkbMOk?= " , Chris Wilson , Imre Deak , " =?utf-8?q?Jos=C3=A9_Roberto_de_Souza?= " , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, gregkh@linuxfoundation.org, mathewk@google.com, Daniel Thompson , Jonathan Corbet , Pavel Machek , seanpaul@google.com, Duncan Laurie , jsbarnes@google.com, Thierry Reding , mpearson@lenovo.com, Nitin Joshi1 , Sugumaran Lacshiminarayanan , Tomoki Maruichi Subject: [Intel-gfx] [PATCH v6 1/3] intel_acpi: Rename drm_dev local variable to dev X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: rajatxjain@gmail.com Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" Change the struct drm_device * local variable from drm_dev to dev per the feedback received here: https://lkml.org/lkml/2020/1/24/1143 Signed-off-by: Rajat Jain Reviewed-by: Jani Nikula --- v6: Initial patch (v6 to match other patches in the set) drivers/gpu/drm/i915/display/intel_acpi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_acpi.c b/drivers/gpu/drm/i915/display/intel_acpi.c index e21fb14d5e07b..3e6831cca4ac1 100644 --- a/drivers/gpu/drm/i915/display/intel_acpi.c +++ b/drivers/gpu/drm/i915/display/intel_acpi.c @@ -224,13 +224,13 @@ static u32 acpi_display_type(struct intel_connector *connector) void intel_acpi_device_id_update(struct drm_i915_private *dev_priv) { - struct drm_device *drm_dev = &dev_priv->drm; + struct drm_device *dev = &dev_priv->drm; struct intel_connector *connector; struct drm_connector_list_iter conn_iter; u8 display_index[16] = {}; /* Populate the ACPI IDs for all connectors for a given drm_device */ - drm_connector_list_iter_begin(drm_dev, &conn_iter); + drm_connector_list_iter_begin(dev, &conn_iter); for_each_intel_connector_iter(connector, &conn_iter) { u32 device_id, type; From patchwork Thu Mar 5 01:23:37 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rajat Jain X-Patchwork-Id: 11421017 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 906DE14B4 for ; Thu, 5 Mar 2020 01:23:52 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 6EBC320870 for ; Thu, 5 Mar 2020 01:23:52 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=google.com header.i=@google.com header.b="uo/C8yMH" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6EBC320870 Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 1CF436EB64; Thu, 5 Mar 2020 01:23:50 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mail-pf1-x44a.google.com (mail-pf1-x44a.google.com [IPv6:2607:f8b0:4864:20::44a]) by gabe.freedesktop.org (Postfix) with ESMTPS id AF89D6EB64 for ; Thu, 5 Mar 2020 01:23:49 +0000 (UTC) Received: by mail-pf1-x44a.google.com with SMTP id u84so2648038pfc.18 for ; Wed, 04 Mar 2020 17:23:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=mCF91NKean3cZSjdJ9yCVdLO2tsfZeI0WmZfI6eVTDk=; b=uo/C8yMHGcAiUAXPbnXBhbG4jnjT5y+s6oGDa7K/0z30wofFkGYcvZv6k2R5y+axle /PkoxfUS8dZgydEpwQYaaLoX4H20nhMuC/cl2W4sqSPCjTYhhpxtHYnp1la3qfFpBvsV j6x9VrsBWz5Q189GyQRCn8UEfnZQHy2JJcmQMfNNwd/Atbw0R2d1F8RVxXTvTwYXt7iv 8lsjJfKAcpxcUFXKP7cCxyI4f9t0J9kLsiNHNtsgMyDE76xEAXu7SopNG9CgHdR5p6v2 QrH7fwWPRKRDKjXN/I8zUIczzdedY7CqjBEN685sFDwdnzdlyzw8wQ9PF9EImUmOiuTB cg3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=mCF91NKean3cZSjdJ9yCVdLO2tsfZeI0WmZfI6eVTDk=; b=gIDDxCfUBBswcIVgDgz9tveqLhruzTueLTIDgHo2XS90Dob6rLCNSfwt8bf/ZNGXe7 PkP7s6J1VIoYQ3vSx+x0at8n8UOWS5voR42jYc7T80Ha5/VMDBUzhn0+DmjG0KpL5UnY Mr6Y30zF+9bzfB1szYGUxVJrUKJ7tao4y/isszzChpaQMvBHKr3quvWfzRpceQtvHIb0 5gGoMxfmQbA5svyfLRm8U4kQ9yGrTuNn9fL3csW7tmA9y5FPyEFfQWqszUUo+Hyylsbd WQsuDNjda9EfwJ/EH9eGj7i1PQ0pZJzYxHbG14BAXBYRFj7PV5SBPoRHheWLUqaaCND8 TGig== X-Gm-Message-State: ANhLgQ17HbyIGc79r5R2KoJK8+r4XWaBkPFFv6UK57OafltqHALuBoR2 N65PCwWldHNQ8gMqzcq4YVIY8VoFCP8K X-Google-Smtp-Source: ADFU+vsdGdUM+5sgueLuCR2fxyGeMboRJDKDOW+jbRDCwCPSHE+kvEQbamlCPTI20P2VPL0QIhsmAJzMsKBR X-Received: by 2002:a65:5846:: with SMTP id s6mr5041932pgr.179.1583371429163; Wed, 04 Mar 2020 17:23:49 -0800 (PST) Date: Wed, 4 Mar 2020 17:23:37 -0800 In-Reply-To: <20200305012338.219746-1-rajatja@google.com> Message-Id: <20200305012338.219746-3-rajatja@google.com> Mime-Version: 1.0 References: <20200305012338.219746-1-rajatja@google.com> X-Mailer: git-send-email 2.25.0.265.gbab2e86ba0-goog From: Rajat Jain To: Maarten Lankhorst , Maxime Ripard , Sean Paul , David Airlie , Daniel Vetter , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , " =?utf-8?b?VmlsbGUgU3lyasOkbMOk?= " , Chris Wilson , Imre Deak , " =?utf-8?q?Jos=C3=A9_Roberto_de_Souza?= " , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, gregkh@linuxfoundation.org, mathewk@google.com, Daniel Thompson , Jonathan Corbet , Pavel Machek , seanpaul@google.com, Duncan Laurie , jsbarnes@google.com, Thierry Reding , mpearson@lenovo.com, Nitin Joshi1 , Sugumaran Lacshiminarayanan , Tomoki Maruichi Subject: [Intel-gfx] [PATCH v6 2/3] drm/i915: Lookup and attach ACPI device node for connectors X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: rajatxjain@gmail.com Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" Lookup and attach ACPI nodes for intel connectors. The lookup is done in compliance with ACPI Spec 6.3 https://uefi.org/sites/default/files/resources/ACPI_6_3_final_Jan30.pdf (Ref: Pages 1119 - 1123). This can be useful for any connector specific platform properties. (This will be used for privacy screen in next patch). Signed-off-by: Rajat Jain --- v6: Addressed minor comments from Jani at https://lkml.org/lkml/2020/1/24/1143 - local variable renamed. - used drm_dbg_kms() - used acpi_device_handle() - Used opaque type acpi_handle instead of void* v5: same as v4 v4: Same as v3 v3: fold the code into existing acpi_device_id_update() function v2: formed by splitting the original patch into ACPI lookup, and privacy screen property. Also move it into i915 now that I found existing code in i915 that can be re-used. drivers/gpu/drm/i915/display/intel_acpi.c | 24 +++++++++++++++++++ .../drm/i915/display/intel_display_types.h | 5 ++++ drivers/gpu/drm/i915/display/intel_dp.c | 3 +++ 3 files changed, 32 insertions(+) diff --git a/drivers/gpu/drm/i915/display/intel_acpi.c b/drivers/gpu/drm/i915/display/intel_acpi.c index 3e6831cca4ac1..870c1ad98df92 100644 --- a/drivers/gpu/drm/i915/display/intel_acpi.c +++ b/drivers/gpu/drm/i915/display/intel_acpi.c @@ -222,11 +222,22 @@ static u32 acpi_display_type(struct intel_connector *connector) return display_type; } +/* + * Ref: ACPI Spec 6.3 + * https://uefi.org/sites/default/files/resources/ACPI_6_3_final_Jan30.pdf + * Pages 1119 - 1123 describe, what I believe, a standard way of + * identifying / addressing "display panels" in the ACPI. It provides + * a way for the ACPI to define devices for the display panels attached + * to the system. It thus provides a way for the BIOS to export any panel + * specific properties to the system via ACPI (like device trees). + */ void intel_acpi_device_id_update(struct drm_i915_private *dev_priv) { struct drm_device *dev = &dev_priv->drm; struct intel_connector *connector; struct drm_connector_list_iter conn_iter; + struct acpi_device *conn_dev; + u64 conn_addr; u8 display_index[16] = {}; /* Populate the ACPI IDs for all connectors for a given drm_device */ @@ -242,6 +253,19 @@ void intel_acpi_device_id_update(struct drm_i915_private *dev_priv) device_id |= display_index[type]++ << ACPI_DISPLAY_INDEX_SHIFT; connector->acpi_device_id = device_id; + + /* Build the _ADR to look for */ + conn_addr = device_id | ACPI_DEVICE_ID_SCHEME | + ACPI_BIOS_CAN_DETECT; + + drm_dbg_kms(dev, "Checking connector ACPI node at _ADR=%llX\n", + conn_addr); + + /* Look up the connector device, under the PCI device */ + conn_dev = acpi_find_child_device( + ACPI_COMPANION(&dev->pdev->dev), + conn_addr, false); + connector->acpi_handle = acpi_device_handle(conn_dev); } drm_connector_list_iter_end(&conn_iter); } diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h index 5e00e611f077f..d70612cc1ba2a 100644 --- a/drivers/gpu/drm/i915/display/intel_display_types.h +++ b/drivers/gpu/drm/i915/display/intel_display_types.h @@ -411,9 +411,14 @@ struct intel_connector { */ struct intel_encoder *encoder; +#ifdef CONFIG_ACPI /* ACPI device id for ACPI and driver cooperation */ u32 acpi_device_id; + /* ACPI handle corresponding to this connector display, if found */ + acpi_handle acpi_handle; +#endif + /* Reads out the current hw, returning true if the connector is enabled * and active (i.e. dpms ON state). */ bool (*get_hw_state)(struct intel_connector *); diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c index 0a417cd2af2bc..171821113d362 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -44,6 +44,7 @@ #include "i915_debugfs.h" #include "i915_drv.h" #include "i915_trace.h" +#include "intel_acpi.h" #include "intel_atomic.h" #include "intel_audio.h" #include "intel_connector.h" @@ -6868,6 +6869,8 @@ intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connect connector->state->scaling_mode = DRM_MODE_SCALE_ASPECT; + /* Lookup the ACPI node corresponding to the connector */ + intel_acpi_device_id_update(dev_priv); } } From patchwork Thu Mar 5 01:23:38 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Rajat Jain X-Patchwork-Id: 11421019 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 78F2D14B4 for ; Thu, 5 Mar 2020 01:23:54 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 5765E20866 for ; Thu, 5 Mar 2020 01:23:54 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=google.com header.i=@google.com header.b="GM2z4ud+" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5765E20866 Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 8876C6EB82; Thu, 5 Mar 2020 01:23:53 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mail-pf1-x44a.google.com (mail-pf1-x44a.google.com [IPv6:2607:f8b0:4864:20::44a]) by gabe.freedesktop.org (Postfix) with ESMTPS id 4F7096EB83 for ; Thu, 5 Mar 2020 01:23:52 +0000 (UTC) Received: by mail-pf1-x44a.google.com with SMTP id f27so2673344pfq.0 for ; Wed, 04 Mar 2020 17:23:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc:content-transfer-encoding; bh=xVbKhPYa03B/7Fj2wzK9whmItxLhEu9PIS8rQfMj+SU=; b=GM2z4ud+9K0JKzbxsFheloVDdBaQxSOGR7UIizgqv6Fz3VfjncftQN2pKYvj/ugTrJ mMLygJcH56f9wyVkGssID3FkFnLLrIPZAIW6W4LRnh+L2ihE5QKtAmn2oqIIpUFk1apN 8d38W5ToUj9qvA1qIicW38AR0EroTnBYVFjbJ33csWp+zI4q8tuJFR/VkHAf6bTlZRIe IPeY1Jx9dlQ5AiAz0ocL2KKG8XzORqbjzlMCzPHjKEP3Kupx/yzVN/JcRTfgh5nE8trH P6YObwrzcc3Uha/ST7nirtLf3DxrE4c0hojx9bg92k3iePINHFff5+OoApSeTOvBobrT ml+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc:content-transfer-encoding; bh=xVbKhPYa03B/7Fj2wzK9whmItxLhEu9PIS8rQfMj+SU=; b=QUgvF4Uaan4cqPM1dWQz46N50BgeyOIUCoJ8W6b+jJ8nudD2MuvrWuKjEz796qeMma 3eL/mVB+TQco0wQVj16dGwZNq2vuzyfFiKud7LoPfuAtPYsUIjkFVMt9nTbmAG3WLmaN LSTApPMoDG0IkOTFGVpdtHdVRGUYcMKUAn6vRp9eqf9MxoSvdN03P6nGmRgPhw1QBp/r z2nhmsC193Solzf5VikCe1l20V7qeiCOJSdx92fhTEKm4B9sTNcYUTcEQmyNdSpXEhPm 8Hra3Q8QSOOvGo00l53hCwaX/kO7Yp62jG+45llyibippmv0Ifv5XD2yqfcqTnu8lOJe wglw== X-Gm-Message-State: ANhLgQ1mIIfffwTDK1YYjWOy7vuS/4EPt+XScuXh1ctx/f4rC6WZTACY 2llpjbtPasqqC1cASjCu3cLk+hgzxbOz X-Google-Smtp-Source: ADFU+vu9pNnubG4QZFewleUzGXkCy2THuipbLYTYtQx0hzQy+4owF20BomGvEjVc33UZsofb5kI0PQhzFQ/O X-Received: by 2002:a65:488d:: with SMTP id n13mr5008755pgs.91.1583371431651; Wed, 04 Mar 2020 17:23:51 -0800 (PST) Date: Wed, 4 Mar 2020 17:23:38 -0800 In-Reply-To: <20200305012338.219746-1-rajatja@google.com> Message-Id: <20200305012338.219746-4-rajatja@google.com> Mime-Version: 1.0 References: <20200305012338.219746-1-rajatja@google.com> X-Mailer: git-send-email 2.25.0.265.gbab2e86ba0-goog From: Rajat Jain To: Maarten Lankhorst , Maxime Ripard , Sean Paul , David Airlie , Daniel Vetter , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , " =?utf-8?b?VmlsbGUgU3lyasOkbMOk?= " , Chris Wilson , Imre Deak , " =?utf-8?q?Jos=C3=A9_Roberto_de_Souza?= " , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, gregkh@linuxfoundation.org, mathewk@google.com, Daniel Thompson , Jonathan Corbet , Pavel Machek , seanpaul@google.com, Duncan Laurie , jsbarnes@google.com, Thierry Reding , mpearson@lenovo.com, Nitin Joshi1 , Sugumaran Lacshiminarayanan , Tomoki Maruichi , groeck@google.com Subject: [Intel-gfx] [PATCH v6 3/3] drm/i915: Add support for integrated privacy screens X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: rajatxjain@gmail.com Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" Certain laptops now come with panels that have integrated privacy screens on them. This patch adds support for such panels by adding a privacy-screen property to the intel_connector for the panel, that the userspace can then use to control and check the status. Identifying the presence of privacy screen, and controlling it, is done via ACPI _DSM methods. Currently, this is done only for the Intel display ports. But in future, this can be done for any other ports if the hardware becomes available (e.g. external monitors supporting integrated privacy screens?). Signed-off-by: Rajat Jain --- v6: Always initialize prop in intel_attach_privacy_screen_property() v5: fix a cosmetic checkpatch warning v4: Fix a typo in intel_privacy_screen.h v3: * Change license to GPL-2.0 OR MIT * Move privacy screen enum from UAPI to intel_display_types.h * Rename parameter name and some other minor changes. v2: Formed by splitting the original patch into multiple patches. - All code has been moved into i915 now. - Privacy screen is a i915 property - Have a local state variable to store the prvacy screen. Don't read it from hardware. drivers/gpu/drm/i915/Makefile | 3 +- drivers/gpu/drm/i915/display/intel_atomic.c | 13 +++- .../gpu/drm/i915/display/intel_connector.c | 35 +++++++++ .../gpu/drm/i915/display/intel_connector.h | 1 + .../drm/i915/display/intel_display_types.h | 18 +++++ drivers/gpu/drm/i915/display/intel_dp.c | 6 ++ .../drm/i915/display/intel_privacy_screen.c | 72 +++++++++++++++++++ .../drm/i915/display/intel_privacy_screen.h | 27 +++++++ 8 files changed, 171 insertions(+), 4 deletions(-) create mode 100644 drivers/gpu/drm/i915/display/intel_privacy_screen.c create mode 100644 drivers/gpu/drm/i915/display/intel_privacy_screen.h diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile index 991a8c537d123..825951b4cd006 100644 --- a/drivers/gpu/drm/i915/Makefile +++ b/drivers/gpu/drm/i915/Makefile @@ -208,7 +208,8 @@ i915-y += \ display/intel_vga.o i915-$(CONFIG_ACPI) += \ display/intel_acpi.o \ - display/intel_opregion.o + display/intel_opregion.o \ + display/intel_privacy_screen.o i915-$(CONFIG_DRM_FBDEV_EMULATION) += \ display/intel_fbdev.o diff --git a/drivers/gpu/drm/i915/display/intel_atomic.c b/drivers/gpu/drm/i915/display/intel_atomic.c index d043057d2fa03..4ed537c877777 100644 --- a/drivers/gpu/drm/i915/display/intel_atomic.c +++ b/drivers/gpu/drm/i915/display/intel_atomic.c @@ -40,6 +40,7 @@ #include "intel_global_state.h" #include "intel_hdcp.h" #include "intel_psr.h" +#include "intel_privacy_screen.h" #include "intel_sprite.h" /** @@ -60,11 +61,14 @@ int intel_digital_connector_atomic_get_property(struct drm_connector *connector, struct drm_i915_private *dev_priv = to_i915(dev); struct intel_digital_connector_state *intel_conn_state = to_intel_digital_connector_state(state); + struct intel_connector *intel_connector = to_intel_connector(connector); if (property == dev_priv->force_audio_property) *val = intel_conn_state->force_audio; else if (property == dev_priv->broadcast_rgb_property) *val = intel_conn_state->broadcast_rgb; + else if (property == intel_connector->privacy_screen_property) + *val = intel_conn_state->privacy_screen_status; else { drm_dbg_atomic(&dev_priv->drm, "Unknown property [PROP:%d:%s]\n", @@ -93,15 +97,18 @@ int intel_digital_connector_atomic_set_property(struct drm_connector *connector, struct drm_i915_private *dev_priv = to_i915(dev); struct intel_digital_connector_state *intel_conn_state = to_intel_digital_connector_state(state); + struct intel_connector *intel_connector = to_intel_connector(connector); if (property == dev_priv->force_audio_property) { intel_conn_state->force_audio = val; return 0; - } - - if (property == dev_priv->broadcast_rgb_property) { + } else if (property == dev_priv->broadcast_rgb_property) { intel_conn_state->broadcast_rgb = val; return 0; + } else if (property == intel_connector->privacy_screen_property) { + intel_privacy_screen_set_val(intel_connector, val); + intel_conn_state->privacy_screen_status = val; + return 0; } drm_dbg_atomic(&dev_priv->drm, "Unknown property [PROP:%d:%s]\n", diff --git a/drivers/gpu/drm/i915/display/intel_connector.c b/drivers/gpu/drm/i915/display/intel_connector.c index 903e49659f561..55f80219cb269 100644 --- a/drivers/gpu/drm/i915/display/intel_connector.c +++ b/drivers/gpu/drm/i915/display/intel_connector.c @@ -297,3 +297,38 @@ intel_attach_colorspace_property(struct drm_connector *connector) drm_object_attach_property(&connector->base, connector->colorspace_property, 0); } + +static const struct drm_prop_enum_list privacy_screen_enum[] = { + { PRIVACY_SCREEN_DISABLED, "Disabled" }, + { PRIVACY_SCREEN_ENABLED, "Enabled" }, +}; + +/** + * intel_attach_privacy_screen_property - + * create and attach the connecter's privacy-screen property. * + * @connector: connector for which to init the privacy-screen property + * + * This function creates and attaches the "privacy-screen" property to the + * connector. Initial state of privacy-screen is set to disabled. + */ +void +intel_attach_privacy_screen_property(struct drm_connector *connector) +{ + struct intel_connector *intel_connector = to_intel_connector(connector); + struct drm_property *prop = intel_connector->privacy_screen_property; + + if (!prop) { + prop = drm_property_create_enum(connector->dev, + DRM_MODE_PROP_ENUM, + "privacy-screen", + privacy_screen_enum, + ARRAY_SIZE(privacy_screen_enum)); + if (!prop) + return; + + intel_connector->privacy_screen_property = prop; + } + + drm_object_attach_property(&connector->base, prop, + PRIVACY_SCREEN_DISABLED); +} diff --git a/drivers/gpu/drm/i915/display/intel_connector.h b/drivers/gpu/drm/i915/display/intel_connector.h index 93a7375c8196d..61005f37a3385 100644 --- a/drivers/gpu/drm/i915/display/intel_connector.h +++ b/drivers/gpu/drm/i915/display/intel_connector.h @@ -31,5 +31,6 @@ void intel_attach_force_audio_property(struct drm_connector *connector); void intel_attach_broadcast_rgb_property(struct drm_connector *connector); void intel_attach_aspect_ratio_property(struct drm_connector *connector); void intel_attach_colorspace_property(struct drm_connector *connector); +void intel_attach_privacy_screen_property(struct drm_connector *connector); #endif /* __INTEL_CONNECTOR_H__ */ diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h index d70612cc1ba2a..de20effb3e073 100644 --- a/drivers/gpu/drm/i915/display/intel_display_types.h +++ b/drivers/gpu/drm/i915/display/intel_display_types.h @@ -442,6 +442,23 @@ struct intel_connector { struct work_struct modeset_retry_work; struct intel_hdcp hdcp; + + /* Optional "privacy-screen" property for the connector panel */ + struct drm_property *privacy_screen_property; +}; + +/** + * enum intel_privacy_screen_status - privacy_screen status + * + * This enum is used to track and control the state of the integrated privacy + * screen present on some display panels, via the "privacy-screen" property. + * + * @PRIVACY_SCREEN_DISABLED: The privacy-screen on the panel is disabled + * @PRIVACY_SCREEN_ENABLED: The privacy-screen on the panel is enabled + **/ +enum intel_privacy_screen_status { + PRIVACY_SCREEN_DISABLED = 0, + PRIVACY_SCREEN_ENABLED = 1, }; struct intel_digital_connector_state { @@ -449,6 +466,7 @@ struct intel_digital_connector_state { enum hdmi_force_audio force_audio; int broadcast_rgb; + enum intel_privacy_screen_status privacy_screen_status; }; #define to_intel_digital_connector_state(x) container_of(x, struct intel_digital_connector_state, base) diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c index 171821113d362..ff76c799364d0 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -62,6 +62,7 @@ #include "intel_lspcon.h" #include "intel_lvds.h" #include "intel_panel.h" +#include "intel_privacy_screen.h" #include "intel_psr.h" #include "intel_sideband.h" #include "intel_tc.h" @@ -6841,6 +6842,7 @@ intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connect { struct drm_i915_private *dev_priv = to_i915(connector->dev); enum port port = dp_to_dig_port(intel_dp)->base.port; + struct intel_connector *intel_connector = to_intel_connector(connector); if (!IS_G4X(dev_priv) && port != PORT_A) intel_attach_force_audio_property(connector); @@ -6871,6 +6873,10 @@ intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connect /* Lookup the ACPI node corresponding to the connector */ intel_acpi_device_id_update(dev_priv); + + /* Check for integrated Privacy screen support */ + if (intel_privacy_screen_present(intel_connector)) + intel_attach_privacy_screen_property(connector); } } diff --git a/drivers/gpu/drm/i915/display/intel_privacy_screen.c b/drivers/gpu/drm/i915/display/intel_privacy_screen.c new file mode 100644 index 0000000000000..c8a5b64f94fb7 --- /dev/null +++ b/drivers/gpu/drm/i915/display/intel_privacy_screen.c @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: GPL-2.0 OR MIT +/* + * Intel ACPI privacy screen code + * + * Copyright © 2019 Google Inc. + */ + +#include + +#include "intel_privacy_screen.h" + +#define CONNECTOR_DSM_REVID 1 + +#define CONNECTOR_DSM_FN_PRIVACY_ENABLE 2 +#define CONNECTOR_DSM_FN_PRIVACY_DISABLE 3 + +static const guid_t drm_conn_dsm_guid = + GUID_INIT(0xC7033113, 0x8720, 0x4CEB, + 0x90, 0x90, 0x9D, 0x52, 0xB3, 0xE5, 0x2D, 0x73); + +/* Makes _DSM call to set privacy screen status */ +static void acpi_privacy_screen_call_dsm(acpi_handle conn_handle, u64 func) +{ + union acpi_object *obj; + + obj = acpi_evaluate_dsm(conn_handle, &drm_conn_dsm_guid, + CONNECTOR_DSM_REVID, func, NULL); + if (!obj) { + DRM_DEBUG_DRIVER("failed to evaluate _DSM for fn %llx\n", func); + return; + } + + ACPI_FREE(obj); +} + +void intel_privacy_screen_set_val(struct intel_connector *connector, + enum intel_privacy_screen_status val) +{ + acpi_handle acpi_handle = connector->acpi_handle; + + if (!acpi_handle) + return; + + if (val == PRIVACY_SCREEN_DISABLED) + acpi_privacy_screen_call_dsm(acpi_handle, + CONNECTOR_DSM_FN_PRIVACY_DISABLE); + else if (val == PRIVACY_SCREEN_ENABLED) + acpi_privacy_screen_call_dsm(acpi_handle, + CONNECTOR_DSM_FN_PRIVACY_ENABLE); + else + DRM_WARN("%s: Cannot set privacy screen to invalid val %u\n", + dev_name(connector->base.dev->dev), val); +} + +bool intel_privacy_screen_present(struct intel_connector *connector) +{ + acpi_handle handle = connector->acpi_handle; + + if (!handle) + return false; + + if (!acpi_check_dsm(handle, &drm_conn_dsm_guid, + CONNECTOR_DSM_REVID, + 1 << CONNECTOR_DSM_FN_PRIVACY_ENABLE | + 1 << CONNECTOR_DSM_FN_PRIVACY_DISABLE)) { + DRM_WARN("%s: Odd, connector ACPI node but no privacy scrn?\n", + dev_name(connector->base.dev->dev)); + return false; + } + DRM_DEV_INFO(connector->base.dev->dev, "supports privacy screen\n"); + return true; +} diff --git a/drivers/gpu/drm/i915/display/intel_privacy_screen.h b/drivers/gpu/drm/i915/display/intel_privacy_screen.h new file mode 100644 index 0000000000000..74013a7885c70 --- /dev/null +++ b/drivers/gpu/drm/i915/display/intel_privacy_screen.h @@ -0,0 +1,27 @@ +/* SPDX-License-Identifier: GPL-2.0 OR MIT */ +/* + * Copyright © 2019 Google Inc. + */ + +#ifndef __DRM_PRIVACY_SCREEN_H__ +#define __DRM_PRIVACY_SCREEN_H__ + +#include "intel_display_types.h" + +#ifdef CONFIG_ACPI +bool intel_privacy_screen_present(struct intel_connector *connector); +void intel_privacy_screen_set_val(struct intel_connector *connector, + enum intel_privacy_screen_status val); +#else +static bool intel_privacy_screen_present(struct intel_connector *connector) +{ + return false; +} + +static void +intel_privacy_screen_set_val(struct intel_connector *connector, + enum intel_privacy_screen_status val) +{ } +#endif /* CONFIG_ACPI */ + +#endif /* __DRM_PRIVACY_SCREEN_H__ */