diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 27 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 2 | 
3 files changed, 30 insertions, 0 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 5cbed256f006..c87dfdb8aedb 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -990,6 +990,7 @@ struct amdgpu_device {  	/* record last mm index being written through WREG32*/  	unsigned long last_mm_index;  	bool                            in_gpu_reset; +	enum pp_mp1_state               mp1_state;  	struct mutex  lock_reset;  	struct amdgpu_doorbell_index doorbell_index; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 14a9169446f5..2081649f49ca 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -2175,6 +2175,21 @@ static int amdgpu_device_ip_suspend_phase2(struct amdgpu_device *adev)  			DRM_ERROR("suspend of IP block <%s> failed %d\n",  				  adev->ip_blocks[i].version->funcs->name, r);  		} +		/* handle putting the SMC in the appropriate state */ +		if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC) { +			if (is_support_sw_smu(adev)) { +				/* todo */ +			} else if (adev->powerplay.pp_funcs && +				   adev->powerplay.pp_funcs->set_mp1_state) { +				r = adev->powerplay.pp_funcs->set_mp1_state( +					adev->powerplay.pp_handle, +					adev->mp1_state); +				if (r) { +					DRM_ERROR("SMC failed to set mp1 state %d, %d\n", +						  adev->mp1_state, r); +				} +			} +		}  	}  	return 0; @@ -3640,6 +3655,17 @@ static bool amdgpu_device_lock_adev(struct amdgpu_device *adev, bool trylock)  	atomic_inc(&adev->gpu_reset_counter);  	adev->in_gpu_reset = 1; +	switch (amdgpu_asic_reset_method(adev)) { +	case AMD_RESET_METHOD_MODE1: +		adev->mp1_state = PP_MP1_STATE_SHUTDOWN; +		break; +	case AMD_RESET_METHOD_MODE2: +		adev->mp1_state = PP_MP1_STATE_RESET; +		break; +	default: +		adev->mp1_state = PP_MP1_STATE_NONE; +		break; +	}  	/* Block kfd: SRIOV would do it separately */  	if (!amdgpu_sriov_vf(adev))                  amdgpu_amdkfd_pre_reset(adev); @@ -3653,6 +3679,7 @@ static void amdgpu_device_unlock_adev(struct amdgpu_device *adev)  	if (!amdgpu_sriov_vf(adev))                  amdgpu_amdkfd_post_reset(adev);  	amdgpu_vf_error_trans_all(adev); +	adev->mp1_state = PP_MP1_STATE_NONE;  	adev->in_gpu_reset = 0;  	mutex_unlock(&adev->lock_reset);  } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index 56f807757d2c..e3e09e6d7f42 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c @@ -1096,7 +1096,9 @@ amdgpu_pci_shutdown(struct pci_dev *pdev)  	 * unfortunately we can't detect certain  	 * hypervisors so just do this all the time.  	 */ +	adev->mp1_state = PP_MP1_STATE_UNLOAD;  	amdgpu_device_ip_suspend(adev); +	adev->mp1_state = PP_MP1_STATE_NONE;  }  static int amdgpu_pmops_suspend(struct device *dev) |