Commit 53762ba8 authored by Zhou Wang's avatar Zhou Wang Committed by Bjorn Helgaas

PCI/ACPI: Fix bus range comparison in pci_mcfg_lookup()

The configuration data provided by an MCFG entry, i.e., PCI segment and bus
range, may span multiple host bridges.

pci_mcfg_lookup() previously required an exact match of the host bridge
starting bus and the MCFG starting bus, which made the following
configuration fail:

  MCFG region:
    segment: 0
    bus range: 0x00-0xff

  host bridge
    segment: 0
    bus range: 0x20-0x4f

Relax the bus range check in pci_mcfg_lookup() so we can use any MCFG entry
that contains the required bus range, as we do in pci_mmconfig_lookup().

[bhelgaas: changelog]
Signed-off-by: default avatarZhou Wang <wangzhou1@hisilicon.com>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
Reviewed-by: default avatarTomasz Nowicki <tn@semihalf.com>
Acked-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
parent 977509f7
...@@ -195,11 +195,10 @@ int pci_mcfg_lookup(struct acpi_pci_root *root, struct resource *cfgres, ...@@ -195,11 +195,10 @@ int pci_mcfg_lookup(struct acpi_pci_root *root, struct resource *cfgres,
goto skip_lookup; goto skip_lookup;
/* /*
* We expect exact match, unless MCFG entry end bus covers more than * We expect the range in bus_res in the coverage of MCFG bus range.
* specified by caller.
*/ */
list_for_each_entry(e, &pci_mcfg_list, list) { list_for_each_entry(e, &pci_mcfg_list, list) {
if (e->segment == seg && e->bus_start == bus_res->start && if (e->segment == seg && e->bus_start <= bus_res->start &&
e->bus_end >= bus_res->end) { e->bus_end >= bus_res->end) {
root->mcfg_addr = e->addr; root->mcfg_addr = e->addr;
} }
......
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