diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_device.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 27 | 
1 files changed, 26 insertions, 1 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index be7aff2d4a57..25e1f5ed7ead 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -3152,7 +3152,8 @@ static int amdgpu_device_ip_resume_phase1(struct amdgpu_device *adev)  			continue;  		if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON ||  		    adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC || -		    adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH) { +		    adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH || +		    (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_PSP && amdgpu_sriov_vf(adev))) {  			r = adev->ip_blocks[i].version->funcs->resume(adev);  			if (r) { @@ -4064,12 +4065,20 @@ static void amdgpu_device_evict_resources(struct amdgpu_device *adev)  int amdgpu_device_suspend(struct drm_device *dev, bool fbcon)  {  	struct amdgpu_device *adev = drm_to_adev(dev); +	int r = 0;  	if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)  		return 0;  	adev->in_suspend = true; +	if (amdgpu_sriov_vf(adev)) { +		amdgpu_virt_fini_data_exchange(adev); +		r = amdgpu_virt_request_full_gpu(adev, false); +		if (r) +			return r; +	} +  	if (amdgpu_acpi_smart_shift_update(dev, AMDGPU_SS_DEV_D3))  		DRM_WARN("smart shift update failed\n"); @@ -4093,6 +4102,9 @@ int amdgpu_device_suspend(struct drm_device *dev, bool fbcon)  	amdgpu_device_ip_suspend_phase2(adev); +	if (amdgpu_sriov_vf(adev)) +		amdgpu_virt_release_full_gpu(adev, false); +  	return 0;  } @@ -4111,6 +4123,12 @@ int amdgpu_device_resume(struct drm_device *dev, bool fbcon)  	struct amdgpu_device *adev = drm_to_adev(dev);  	int r = 0; +	if (amdgpu_sriov_vf(adev)) { +		r = amdgpu_virt_request_full_gpu(adev, true); +		if (r) +			return r; +	} +  	if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)  		return 0; @@ -4125,6 +4143,13 @@ int amdgpu_device_resume(struct drm_device *dev, bool fbcon)  	}  	r = amdgpu_device_ip_resume(adev); + +	/* no matter what r is, always need to properly release full GPU */ +	if (amdgpu_sriov_vf(adev)) { +		amdgpu_virt_init_data_exchange(adev); +		amdgpu_virt_release_full_gpu(adev, true); +	} +  	if (r) {  		dev_err(adev->dev, "amdgpu_device_ip_resume failed (%d).\n", r);  		return r; | 
