Commit 7f785763 authored by Randy Dunlap's avatar Randy Dunlap Committed by Greg Kroah-Hartman

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: default avatarRandy Dunlap <randy.dunlap@oracle.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent fd6e7321
...@@ -68,6 +68,7 @@ parameter is applicable: ...@@ -68,6 +68,7 @@ parameter is applicable:
PARIDE The ParIDE (parallel port IDE) subsystem is enabled. PARIDE The ParIDE (parallel port IDE) subsystem is enabled.
PARISC The PA-RISC architecture is enabled. PARISC The PA-RISC architecture is enabled.
PCI PCI bus support is enabled. PCI PCI bus support is enabled.
PCIE PCI Express support is enabled.
PCMCIA The PCMCIA subsystem is enabled. PCMCIA The PCMCIA subsystem is enabled.
PNP Plug & Play support is enabled. PNP Plug & Play support is enabled.
PPC PowerPC architecture is enabled. PPC PowerPC architecture is enabled.
...@@ -1270,6 +1271,9 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -1270,6 +1271,9 @@ and is between 256 and 4096 characters. It is defined in the file
Mechanism 1. Mechanism 1.
conf2 [X86-32] Force use of PCI Configuration conf2 [X86-32] Force use of PCI Configuration
Mechanism 2. Mechanism 2.
noaer [PCIE] If the PCIEAER kernel config parameter is
enabled, this kernel boot option can be used to
disable the use of PCIE advanced error reporting.
nommconf [X86-32,X86_64] Disable use of MMCONFIG for PCI nommconf [X86-32,X86_64] Disable use of MMCONFIG for PCI
Configuration Configuration
nomsi [MSI] If the PCI_MSI kernel config parameter is nomsi [MSI] If the PCI_MSI kernel config parameter is
......
...@@ -1586,6 +1586,8 @@ static int __devinit pci_setup(char *str) ...@@ -1586,6 +1586,8 @@ static int __devinit pci_setup(char *str)
if (*str && (str = pcibios_setup(str)) && *str) { if (*str && (str = pcibios_setup(str)) && *str) {
if (!strcmp(str, "nomsi")) { if (!strcmp(str, "nomsi")) {
pci_no_msi(); pci_no_msi();
} else if (!strcmp(str, "noaer")) {
pci_no_aer();
} else if (!strncmp(str, "cbiosize=", 9)) { } else if (!strncmp(str, "cbiosize=", 9)) {
pci_cardbus_io_size = memparse(str + 9, &str); pci_cardbus_io_size = memparse(str + 9, &str);
} else if (!strncmp(str, "cbmemsize=", 10)) { } else if (!strncmp(str, "cbmemsize=", 10)) {
......
...@@ -52,6 +52,12 @@ void pci_restore_msi_state(struct pci_dev *dev); ...@@ -52,6 +52,12 @@ void pci_restore_msi_state(struct pci_dev *dev);
static inline void pci_restore_msi_state(struct pci_dev *dev) {} static inline void pci_restore_msi_state(struct pci_dev *dev) {}
#endif #endif
#ifdef CONFIG_PCIEAER
void pci_no_aer(void);
#else
static inline void pci_no_aer(void) { }
#endif
static inline int pci_no_d1d2(struct pci_dev *dev) static inline int pci_no_d1d2(struct pci_dev *dev)
{ {
unsigned int parent_dstates = 0; unsigned int parent_dstates = 0;
......
...@@ -81,6 +81,13 @@ static struct pcie_port_service_driver aerdriver = { ...@@ -81,6 +81,13 @@ static struct pcie_port_service_driver aerdriver = {
.reset_link = aer_root_reset, .reset_link = aer_root_reset,
}; };
static int pcie_aer_disable;
void pci_no_aer(void)
{
pcie_aer_disable = 1; /* has priority over 'forceload' */
}
/** /**
* aer_irq - Root Port's ISR * aer_irq - Root Port's ISR
* @irq: IRQ assigned to Root Port * @irq: IRQ assigned to Root Port
...@@ -327,6 +334,8 @@ static void aer_error_resume(struct pci_dev *dev) ...@@ -327,6 +334,8 @@ static void aer_error_resume(struct pci_dev *dev)
**/ **/
static int __init aer_service_init(void) static int __init aer_service_init(void)
{ {
if (pcie_aer_disable)
return -ENXIO;
return pcie_port_service_register(&aerdriver); return pcie_port_service_register(&aerdriver);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment