[PATCH] drm/amdgpu/powerplay: add one flag to show that no one message be sent yet by SMU

chen gong curry.gong at amd.com
Thu Oct 24 10:35:40 UTC 2019


The value of the register mmMP1_SMN_C2PMSG_90 should be 0 when
initializing smu and after resuming smu.

Signed-off-by: chen gong <curry.gong at amd.com>
---
 drivers/gpu/drm/amd/powerplay/amdgpu_smu.c     |  3 ++-
 drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h |  1 +
 drivers/gpu/drm/amd/powerplay/smu_v12_0.c      | 15 ++++++++++-----
 3 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
index 3ce01e1..d93040b 100644
--- a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
+++ b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
@@ -738,6 +738,7 @@ static int smu_early_init(void *handle)
 	smu->adev = adev;
 	smu->pm_enabled = !!amdgpu_dpm;
 	smu->is_apu = false;
+	smu->not_yet_sent_one_msg = true;
 	mutex_init(&smu->mutex);
 
 	return smu_set_funcs(adev);
@@ -1381,7 +1382,7 @@ static int smu_resume(void *handle)
 		smu_set_gfx_cgpg(&adev->smu, true);
 
 	smu->disable_uclk_switch = 0;
-
+	smu->not_yet_sent_one_msg = true;
 	pr_info("SMU is resumed successfully!\n");
 
 	return 0;
diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
index 8120e75..1c03163 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
@@ -388,6 +388,7 @@ struct smu_context
 	uint32_t default_power_profile_mode;
 	bool pm_enabled;
 	bool is_apu;
+	bool not_yet_sent_one_msg;
 
 	uint32_t smc_if_version;
 
diff --git a/drivers/gpu/drm/amd/powerplay/smu_v12_0.c b/drivers/gpu/drm/amd/powerplay/smu_v12_0.c
index 139dd73..2199a39 100644
--- a/drivers/gpu/drm/amd/powerplay/smu_v12_0.c
+++ b/drivers/gpu/drm/amd/powerplay/smu_v12_0.c
@@ -113,10 +113,11 @@ smu_v12_0_send_msg_with_param(struct smu_context *smu, uint16_t msg,
 	if (index < 0)
 		return index;
 
-	ret = smu_v12_0_wait_for_response(smu);
-	if (ret)
-		pr_err("Failed to send message 0x%x, response 0x%x, param 0x%x\n",
-		       index, ret, param);
+	if(!smu->not_yet_sent_one_msg){
+		ret = smu_v12_0_wait_for_response(smu);
+		if (ret)
+			pr_err("Failed to send message 0x%x, response 0x%x, param 0x%x\n",index, ret, param);
+	}
 
 	WREG32_SOC15(MP1, 0, mmMP1_SMN_C2PMSG_90, 0);
 
@@ -125,9 +126,13 @@ smu_v12_0_send_msg_with_param(struct smu_context *smu, uint16_t msg,
 	smu_v12_0_send_msg_without_waiting(smu, (uint16_t)index);
 
 	ret = smu_v12_0_wait_for_response(smu);
-	if (ret)
+	if (ret){
 		pr_err("Failed to send message 0x%x, response 0x%x param 0x%x\n",
 		       index, ret, param);
+	}
+	else if(smu->not_yet_sent_one_msg){
+		smu->not_yet_sent_one_msg = false;
+	}
 
 	return ret;
 }
-- 
2.7.4



More information about the amd-gfx mailing list