I tried to apply the patch below to the 3.8-stable tree, but it has
conflicts and doesn't apply.  So I tried a straight-revert of
8c33f51df406e1a1f7fa4e9b244845b7ebd61fa6, which did work fine, but I
noticed that it really doesn't look anything like the patch below.

Is this patch a "logical" revert, and not a "literal" one?

Anyway, can someone send me a properly backported version so it can be
applied to the 3.8-stable tree?

thanks,

greg k-h


On Fri, Apr 05, 2013 at 11:00:22PM -0400, Gregs git-bot wrote:
> commit: b8178f130e25c1bdac1c33e0996f1ff6e20ec08e
> From: Bjorn Helgaas <[email protected]>
> Date: Mon, 1 Apr 2013 15:47:39 -0600
> Subject: Revert "PCI/ACPI: Request _OSC control before scanning PCI root bus"
> 
> This reverts commit 8c33f51df406e1a1f7fa4e9b244845b7ebd61fa6.
> 
> Conflicts:
>       drivers/acpi/pci_root.c
> 
> This commit broke some pre-1.1 PCIe devices by leaving them with
> ASPM enabled.  Previously, we had disabled ASPM on these devices
> because many of them don't implement it correctly (per 149e1637).
> 
> Requesting _OSC control early means that aspm_disabled may be set
> before we scan the PCI bus and configure link ASPM state.  But the
> ASPM configuration currently skips the check for pre-PCIe 1.1 devices
> when aspm_disabled is set, like this:
> 
>     acpi_pci_root_add
>       acpi_pci_osc_support
>         if (flags != base_flags)
>           pcie_no_aspm
>             aspm_disabled = 1
>       pci_acpi_scan_root
>         ...
>           pcie_aspm_init_link_state
>             pcie_aspm_sanity_check
>               if (!aspm_disabled)
>                 /* check for pre-PCIe 1.1 device */
> 
> Therefore, setting aspm_disabled early means that we leave ASPM enabled
> on these pre-PCIe 1.1 devices, which is a regression for some devices.
> 
> The best fix would be to clean up the ASPM init so we can evaluate
> _OSC before scanning the bug (that way boot-time and hot-add discovery
> will work the same), but that requires significant rework.
> 
> For now, we'll just revert the _OSC change as the lowest-risk fix.
> 
> Reference: https://bugzilla.kernel.org/show_bug.cgi?id=55211
> Signed-off-by: Bjorn Helgaas <[email protected]>
> Acked-by: Rafael J. Wysocki <[email protected]>
> Acked-by: Yinghai Lu <[email protected]>
> CC: [email protected]    # v3.8+
> ---
>  drivers/acpi/pci_root.c |   76 
> +++++++++++++++++++++++------------------------
>  1 file changed, 37 insertions(+), 39 deletions(-)
> 
> diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c
> index 0ac546d..c740364 100644
> --- a/drivers/acpi/pci_root.c
> +++ b/drivers/acpi/pci_root.c
> @@ -415,7 +415,6 @@ static int acpi_pci_root_add(struct acpi_device *device,
>       struct acpi_pci_root *root;
>       struct acpi_pci_driver *driver;
>       u32 flags, base_flags;
> -     bool is_osc_granted = false;
>  
>       root = kzalloc(sizeof(struct acpi_pci_root), GFP_KERNEL);
>       if (!root)
> @@ -476,6 +475,30 @@ 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.
> +      */
> +
> +     mutex_lock(&acpi_pci_root_lock);
> +     list_add_tail(&root->node, &acpi_pci_roots);
> +     mutex_unlock(&acpi_pci_root_lock);
> +
> +     /*
> +      * 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) {
> +             printk(KERN_ERR PREFIX
> +                         "Bus %04x:%02x not present in PCI namespace\n",
> +                         root->segment, (unsigned int)root->secondary.start);
> +             result = -ENODEV;
> +             goto out_del_root;
> +     }
> +
>       /* Indicate support for various _OSC capabilities. */
>       if (pci_ext_cfg_avail())
>               flags |= OSC_EXT_PCI_CONFIG_SUPPORT;
> @@ -494,6 +517,7 @@ static int acpi_pci_root_add(struct acpi_device *device,
>                       flags = base_flags;
>               }
>       }
> +
>       if (!pcie_ports_disabled
>           && (flags & ACPI_PCIE_REQ_SUPPORT) == ACPI_PCIE_REQ_SUPPORT) {
>               flags = OSC_PCI_EXPRESS_CAP_STRUCTURE_CONTROL
> @@ -514,54 +538,28 @@ static int acpi_pci_root_add(struct acpi_device *device,
>               status = acpi_pci_osc_control_set(device->handle, &flags,
>                                      OSC_PCI_EXPRESS_CAP_STRUCTURE_CONTROL);
>               if (ACPI_SUCCESS(status)) {
> -                     is_osc_granted = true;
>                       dev_info(&device->dev,
>                               "ACPI _OSC control (0x%02x) granted\n", flags);
> +                     if (acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_ASPM) {
> +                             /*
> +                              * We have ASPM control, but the FADT indicates
> +                              * that it's unsupported. Clear it.
> +                              */
> +                             pcie_clear_aspm(root->bus);
> +                     }
>               } else {
> -                     is_osc_granted = false;
>                       dev_info(&device->dev,
>                               "ACPI _OSC request failed (%s), "
>                               "returned control mask: 0x%02x\n",
>                               acpi_format_exception(status), flags);
> +                     pr_info("ACPI _OSC control for PCIe not granted, "
> +                             "disabling ASPM\n");
> +                     pcie_no_aspm();
>               }
>       } else {
>               dev_info(&device->dev,
> -                     "Unable to request _OSC control "
> -                     "(_OSC support mask: 0x%02x)\n", flags);
> -     }
> -
> -     /*
> -      * TBD: Need PCI interface for enumeration/configuration of roots.
> -      */
> -
> -     mutex_lock(&acpi_pci_root_lock);
> -     list_add_tail(&root->node, &acpi_pci_roots);
> -     mutex_unlock(&acpi_pci_root_lock);
> -
> -     /*
> -      * 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) {
> -             printk(KERN_ERR PREFIX
> -                         "Bus %04x:%02x not present in PCI namespace\n",
> -                         root->segment, (unsigned int)root->secondary.start);
> -             result = -ENODEV;
> -             goto out_del_root;
> -     }
> -
> -     /* ASPM setting */
> -     if (is_osc_granted) {
> -             if (acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_ASPM)
> -                     pcie_clear_aspm(root->bus);
> -     } else {
> -             pr_info("ACPI _OSC control for PCIe not granted, "
> -                     "disabling ASPM\n");
> -             pcie_no_aspm();
> +                      "Unable to request _OSC control "
> +                      "(_OSC support mask: 0x%02x)\n", flags);
>       }
>  
>       pci_acpi_add_bus_pm_notifier(device, root->bus);
> -- 
> 1.7.10.4
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to