diff options
| -rw-r--r-- | drivers/acpi/pci_root.c | 76 | 
1 files changed, 37 insertions, 39 deletions
| diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c index 0ac546d5e53f..c740364d4abe 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); |