From 2ce57862768ba30423df43db00160a9250e83ec4 Mon Sep 17 00:00:00 2001 From: Neil Horman Date: Sep 11 2013 18:46:31 +0000 Subject: Resolves: rhbz 963991 --- 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 +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 + Signed-off-by: Bjorn Helgaas + Acked-by: Yinghai Lu + CC: stable@vger.kernel.org # v3.10+ + CC: Len Brown + CC: "Rafael J. Wysocki" + +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 +- Fix pcie/acpi hotplug conflict (rhbz 963991) + * Wed Sep 11 2013 Justin M. Forbes - Linux v3.11 rebase