x86/pci: fix mmconfig detection with 32bit near 4g
Pascal reported and bisected a commit: | x86/PCI: don't call e820_all_mapped with -1 in the mmconfig case which broke one system system. ACPI: Using IOAPIC for interrupt routing PCI: MCFG configuration 0: base f0000000 segment 0 buses 0 - 255 PCI: MCFG area at f0000000 reserved in ACPI motherboard resources PCI: Using MMCONFIG for extended config space it didn't have PCI: updated MCFG configuration 0: base f0000000 segment 0 buses 0 - 63 anymore, and try to use 0xf000000 - 0xffffffff for mmconfig For 32bit, mcfg_res->end could be 32bit only (if 64 resources aren't used) So use end - 1 to pass the value in mcfg->end to avoid overflow. We don't need to worry about the e820 path, they are always 64 bit. Reported-by: Pascal Terjan <pterjan@mandriva.com> Bisected-by: Pascal Terjan <pterjan@mandriva.com> Tested-by: Pascal Terjan <pterjan@mandriva.com> Signed-off-by: Yinghai Lu <yinghai@kernel.org> Cc: stable@kernel.org Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
This commit is contained in:
parent
f79b1b146b
commit
75e613cdc7
1 changed files with 3 additions and 3 deletions
|
@ -375,7 +375,7 @@ static acpi_status __init check_mcfg_resource(struct acpi_resource *res,
|
||||||
if (!fixmem32)
|
if (!fixmem32)
|
||||||
return AE_OK;
|
return AE_OK;
|
||||||
if ((mcfg_res->start >= fixmem32->address) &&
|
if ((mcfg_res->start >= fixmem32->address) &&
|
||||||
(mcfg_res->end <= (fixmem32->address +
|
(mcfg_res->end < (fixmem32->address +
|
||||||
fixmem32->address_length))) {
|
fixmem32->address_length))) {
|
||||||
mcfg_res->flags = 1;
|
mcfg_res->flags = 1;
|
||||||
return AE_CTRL_TERMINATE;
|
return AE_CTRL_TERMINATE;
|
||||||
|
@ -392,7 +392,7 @@ static acpi_status __init check_mcfg_resource(struct acpi_resource *res,
|
||||||
return AE_OK;
|
return AE_OK;
|
||||||
|
|
||||||
if ((mcfg_res->start >= address.minimum) &&
|
if ((mcfg_res->start >= address.minimum) &&
|
||||||
(mcfg_res->end <= (address.minimum + address.address_length))) {
|
(mcfg_res->end < (address.minimum + address.address_length))) {
|
||||||
mcfg_res->flags = 1;
|
mcfg_res->flags = 1;
|
||||||
return AE_CTRL_TERMINATE;
|
return AE_CTRL_TERMINATE;
|
||||||
}
|
}
|
||||||
|
@ -418,7 +418,7 @@ static int __init is_acpi_reserved(u64 start, u64 end, unsigned not_used)
|
||||||
struct resource mcfg_res;
|
struct resource mcfg_res;
|
||||||
|
|
||||||
mcfg_res.start = start;
|
mcfg_res.start = start;
|
||||||
mcfg_res.end = end;
|
mcfg_res.end = end - 1;
|
||||||
mcfg_res.flags = 0;
|
mcfg_res.flags = 0;
|
||||||
|
|
||||||
acpi_get_devices("PNP0C01", find_mboard_resource, &mcfg_res, NULL);
|
acpi_get_devices("PNP0C01", find_mboard_resource, &mcfg_res, NULL);
|
||||||
|
|
Loading…
Reference in a new issue