forked from mirrors/linux
		
	Revert "PCI/ACPI: Request _OSC control before scanning PCI root bus"
This reverts commit8c33f51df4. 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 (per149e1637). 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@google.com> Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Acked-by: Yinghai Lu <yinghai@kernel.org> CC: stable@vger.kernel.org # v3.8+
This commit is contained in:
		
							parent
							
								
									be7f088bd0
								
							
						
					
					
						commit
						b8178f130e
					
				
					 1 changed files with 37 additions and 39 deletions
				
			
		|  | @ -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,60 +475,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); | ||||
| 
 | ||||
| 	/* Indicate support for various _OSC capabilities. */ | ||||
| 	if (pci_ext_cfg_avail()) | ||||
| 		flags |= OSC_EXT_PCI_CONFIG_SUPPORT; | ||||
| 	if (pcie_aspm_support_enabled()) { | ||||
| 		flags |= OSC_ACTIVE_STATE_PWR_SUPPORT | | ||||
| 		OSC_CLOCK_PWR_CAPABILITY_SUPPORT; | ||||
| 	} | ||||
| 	if (pci_msi_enabled()) | ||||
| 		flags |= OSC_MSI_SUPPORT; | ||||
| 	if (flags != base_flags) { | ||||
| 		status = acpi_pci_osc_support(root, flags); | ||||
| 		if (ACPI_FAILURE(status)) { | ||||
| 			dev_info(&device->dev, "ACPI _OSC support " | ||||
| 				"notification failed, disabling PCIe ASPM\n"); | ||||
| 			pcie_no_aspm(); | ||||
| 			flags = base_flags; | ||||
| 		} | ||||
| 	} | ||||
| 	if (!pcie_ports_disabled | ||||
| 	    && (flags & ACPI_PCIE_REQ_SUPPORT) == ACPI_PCIE_REQ_SUPPORT) { | ||||
| 		flags = OSC_PCI_EXPRESS_CAP_STRUCTURE_CONTROL | ||||
| 			| OSC_PCI_EXPRESS_NATIVE_HP_CONTROL | ||||
| 			| OSC_PCI_EXPRESS_PME_CONTROL; | ||||
| 
 | ||||
| 		if (pci_aer_available()) { | ||||
| 			if (aer_acpi_firmware_first()) | ||||
| 				dev_dbg(&device->dev, | ||||
| 					"PCIe errors handled by BIOS.\n"); | ||||
| 			else | ||||
| 				flags |= OSC_PCI_EXPRESS_AER_CONTROL; | ||||
| 		} | ||||
| 
 | ||||
| 		dev_info(&device->dev, | ||||
| 			"Requesting ACPI _OSC control (0x%02x)\n", flags); | ||||
| 
 | ||||
| 		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); | ||||
| 		} 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); | ||||
| 		} | ||||
| 	} 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. | ||||
| 	 */ | ||||
|  | @ -554,15 +499,68 @@ static int acpi_pci_root_add(struct acpi_device *device, | |||
| 		goto out_del_root; | ||||
| 	} | ||||
| 
 | ||||
| 	/* ASPM setting */ | ||||
| 	if (is_osc_granted) { | ||||
| 		if (acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_ASPM) | ||||
| 	/* Indicate support for various _OSC capabilities. */ | ||||
| 	if (pci_ext_cfg_avail()) | ||||
| 		flags |= OSC_EXT_PCI_CONFIG_SUPPORT; | ||||
| 	if (pcie_aspm_support_enabled()) { | ||||
| 		flags |= OSC_ACTIVE_STATE_PWR_SUPPORT | | ||||
| 		OSC_CLOCK_PWR_CAPABILITY_SUPPORT; | ||||
| 	} | ||||
| 	if (pci_msi_enabled()) | ||||
| 		flags |= OSC_MSI_SUPPORT; | ||||
| 	if (flags != base_flags) { | ||||
| 		status = acpi_pci_osc_support(root, flags); | ||||
| 		if (ACPI_FAILURE(status)) { | ||||
| 			dev_info(&device->dev, "ACPI _OSC support " | ||||
| 				"notification failed, disabling PCIe ASPM\n"); | ||||
| 			pcie_no_aspm(); | ||||
| 			flags = base_flags; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (!pcie_ports_disabled | ||||
| 	    && (flags & ACPI_PCIE_REQ_SUPPORT) == ACPI_PCIE_REQ_SUPPORT) { | ||||
| 		flags = OSC_PCI_EXPRESS_CAP_STRUCTURE_CONTROL | ||||
| 			| OSC_PCI_EXPRESS_NATIVE_HP_CONTROL | ||||
| 			| OSC_PCI_EXPRESS_PME_CONTROL; | ||||
| 
 | ||||
| 		if (pci_aer_available()) { | ||||
| 			if (aer_acpi_firmware_first()) | ||||
| 				dev_dbg(&device->dev, | ||||
| 					"PCIe errors handled by BIOS.\n"); | ||||
| 			else | ||||
| 				flags |= OSC_PCI_EXPRESS_AER_CONTROL; | ||||
| 		} | ||||
| 
 | ||||
| 		dev_info(&device->dev, | ||||
| 			"Requesting ACPI _OSC control (0x%02x)\n", flags); | ||||
| 
 | ||||
| 		status = acpi_pci_osc_control_set(device->handle, &flags, | ||||
| 				       OSC_PCI_EXPRESS_CAP_STRUCTURE_CONTROL); | ||||
| 		if (ACPI_SUCCESS(status)) { | ||||
| 			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 { | ||||
| 			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); | ||||
| 	} | ||||
| 
 | ||||
| 	pci_acpi_add_bus_pm_notifier(device, root->bus); | ||||
| 	if (device->wakeup.flags.run_wake) | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Bjorn Helgaas
						Bjorn Helgaas