Skip to content

Commit

Permalink
PCI/ACPI: Fix bus range comparison in pci_mcfg_lookup()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Zhou Wang authored and Bjorn Helgaas committed Jan 12, 2017
1 parent 977509f commit 53762ba
Showing 1 changed file with 2 additions and 3 deletions.
5 changes: 2 additions & 3 deletions drivers/acpi/pci_mcfg.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down

0 comments on commit 53762ba

Please sign in to comment.