Commit d76c66c6 authored by Kenneth Feng's avatar Kenneth Feng Committed by Alex Deucher
Browse files

drm/amd/pm: send unload command to smu during modprobe -r amdgpu



Send unload command to smu during modprobe -r amdgpu for smu 13/14.
1. This can fix the high voltage/temperatue issue after driver is unloaded.
2. Reloading driver could fail but with the debug port based mode1 reset
during driver is reloaded, it is good and safe.

Signed-off-by: default avatarKenneth Feng <kenneth.feng@amd.com>
Reviewed-by: default avatarYang Wang <kevinyang.wang@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 29b1b0b0
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -4652,9 +4652,6 @@ int amdgpu_device_init(struct amdgpu_device *adev,
			dev_info(adev->dev, "Pending hive reset.\n");
			amdgpu_set_init_level(adev,
					      AMDGPU_INIT_LEVEL_MINIMAL_XGMI);
		} else if (amdgpu_ip_version(adev, MP1_HWIP, 0) == IP_VERSION(13, 0, 10) &&
				   !amdgpu_device_has_display_hardware(adev)) {
					r = psp_gpu_reset(adev);
		} else {
				tmp = amdgpu_reset_method;
				/* It should do a default reset when loading or reloading the driver,
+3 −4
Original line number Diff line number Diff line
@@ -810,7 +810,7 @@ static int smu_early_init(struct amdgpu_ip_block *ip_block)
	smu->adev = adev;
	smu->pm_enabled = !!amdgpu_dpm;
	smu->is_apu = false;
	smu->smu_baco.state = SMU_BACO_STATE_NONE;
	smu->smu_baco.state = SMU_BACO_STATE_EXIT;
	smu->smu_baco.platform_support = false;
	smu->smu_baco.maco_support = false;
	smu->user_dpm_profile.fan_mode = -1;
@@ -2120,9 +2120,8 @@ static int smu_reset_mp1_state(struct smu_context *smu)
	int ret = 0;

	if ((!adev->in_runpm) && (!adev->in_suspend) &&
		(!amdgpu_in_reset(adev)) && amdgpu_ip_version(adev, MP1_HWIP, 0) ==
									IP_VERSION(13, 0, 10) &&
		!amdgpu_device_has_display_hardware(adev))
		(!amdgpu_in_reset(adev)) && !smu->is_apu &&
			amdgpu_ip_version(adev, MP1_HWIP, 0) >= IP_VERSION(13, 0, 0))
		ret = smu_set_mp1_state(smu, PP_MP1_STATE_UNLOAD);

	return ret;
+0 −1
Original line number Diff line number Diff line
@@ -536,7 +536,6 @@ enum smu_reset_mode {
enum smu_baco_state {
	SMU_BACO_STATE_ENTER = 0,
	SMU_BACO_STATE_EXIT,
	SMU_BACO_STATE_NONE,
};

struct smu_baco_context {
+1 −7
Original line number Diff line number Diff line
@@ -2768,13 +2768,7 @@ static int smu_v13_0_0_set_mp1_state(struct smu_context *smu,

	switch (mp1_state) {
	case PP_MP1_STATE_UNLOAD:
		ret = smu_cmn_send_smc_msg_with_param(smu,
											  SMU_MSG_PrepareMp1ForUnload,
											  0x55, NULL);

		if (!ret && smu->smu_baco.state == SMU_BACO_STATE_EXIT)
			ret = smu_v13_0_disable_pmfw_state(smu);

		ret = smu_cmn_set_mp1_state(smu, mp1_state);
		break;
	default:
		/* Ignore others */