Kyle McMartin 6558398
commit 885c252ffb059dc493200bdb981bdd21cabe4442
Kyle McMartin 6558398
Author: Matthew Garrett <mjg@redhat.com>
Kyle McMartin 6558398
Date:   Thu Dec 9 18:31:59 2010 -0500
Kyle McMartin 6558398
Kyle McMartin 6558398
    PCI: _OSC "supported" field should contain supported features, not enabled ones
Kyle McMartin 6558398
    
Kyle McMartin 6558398
    From testing with Windows, the call to the PCI root _OSC method includes
Kyle McMartin 6558398
    the full set of features supported by the operating system even if the
Kyle McMartin 6558398
    hardware has already indicated that it doesn't support ASPM or MSI.
Kyle McMartin 6558398
    https://bugzilla.redhat.com/show_bug.cgi?id=638912 is a case where making
Kyle McMartin 6558398
    the _OSC call will incorrectly configure the chipset unless the supported
Kyle McMartin 6558398
    field has bits 1, 2 and 4 set. Rework the functionality to ensure that
Kyle McMartin 6558398
    we match this behaviour.
Kyle McMartin 6558398
    
Kyle McMartin 6558398
    Signed-off-by: Matthew Garrett <mjg@redhat.com>
Kyle McMartin 6558398
Kyle McMartin 6558398
diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c
Kyle McMartin 6558398
index 96668ad..afb5d08 100644
Kyle McMartin 6558398
--- a/drivers/acpi/pci_root.c
Kyle McMartin 6558398
+++ b/drivers/acpi/pci_root.c
Kyle McMartin 6558398
@@ -450,7 +450,7 @@ static int __devinit acpi_pci_root_add(struct acpi_device *device)
Kyle McMartin 6558398
 	struct acpi_pci_root *root;
Kyle McMartin 6558398
 	acpi_handle handle;
Kyle McMartin 6558398
 	struct acpi_device *child;
Kyle McMartin 6558398
-	u32 flags, base_flags;
Kyle McMartin 6558398
+	u32 flags;
Kyle McMartin 6558398
 
Kyle McMartin 6558398
 	root = kzalloc(sizeof(struct acpi_pci_root), GFP_KERNEL);
Kyle McMartin 6558398
 	if (!root)
Kyle McMartin 6558398
@@ -498,10 +498,15 @@ static int __devinit acpi_pci_root_add(struct acpi_device *device)
Kyle McMartin 6558398
 	device->driver_data = root;
Kyle McMartin 6558398
 
Kyle McMartin 6558398
 	/*
Kyle McMartin 6558398
-	 * All supported architectures that use ACPI have support for
Kyle McMartin 6558398
-	 * PCI domains, so we indicate this in _OSC support capabilities.
Kyle McMartin 6558398
+	 * Indicate support for various _OSC capabilities. These match
Kyle McMartin 6558398
+	 * what the operating system supports, not what the hardware supports,
Kyle McMartin 6558398
+	 * so they shouldn't be conditional on functionality that's been
Kyle McMartin 6558398
+	 * blacklisted
Kyle McMartin 6558398
 	 */
Kyle McMartin 6558398
-	flags = base_flags = OSC_PCI_SEGMENT_GROUPS_SUPPORT;
Kyle McMartin 6558398
+	flags = OSC_EXT_PCI_CONFIG_SUPPORT | OSC_ACTIVE_STATE_PWR_SUPPORT |
Kyle McMartin 6558398
+		OSC_CLOCK_PWR_CAPABILITY_SUPPORT |
Kyle McMartin 6558398
+		OSC_PCI_SEGMENT_GROUPS_SUPPORT | OSC_MSI_SUPPORT;
Kyle McMartin 6558398
+
Kyle McMartin 6558398
 	acpi_pci_osc_support(root, flags);
Kyle McMartin 6558398
 
Kyle McMartin 6558398
 	/*
Kyle McMartin 6558398
@@ -555,17 +560,6 @@ static int __devinit acpi_pci_root_add(struct acpi_device *device)
Kyle McMartin 6558398
 	list_for_each_entry(child, &device->children, node)
Kyle McMartin 6558398
 		acpi_pci_bridge_scan(child);
Kyle McMartin 6558398
 
Kyle McMartin 6558398
-	/* Indicate support for various _OSC capabilities. */
Kyle McMartin 6558398
-	if (pci_ext_cfg_avail(root->bus->self))
Kyle McMartin 6558398
-		flags |= OSC_EXT_PCI_CONFIG_SUPPORT;
Kyle McMartin 6558398
-	if (pcie_aspm_enabled())
Kyle McMartin 6558398
-		flags |= OSC_ACTIVE_STATE_PWR_SUPPORT |
Kyle McMartin 6558398
-			OSC_CLOCK_PWR_CAPABILITY_SUPPORT;
Kyle McMartin 6558398
-	if (pci_msi_enabled())
Kyle McMartin 6558398
-		flags |= OSC_MSI_SUPPORT;
Kyle McMartin 6558398
-	if (flags != base_flags)
Kyle McMartin 6558398
-		acpi_pci_osc_support(root, flags);
Kyle McMartin 6558398
-
Kyle McMartin 6558398
 	pci_acpi_add_bus_pm_notifier(device, root->bus);
Kyle McMartin 6558398
 	if (device->wakeup.flags.run_wake)
Kyle McMartin 6558398
 		device_set_run_wake(root->bus->bridge, true);