Skip to content

Commit

Permalink
UBUNTU: SAUCE: PCI/AER: Disable AER interrupt during suspend
Browse files Browse the repository at this point in the history
BugLink: https://bugs.launchpad.net/bugs/1913691

Commit 5031060 ("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: 5031060 ("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: Timo Aaltonen <timo.aaltonen@canonical.com>
  • Loading branch information
Kai-Heng Feng authored and Timo Aaltonen committed Jan 29, 2021
1 parent bcb4c6c commit 3e31ff0
Showing 1 changed file with 18 additions and 0 deletions.
18 changes: 18 additions & 0 deletions drivers/pci/pcie/aer.c
Original file line number Diff line number Diff line change
Expand Up @@ -1349,6 +1349,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 link on Root Port
* @dev: pointer to Root Port's pci_dev data structure
Expand Down Expand Up @@ -1388,6 +1404,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,
};

Expand Down

0 comments on commit 3e31ff0

Please sign in to comment.