FAILED: Patch Upstream: Revert "PCI/ACPI: Request _OSC control before scanning PCI root bus"

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 <bhelgaas@xxxxxxxxxx>
> 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 <bhelgaas@xxxxxxxxxx>
> Acked-by: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx>
> Acked-by: Yinghai Lu <yinghai@xxxxxxxxxx>
> CC: stable@xxxxxxxxxxxxxxx	# 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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]