summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel.spec6
-rw-r--r--pci-_osc-supported-field-should-contain-supported-features-not-enabled-ones.patch66
2 files changed, 72 insertions, 0 deletions
diff --git a/kernel.spec b/kernel.spec
index 054236d2a..b4777b59f 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -613,6 +613,7 @@ Patch380: linux-2.6-defaults-pci_no_msi.patch
Patch381: linux-2.6-defaults-pci_use_crs.patch
Patch383: linux-2.6-defaults-aspm.patch
Patch384: pci-disable-aspm-if-bios-asks-us-to.patch
+Patch386: pci-_osc-supported-field-should-contain-supported-features-not-enabled-ones.patch
Patch385: ima-allow-it-to-be-completely-disabled-and-default-off.patch
@@ -1196,6 +1197,8 @@ ApplyPatch linux-2.6-defaults-pci_use_crs.patch
# enable ASPM by default on hardware we expect to work
ApplyPatch linux-2.6-defaults-aspm.patch
ApplyPatch pci-disable-aspm-if-bios-asks-us-to.patch
+# rhbz#638912
+ApplyPatch pci-_osc-supported-field-should-contain-supported-features-not-enabled-ones.patch
#ApplyPatch ima-allow-it-to-be-completely-disabled-and-default-off.patch
@@ -1929,6 +1932,9 @@ fi
%changelog
* Fri Dec 10 2010 Kyle McMartin <kyle@redhat.com>
+- Another patch from mjg59: Set _OSC supported field correctly (#638912)
+
+* Fri Dec 10 2010 Kyle McMartin <kyle@redhat.com>
- pci-disable-aspm-if-bios-asks-us-to.patch: Patch from mjg59 to disable
ASPM if the BIOS has disabled it, but enabled it already on some devices.
diff --git a/pci-_osc-supported-field-should-contain-supported-features-not-enabled-ones.patch b/pci-_osc-supported-field-should-contain-supported-features-not-enabled-ones.patch
new file mode 100644
index 000000000..0baffd639
--- /dev/null
+++ b/pci-_osc-supported-field-should-contain-supported-features-not-enabled-ones.patch
@@ -0,0 +1,66 @@
+commit 885c252ffb059dc493200bdb981bdd21cabe4442
+Author: Matthew Garrett <mjg@redhat.com>
+Date: Thu Dec 9 18:31:59 2010 -0500
+
+ PCI: _OSC "supported" field should contain supported features, not enabled ones
+
+ From testing with Windows, the call to the PCI root _OSC method includes
+ the full set of features supported by the operating system even if the
+ hardware has already indicated that it doesn't support ASPM or MSI.
+ https://bugzilla.redhat.com/show_bug.cgi?id=638912 is a case where making
+ the _OSC call will incorrectly configure the chipset unless the supported
+ field has bits 1, 2 and 4 set. Rework the functionality to ensure that
+ we match this behaviour.
+
+ Signed-off-by: Matthew Garrett <mjg@redhat.com>
+
+diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c
+index 96668ad..afb5d08 100644
+--- a/drivers/acpi/pci_root.c
++++ b/drivers/acpi/pci_root.c
+@@ -450,7 +450,7 @@ static int __devinit acpi_pci_root_add(struct acpi_device *device)
+ struct acpi_pci_root *root;
+ acpi_handle handle;
+ struct acpi_device *child;
+- u32 flags, base_flags;
++ u32 flags;
+
+ root = kzalloc(sizeof(struct acpi_pci_root), GFP_KERNEL);
+ if (!root)
+@@ -498,10 +498,15 @@ static int __devinit acpi_pci_root_add(struct acpi_device *device)
+ device->driver_data = root;
+
+ /*
+- * All supported architectures that use ACPI have support for
+- * PCI domains, so we indicate this in _OSC support capabilities.
++ * Indicate support for various _OSC capabilities. These match
++ * what the operating system supports, not what the hardware supports,
++ * so they shouldn't be conditional on functionality that's been
++ * blacklisted
+ */
+- flags = base_flags = OSC_PCI_SEGMENT_GROUPS_SUPPORT;
++ flags = OSC_EXT_PCI_CONFIG_SUPPORT | OSC_ACTIVE_STATE_PWR_SUPPORT |
++ OSC_CLOCK_PWR_CAPABILITY_SUPPORT |
++ OSC_PCI_SEGMENT_GROUPS_SUPPORT | OSC_MSI_SUPPORT;
++
+ acpi_pci_osc_support(root, flags);
+
+ /*
+@@ -555,17 +560,6 @@ static int __devinit acpi_pci_root_add(struct acpi_device *device)
+ list_for_each_entry(child, &device->children, node)
+ acpi_pci_bridge_scan(child);
+
+- /* Indicate support for various _OSC capabilities. */
+- if (pci_ext_cfg_avail(root->bus->self))
+- flags |= OSC_EXT_PCI_CONFIG_SUPPORT;
+- if (pcie_aspm_enabled())
+- flags |= OSC_ACTIVE_STATE_PWR_SUPPORT |
+- OSC_CLOCK_PWR_CAPABILITY_SUPPORT;
+- if (pci_msi_enabled())
+- flags |= OSC_MSI_SUPPORT;
+- if (flags != base_flags)
+- acpi_pci_osc_support(root, flags);
+-
+ pci_acpi_add_bus_pm_notifier(device, root->bus);
+ if (device->wakeup.flags.run_wake)
+ device_set_run_wake(root->bus->bridge, true);