Thread (11 messages) 11 messages, 4 authors, 2023-05-11

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

From: Kai-Heng Feng <hidden>
Date: 2023-05-11 13:37:21
Also in: linux-pci, lkml

On Tue, Apr 25, 2023 at 7:47 AM Sathyanarayanan Kuppuswamy
[off-list ref] wrote:


On 4/23/23 10:52 PM, Kai-Heng Feng wrote:
quoted
PCIe service that shares IRQ with PME may cause spurious wakeup on
system suspend.

PCIe Base Spec 5.0, section 5.2 "Link State Power Management" states
that TLP and DLLP transmission is disabled for a Link in L2/L3 Ready
(D3hot), L2 (D3cold with aux power) and L3 (D3cold), so we don't lose
much here to disable AER during system suspend.

This is very similar to previous attempts to suspend AER and DPC [1],
but with a different reason.

[1] https://lore.kernel.org/linux-pci/20220408153159.106741-1-kai.heng.feng@canonical.com/ (local)
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>
---
IIUC, you encounter AER errors during the suspend/resume process, which
results in AER IRQ. Because AER and PME share an IRQ, it is regarded as a
spurious wake-up IRQ. So to fix it, you want to disable AER reporting,
right?

It looks like it is harmless to disable the AER during the suspend/resume
path. But, I am wondering why we get these errors? Did you check what errors
you get during the suspend/resume path? Are these errors valid?
AFAIK those errors comes from firmware/hardware side, especially when
the device gets put to D3hot/D3cold.

Kai-Heng
quoted
 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,
 };
--
Sathyanarayanan Kuppuswamy
Linux Kernel Developer
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help