Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

PCI / PCIe: Introduce command line option to disable ARI

There are PCIe devices on the market that report ARI support but
then fail to initialize correctly when ARI is actually used. This
leads to situations in which kernels 2.6.34 and newer fail to handle
systems where the previous kernels worked without any apparent
problems. Unfortunately, it is currently unknown how many such
devices are there.

For this reason, introduce a new kernel command line option,
pci=noari, allowing users to disable PCIe ARI altogether if they
see problems with PCIe device initialization.

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>

authored by

Rafael J. Wysocki and committed by
Jesse Barnes
6748dcc2 f6330c31

+7 -1
+1
Documentation/kernel-parameters.txt
··· 2116 2116 off: Turn realloc off 2117 2117 on: Turn realloc on 2118 2118 realloc same as realloc=on 2119 + noari do not use PCIe ARI. 2119 2120 2120 2121 pcie_aspm= [PCIE] Forcibly enable or disable PCIe Active State Power 2121 2122 Management.
+6 -1
drivers/pci/pci.c
··· 94 94 */ 95 95 unsigned int pcibios_max_latency = 255; 96 96 97 + /* If set, the PCIe ARI capability will not be used. */ 98 + static bool pcie_ari_disabled; 99 + 97 100 /** 98 101 * pci_bus_max_busnr - returns maximum PCI bus number of given bus' children 99 102 * @bus: pointer to PCI bus structure to search ··· 1958 1955 u16 flags, ctrl; 1959 1956 struct pci_dev *bridge; 1960 1957 1961 - if (!pci_is_pcie(dev) || dev->devfn) 1958 + if (pcie_ari_disabled || !pci_is_pcie(dev) || dev->devfn) 1962 1959 return; 1963 1960 1964 1961 pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ARI); ··· 3843 3840 pci_realloc_get_opt("on"); 3844 3841 } else if (!strcmp(str, "nodomains")) { 3845 3842 pci_no_domains(); 3843 + } else if (!strncmp(str, "noari", 5)) { 3844 + pcie_ari_disabled = true; 3846 3845 } else if (!strncmp(str, "cbiosize=", 9)) { 3847 3846 pci_cardbus_io_size = memparse(str + 9, &str); 3848 3847 } else if (!strncmp(str, "cbmemsize=", 10)) {