diff options
author | Zhou Wang <wangzhou1@hisilicon.com> | 2017-01-04 08:00:06 +0100 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2017-01-12 21:32:09 +0100 |
commit | 53762ba810398c11efaf65f9a45d992125e86dcf (patch) | |
tree | e6f01d279441ef4a9a6c9db11c5f0403b7682026 /drivers/acpi | |
parent | PCI: Apply _HPX settings only to relevant devices (diff) | |
download | linux-53762ba810398c11efaf65f9a45d992125e86dcf.tar.xz linux-53762ba810398c11efaf65f9a45d992125e86dcf.zip |
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: Zhou Wang <wangzhou1@hisilicon.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Tomasz Nowicki <tn@semihalf.com>
Acked-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Diffstat (limited to 'drivers/acpi')
-rw-r--r-- | drivers/acpi/pci_mcfg.c | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/drivers/acpi/pci_mcfg.c b/drivers/acpi/pci_mcfg.c index a6a4ceaa6cc3..2944353253ed 100644 --- a/drivers/acpi/pci_mcfg.c +++ b/drivers/acpi/pci_mcfg.c @@ -195,11 +195,10 @@ int pci_mcfg_lookup(struct acpi_pci_root *root, struct resource *cfgres, goto skip_lookup; /* - * We expect exact match, unless MCFG entry end bus covers more than - * specified by caller. + * We expect the range in bus_res in the coverage of MCFG bus range. */ 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) { root->mcfg_addr = e->addr; } |