drm/amdgpu: disentangle HG systems from vgaswitcheroo
There's no need to keep vgaswitcheroo around for HG systems. They don't use muxes and their power control is handled via ACPI. Reviewed-by: Evan Quan <evan.quan@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
		
							parent
							
								
									b2aba43af9
								
							
						
					
					
						commit
						b98c6299ef
					
				@ -1275,8 +1275,9 @@ void amdgpu_device_program_register_sequence(struct amdgpu_device *adev,
 | 
			
		||||
					     const u32 *registers,
 | 
			
		||||
					     const u32 array_size);
 | 
			
		||||
 | 
			
		||||
bool amdgpu_device_supports_atpx(struct drm_device *dev);
 | 
			
		||||
int amdgpu_device_mode1_reset(struct amdgpu_device *adev);
 | 
			
		||||
bool amdgpu_device_supports_atpx(struct drm_device *dev);
 | 
			
		||||
bool amdgpu_device_supports_px(struct drm_device *dev);
 | 
			
		||||
bool amdgpu_device_supports_boco(struct drm_device *dev);
 | 
			
		||||
bool amdgpu_device_supports_baco(struct drm_device *dev);
 | 
			
		||||
bool amdgpu_device_is_peer_accessible(struct amdgpu_device *adev,
 | 
			
		||||
 | 
			
		||||
@ -212,18 +212,18 @@ static DEVICE_ATTR(serial_number, S_IRUGO,
 | 
			
		||||
		amdgpu_device_get_serial_number, NULL);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * amdgpu_device_supports_atpx - Is the device a dGPU with HG/PX power control
 | 
			
		||||
 * amdgpu_device_supports_px - Is the device a dGPU with ATPX power control
 | 
			
		||||
 *
 | 
			
		||||
 * @dev: drm_device pointer
 | 
			
		||||
 *
 | 
			
		||||
 * Returns true if the device is a dGPU with HG/PX power control,
 | 
			
		||||
 * Returns true if the device is a dGPU with ATPX power control,
 | 
			
		||||
 * otherwise return false.
 | 
			
		||||
 */
 | 
			
		||||
bool amdgpu_device_supports_atpx(struct drm_device *dev)
 | 
			
		||||
bool amdgpu_device_supports_px(struct drm_device *dev)
 | 
			
		||||
{
 | 
			
		||||
	struct amdgpu_device *adev = drm_to_adev(dev);
 | 
			
		||||
 | 
			
		||||
	if (adev->flags & AMD_IS_PX)
 | 
			
		||||
	if ((adev->flags & AMD_IS_PX) && !amdgpu_is_atpx_hybrid())
 | 
			
		||||
		return true;
 | 
			
		||||
	return false;
 | 
			
		||||
}
 | 
			
		||||
@ -233,14 +233,15 @@ bool amdgpu_device_supports_atpx(struct drm_device *dev)
 | 
			
		||||
 *
 | 
			
		||||
 * @dev: drm_device pointer
 | 
			
		||||
 *
 | 
			
		||||
 * Returns true if the device is a dGPU with HG/PX power control,
 | 
			
		||||
 * Returns true if the device is a dGPU with ACPI power control,
 | 
			
		||||
 * otherwise return false.
 | 
			
		||||
 */
 | 
			
		||||
bool amdgpu_device_supports_boco(struct drm_device *dev)
 | 
			
		||||
{
 | 
			
		||||
	struct amdgpu_device *adev = drm_to_adev(dev);
 | 
			
		||||
 | 
			
		||||
	if (adev->has_pr3)
 | 
			
		||||
	if (adev->has_pr3 ||
 | 
			
		||||
	    ((adev->flags & AMD_IS_PX) && amdgpu_is_atpx_hybrid()))
 | 
			
		||||
		return true;
 | 
			
		||||
	return false;
 | 
			
		||||
}
 | 
			
		||||
@ -1420,7 +1421,7 @@ static void amdgpu_switcheroo_set_state(struct pci_dev *pdev,
 | 
			
		||||
	struct drm_device *dev = pci_get_drvdata(pdev);
 | 
			
		||||
	int r;
 | 
			
		||||
 | 
			
		||||
	if (amdgpu_device_supports_atpx(dev) && state == VGA_SWITCHEROO_OFF)
 | 
			
		||||
	if (amdgpu_device_supports_px(dev) && state == VGA_SWITCHEROO_OFF)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	if (state == VGA_SWITCHEROO_ON) {
 | 
			
		||||
@ -3226,7 +3227,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
 | 
			
		||||
	struct drm_device *ddev = adev_to_drm(adev);
 | 
			
		||||
	struct pci_dev *pdev = adev->pdev;
 | 
			
		||||
	int r, i;
 | 
			
		||||
	bool atpx = false;
 | 
			
		||||
	bool px = false;
 | 
			
		||||
	u32 max_MBps;
 | 
			
		||||
 | 
			
		||||
	adev->shutdown = false;
 | 
			
		||||
@ -3388,16 +3389,12 @@ int amdgpu_device_init(struct amdgpu_device *adev,
 | 
			
		||||
	if ((adev->pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA)
 | 
			
		||||
		vga_client_register(adev->pdev, adev, NULL, amdgpu_device_vga_set_decode);
 | 
			
		||||
 | 
			
		||||
	if (amdgpu_device_supports_atpx(ddev))
 | 
			
		||||
		atpx = true;
 | 
			
		||||
	if (amdgpu_has_atpx() &&
 | 
			
		||||
	    (amdgpu_is_atpx_hybrid() ||
 | 
			
		||||
	     amdgpu_has_atpx_dgpu_power_cntl()) &&
 | 
			
		||||
	    !pci_is_thunderbolt_attached(adev->pdev))
 | 
			
		||||
	if (amdgpu_device_supports_px(ddev)) {
 | 
			
		||||
		px = true;
 | 
			
		||||
		vga_switcheroo_register_client(adev->pdev,
 | 
			
		||||
					       &amdgpu_switcheroo_ops, atpx);
 | 
			
		||||
	if (atpx)
 | 
			
		||||
					       &amdgpu_switcheroo_ops, px);
 | 
			
		||||
		vga_switcheroo_init_domain_pm_ops(adev->dev, &adev->vga_pm_domain);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (amdgpu_emu_mode == 1) {
 | 
			
		||||
		/* post the asic on emulation mode */
 | 
			
		||||
@ -3604,7 +3601,7 @@ release_ras_con:
 | 
			
		||||
 | 
			
		||||
failed:
 | 
			
		||||
	amdgpu_vf_error_trans_all(adev);
 | 
			
		||||
	if (atpx)
 | 
			
		||||
	if (px)
 | 
			
		||||
		vga_switcheroo_fini_domain_pm_ops(adev->dev);
 | 
			
		||||
 | 
			
		||||
failed_unmap:
 | 
			
		||||
@ -3664,13 +3661,10 @@ void amdgpu_device_fini(struct amdgpu_device *adev)
 | 
			
		||||
 | 
			
		||||
	kfree(adev->bios);
 | 
			
		||||
	adev->bios = NULL;
 | 
			
		||||
	if (amdgpu_has_atpx() &&
 | 
			
		||||
	    (amdgpu_is_atpx_hybrid() ||
 | 
			
		||||
	     amdgpu_has_atpx_dgpu_power_cntl()) &&
 | 
			
		||||
	    !pci_is_thunderbolt_attached(adev->pdev))
 | 
			
		||||
	if (amdgpu_device_supports_px(adev_to_drm(adev))) {
 | 
			
		||||
		vga_switcheroo_unregister_client(adev->pdev);
 | 
			
		||||
	if (amdgpu_device_supports_atpx(adev_to_drm(adev)))
 | 
			
		||||
		vga_switcheroo_fini_domain_pm_ops(adev->dev);
 | 
			
		||||
	}
 | 
			
		||||
	if ((adev->pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA)
 | 
			
		||||
		vga_client_register(adev->pdev, NULL, NULL, NULL);
 | 
			
		||||
	iounmap(adev->rmmio);
 | 
			
		||||
 | 
			
		||||
@ -1411,9 +1411,7 @@ static int amdgpu_pmops_prepare(struct device *dev)
 | 
			
		||||
	/* Return a positive number here so
 | 
			
		||||
	 * DPM_FLAG_SMART_SUSPEND works properly
 | 
			
		||||
	 */
 | 
			
		||||
	if ((amdgpu_device_supports_atpx(drm_dev) &&
 | 
			
		||||
	    amdgpu_is_atpx_hybrid()) ||
 | 
			
		||||
	    amdgpu_device_supports_boco(drm_dev))
 | 
			
		||||
	if (amdgpu_device_supports_boco(drm_dev))
 | 
			
		||||
		return pm_runtime_suspended(dev) &&
 | 
			
		||||
			pm_suspend_via_firmware();
 | 
			
		||||
 | 
			
		||||
@ -1502,7 +1500,7 @@ static int amdgpu_pmops_runtime_suspend(struct device *dev)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	adev->in_runpm = true;
 | 
			
		||||
	if (amdgpu_device_supports_atpx(drm_dev))
 | 
			
		||||
	if (amdgpu_device_supports_px(drm_dev))
 | 
			
		||||
		drm_dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
 | 
			
		||||
 | 
			
		||||
	ret = amdgpu_device_suspend(drm_dev, false);
 | 
			
		||||
@ -1511,16 +1509,14 @@ static int amdgpu_pmops_runtime_suspend(struct device *dev)
 | 
			
		||||
		return ret;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (amdgpu_device_supports_atpx(drm_dev)) {
 | 
			
		||||
	if (amdgpu_device_supports_px(drm_dev)) {
 | 
			
		||||
		/* Only need to handle PCI state in the driver for ATPX
 | 
			
		||||
		 * PCI core handles it for _PR3.
 | 
			
		||||
		 */
 | 
			
		||||
		if (!amdgpu_is_atpx_hybrid()) {
 | 
			
		||||
			amdgpu_device_cache_pci_state(pdev);
 | 
			
		||||
			pci_disable_device(pdev);
 | 
			
		||||
			pci_ignore_hotplug(pdev);
 | 
			
		||||
			pci_set_power_state(pdev, PCI_D3cold);
 | 
			
		||||
		}
 | 
			
		||||
		amdgpu_device_cache_pci_state(pdev);
 | 
			
		||||
		pci_disable_device(pdev);
 | 
			
		||||
		pci_ignore_hotplug(pdev);
 | 
			
		||||
		pci_set_power_state(pdev, PCI_D3cold);
 | 
			
		||||
		drm_dev->switch_power_state = DRM_SWITCH_POWER_DYNAMIC_OFF;
 | 
			
		||||
	} else if (amdgpu_device_supports_baco(drm_dev)) {
 | 
			
		||||
		amdgpu_device_baco_enter(drm_dev);
 | 
			
		||||
@ -1539,19 +1535,17 @@ static int amdgpu_pmops_runtime_resume(struct device *dev)
 | 
			
		||||
	if (!adev->runpm)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	if (amdgpu_device_supports_atpx(drm_dev)) {
 | 
			
		||||
	if (amdgpu_device_supports_px(drm_dev)) {
 | 
			
		||||
		drm_dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
 | 
			
		||||
 | 
			
		||||
		/* Only need to handle PCI state in the driver for ATPX
 | 
			
		||||
		 * PCI core handles it for _PR3.
 | 
			
		||||
		 */
 | 
			
		||||
		if (!amdgpu_is_atpx_hybrid()) {
 | 
			
		||||
			pci_set_power_state(pdev, PCI_D0);
 | 
			
		||||
			amdgpu_device_load_pci_state(pdev);
 | 
			
		||||
			ret = pci_enable_device(pdev);
 | 
			
		||||
			if (ret)
 | 
			
		||||
				return ret;
 | 
			
		||||
		}
 | 
			
		||||
		pci_set_power_state(pdev, PCI_D0);
 | 
			
		||||
		amdgpu_device_load_pci_state(pdev);
 | 
			
		||||
		ret = pci_enable_device(pdev);
 | 
			
		||||
		if (ret)
 | 
			
		||||
			return ret;
 | 
			
		||||
		pci_set_master(pdev);
 | 
			
		||||
	} else if (amdgpu_device_supports_boco(drm_dev)) {
 | 
			
		||||
		/* Only need to handle PCI state in the driver for ATPX
 | 
			
		||||
@ -1562,7 +1556,7 @@ static int amdgpu_pmops_runtime_resume(struct device *dev)
 | 
			
		||||
		amdgpu_device_baco_exit(drm_dev);
 | 
			
		||||
	}
 | 
			
		||||
	ret = amdgpu_device_resume(drm_dev, false);
 | 
			
		||||
	if (amdgpu_device_supports_atpx(drm_dev))
 | 
			
		||||
	if (amdgpu_device_supports_px(drm_dev))
 | 
			
		||||
		drm_dev->switch_power_state = DRM_SWITCH_POWER_ON;
 | 
			
		||||
	adev->in_runpm = false;
 | 
			
		||||
	return 0;
 | 
			
		||||
 | 
			
		||||
@ -159,7 +159,7 @@ int amdgpu_driver_load_kms(struct amdgpu_device *adev, unsigned long flags)
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (amdgpu_device_supports_atpx(dev) &&
 | 
			
		||||
	if (amdgpu_device_supports_px(dev) &&
 | 
			
		||||
	    (amdgpu_runtime_pm != 0)) { /* enable runpm by default for atpx */
 | 
			
		||||
		adev->runpm = true;
 | 
			
		||||
		dev_info(adev->dev, "Using ATPX for runtime pm\n");
 | 
			
		||||
@ -200,13 +200,10 @@ int amdgpu_driver_load_kms(struct amdgpu_device *adev, unsigned long flags)
 | 
			
		||||
 | 
			
		||||
	if (adev->runpm) {
 | 
			
		||||
		/* only need to skip on ATPX */
 | 
			
		||||
		if (amdgpu_device_supports_atpx(dev) &&
 | 
			
		||||
		    !amdgpu_is_atpx_hybrid())
 | 
			
		||||
		if (amdgpu_device_supports_px(dev))
 | 
			
		||||
			dev_pm_set_driver_flags(dev->dev, DPM_FLAG_NO_DIRECT_COMPLETE);
 | 
			
		||||
		/* we want direct complete for BOCO */
 | 
			
		||||
		if ((amdgpu_device_supports_atpx(dev) &&
 | 
			
		||||
		    amdgpu_is_atpx_hybrid()) ||
 | 
			
		||||
		    amdgpu_device_supports_boco(dev))
 | 
			
		||||
		if (amdgpu_device_supports_boco(dev))
 | 
			
		||||
			dev_pm_set_driver_flags(dev->dev, DPM_FLAG_SMART_PREPARE |
 | 
			
		||||
						DPM_FLAG_SMART_SUSPEND |
 | 
			
		||||
						DPM_FLAG_MAY_SKIP_RESUME);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user