97 lines
3.1 KiB
Diff
97 lines
3.1 KiB
Diff
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
|
From: Kai-Heng Feng <kai.heng.feng@canonical.com>
|
||
|
Date: Thu, 23 Apr 2020 14:23:58 +0800
|
||
|
Subject: [PATCH] drm: Use generic helper to check _PR3 presence
|
||
|
|
||
|
Replace nouveau_pr3_present() in favor of a more generic one,
|
||
|
pci_pr3_present().
|
||
|
|
||
|
Also the presence of upstream bridge _PR3 doesn't need to go hand in
|
||
|
hand with device's _DSM, so check _PR3 before _DSM.
|
||
|
|
||
|
Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
|
||
|
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
|
||
|
---
|
||
|
drivers/gpu/drm/nouveau/nouveau_acpi.c | 44 ++++++--------------------
|
||
|
1 file changed, 10 insertions(+), 34 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/gpu/drm/nouveau/nouveau_acpi.c b/drivers/gpu/drm/nouveau/nouveau_acpi.c
|
||
|
index fe3a10255c36..b84dff1b0f28 100644
|
||
|
--- a/drivers/gpu/drm/nouveau/nouveau_acpi.c
|
||
|
+++ b/drivers/gpu/drm/nouveau/nouveau_acpi.c
|
||
|
@@ -212,37 +212,6 @@ static const struct vga_switcheroo_handler nouveau_dsm_handler = {
|
||
|
.get_client_id = nouveau_dsm_get_client_id,
|
||
|
};
|
||
|
|
||
|
-/*
|
||
|
- * Firmware supporting Windows 8 or later do not use _DSM to put the device into
|
||
|
- * D3cold, they instead rely on disabling power resources on the parent.
|
||
|
- */
|
||
|
-static bool nouveau_pr3_present(struct pci_dev *pdev)
|
||
|
-{
|
||
|
- struct pci_dev *parent_pdev = pci_upstream_bridge(pdev);
|
||
|
- struct acpi_device *parent_adev;
|
||
|
-
|
||
|
- if (!parent_pdev)
|
||
|
- return false;
|
||
|
-
|
||
|
- if (!parent_pdev->bridge_d3) {
|
||
|
- /*
|
||
|
- * Parent PCI bridge is currently not power managed.
|
||
|
- * Since userspace can change these afterwards to be on
|
||
|
- * the safe side we stick with _DSM and prevent usage of
|
||
|
- * _PR3 from the bridge.
|
||
|
- */
|
||
|
- pci_d3cold_disable(pdev);
|
||
|
- return false;
|
||
|
- }
|
||
|
-
|
||
|
- parent_adev = ACPI_COMPANION(&parent_pdev->dev);
|
||
|
- if (!parent_adev)
|
||
|
- return false;
|
||
|
-
|
||
|
- return parent_adev->power.flags.power_resources &&
|
||
|
- acpi_has_method(parent_adev->handle, "_PR3");
|
||
|
-}
|
||
|
-
|
||
|
static void nouveau_dsm_pci_probe(struct pci_dev *pdev, acpi_handle *dhandle_out,
|
||
|
bool *has_mux, bool *has_opt,
|
||
|
bool *has_opt_flags, bool *has_pr3)
|
||
|
@@ -250,6 +219,16 @@ static void nouveau_dsm_pci_probe(struct pci_dev *pdev, acpi_handle *dhandle_out
|
||
|
acpi_handle dhandle;
|
||
|
bool supports_mux;
|
||
|
int optimus_funcs;
|
||
|
+ struct pci_dev *parent_pdev;
|
||
|
+
|
||
|
+ *has_pr3 = false;
|
||
|
+ parent_pdev = pci_upstream_bridge(pdev);
|
||
|
+ if (parent_pdev) {
|
||
|
+ if (parent_pdev->bridge_d3)
|
||
|
+ *has_pr3 = pci_pr3_present(parent_pdev);
|
||
|
+ else
|
||
|
+ pci_d3cold_disable(pdev);
|
||
|
+ }
|
||
|
|
||
|
dhandle = ACPI_HANDLE(&pdev->dev);
|
||
|
if (!dhandle)
|
||
|
@@ -270,7 +249,6 @@ static void nouveau_dsm_pci_probe(struct pci_dev *pdev, acpi_handle *dhandle_out
|
||
|
*has_mux = supports_mux;
|
||
|
*has_opt = !!optimus_funcs;
|
||
|
*has_opt_flags = optimus_funcs & (1 << NOUVEAU_DSM_OPTIMUS_FLAGS);
|
||
|
- *has_pr3 = false;
|
||
|
|
||
|
if (optimus_funcs) {
|
||
|
uint32_t result;
|
||
|
@@ -280,8 +258,6 @@ static void nouveau_dsm_pci_probe(struct pci_dev *pdev, acpi_handle *dhandle_out
|
||
|
(result & OPTIMUS_ENABLED) ? "enabled" : "disabled",
|
||
|
(result & OPTIMUS_DYNAMIC_PWR_CAP) ? "dynamic power, " : "",
|
||
|
(result & OPTIMUS_HDA_CODEC_MASK) ? "hda bios codec supported" : "");
|
||
|
-
|
||
|
- *has_pr3 = nouveau_pr3_present(pdev);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
--
|
||
|
2.26.2
|
||
|
|