Kai-Heng Feng
2020-Apr-23  06:23 UTC
[Nouveau] [PATCH 1/1] drm/nouveau: 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 at canonical.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.17.1
Ben Skeggs
2020-Apr-30  03:59 UTC
[Nouveau] [PATCH 1/1] drm/nouveau: Use generic helper to check _PR3 presence
Thanks! On Thu, 23 Apr 2020 at 17:37, Kai-Heng Feng <kai.heng.feng at canonical.com> wrote:> > 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 at canonical.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.17.1 > > _______________________________________________ > dri-devel mailing list > dri-devel at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel
Apparently Analagous Threads
- [PATCH v2 0/4] nouveau RPM fixes for Optimus
- [PATCH v3 0/4] nouveau RPM fixes for Optimus (final)
- [PATCH v2 4/4] drm/nouveau/acpi: fix lockup with PCIe runtime PM
- [PATCH] drm/nouveau/acpi: fix check for power resources support
- [PATCH 4/4] drm/nouveau/acpi: fix lockup with PCIe runtime PM