]> git.ipfire.org Git - ipfire-2.x.git/blobdiff - src/patches/suse-2.6.27.39/patches.drivers/acpi-pci-call-_osc-support-during-root-bridge-discovery.patch
Imported linux-2.6.27.39 suse/xen patches.
[ipfire-2.x.git] / src / patches / suse-2.6.27.39 / patches.drivers / acpi-pci-call-_osc-support-during-root-bridge-discovery.patch
diff --git a/src/patches/suse-2.6.27.39/patches.drivers/acpi-pci-call-_osc-support-during-root-bridge-discovery.patch b/src/patches/suse-2.6.27.39/patches.drivers/acpi-pci-call-_osc-support-during-root-bridge-discovery.patch
new file mode 100644 (file)
index 0000000..c7277e4
--- /dev/null
@@ -0,0 +1,119 @@
+From 990a7ac5645883a833a11b900bb6f25b65dea65b Mon Sep 17 00:00:00 2001
+From: Andrew Patterson <andrew.patterson@hp.com>
+Date: Mon, 10 Nov 2008 15:30:45 -0700
+Subject: ACPI/PCI: call _OSC support during root bridge discovery
+Patch-mainline: 2.6.29
+References: bnc#438941
+
+Add pci_acpi_osc_support() and call it when a PCI bridge is added.  This
+allows us to avoid having every individual PCI root bridge driver call
+_OSC support for every root bridge in their probe functions, a
+significant savings in boot time.
+
+Signed-off-by: Matthew Wilcox <willy@linux.intel.com>
+Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/acpi/pci_root.c  |    9 +++++++++
+ drivers/pci/pci-acpi.c   |   27 ++++++++++++++++++++-------
+ include/linux/pci-acpi.h |    1 +
+ 3 files changed, 30 insertions(+), 7 deletions(-)
+
+--- a/drivers/acpi/pci_root.c
++++ b/drivers/acpi/pci_root.c
+@@ -31,6 +31,7 @@
+ #include <linux/spinlock.h>
+ #include <linux/pm.h>
+ #include <linux/pci.h>
++#include <linux/pci-acpi.h>
+ #include <linux/acpi.h>
+ #include <acpi/acpi_bus.h>
+ #include <acpi/acpi_drivers.h>
+@@ -193,6 +194,7 @@ static int __devinit acpi_pci_root_add(s
+       unsigned long long value = 0;
+       acpi_handle handle = NULL;
+       struct acpi_device *child;
++      u32 flags;
+       if (!device)
+@@ -210,6 +212,13 @@ static int __devinit acpi_pci_root_add(s
+       device->ops.bind = acpi_pci_bind;
++      /*
++       * All supported architectures that use ACPI have support for
++       * PCI domains, so we indicate this in _OSC support capabilities.
++       */
++      flags = OSC_PCI_SEGMENT_GROUPS_SUPPORT;
++      pci_acpi_osc_support(device->handle, flags);
++
+       /* 
+        * Segment
+        * -------
+--- a/drivers/pci/pci-acpi.c
++++ b/drivers/pci/pci-acpi.c
+@@ -142,32 +142,45 @@ static acpi_status __acpi_query_osc(u32 
+       return status;
+ }
+-static acpi_status acpi_query_osc(acpi_handle handle,
+-                                u32 level, void *context, void **retval)
++/*
++ * pci_acpi_osc_support: Invoke _OSC indicating support for the given feature
++ * @flags: Bitmask of flags to support
++ *
++ * See the ACPI spec for the definition of the flags
++ */
++int pci_acpi_osc_support(acpi_handle handle, u32 flags)
+ {
+       acpi_status status;
+-      struct acpi_osc_data *osc_data;
+-      u32 flags = (unsigned long)context;
+       acpi_handle tmp;
++      struct acpi_osc_data *osc_data;
++      int rc = 0;
+       status = acpi_get_handle(handle, "_OSC", &tmp);
+       if (ACPI_FAILURE(status))
+-              return status;
++              return -ENOTTY;
+       mutex_lock(&pci_acpi_lock);
+       osc_data = acpi_get_osc_data(handle);
+       if (!osc_data) {
+               printk(KERN_ERR "acpi osc data array is full\n");
+-              status = AE_ERROR;
++              rc = -ENOMEM;
+               goto out;
+       }
+       status = __acpi_query_osc(flags, osc_data);
+ out:
+       mutex_unlock(&pci_acpi_lock);
+-      return status;
++      return rc;
++}
++
++static acpi_status acpi_query_osc(acpi_handle handle, u32 level,
++                                void *context, void **retval)
++{
++      pci_acpi_osc_support(handle, (unsigned long)context);
++      return AE_OK;
+ }
++
+ /**
+  * __pci_osc_support_set - register OS support to Firmware
+  * @flags: OS support bits
+--- a/include/linux/pci-acpi.h
++++ b/include/linux/pci-acpi.h
+@@ -51,6 +51,7 @@
+ #ifdef CONFIG_ACPI
+ extern acpi_status pci_osc_control_set(acpi_handle handle, u32 flags);
+ extern acpi_status __pci_osc_support_set(u32 flags, const char *hid);
++int pci_acpi_osc_support(acpi_handle handle, u32 flags);
+ static inline acpi_status pci_osc_support_set(u32 flags)
+ {
+       return __pci_osc_support_set(flags, PCI_ROOT_HID_STRING);