--- /dev/null
+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);