summaryrefslogtreecommitdiffstats
path: root/debian/patches/bugfix/all/PCI-ACPI-Evaluate-PCI-Boot-Configuration-_DSM.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/bugfix/all/PCI-ACPI-Evaluate-PCI-Boot-Configuration-_DSM.patch')
-rw-r--r--debian/patches/bugfix/all/PCI-ACPI-Evaluate-PCI-Boot-Configuration-_DSM.patch80
1 files changed, 80 insertions, 0 deletions
diff --git a/debian/patches/bugfix/all/PCI-ACPI-Evaluate-PCI-Boot-Configuration-_DSM.patch b/debian/patches/bugfix/all/PCI-ACPI-Evaluate-PCI-Boot-Configuration-_DSM.patch
new file mode 100644
index 000000000..2172fa43d
--- /dev/null
+++ b/debian/patches/bugfix/all/PCI-ACPI-Evaluate-PCI-Boot-Configuration-_DSM.patch
@@ -0,0 +1,80 @@
+From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
+Date: Sat, 15 Jun 2019 10:23:57 +1000
+Subject: [PATCH 1/4] PCI/ACPI: Evaluate PCI Boot Configuration _DSM
+Origin: https://git.kernel.org/linus/a78cf9657ba5426f54aa93a067c10d097944c082
+
+Evaluate _DSM Function #5, the "PCI Boot Configuration" function. If the
+result is 0, the OS should preserve any resource assignments made by the
+firmware.
+
+Link: https://lore.kernel.org/r/20190615002359.29577-2-benh@kernel.crashing.org
+Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
+[bhelgaas: commit log]
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+---
+ drivers/acpi/pci_root.c | 12 ++++++++++++
+ include/linux/pci-acpi.h | 7 ++++---
+ include/linux/pci.h | 2 ++
+ 3 files changed, 18 insertions(+), 3 deletions(-)
+
+Index: linux/drivers/acpi/pci_root.c
+===================================================================
+--- linux.orig/drivers/acpi/pci_root.c
++++ linux/drivers/acpi/pci_root.c
+@@ -884,6 +884,7 @@ struct pci_bus *acpi_pci_root_create(str
+ int node = acpi_get_node(device->handle);
+ struct pci_bus *bus;
+ struct pci_host_bridge *host_bridge;
++ union acpi_object *obj;
+
+ info->root = root;
+ info->bridge = device;
+@@ -920,6 +921,17 @@ struct pci_bus *acpi_pci_root_create(str
+ if (!(root->osc_control_set & OSC_PCI_EXPRESS_LTR_CONTROL))
+ host_bridge->native_ltr = 0;
+
++ /*
++ * Evaluate the "PCI Boot Configuration" _DSM Function. If it
++ * exists and returns 0, we must preserve any PCI resource
++ * assignments made by firmware for this host bridge.
++ */
++ obj = acpi_evaluate_dsm(ACPI_HANDLE(bus->bridge), &pci_acpi_dsm_guid, 1,
++ IGNORE_PCI_BOOT_CONFIG_DSM, NULL);
++ if (obj && obj->type == ACPI_TYPE_INTEGER && obj->integer.value == 0)
++ host_bridge->preserve_config = 1;
++ ACPI_FREE(obj);
++
+ pci_scan_child_bus(bus);
+ pci_set_host_bridge_release(host_bridge, acpi_pci_root_release_info,
+ info);
+Index: linux/include/linux/pci-acpi.h
+===================================================================
+--- linux.orig/include/linux/pci-acpi.h
++++ linux/include/linux/pci-acpi.h
+@@ -107,9 +107,10 @@ static inline void acpiphp_check_host_br
+ #endif
+
+ extern const guid_t pci_acpi_dsm_guid;
+-#define DEVICE_LABEL_DSM 0x07
+-#define RESET_DELAY_DSM 0x08
+-#define FUNCTION_DELAY_DSM 0x09
++#define IGNORE_PCI_BOOT_CONFIG_DSM 0x05
++#define DEVICE_LABEL_DSM 0x07
++#define RESET_DELAY_DSM 0x08
++#define FUNCTION_DELAY_DSM 0x09
+
+ #else /* CONFIG_ACPI */
+ static inline void acpi_pci_add_bus(struct pci_bus *bus) { }
+Index: linux/include/linux/pci.h
+===================================================================
+--- linux.orig/include/linux/pci.h
++++ linux/include/linux/pci.h
+@@ -486,6 +486,8 @@ struct pci_host_bridge {
+ unsigned int native_shpc_hotplug:1; /* OS may use SHPC hotplug */
+ unsigned int native_pme:1; /* OS may use PCIe PME */
+ unsigned int native_ltr:1; /* OS may use PCIe LTR */
++ unsigned int preserve_config:1; /* Preserve FW resource setup */
++
+ /* Resource alignment requirements */
+ resource_size_t (*align_resource)(struct pci_dev *dev,
+ const struct resource *res,