[kernel/f19] Resolves: rhbz 963991

Neil Horman nhorman at fedoraproject.org
Wed Sep 11 18:47:00 UTC 2013


commit 2ce57862768ba30423df43db00160a9250e83ec4
Author: Neil Horman <nhorman at tuxdriver.com>
Date:   Wed Sep 11 14:46:31 2013 -0400

    Resolves: rhbz 963991

 acpi-pcie-hotplug-conflict.patch |  149 ++++++++++++++++++++++++++++++++++++++
 kernel.spec                      |    9 +++
 2 files changed, 158 insertions(+), 0 deletions(-)
---
diff --git a/acpi-pcie-hotplug-conflict.patch b/acpi-pcie-hotplug-conflict.patch
new file mode 100644
index 0000000..4815b99
--- /dev/null
+++ b/acpi-pcie-hotplug-conflict.patch
@@ -0,0 +1,149 @@
+commit 3dc48af310709b85d07c8b0d3aa8f1ead02829d3
+Author: Neil Horman <nhorman at tuxdriver.com>
+Date:   Thu Aug 29 16:17:05 2013 -0400
+
+    PCI/ACPI: Fix _OSC ordering to allow PCIe hotplug use when available
+    
+    This fixes the problem of acpiphp claiming slots that should be managed
+    by pciehp, which may keep ExpressCard slots from working.
+    
+    The acpiphp driver claims PCIe slots unless the BIOS has granted us
+    control of PCIe native hotplug via _OSC.  Prior to v3.10, the acpiphp
+    .add method (add_bridge()) was always called *after* we had requested
+    native hotplug control with _OSC.
+    
+    But after 3b63aaa70e ("PCI: acpiphp: Do not use ACPI PCI subdriver
+    mechanism"), which appeared in v3.10, acpiphp initialization is done
+    during the bus scan via the pcibios_add_bus() hook, and this happens
+    *before* we request native hotplug control.
+    
+    Therefore, acpiphp doesn't know yet whether the BIOS will grant control,
+    and it claims slots that we should be handling with native hotplug.
+    
+    This patch requests native hotplug control earlier, so we know whether
+    the BIOS granted it to us before we initialize acpiphp.
+    
+    To avoid reintroducing the ASPM issue fixed by b8178f130e ('Revert
+    "PCI/ACPI: Request _OSC control before scanning PCI root bus"'), we run
+    _OSC earlier but defer the actual ASPM calls until after the bus scan is
+    complete.
+    
+    Tested successfully by myself.
+    
+    [bhelgaas: changelog, mark for stable]
+    Reference: https://bugzilla.kernel.org/show_bug.cgi?id=60736
+    Signed-off-by: Neil Horman <nhorman at tuxdriver.com>
+    Signed-off-by: Bjorn Helgaas <bhelgaas at google.com>
+    Acked-by: Yinghai Lu <yinghai at kernel.org>
+    CC: stable at vger.kernel.org	# v3.10+
+    CC: Len Brown <lenb at kernel.org>
+    CC: "Rafael J. Wysocki" <rjw at sisk.pl>
+
+diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c
+index 5917839..a67853e 100644
+--- a/drivers/acpi/pci_root.c
++++ b/drivers/acpi/pci_root.c
+@@ -378,6 +378,7 @@ static int acpi_pci_root_add(struct acpi_device *device,
+ 	struct acpi_pci_root *root;
+ 	u32 flags, base_flags;
+ 	acpi_handle handle = device->handle;
++	bool no_aspm = false, clear_aspm = false;
+ 
+ 	root = kzalloc(sizeof(struct acpi_pci_root), GFP_KERNEL);
+ 	if (!root)
+@@ -437,27 +438,6 @@ static int acpi_pci_root_add(struct acpi_device *device,
+ 	flags = base_flags = OSC_PCI_SEGMENT_GROUPS_SUPPORT;
+ 	acpi_pci_osc_support(root, flags);
+ 
+-	/*
+-	 * TBD: Need PCI interface for enumeration/configuration of roots.
+-	 */
+-
+-	/*
+-	 * Scan the Root Bridge
+-	 * --------------------
+-	 * Must do this prior to any attempt to bind the root device, as the
+-	 * PCI namespace does not get created until this call is made (and
+-	 * thus the root bridge's pci_dev does not exist).
+-	 */
+-	root->bus = pci_acpi_scan_root(root);
+-	if (!root->bus) {
+-		dev_err(&device->dev,
+-			"Bus %04x:%02x not present in PCI namespace\n",
+-			root->segment, (unsigned int)root->secondary.start);
+-		result = -ENODEV;
+-		goto end;
+-	}
+-
+-	/* Indicate support for various _OSC capabilities. */
+ 	if (pci_ext_cfg_avail())
+ 		flags |= OSC_EXT_PCI_CONFIG_SUPPORT;
+ 	if (pcie_aspm_support_enabled()) {
+@@ -471,7 +451,7 @@ static int acpi_pci_root_add(struct acpi_device *device,
+ 		if (ACPI_FAILURE(status)) {
+ 			dev_info(&device->dev, "ACPI _OSC support "
+ 				"notification failed, disabling PCIe ASPM\n");
+-			pcie_no_aspm();
++			no_aspm = true;
+ 			flags = base_flags;
+ 		}
+ 	}
+@@ -503,7 +483,7 @@ static int acpi_pci_root_add(struct acpi_device *device,
+ 				 * We have ASPM control, but the FADT indicates
+ 				 * that it's unsupported. Clear it.
+ 				 */
+-				pcie_clear_aspm(root->bus);
++				clear_aspm = true;
+ 			}
+ 		} else {
+ 			dev_info(&device->dev,
+@@ -512,7 +492,14 @@ static int acpi_pci_root_add(struct acpi_device *device,
+ 				acpi_format_exception(status), flags);
+ 			dev_info(&device->dev,
+ 				 "ACPI _OSC control for PCIe not granted, disabling ASPM\n");
+-			pcie_no_aspm();
++			/*
++			 * We want to disable ASPM here, but aspm_disabled
++			 * needs to remain in its state from boot so that we
++			 * properly handle PCIe 1.1 devices.  So we set this
++			 * flag here, to defer the action until after the ACPI
++			 * root scan.
++			 */
++			no_aspm = true;
+ 		}
+ 	} else {
+ 		dev_info(&device->dev,
+@@ -520,6 +507,33 @@ static int acpi_pci_root_add(struct acpi_device *device,
+ 			 "(_OSC support mask: 0x%02x)\n", flags);
+ 	}
+ 
++	/*
++	 * TBD: Need PCI interface for enumeration/configuration of roots.
++	 */
++
++	/*
++	 * Scan the Root Bridge
++	 * --------------------
++	 * Must do this prior to any attempt to bind the root device, as the
++	 * PCI namespace does not get created until this call is made (and
++	 * thus the root bridge's pci_dev does not exist).
++	 */
++	root->bus = pci_acpi_scan_root(root);
++	if (!root->bus) {
++		dev_err(&device->dev,
++			"Bus %04x:%02x not present in PCI namespace\n",
++			root->segment, (unsigned int)root->secondary.start);
++		result = -ENODEV;
++		goto end;
++	}
++
++	if (clear_aspm) {
++		dev_info(&device->dev, "Disabling ASPM (FADT indicates it is unsupported)\n");
++		pcie_clear_aspm(root->bus);
++	}
++	if (no_aspm)
++		pcie_no_aspm();
++
+ 	pci_acpi_add_bus_pm_notifier(device, root->bus);
+ 	if (device->wakeup.flags.run_wake)
+ 		device_set_run_wake(root->bus->bridge, true);
diff --git a/kernel.spec b/kernel.spec
index aae2731..838bb8f 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -745,6 +745,9 @@ Patch25079: rt2800-rearrange-bbp-rfcsr-initialization.patch
 #CVE-2013-2897 rhbz 1000536 1002600 CVE-2013-2899 rhbz 1000373 1002604
 Patch25099: HID-CVE-fixes.patch
 
+#rhbz 963991
+Patch26000: acpi-pcie-hotplug-conflict.patch
+
 # END OF PATCH DEFINITIONS
 
 %endif
@@ -1438,6 +1441,9 @@ ApplyPatch HID-CVE-fixes.patch
 #rhbz 1000679
 ApplyPatch rt2800-rearrange-bbp-rfcsr-initialization.patch
 
+#rhbz 963991
+ApplyPatch acpi-pcie-hotplug-conflict.patch
+
 # END OF PATCH APPLICATIONS
 
 %endif
@@ -2250,6 +2256,9 @@ fi
 # and build.
 
 %changelog
+* Wed Sep 11 2013 Neil Horman <nhorman at redhat.com>
+- Fix pcie/acpi hotplug conflict (rhbz 963991)
+
 * Wed Sep 11 2013 Justin M. Forbes <jforbes at fedoraproject.org>
 - Linux v3.11 rebase
 


More information about the scm-commits mailing list