Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp2116081pxj; Thu, 20 May 2021 00:02:00 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy47Yc4+QXYbeYIZ61uYUNsgREHtTfXqxSK40J+SO69u5jbT2hJEWur4kNZjm79p+Gbveer X-Received: by 2002:a05:6402:19a:: with SMTP id r26mr3361803edv.44.1621494120303; Thu, 20 May 2021 00:02:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621494120; cv=none; d=google.com; s=arc-20160816; b=hvEgQz+2FkMZHL0bqq70zFlnFIaBlvRoH6vOYPYEGN+2AZv1FUmHtTiwsS+Z5gpVRn 0bP9B5IXvf1exVEQRpmOGE2TIBh6wGiBz1slnFuRG/vRPqA3dXjYff4hHy8hCgnrAir0 MCcD9YhwGziwC9LF11tWZKcaHWtShoCpahDue6kS+JHEvr6wQ5diOgP6n6yR1AMfsDql A3T4W8HWTZq4lYAGdTj1XnUbHswyltUCPlGc9iB8eIKvJVmogL2sWDj5AoEBNECrpbNG 7faHboKuxJ3byM08ErwA5DG7CU1dEgu0fr6chZKGZTutP3J8gVKpO93IT6PlLdARN+TK QE7A== 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 :message-id:date:subject:cc:to:from; bh=SM0LQZdosPgTpvlEPFnb+VWTxXFrZit0ekBMw3N7ZZU=; b=vWln8VQpNhaihqPjXMnTuD9uewYaz8Svk7l2I0B0UXZ4ogqq71rbbgkpIjHLkk2BrX B8B7SllT3K8owxhafjQcFjYcAOXFHbTLz/YjJsQVfg0arQnFQmn4XN/MbEIKP7jGha+Q PMbTkOQX0dtKiiOdw1YDGoPmZCDkty+swdYc5EXi69mW8YSXy9FK9GY/rhEIfXRxctRn nTXViHpOxkJpz4H1BDZ3/MoDiPxs8qUC4u9mwxeMZZm+2VVeiNP3G7Ucn2J7FVpdp5OL LaPftoU02nPM/8bHLDzBXvsfW5YI+qDpQc/IrJHzp7pXEkijqQPWYHDnSdy1ziVai43r PKRQ== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (p=NONE sp=NONE dis=NONE) header.from=canonical.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id y97si1584615ede.37.2021.05.20.00.01.28; Thu, 20 May 2021 00:02:00 -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; 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=fail (p=NONE sp=NONE dis=NONE) header.from=canonical.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230377AbhETHAI (ORCPT + 99 others); Thu, 20 May 2021 03:00:08 -0400 Received: from youngberry.canonical.com ([91.189.89.112]:55964 "EHLO youngberry.canonical.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229978AbhETHAI (ORCPT ); Thu, 20 May 2021 03:00:08 -0400 Received: from 36-229-229-74.dynamic-ip.hinet.net ([36.229.229.74] helo=localhost) by youngberry.canonical.com with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.93) (envelope-from ) id 1ljcdi-0003qu-An; Thu, 20 May 2021 06:58:39 +0000 From: Kai-Heng Feng To: jani.nikula@linux.intel.com, joonas.lahtinen@linux.intel.com, rodrigo.vivi@intel.com, ville.syrjala@linux.intel.com Cc: Kai-Heng Feng , David Airlie , Daniel Vetter , Takashi Iwai , Chris Wilson , Lucas De Marchi , Thomas Zimmermann , intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org (open list:DRM DRIVERS), linux-kernel@vger.kernel.org (open list) Subject: [PATCH v4] drm/i915: Invoke another _DSM to enable MUX on HP Workstation laptops Date: Thu, 20 May 2021 14:58:20 +0800 Message-Id: <20210520065832.614245-1-kai.heng.feng@canonical.com> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On HP Fury G7 Workstations, graphics output is re-routed from Intel GFX to discrete GFX after S3. This is not desirable, because userspace will treat connected display as a new one, losing display settings. The expected behavior is to let discrete GFX drives all external displays. The platform in question uses ACPI method \_SB.PCI0.HGME to enable MUX. The method is inside the another _DSM, so add the _DSM and call it accordingly. I also tested some MUX-less and iGPU only laptops with that _DSM, no regression was found. v4: - Rebase. - Change the DSM name to avoid confusion. - Move the function call to intel_opregion. v3: - Remove BXT from names. - Change the parameter type. - Fold the function into intel_modeset_init_hw(). v2: - Forward declare struct pci_dev. Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/3113 References: https://lore.kernel.org/intel-gfx/1460040732-31417-4-git-send-email-animesh.manna@intel.com/ Signed-off-by: Kai-Heng Feng --- drivers/gpu/drm/i915/display/intel_acpi.c | 19 +++++++++++++++++++ drivers/gpu/drm/i915/display/intel_acpi.h | 3 +++ drivers/gpu/drm/i915/display/intel_opregion.c | 3 +++ 3 files changed, 25 insertions(+) diff --git a/drivers/gpu/drm/i915/display/intel_acpi.c b/drivers/gpu/drm/i915/display/intel_acpi.c index 833d0c1be4f1..7cfe91fc05f2 100644 --- a/drivers/gpu/drm/i915/display/intel_acpi.c +++ b/drivers/gpu/drm/i915/display/intel_acpi.c @@ -19,6 +19,12 @@ static const guid_t intel_dsm_guid = GUID_INIT(0x7ed873d3, 0xc2d0, 0x4e4f, 0xa8, 0x54, 0x0f, 0x13, 0x17, 0xb0, 0x1c, 0x2c); +#define INTEL_DSM_FN_GET_BIOS_DATA_FUNCS_SUPPORTED 0 /* No args */ + +static const guid_t intel_dsm_guid2 = + GUID_INIT(0x3e5b41c6, 0xeb1d, 0x4260, + 0x9d, 0x15, 0xc7, 0x1f, 0xba, 0xda, 0xe4, 0x14); + static char *intel_dsm_port_name(u8 id) { switch (id) { @@ -176,6 +182,19 @@ void intel_unregister_dsm_handler(void) { } +void intel_dsm_get_bios_data_funcs_supported(struct drm_i915_private *i915) +{ + struct pci_dev *pdev = to_pci_dev(i915->drm.dev); + acpi_handle dhandle; + + dhandle = ACPI_HANDLE(&pdev->dev); + if (!dhandle) + return; + + acpi_evaluate_dsm(dhandle, &intel_dsm_guid2, INTEL_DSM_REVISION_ID, + INTEL_DSM_FN_GET_BIOS_DATA_FUNCS_SUPPORTED, NULL); +} + /* * ACPI Specification, Revision 5.0, Appendix B.3.2 _DOD (Enumerate All Devices * Attached to the Display Adapter). diff --git a/drivers/gpu/drm/i915/display/intel_acpi.h b/drivers/gpu/drm/i915/display/intel_acpi.h index e8b068661d22..9f197401c313 100644 --- a/drivers/gpu/drm/i915/display/intel_acpi.h +++ b/drivers/gpu/drm/i915/display/intel_acpi.h @@ -11,11 +11,14 @@ struct drm_i915_private; #ifdef CONFIG_ACPI void intel_register_dsm_handler(void); void intel_unregister_dsm_handler(void); +void intel_dsm_get_bios_data_funcs_supported(struct drm_i915_private *i915); void intel_acpi_device_id_update(struct drm_i915_private *i915); #else static inline void intel_register_dsm_handler(void) { return; } static inline void intel_unregister_dsm_handler(void) { return; } static inline +void intel_dsm_get_bios_data_funcs_supported(struct drm_i915_private *i915) { return; } +static inline void intel_acpi_device_id_update(struct drm_i915_private *i915) { return; } #endif /* CONFIG_ACPI */ diff --git a/drivers/gpu/drm/i915/display/intel_opregion.c b/drivers/gpu/drm/i915/display/intel_opregion.c index dfd724e506b5..3855fba70980 100644 --- a/drivers/gpu/drm/i915/display/intel_opregion.c +++ b/drivers/gpu/drm/i915/display/intel_opregion.c @@ -1078,6 +1078,9 @@ void intel_opregion_resume(struct drm_i915_private *i915) opregion->asle->ardy = ASLE_ARDY_READY; } + /* Some platforms abuse the _DSM to enable MUX */ + intel_dsm_get_bios_data_funcs_supported(i915); + intel_opregion_notify_adapter(i915, PCI_D0); } -- 2.31.1