[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