[PATCH v5] PCI/portdev: Disable AER for Titan Ridge 4C 2018
From: Atharva Tiwari <hidden>
Date: 2026-01-09 06:19:11
Also in:
linux-pci, linux-usb, lkml
Subsystem:
pci enhanced error handling (eeh) for powerpc, pci subsystem, the rest, x86 architecture (32-bit and 64-bit) · Maintainers:
Mahesh J Salgaonkar, Bjorn Helgaas, Linus Torvalds, Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen
Disable AER for Intel Titan Ridge 4C 2018 (used in T2 iMacs, where the warnings appear) that generate continuous pcieport warnings. such as: pcieport 0000:00:1c.4: AER: Correctable error message received from 0000:07:00.0 pcieport 0000:07:00.0: PCIe Bus Error: severity=Correctable, type=Data Link Layer, (Receiver ID) pcieport 0000:07:00.0: device [8086:15ea] error status/mask=00000080/00002000 pcieport 0000:07:00.0: [ 7] BadDLLP macOS also disables AER for Thunderbolt devices and controllers in their drivers. Closes: https://bugzilla.kernel.org/show_bug.cgi?id=220651 Signed-off-by: Atharva Tiwari <redacted> --- Changes since v4: - Used lowercase hex letters - Used DMI_BOARD_VENDOR instead of DMI_SYS_VENDOR Chnages since v3: - Fixed Grammer mistakes Changes since v2: - Transferred logic to arch/x86/pci/fixup.c to only target x86 - Added DMI quirk to only target Apple Systems Changes since v1: - Transferred logic to drivers/pci/quicks.c --- --- arch/x86/pci/fixup.c | 12 ++++++++++++ drivers/pci/pcie/aer.c | 3 +++ drivers/pci/pcie/portdrv.c | 2 +- include/linux/pci.h | 1 + 4 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/arch/x86/pci/fixup.c b/arch/x86/pci/fixup.c
index 25076a5acd96..850bfe03a685 100644
--- a/arch/x86/pci/fixup.c
+++ b/arch/x86/pci/fixup.c@@ -1081,3 +1081,15 @@ static void quirk_tuxeo_rp_d3(struct pci_dev *pdev) } DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, 0x1502, quirk_tuxeo_rp_d3); #endif /* CONFIG_SUSPEND */ + +#ifdef CONFIG_PCIEAER + +static void quirk_disable_aer(struct pci_dev *pdev) +{ + if (dmi_match(DMI_BOARD_VENDOR, "Apple")) + pdev->no_aer = 1; +} +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x15ea, quirk_disable_aer); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x15eb, quirk_disable_aer); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x15ec, quirk_disable_aer); +#endif /* CONFIG_PCIEAER */
diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c
index e0bcaa896803..45604564ce6f 100644
--- a/drivers/pci/pcie/aer.c
+++ b/drivers/pci/pcie/aer.c@@ -389,6 +389,9 @@ void pci_aer_init(struct pci_dev *dev) { int n; + if (dev->no_aer) + return; + dev->aer_cap = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR); if (!dev->aer_cap) return;
diff --git a/drivers/pci/pcie/portdrv.c b/drivers/pci/pcie/portdrv.c
index 38a41ccf79b9..ab904a224296 100644
--- a/drivers/pci/pcie/portdrv.c
+++ b/drivers/pci/pcie/portdrv.c@@ -240,7 +240,7 @@ static int get_port_device_capability(struct pci_dev *dev) if ((pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT || pci_pcie_type(dev) == PCI_EXP_TYPE_RC_EC) && dev->aer_cap && pci_aer_available() && - (pcie_ports_native || host->native_aer)) + (pcie_ports_native || host->native_aer) && !dev->no_aer) services |= PCIE_PORT_SERVICE_AER; #endif
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 864775651c6f..f447f86c6bdf 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h@@ -440,6 +440,7 @@ struct pci_dev { unsigned int multifunction:1; /* Multi-function device */ unsigned int is_busmaster:1; /* Is busmaster */ + unsigned int no_aer:1; /* May not use AER */ unsigned int no_msi:1; /* May not use MSI */ unsigned int no_64bit_msi:1; /* May only use 32-bit MSIs */ unsigned int block_cfg_access:1; /* Config space access blocked */
--
2.43.0