Commit 7ece1417 authored by Bjorn Helgaas's avatar Bjorn Helgaas

PCI/AER: Remove aerdriver.forceload kernel parameter

Per the PCI Firmware spec, r3.0, sec 4.5.1, on ACPI systems, the OS must
not use AER unless _OSC is present and _OSC grants AER control to the OS.
The aerdriver.forceload kernel parameter was a way to enable Linux AER
support on ACPI systems that lack _OSC or fail to grant control the the OS.

Enabling Linux AER support when the firmware doesn't want us to is a recipe
for problems, e.g., the firmware might be handling AER itself.

Remove the aerdriver.forceload kernel parameter and related supporting
code.
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
parent 9ff25e6b
...@@ -49,21 +49,17 @@ depends on CONFIG_PCIEPORTBUS, so pls. set CONFIG_PCIEPORTBUS=y and ...@@ -49,21 +49,17 @@ depends on CONFIG_PCIEPORTBUS, so pls. set CONFIG_PCIEPORTBUS=y and
CONFIG_PCIEAER = y. CONFIG_PCIEAER = y.
2.2 Load PCI Express AER Root Driver 2.2 Load PCI Express AER Root Driver
There is a case where a system has AER support in BIOS. Enabling the AER
Root driver and having AER support in BIOS may result unpredictable Some systems have AER support in firmware. Enabling Linux AER support at
behavior. To avoid this conflict, a successful load of the AER Root driver the same time the firmware handles AER may result in unpredictable
requires ACPI _OSC support in the BIOS to allow the AER Root driver to behavior. Therefore, Linux does not handle AER events unless the firmware
request for native control of AER. See the PCI FW 3.0 Specification for grants AER control to the OS via the ACPI _OSC method. See the PCI FW 3.0
details regarding OSC usage. Currently, lots of firmwares don't provide Specification for details regarding _OSC usage.
_OSC support while they use PCI Express. To support such firmwares,
forceload, a parameter of type bool, could enable AER to continue to
be initiated although firmwares have no _OSC support. To enable the
walkaround, pls. add aerdriver.forceload=y to kernel boot parameter line
when booting kernel. Note that forceload=n by default.
2.3 AER error output 2.3 AER error output
When a PCI-E AER error is captured, an error message will be outputted to
console. If it's a correctable error, it is outputted as a warning. When a PCIe AER error is captured, an error message will be output to
console. If it's a correctable error, it is output as a warning.
Otherwise, it is printed as an error. So users could choose different Otherwise, it is printed as an error. So users could choose different
log level to filter out correctable error messages. log level to filter out correctable error messages.
......
...@@ -70,7 +70,7 @@ static int pcie_aer_disable; ...@@ -70,7 +70,7 @@ static int pcie_aer_disable;
void pci_no_aer(void) void pci_no_aer(void)
{ {
pcie_aer_disable = 1; /* has priority over 'forceload' */ pcie_aer_disable = 1;
} }
bool pci_aer_available(void) bool pci_aer_available(void)
...@@ -304,11 +304,6 @@ static int aer_probe(struct pcie_device *dev) ...@@ -304,11 +304,6 @@ static int aer_probe(struct pcie_device *dev)
struct aer_rpc *rpc; struct aer_rpc *rpc;
struct device *device = &dev->device; struct device *device = &dev->device;
/* Init */
status = aer_init(dev);
if (status)
return status;
/* Alloc rpc data structure */ /* Alloc rpc data structure */
rpc = aer_alloc_rpc(dev); rpc = aer_alloc_rpc(dev);
if (!rpc) { if (!rpc) {
......
...@@ -105,7 +105,6 @@ static inline pci_ers_result_t merge_result(enum pci_ers_result orig, ...@@ -105,7 +105,6 @@ static inline pci_ers_result_t merge_result(enum pci_ers_result orig,
} }
extern struct bus_type pcie_port_bus_type; extern struct bus_type pcie_port_bus_type;
int aer_init(struct pcie_device *dev);
void aer_isr(struct work_struct *work); void aer_isr(struct work_struct *work);
void aer_print_error(struct pci_dev *dev, struct aer_err_info *info); void aer_print_error(struct pci_dev *dev, struct aer_err_info *info);
void aer_print_port_info(struct pci_dev *dev, struct aer_err_info *info); void aer_print_port_info(struct pci_dev *dev, struct aer_err_info *info);
...@@ -121,11 +120,4 @@ static inline int pcie_aer_get_firmware_first(struct pci_dev *pci_dev) ...@@ -121,11 +120,4 @@ static inline int pcie_aer_get_firmware_first(struct pci_dev *pci_dev)
return 0; return 0;
} }
#endif #endif
static inline void pcie_aer_force_firmware_first(struct pci_dev *pci_dev,
int enable)
{
pci_dev->__aer_firmware_first = !!enable;
pci_dev->__aer_firmware_first_valid = 1;
}
#endif /* _AERDRV_H_ */ #endif /* _AERDRV_H_ */
...@@ -27,9 +27,6 @@ ...@@ -27,9 +27,6 @@
#include <linux/kfifo.h> #include <linux/kfifo.h>
#include "aerdrv.h" #include "aerdrv.h"
static bool forceload;
module_param(forceload, bool, 0);
#define PCI_EXP_AER_FLAGS (PCI_EXP_DEVCTL_CERE | PCI_EXP_DEVCTL_NFERE | \ #define PCI_EXP_AER_FLAGS (PCI_EXP_DEVCTL_CERE | PCI_EXP_DEVCTL_NFERE | \
PCI_EXP_DEVCTL_FERE | PCI_EXP_DEVCTL_URRE) PCI_EXP_DEVCTL_FERE | PCI_EXP_DEVCTL_URRE)
...@@ -811,19 +808,3 @@ void aer_isr(struct work_struct *work) ...@@ -811,19 +808,3 @@ void aer_isr(struct work_struct *work)
aer_isr_one_error(p_device, &e_src); aer_isr_one_error(p_device, &e_src);
mutex_unlock(&rpc->rpc_mutex); mutex_unlock(&rpc->rpc_mutex);
} }
/**
* aer_init - provide AER initialization
* @dev: pointer to AER pcie device
*
* Invoked when AER service driver is loaded.
*/
int aer_init(struct pcie_device *dev)
{
if (forceload) {
dev_printk(KERN_DEBUG, &dev->device,
"aerdrv forceload requested.\n");
pcie_aer_force_firmware_first(dev->port, 0);
}
return 0;
}
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