diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 24 | 
1 files changed, 14 insertions, 10 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index 26bf896f1444..72c807f5822e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c @@ -2548,8 +2548,20 @@ static int amdgpu_pmops_suspend(struct device *dev)  		adev->in_s0ix = true;  	else if (amdgpu_acpi_is_s3_active(adev))  		adev->in_s3 = true; -	if (!adev->in_s0ix && !adev->in_s3) +	if (!adev->in_s0ix && !adev->in_s3) { +		/* don't allow going deep first time followed by s2idle the next time */ +		if (adev->last_suspend_state != PM_SUSPEND_ON && +		    adev->last_suspend_state != pm_suspend_target_state) { +			drm_err_once(drm_dev, "Unsupported suspend state %d\n", +				     pm_suspend_target_state); +			return -EINVAL; +		}  		return 0; +	} + +	/* cache the state last used for suspend */ +	adev->last_suspend_state = pm_suspend_target_state; +  	return amdgpu_device_suspend(drm_dev, true);  } @@ -2603,13 +2615,8 @@ static int amdgpu_pmops_freeze(struct device *dev)  static int amdgpu_pmops_thaw(struct device *dev)  {  	struct drm_device *drm_dev = dev_get_drvdata(dev); -	struct amdgpu_device *adev = drm_to_adev(drm_dev); -	int r; - -	r = amdgpu_device_resume(drm_dev, true); -	adev->in_s4 = false; -	return r; +	return amdgpu_device_resume(drm_dev, true);  }  static int amdgpu_pmops_poweroff(struct device *dev) @@ -2622,9 +2629,6 @@ static int amdgpu_pmops_poweroff(struct device *dev)  static int amdgpu_pmops_restore(struct device *dev)  {  	struct drm_device *drm_dev = dev_get_drvdata(dev); -	struct amdgpu_device *adev = drm_to_adev(drm_dev); - -	adev->in_s4 = false;  	return amdgpu_device_resume(drm_dev, true);  }  | 
