SMU messages may use fewer arguments than the available argument registers,
the previous code only wrote used registers and left the rest unchanged,
so stale values from a prior message could persist.

Write all argument registers for each message and zero the unused tail
to keep command arguments deterministic and avoid unintended carry-over.

Signed-off-by: Yang Wang <[email protected]>
---
 drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c 
b/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c
index 546e64e3ba9c..85e7a8b347f7 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c
@@ -313,11 +313,15 @@ static void __smu_msg_v1_send(struct smu_msg_ctl *ctl, 
u16 index,
 {
        struct amdgpu_device *adev = ctl->smu->adev;
        struct smu_msg_config *cfg = &ctl->config;
+       u32 arg;
        int i;
 
        WREG32(cfg->resp_reg, 0);
-       for (i = 0; i < args->num_args; i++)
-               WREG32(cfg->arg_regs[i], args->args[i]);
+       for (i = 0; i < ctl->config.num_arg_regs; i++) {
+               /* NOTE: Clear unused argument registers to avoid stale values. 
*/
+               arg = i < args->num_args ? args->args[i] : 0;
+               WREG32(cfg->arg_regs[i], arg);
+       }
        WREG32(cfg->msg_reg, index);
 }
 
-- 
2.47.3

Reply via email to