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: Bjorn Helgaas <bhelgaas@google.com>
This commit is contained in:
parent
9ff25e6b3e
commit
7ece141753
@ -49,21 +49,17 @@ depends on CONFIG_PCIEPORTBUS, so pls. set CONFIG_PCIEPORTBUS=y and
|
||||
CONFIG_PCIEAER = y.
|
||||
|
||||
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
|
||||
behavior. To avoid this conflict, a successful load of the AER Root driver
|
||||
requires ACPI _OSC support in the BIOS to allow the AER Root driver to
|
||||
request for native control of AER. See the PCI FW 3.0 Specification for
|
||||
details regarding OSC usage. Currently, lots of firmwares don't provide
|
||||
_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.
|
||||
|
||||
Some systems have AER support in firmware. Enabling Linux AER support at
|
||||
the same time the firmware handles AER may result in unpredictable
|
||||
behavior. Therefore, Linux does not handle AER events unless the firmware
|
||||
grants AER control to the OS via the ACPI _OSC method. See the PCI FW 3.0
|
||||
Specification for details regarding _OSC usage.
|
||||
|
||||
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
|
||||
log level to filter out correctable error messages.
|
||||
|
||||
|
@ -70,7 +70,7 @@ static int pcie_aer_disable;
|
||||
|
||||
void pci_no_aer(void)
|
||||
{
|
||||
pcie_aer_disable = 1; /* has priority over 'forceload' */
|
||||
pcie_aer_disable = 1;
|
||||
}
|
||||
|
||||
bool pci_aer_available(void)
|
||||
@ -304,11 +304,6 @@ static int aer_probe(struct pcie_device *dev)
|
||||
struct aer_rpc *rpc;
|
||||
struct device *device = &dev->device;
|
||||
|
||||
/* Init */
|
||||
status = aer_init(dev);
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
/* Alloc rpc data structure */
|
||||
rpc = aer_alloc_rpc(dev);
|
||||
if (!rpc) {
|
||||
|
@ -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;
|
||||
int aer_init(struct pcie_device *dev);
|
||||
void aer_isr(struct work_struct *work);
|
||||
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);
|
||||
@ -121,11 +120,4 @@ static inline int pcie_aer_get_firmware_first(struct pci_dev *pci_dev)
|
||||
return 0;
|
||||
}
|
||||
#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_ */
|
||||
|
@ -27,9 +27,6 @@
|
||||
#include <linux/kfifo.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 | \
|
||||
PCI_EXP_DEVCTL_FERE | PCI_EXP_DEVCTL_URRE)
|
||||
|
||||
@ -811,19 +808,3 @@ void aer_isr(struct work_struct *work)
|
||||
aer_isr_one_error(p_device, &e_src);
|
||||
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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user