aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSuravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>2014-05-08 12:44:18 -0400
committerBjorn Helgaas <bhelgaas@google.com>2014-05-21 14:34:01 -0400
commit94d4bb5b13978127d12860bc6b7071a784144e2f (patch)
tree318aec5e5438f418515f65392563327ad418067c
parent33673101335b19913745ff0e9d2946b490608e5f (diff)
x86/PCI: Work around AMD Fam15h BIOSes that fail to provide _PXM
The BIOS is supposed to provide ACPI _PXM methods for PCI host bridges if it cares about platform topology. But some BIOSes do not, so add Fam15h to the list of CPUs for which we fall back to reading node numbers from the hardware. Note that pci_acpi_scan_root() warns about the BIOS bug if we use this information because (1) the hardware node numbers are not necessarily compatible with other logical node numbers from ACPI, and (2) the lack of _PXM forces OS updates that would not otherwise be required. [bhelgaas: changelog, comments] Link: https://bugzilla.kernel.org/show_bug.cgi?id=72051 Tested-by: Aravind Gopalakrishnan <Aravind.Gopalakrishnan@amd.com> Signed-off-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com> Signed-off-by: Myron Stowe <myron.stowe@redhat.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Cc: Borislav Petkov <bp@suse.de> Cc: Robert Richter <rric@kernel.org> Cc: Daniel J Blueman <daniel@numascale.com> Cc: Andreas Herrmann <herrmann.der.user@googlemail.com>
-rw-r--r--arch/x86/pci/amd_bus.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/arch/x86/pci/amd_bus.c b/arch/x86/pci/amd_bus.c
index e88f4c53d7f6..aa936e3a2019 100644
--- a/arch/x86/pci/amd_bus.c
+++ b/arch/x86/pci/amd_bus.c
@@ -24,10 +24,11 @@ struct pci_hostbridge_probe {
24}; 24};
25 25
26static struct pci_hostbridge_probe pci_probes[] __initdata = { 26static struct pci_hostbridge_probe pci_probes[] __initdata = {
27 { 0, 0x18, PCI_VENDOR_ID_AMD, 0x1100 }, 27 { 0, 0x18, PCI_VENDOR_ID_AMD, 0x1100 }, /* K8 */
28 { 0, 0x18, PCI_VENDOR_ID_AMD, 0x1200 }, 28 { 0, 0x18, PCI_VENDOR_ID_AMD, 0x1200 }, /* Fam10h */
29 { 0xff, 0, PCI_VENDOR_ID_AMD, 0x1200 }, 29 { 0xff, 0, PCI_VENDOR_ID_AMD, 0x1200 }, /* Fam10h */
30 { 0, 0x18, PCI_VENDOR_ID_AMD, 0x1300 }, 30 { 0, 0x18, PCI_VENDOR_ID_AMD, 0x1300 }, /* Fam11h */
31 { 0, 0x18, PCI_VENDOR_ID_AMD, 0x1600 }, /* Fam15h */
31}; 32};
32 33
33#define RANGE_NUM 16 34#define RANGE_NUM 16
@@ -96,6 +97,11 @@ static int __init early_fill_mp_bus_info(void)
96 if (!found) 97 if (!found)
97 return 0; 98 return 0;
98 99
100 /*
101 * We should learn topology and routing information from _PXM and
102 * _CRS methods in the ACPI namespace. We extract node numbers
103 * here to work around BIOSes that don't supply _PXM.
104 */
99 for (i = 0; i < 4; i++) { 105 for (i = 0; i < 4; i++) {
100 int min_bus; 106 int min_bus;
101 int max_bus; 107 int max_bus;
@@ -113,6 +119,17 @@ static int __init early_fill_mp_bus_info(void)
113 info = alloc_pci_root_info(min_bus, max_bus, node, link); 119 info = alloc_pci_root_info(min_bus, max_bus, node, link);
114 } 120 }
115 121
122 /*
123 * The following code extracts routing information for use on old
124 * systems where Linux doesn't automatically use host bridge _CRS
125 * methods (or when the user specifies "pci=nocrs").
126 *
127 * We only do this through Fam11h, because _CRS should be enough on
128 * newer systems.
129 */
130 if (boot_cpu_data.x86 > 0x11)
131 return 0;
132
116 /* get the default node and link for left over res */ 133 /* get the default node and link for left over res */
117 reg = read_pci_config(bus, slot, 0, 0x60); 134 reg = read_pci_config(bus, slot, 0, 0x60);
118 def_node = (reg >> 8) & 0x07; 135 def_node = (reg >> 8) & 0x07;