]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
UBUNTU: SAUCE: PCI/AER: Disable AER interrupt during suspend
authorKai-Heng Feng <kai.heng.feng@canonical.com>
Fri, 29 Jan 2021 08:02:44 +0000 (16:02 +0800)
committerPaolo Pisati <paolo.pisati@canonical.com>
Tue, 2 Nov 2021 07:24:54 +0000 (08:24 +0100)
BugLink: https://bugs.launchpad.net/bugs/1913691
Commit 50310600ebda ("iommu/vt-d: Enable PCI ACS for platform opt in
hint") enables ACS, and some platforms lose its NVMe after resume from
firmware:
[   50.947816] pcieport 0000:00:1b.0: DPC: containment event, status:0x1f01 source:0x0000
[   50.947817] pcieport 0000:00:1b.0: DPC: unmasked uncorrectable error detected
[   50.947829] pcieport 0000:00:1b.0: PCIe Bus Error: severity=Uncorrected (Non-Fatal), type=Transaction Layer, (Receiver ID)
[   50.947830] pcieport 0000:00:1b.0:   device [8086:06ac] error status/mask=00200000/00010000
[   50.947831] pcieport 0000:00:1b.0:    [21] ACSViol                (First)
[   50.947841] pcieport 0000:00:1b.0: AER: broadcast error_detected message
[   50.947843] nvme nvme0: frozen state error detected, reset controller

It happens right after ACS gets enabled during resume.

To prevent that from happening, disable AER interrupt and enable it on
system suspend and resume, respectively.

Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=209149
Fixes: 50310600ebda ("iommu/vt-d: Enable PCI ACS for platform opt in hint")
Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
Signed-off-by: Andrea Righi <andrea.righi@canonical.com>
drivers/pci/pcie/aer.c

index 9784fdcf30061c7ffd407b73bf20f60a8c70ca62..dc0b4b8f3c8a18d2774e9e2e374f0ce50246f8ff 100644 (file)
@@ -1367,6 +1367,22 @@ 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);
+
+       aer_disable_rootport(rpc);
+       return 0;
+}
+
+static int aer_resume(struct pcie_device *dev)
+{
+       struct aer_rpc *rpc = get_service_data(dev);
+
+       aer_enable_rootport(rpc);
+       return 0;
+}
+
 /**
  * aer_root_reset - reset Root Port hierarchy, RCEC, or RCiEP
  * @dev: pointer to Root Port, RCEC, or RCiEP
@@ -1438,6 +1454,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,
 };