Skip to content

Commit

Permalink
x86/PCI: Work around AMD Fam15h BIOSes that fail to provide _PXM
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Suravee Suthikulpanit authored and Bjorn Helgaas committed May 21, 2014
1 parent 3367310 commit 94d4bb5
Showing 1 changed file with 21 additions and 4 deletions.
25 changes: 21 additions & 4 deletions arch/x86/pci/amd_bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,11 @@ struct pci_hostbridge_probe {
};

static struct pci_hostbridge_probe pci_probes[] __initdata = {
{ 0, 0x18, PCI_VENDOR_ID_AMD, 0x1100 },
{ 0, 0x18, PCI_VENDOR_ID_AMD, 0x1200 },
{ 0xff, 0, PCI_VENDOR_ID_AMD, 0x1200 },
{ 0, 0x18, PCI_VENDOR_ID_AMD, 0x1300 },
{ 0, 0x18, PCI_VENDOR_ID_AMD, 0x1100 }, /* K8 */
{ 0, 0x18, PCI_VENDOR_ID_AMD, 0x1200 }, /* Fam10h */
{ 0xff, 0, PCI_VENDOR_ID_AMD, 0x1200 }, /* Fam10h */
{ 0, 0x18, PCI_VENDOR_ID_AMD, 0x1300 }, /* Fam11h */
{ 0, 0x18, PCI_VENDOR_ID_AMD, 0x1600 }, /* Fam15h */
};

#define RANGE_NUM 16
Expand Down Expand Up @@ -96,6 +97,11 @@ static int __init early_fill_mp_bus_info(void)
if (!found)
return 0;

/*
* We should learn topology and routing information from _PXM and
* _CRS methods in the ACPI namespace. We extract node numbers
* here to work around BIOSes that don't supply _PXM.
*/
for (i = 0; i < 4; i++) {
int min_bus;
int max_bus;
Expand All @@ -113,6 +119,17 @@ static int __init early_fill_mp_bus_info(void)
info = alloc_pci_root_info(min_bus, max_bus, node, link);
}

/*
* The following code extracts routing information for use on old
* systems where Linux doesn't automatically use host bridge _CRS
* methods (or when the user specifies "pci=nocrs").
*
* We only do this through Fam11h, because _CRS should be enough on
* newer systems.
*/
if (boot_cpu_data.x86 > 0x11)
return 0;

/* get the default node and link for left over res */
reg = read_pci_config(bus, slot, 0, 0x60);
def_node = (reg >> 8) & 0x07;
Expand Down

0 comments on commit 94d4bb5

Please sign in to comment.