Thread (14 messages) 14 messages, 2 authors, 2023-10-25

Re: [PATCH v6 2/3] PCI/AER: Disable AER interrupt on suspend

From: Kai-Heng Feng <hidden>
Date: 2023-07-14 08:16:08
Also in: linux-pci, lkml

On Fri, May 12, 2023 at 8:01 AM Kai-Heng Feng
[off-list ref] wrote:
PCIe services that share an IRQ with PME, such as AER or DPC, may cause a
spurious wakeup on system suspend. To prevent this, disable the AER interrupt
notification during the system suspend process.

As Per PCIe Base Spec 5.0, section 5.2, titled "Link State Power Management",
TLP and DLLP transmission are disabled for a Link in L2/L3 Ready (D3hot), L2
(D3cold with aux power) and L3 (D3cold) states. So disabling the AER
notification during suspend and re-enabling them during the resume process
should not affect the basic functionality.

Link: https://bugzilla.kernel.org/show_bug.cgi?id=216295
Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Kai-Heng Feng <redacted>
A gentle ping...
quoted hunk ↗ jump to hunk
---
v6:
v5:
 - Wording.

v4:
v3:
 - No change.

v2:
 - Only disable AER IRQ.
 - No more check on PME IRQ#.
 - Use helper.

 drivers/pci/pcie/aer.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)
diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c
index 1420e1f27105..9c07fdbeb52d 100644
--- a/drivers/pci/pcie/aer.c
+++ b/drivers/pci/pcie/aer.c
@@ -1356,6 +1356,26 @@ static int aer_probe(struct pcie_device *dev)
        return 0;
 }

+static int aer_suspend(struct pcie_device *dev)
+{
+       struct aer_rpc *rpc = get_service_data(dev);
+       struct pci_dev *pdev = rpc->rpd;
+
+       aer_disable_irq(pdev);
+
+       return 0;
+}
+
+static int aer_resume(struct pcie_device *dev)
+{
+       struct aer_rpc *rpc = get_service_data(dev);
+       struct pci_dev *pdev = rpc->rpd;
+
+       aer_enable_irq(pdev);
+
+       return 0;
+}
+
 /**
  * aer_root_reset - reset Root Port hierarchy, RCEC, or RCiEP
  * @dev: pointer to Root Port, RCEC, or RCiEP
@@ -1420,6 +1440,8 @@ static struct pcie_port_service_driver aerdriver = {
        .service        = PCIE_PORT_SERVICE_AER,

        .probe          = aer_probe,
+       .suspend        = aer_suspend,
+       .resume         = aer_resume,
        .remove         = aer_remove,
 };

--
2.34.1
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help