diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_device.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 29 | 
1 files changed, 7 insertions, 22 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 7f354cd532dc..f8b3e04d71ed 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -4907,28 +4907,20 @@ static int amdgpu_device_evict_resources(struct amdgpu_device *adev)   * @data: data   *   * This function is called when the system is about to suspend or hibernate. - * It is used to evict resources from the device before the system goes to - * sleep while there is still access to swap. + * It is used to set the appropriate flags so that eviction can be optimized + * in the pm prepare callback.   */  static int amdgpu_device_pm_notifier(struct notifier_block *nb, unsigned long mode,  				     void *data)  {  	struct amdgpu_device *adev = container_of(nb, struct amdgpu_device, pm_nb); -	int r;  	switch (mode) {  	case PM_HIBERNATION_PREPARE:  		adev->in_s4 = true; -		fallthrough; -	case PM_SUSPEND_PREPARE: -		r = amdgpu_device_evict_resources(adev); -		/* -		 * This is considered non-fatal at this time because -		 * amdgpu_device_prepare() will also fatally evict resources. -		 * See https://gitlab.freedesktop.org/drm/amd/-/issues/3781 -		 */ -		if (r) -			drm_warn(adev_to_drm(adev), "Failed to evict resources, freeze active processes if problems occur: %d\n", r); +		break; +	case PM_POST_HIBERNATION: +		adev->in_s4 = false;  		break;  	} @@ -4949,15 +4941,13 @@ int amdgpu_device_prepare(struct drm_device *dev)  	struct amdgpu_device *adev = drm_to_adev(dev);  	int i, r; -	amdgpu_choose_low_power_state(adev); -  	if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)  		return 0;  	/* Evict the majority of BOs before starting suspend sequence */  	r = amdgpu_device_evict_resources(adev);  	if (r) -		goto unprepare; +		return r;  	flush_delayed_work(&adev->gfx.gfx_off_delay_work); @@ -4968,15 +4958,10 @@ int amdgpu_device_prepare(struct drm_device *dev)  			continue;  		r = adev->ip_blocks[i].version->funcs->prepare_suspend(&adev->ip_blocks[i]);  		if (r) -			goto unprepare; +			return r;  	}  	return 0; - -unprepare: -	adev->in_s0ix = adev->in_s3 = adev->in_s4 = false; - -	return r;  }  /** | 
