mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-04 20:19:47 +08:00 
			
		
		
		
	drm/nouveau: Use generic helper to check _PR3 presence
Replace nouveau_pr3_present() in favor of a more generic one, pci_pr3_present(). Also the presence of upstream bridge _PR3 doesn't need to go hand in hand with device's _DSM, so check _PR3 before _DSM. Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com> Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
		
							parent
							
								
									75a708918a
								
							
						
					
					
						commit
						ccfc2d5cdb
					
				| @ -211,37 +211,6 @@ static const struct vga_switcheroo_handler nouveau_dsm_handler = { | |||||||
| 	.get_client_id = nouveau_dsm_get_client_id, | 	.get_client_id = nouveau_dsm_get_client_id, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /*
 |  | ||||||
|  * Firmware supporting Windows 8 or later do not use _DSM to put the device into |  | ||||||
|  * D3cold, they instead rely on disabling power resources on the parent. |  | ||||||
|  */ |  | ||||||
| static bool nouveau_pr3_present(struct pci_dev *pdev) |  | ||||||
| { |  | ||||||
| 	struct pci_dev *parent_pdev = pci_upstream_bridge(pdev); |  | ||||||
| 	struct acpi_device *parent_adev; |  | ||||||
| 
 |  | ||||||
| 	if (!parent_pdev) |  | ||||||
| 		return false; |  | ||||||
| 
 |  | ||||||
| 	if (!parent_pdev->bridge_d3) { |  | ||||||
| 		/*
 |  | ||||||
| 		 * Parent PCI bridge is currently not power managed. |  | ||||||
| 		 * Since userspace can change these afterwards to be on |  | ||||||
| 		 * the safe side we stick with _DSM and prevent usage of |  | ||||||
| 		 * _PR3 from the bridge. |  | ||||||
| 		 */ |  | ||||||
| 		pci_d3cold_disable(pdev); |  | ||||||
| 		return false; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	parent_adev = ACPI_COMPANION(&parent_pdev->dev); |  | ||||||
| 	if (!parent_adev) |  | ||||||
| 		return false; |  | ||||||
| 
 |  | ||||||
| 	return parent_adev->power.flags.power_resources && |  | ||||||
| 		acpi_has_method(parent_adev->handle, "_PR3"); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static void nouveau_dsm_pci_probe(struct pci_dev *pdev, acpi_handle *dhandle_out, | static void nouveau_dsm_pci_probe(struct pci_dev *pdev, acpi_handle *dhandle_out, | ||||||
| 				  bool *has_mux, bool *has_opt, | 				  bool *has_mux, bool *has_opt, | ||||||
| 				  bool *has_opt_flags, bool *has_pr3) | 				  bool *has_opt_flags, bool *has_pr3) | ||||||
| @ -249,6 +218,16 @@ static void nouveau_dsm_pci_probe(struct pci_dev *pdev, acpi_handle *dhandle_out | |||||||
| 	acpi_handle dhandle; | 	acpi_handle dhandle; | ||||||
| 	bool supports_mux; | 	bool supports_mux; | ||||||
| 	int optimus_funcs; | 	int optimus_funcs; | ||||||
|  | 	struct pci_dev *parent_pdev; | ||||||
|  | 
 | ||||||
|  | 	*has_pr3 = false; | ||||||
|  | 	parent_pdev = pci_upstream_bridge(pdev); | ||||||
|  | 	if (parent_pdev) { | ||||||
|  | 		if (parent_pdev->bridge_d3) | ||||||
|  | 			*has_pr3 = pci_pr3_present(parent_pdev); | ||||||
|  | 		else | ||||||
|  | 			pci_d3cold_disable(pdev); | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	dhandle = ACPI_HANDLE(&pdev->dev); | 	dhandle = ACPI_HANDLE(&pdev->dev); | ||||||
| 	if (!dhandle) | 	if (!dhandle) | ||||||
| @ -269,7 +248,6 @@ static void nouveau_dsm_pci_probe(struct pci_dev *pdev, acpi_handle *dhandle_out | |||||||
| 	*has_mux = supports_mux; | 	*has_mux = supports_mux; | ||||||
| 	*has_opt = !!optimus_funcs; | 	*has_opt = !!optimus_funcs; | ||||||
| 	*has_opt_flags = optimus_funcs & (1 << NOUVEAU_DSM_OPTIMUS_FLAGS); | 	*has_opt_flags = optimus_funcs & (1 << NOUVEAU_DSM_OPTIMUS_FLAGS); | ||||||
| 	*has_pr3 = false; |  | ||||||
| 
 | 
 | ||||||
| 	if (optimus_funcs) { | 	if (optimus_funcs) { | ||||||
| 		uint32_t result; | 		uint32_t result; | ||||||
| @ -279,8 +257,6 @@ static void nouveau_dsm_pci_probe(struct pci_dev *pdev, acpi_handle *dhandle_out | |||||||
| 			 (result & OPTIMUS_ENABLED) ? "enabled" : "disabled", | 			 (result & OPTIMUS_ENABLED) ? "enabled" : "disabled", | ||||||
| 			 (result & OPTIMUS_DYNAMIC_PWR_CAP) ? "dynamic power, " : "", | 			 (result & OPTIMUS_DYNAMIC_PWR_CAP) ? "dynamic power, " : "", | ||||||
| 			 (result & OPTIMUS_HDA_CODEC_MASK) ? "hda bios codec supported" : ""); | 			 (result & OPTIMUS_HDA_CODEC_MASK) ? "hda bios codec supported" : ""); | ||||||
| 
 |  | ||||||
| 		*has_pr3 = nouveau_pr3_present(pdev); |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Kai-Heng Feng
						Kai-Heng Feng