Patch "x86/PCI/ACPI: Make all resources except [io 0xcf8-0xcff] available on PCI bus" has been added to the 4.0-stable tree
Subsystems (4)
This is a note to let you know that I've just added the patch titled
x86/PCI/ACPI: Make all resources except [io 0xcf8-0xcff] available on PCI bus
to the 4.0-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
x86-pci-acpi-make-all-resources-except-available-on-pci-bus.patch
and it can be found in the queue-4.0 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
2c62e8492ed7358bbe7da51666c7e0f6da9474eeMon Sep 17 00:00:00 2001
From: Jiang Liu <[email protected]>
Date: Thu, 30 Apr 2015 12:41:28 +0800
Subject: x86/PCI/ACPI: Make all resources except [io 0xcf8-0xcff] available on PCI bus
From: Jiang Liu <[email protected]>
commit 2c62e8492ed7358bbe7da51666c7e0f6da9474ee upstream.
An IO port or MMIO resource assigned to a PCI host bridge may be consumed by the host bridge itself or available to its child bus/devices. The ACPI specification defines a bit (Producer/Consumer) to tell whether the resource is consumed by the host bridge itself, but firmware hasn't used that bit consistently, so we can't rely on it.
Before commit 593669c2ac0f ("x86/PCI/ACPI: Use common ACPI resource interfaces to simplify implementation"), arch/x86/pci/acpi.c ignored all IO port resources defined by acpi_resource_io and acpi_resource_fixed_io to filter out IO ports consumed by the host bridge itself.
Commit 593669c2ac0f ("x86/PCI/ACPI: Use common ACPI resource interfaces to simplify implementation") started accepting all IO port and MMIO resources, which caused a regression that IO port resources consumed by the host bridge itself became available to its child devices.
Then commit 63f1789ec716 ("x86/PCI/ACPI: Ignore resources consumed by host bridge itself") ignored resources consumed by the host bridge itself by checking the IORESOURCE_WINDOW flag, which accidently removed MMIO resources defined by acpi_resource_memory24, acpi_resource_memory32 and acpi_resource_fixed_memory32.
On x86 and IA64 platforms, all IO port and MMIO resources are assumed to be available to child bus/devices except one special case:
IO port [0xCF8-0xCFF] is consumed by the host bridge itself to access PCI configuration space.
So explicitly filter out PCI CFG IO ports[0xCF8-0xCFF]. This solution will also ease the way to consolidate ACPI PCI host bridge common code from x86, ia64 and ARM64.
Related ACPI table are archived at:
https://bugzilla.kernel.org/show_bug.cgi?id=94221
Related discussions at:
http://patchwork.ozlabs.org/patch/461633/
https://lkml.org/lkml/2015/3/29/304
--- arch/x86/pci/acpi.c | 24 ++++++++++++++++++++++-- drivers/acpi/resource.c | 2 +- 2 files changed, 23 insertions(+), 3 deletions(-)
arch/x86/pci/acpi.c +22 -2
@@ -325,6 +325,26 @@ static void release_pci_root_info(structkfree (info); } +/* +* An IO port or MMIO resource assigned to a PCI host bridge may be +* consumed by the host bridge itself or available to its child +* bus/devices. The ACPI specification defines a bit (Producer/Consumer) +* to tell whether the resource is consumed by the host bridge itself, +* but firmware hasn't used that bit consistently, so we can't rely on it. +* +* On x86 and IA64 platforms, all IO port and MMIO resources are assumed +* to be available to child bus/devices except one special case: +* IO port [0xCF8-0xCFF] is consumed by the host bridge itself +* to access PCI configuration space. +* +* So explicitly filter out PCI CFG IO ports[0xCF8-0xCFF]. +*/ +static bool resource_is_pcicfg_ioport (struct resource *res) +{ +return (res->flags &IORESOURCE_IO ) && + res->start ==0xCF8 && res->end ==0xCFF ; +} + static void probe_pci_root_info(struct pci_root_info *info, struct acpi_device *device, int busnum, int domain,
@@ -346,8 +366,8 @@ static void probe_pci_root_info(struct p "no IO and memory resources present in _CRS\n"); else resource_list_for_each_entry_safe(entry, tmp, list) { -if ((entry->res->flags &IORESOURCE_WINDOW ) ==0 || - (entry->res->flags &IORESOURCE_DISABLED )) +if ((entry->res->flags &IORESOURCE_DISABLED ) || +resource_is_pcicfg_ioport (entry->res))resource_list_destroy_entry (entry);else entry->res->name = info->name;
drivers/acpi/resource.c +1 -1
@@ -573,7 +573,7 @@ EXPORT_SYMBOL_GPL(acpi_dev_get_resources* @ares: Input ACPI resource object. * @types: Valid resource types of IORESOURCE_XXX * -* This is a hepler function to support acpi_dev_get_resources(), which filters +* This is a helper function to support acpi_dev_get_resources(), which filters * ACPI resource objects according to resource types. */ int acpi_dev_filter_resource_type(struct acpi_resource *ares,
Patches currently in stable-queue which might be from [email protected] are
queue-4.0/x86-pci-acpi-make-all-resources-except-available-on-pci-bus.patch