linux-nvme.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v8 1/3] PCI: Add helper to check if any of ancestor device support D3cold
@ 2024-04-16  4:32 Kai-Heng Feng
  2024-04-16  4:32 ` [PATCH v8 2/3] PCI/AER: Disable AER service on suspend Kai-Heng Feng
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Kai-Heng Feng @ 2024-04-16  4:32 UTC (permalink / raw)
  To: bhelgaas
  Cc: mahesh, oohall, linux-pci, linux-kernel, linuxppc-dev,
	bagasdotme, regressions, linux-nvme, kch, hch, gloriouseggroll,
	kbusch, sagi, hare, Kai-Heng Feng

In addition to nearest upstream bridge, driver may want to know if the
entire hierarchy can be powered off to perform different action.

So walk higher up the hierarchy to find out if any device has valid
_PR3.

The user will be introduced in next patch.

Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
---
v8:
 - No change.

 drivers/pci/pci.c   | 16 ++++++++++++++++
 include/linux/pci.h |  2 ++
 2 files changed, 18 insertions(+)

diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index e5f243dd4288..7a5662f116b8 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -6225,6 +6225,22 @@ bool pci_pr3_present(struct pci_dev *pdev)
 		acpi_has_method(adev->handle, "_PR3");
 }
 EXPORT_SYMBOL_GPL(pci_pr3_present);
+
+bool pci_ancestor_pr3_present(struct pci_dev *pdev)
+{
+	struct pci_dev *parent = pdev;
+
+	if (acpi_disabled)
+		return false;
+
+	while ((parent = pci_upstream_bridge(parent))) {
+		if (pci_pr3_present(pdev))
+			return true;
+	}
+
+	return false;
+}
+EXPORT_SYMBOL_GPL(pci_ancestor_pr3_present);
 #endif
 
 /**
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 16493426a04f..cd71ebfd0f89 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -2620,10 +2620,12 @@ struct irq_domain *pci_host_bridge_acpi_msi_domain(struct pci_bus *bus);
 void
 pci_msi_register_fwnode_provider(struct fwnode_handle *(*fn)(struct device *));
 bool pci_pr3_present(struct pci_dev *pdev);
+bool pci_ancestor_pr3_present(struct pci_dev *pdev);
 #else
 static inline struct irq_domain *
 pci_host_bridge_acpi_msi_domain(struct pci_bus *bus) { return NULL; }
 static inline bool pci_pr3_present(struct pci_dev *pdev) { return false; }
+static inline bool pci_ancestor_pr3_present(struct pci_dev *pdev) { return false; }
 #endif
 
 #ifdef CONFIG_EEH
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2024-04-25  7:33 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-04-16  4:32 [PATCH v8 1/3] PCI: Add helper to check if any of ancestor device support D3cold Kai-Heng Feng
2024-04-16  4:32 ` [PATCH v8 2/3] PCI/AER: Disable AER service on suspend Kai-Heng Feng
2024-04-18  1:33   ` Kuppuswamy Sathyanarayanan
2024-04-18 20:35   ` Bjorn Helgaas
2024-04-25  7:33     ` Kai-Heng Feng
2024-04-16  4:32 ` [PATCH v8 3/3] PCI/DPC: Disable DPC " Kai-Heng Feng
2024-04-18  1:15 ` [PATCH v8 1/3] PCI: Add helper to check if any of ancestor device support D3cold Kuppuswamy Sathyanarayanan
2024-04-25  6:26   ` Kai-Heng Feng

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).