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, 22 insertions, 7 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 559dc24ef436..affde2de2a0d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -2008,8 +2008,24 @@ static void amdgpu_device_fill_reset_magic(struct amdgpu_device *adev)   */  static bool amdgpu_device_check_vram_lost(struct amdgpu_device *adev)  { -	return !!memcmp(adev->gart.ptr, adev->reset_magic, -			AMDGPU_RESET_MAGIC_NUM); +	if (memcmp(adev->gart.ptr, adev->reset_magic, +			AMDGPU_RESET_MAGIC_NUM)) +		return true; + +	if (!adev->in_gpu_reset) +		return false; + +	/* +	 * For all ASICs with baco/mode1 reset, the VRAM is +	 * always assumed to be lost. +	 */ +	switch (amdgpu_asic_reset_method(adev)) { +	case AMD_RESET_METHOD_BACO: +	case AMD_RESET_METHOD_MODE1: +		return true; +	default: +		return false; +	}  }  /** @@ -2340,6 +2356,8 @@ static int amdgpu_device_ip_suspend_phase1(struct amdgpu_device *adev)  {  	int i, r; +	amdgpu_device_set_pg_state(adev, AMD_PG_STATE_UNGATE); +	amdgpu_device_set_cg_state(adev, AMD_CG_STATE_UNGATE);  	for (i = adev->num_ip_blocks - 1; i >= 0; i--) {  		if (!adev->ip_blocks[i].status.valid) @@ -3354,15 +3372,12 @@ int amdgpu_device_suspend(struct drm_device *dev, bool fbcon)  		}  	} -	amdgpu_device_set_pg_state(adev, AMD_PG_STATE_UNGATE); -	amdgpu_device_set_cg_state(adev, AMD_CG_STATE_UNGATE); - -	amdgpu_amdkfd_suspend(adev, !fbcon); -  	amdgpu_ras_suspend(adev);  	r = amdgpu_device_ip_suspend_phase1(adev); +	amdgpu_amdkfd_suspend(adev, !fbcon); +  	/* evict vram memory */  	amdgpu_bo_evict_vram(adev); |