Commit 7f785763660e75c9eddaddea3d618696af4ae3a2

Authored by Randy Dunlap
Committed by Greg Kroah-Hartman
1 parent fd6e732186

pci: implement "pci=noaer"

For cases in which CONFIG_PCIEAER=y (such as distro kernels), allow users
to disable PCIE Advanced Error Reporting by using "pci=noaer" on the
kernel command line.

This can be used to work around hardware or (kernel) software problems.

Signed-off-by: Randy Dunlap <randy.dunlap@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

Showing 4 changed files with 21 additions and 0 deletions Side-by-side Diff

Documentation/kernel-parameters.txt
... ... @@ -68,6 +68,7 @@
68 68 PARIDE The ParIDE (parallel port IDE) subsystem is enabled.
69 69 PARISC The PA-RISC architecture is enabled.
70 70 PCI PCI bus support is enabled.
  71 + PCIE PCI Express support is enabled.
71 72 PCMCIA The PCMCIA subsystem is enabled.
72 73 PNP Plug & Play support is enabled.
73 74 PPC PowerPC architecture is enabled.
... ... @@ -1270,6 +1271,9 @@
1270 1271 Mechanism 1.
1271 1272 conf2 [X86-32] Force use of PCI Configuration
1272 1273 Mechanism 2.
  1274 + noaer [PCIE] If the PCIEAER kernel config parameter is
  1275 + enabled, this kernel boot option can be used to
  1276 + disable the use of PCIE advanced error reporting.
1273 1277 nommconf [X86-32,X86_64] Disable use of MMCONFIG for PCI
1274 1278 Configuration
1275 1279 nomsi [MSI] If the PCI_MSI kernel config parameter is
... ... @@ -1586,6 +1586,8 @@
1586 1586 if (*str && (str = pcibios_setup(str)) && *str) {
1587 1587 if (!strcmp(str, "nomsi")) {
1588 1588 pci_no_msi();
  1589 + } else if (!strcmp(str, "noaer")) {
  1590 + pci_no_aer();
1589 1591 } else if (!strncmp(str, "cbiosize=", 9)) {
1590 1592 pci_cardbus_io_size = memparse(str + 9, &str);
1591 1593 } else if (!strncmp(str, "cbmemsize=", 10)) {
... ... @@ -52,6 +52,12 @@
52 52 static inline void pci_restore_msi_state(struct pci_dev *dev) {}
53 53 #endif
54 54  
  55 +#ifdef CONFIG_PCIEAER
  56 +void pci_no_aer(void);
  57 +#else
  58 +static inline void pci_no_aer(void) { }
  59 +#endif
  60 +
55 61 static inline int pci_no_d1d2(struct pci_dev *dev)
56 62 {
57 63 unsigned int parent_dstates = 0;
drivers/pci/pcie/aer/aerdrv.c
... ... @@ -81,6 +81,13 @@
81 81 .reset_link = aer_root_reset,
82 82 };
83 83  
  84 +static int pcie_aer_disable;
  85 +
  86 +void pci_no_aer(void)
  87 +{
  88 + pcie_aer_disable = 1; /* has priority over 'forceload' */
  89 +}
  90 +
84 91 /**
85 92 * aer_irq - Root Port's ISR
86 93 * @irq: IRQ assigned to Root Port
... ... @@ -327,6 +334,8 @@
327 334 **/
328 335 static int __init aer_service_init(void)
329 336 {
  337 + if (pcie_aer_disable)
  338 + return -ENXIO;
330 339 return pcie_port_service_register(&aerdriver);
331 340 }
332 341