drm/amd/pm: only send GmiPwrDnControl msg on master die (v3)
authorTao Zhou <tao.zhou1@amd.com>
Mon, 10 Jan 2022 07:12:38 +0000 (15:12 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 11 Jan 2022 20:44:28 +0000 (15:44 -0500)
PMFW only returns 0 on master die and sends NACK back on other dies for
the message.

v2: only send GmiPwrDnControl msg on master die instead of all
dies.
v3: remove the pointer check for get_socket_id and get_die_id as they
should be present on Aldebaran.

Signed-off-by: Tao Zhou <tao.zhou1@amd.com>
Reviewed-by: Lijo Lazar <lijo.lazar@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c

index 380811b..4885c4a 100644 (file)
@@ -1625,10 +1625,18 @@ static int aldebaran_set_df_cstate(struct smu_context *smu,
 
 static int aldebaran_allow_xgmi_power_down(struct smu_context *smu, bool en)
 {
-       return smu_cmn_send_smc_msg_with_param(smu,
-                                              SMU_MSG_GmiPwrDnControl,
-                                              en ? 0 : 1,
-                                              NULL);
+       struct amdgpu_device *adev = smu->adev;
+
+       /* The message only works on master die and NACK will be sent
+          back for other dies, only send it on master die */
+       if (!adev->smuio.funcs->get_socket_id(adev) &&
+           !adev->smuio.funcs->get_die_id(adev))
+               return smu_cmn_send_smc_msg_with_param(smu,
+                                  SMU_MSG_GmiPwrDnControl,
+                                  en ? 0 : 1,
+                                  NULL);
+       else
+               return 0;
 }
 
 static const struct throttling_logging_label {