diff options
author | Liu Jiang <jiang.liu@linux.intel.com> | 2015-11-26 22:12:33 -0500 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2015-12-01 20:30:15 -0500 |
commit | 727ae8be30b428082d3519817f4fb98b712d457d (patch) | |
tree | 8a4f4a7b9d0e00233a94548bf86a065a9693cd05 | |
parent | 768acd64d68b232e0d2b9623d9846457355f0c27 (diff) |
x86/PCI/ACPI: Fix regression caused by commit 4d6b4e69a245
Commit 4d6b4e69a245 ("x86/PCI/ACPI: Use common interface to support
PCI host bridge") converted x86 to use the common interface
acpi_pci_root_create, but the conversion missed on code piece in
arch/x86/pci/bus_numa.c, which causes regression on some legacy
AMD platforms as reported by Arthur Marsh <arthur.marsh@internode.on.net>.
The root causes is that acpi_pci_root_create() fails to insert
host bridge resources into iomem_resource/ioport_resource because
x86_pci_root_bus_resources() has already inserted those resources.
So change x86_pci_root_bus_resources() to not insert resources into
iomem_resource/ioport_resource.
Fixes: 4d6b4e69a245 ("x86/PCI/ACPI: Use common interface to support PCI host bridge")
Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
Reported-and-tested-by: Arthur Marsh <arthur.marsh@internode.on.net>
Reported-and-tested-by: Krzysztof Kolasa <kkolasa@winsoft.pl>
Reported-and-tested-by: Keith Busch <keith.busch@intel.com>
Reported-and-tested-by: Hans de Bruin <jmdebruin@xmsnet.nl>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
-rw-r--r-- | arch/x86/pci/bus_numa.c | 13 | ||||
-rw-r--r-- | drivers/acpi/pci_root.c | 7 |
2 files changed, 9 insertions, 11 deletions
diff --git a/arch/x86/pci/bus_numa.c b/arch/x86/pci/bus_numa.c index 7bcf06a7cd12..6eb3c8af96e2 100644 --- a/arch/x86/pci/bus_numa.c +++ b/arch/x86/pci/bus_numa.c | |||
@@ -50,18 +50,9 @@ void x86_pci_root_bus_resources(int bus, struct list_head *resources) | |||
50 | if (!found) | 50 | if (!found) |
51 | pci_add_resource(resources, &info->busn); | 51 | pci_add_resource(resources, &info->busn); |
52 | 52 | ||
53 | list_for_each_entry(root_res, &info->resources, list) { | 53 | list_for_each_entry(root_res, &info->resources, list) |
54 | struct resource *res; | 54 | pci_add_resource(resources, &root_res->res); |
55 | struct resource *root; | ||
56 | 55 | ||
57 | res = &root_res->res; | ||
58 | pci_add_resource(resources, res); | ||
59 | if (res->flags & IORESOURCE_IO) | ||
60 | root = &ioport_resource; | ||
61 | else | ||
62 | root = &iomem_resource; | ||
63 | insert_resource(root, res); | ||
64 | } | ||
65 | return; | 56 | return; |
66 | 57 | ||
67 | default_resources: | 58 | default_resources: |
diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c index 850d7bf0c873..ae3fe4e64203 100644 --- a/drivers/acpi/pci_root.c +++ b/drivers/acpi/pci_root.c | |||
@@ -768,6 +768,13 @@ static void pci_acpi_root_add_resources(struct acpi_pci_root_info *info) | |||
768 | else | 768 | else |
769 | continue; | 769 | continue; |
770 | 770 | ||
771 | /* | ||
772 | * Some legacy x86 host bridge drivers use iomem_resource and | ||
773 | * ioport_resource as default resource pool, skip it. | ||
774 | */ | ||
775 | if (res == root) | ||
776 | continue; | ||
777 | |||
771 | conflict = insert_resource_conflict(root, res); | 778 | conflict = insert_resource_conflict(root, res); |
772 | if (conflict) { | 779 | if (conflict) { |
773 | dev_info(&info->bridge->dev, | 780 | dev_info(&info->bridge->dev, |