Use message control block operations in common message functions.

Signed-off-by: Lijo Lazar <[email protected]>
---
 drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c | 92 +++++---------------------
 1 file changed, 15 insertions(+), 77 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c 
b/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c
index de4b7f423a76..3c06ac5d23fa 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c
@@ -375,22 +375,7 @@ int smu_cmn_send_msg_without_waiting(struct smu_context 
*smu,
  */
 int smu_cmn_wait_for_response(struct smu_context *smu)
 {
-       u32 reg;
-       int res;
-
-       reg = __smu_cmn_poll_stat(smu);
-       res = __smu_cmn_reg2errno(smu, reg);
-
-       if (res == -EREMOTEIO)
-               smu->smc_fw_state = SMU_FW_HANG;
-
-       if (unlikely(smu->adev->pm.smu_debug_mask & SMU_DEBUG_HALT_ON_ERROR) &&
-           res && (res != -ETIME)) {
-               amdgpu_device_halt(smu->adev);
-               WARN_ON(1);
-       }
-
-       return res;
+       return smu_msg_wait_response(&smu->msg_ctl, 0);
 }
 
 /**
@@ -430,70 +415,23 @@ int smu_cmn_send_smc_msg_with_param(struct smu_context 
*smu,
                                    uint32_t param,
                                    uint32_t *read_arg)
 {
-       struct amdgpu_device *adev = smu->adev;
-       int res, index;
-       bool poll = true;
-       u32 reg;
-
-       if (adev->no_hw_access)
-               return 0;
-
-       index = smu_cmn_to_asic_specific_index(smu,
-                                              CMN2ASIC_MAPPING_MSG,
-                                              msg);
-       if (index < 0)
-               return index == -EACCES ? 0 : index;
-
-       mutex_lock(&smu->message_lock);
-
-       if (smu->smc_fw_caps & SMU_FW_CAP_RAS_PRI) {
-               res = __smu_cmn_ras_filter_msg(smu, msg, &poll);
-               if (res)
-                       goto Out;
-       }
+       struct smu_msg_ctl *ctl = &smu->msg_ctl;
+       struct smu_msg_args args = {
+               .msg = msg,
+               .args[0] = param,
+               .num_args = 1,
+               .num_out_args = read_arg ? 1 : 0,
+               .flags = 0,
+               .timeout = 0,
+       };
+       int ret;
 
-       if (smu->smc_fw_state == SMU_FW_HANG) {
-               dev_err(adev->dev, "SMU is in hanged state, failed to send smu 
message!\n");
-               res = -EREMOTEIO;
-               goto Out;
-       } else if (smu->smc_fw_state == SMU_FW_INIT) {
-               /* Ignore initial smu response register value */
-               poll = false;
-               smu->smc_fw_state = SMU_FW_RUNTIME;
-       }
+       ret = ctl->ops->send_msg(ctl, &args);
 
-       if (poll) {
-               reg = __smu_cmn_poll_stat(smu);
-               res = __smu_cmn_reg2errno(smu, reg);
-               if (reg == SMU_RESP_NONE || res == -EREMOTEIO) {
-                       __smu_cmn_reg_print_error(smu, reg, index, param, msg);
-                       goto Out;
-               }
-       }
-       __smu_cmn_send_msg(smu, (uint16_t) index, param);
-       reg = __smu_cmn_poll_stat(smu);
-       res = __smu_cmn_reg2errno(smu, reg);
-       if (res != 0) {
-               if (res == -EREMOTEIO)
-                       smu->smc_fw_state = SMU_FW_HANG;
-               __smu_cmn_reg_print_error(smu, reg, index, param, msg);
-       }
-       if (read_arg) {
-               smu_cmn_read_arg(smu, read_arg);
-               dev_dbg(adev->dev, "smu send message: %s(%d) param: 0x%08x, 
resp: 0x%08x, readval: 0x%08x\n",
-                       smu_get_message_name(smu, msg), index, param, reg, 
*read_arg);
-       } else {
-               dev_dbg(adev->dev, "smu send message: %s(%d) param: 0x%08x, 
resp: 0x%08x\n",
-                       smu_get_message_name(smu, msg), index, param, reg);
-       }
-Out:
-       if (unlikely(adev->pm.smu_debug_mask & SMU_DEBUG_HALT_ON_ERROR) && res) 
{
-               amdgpu_device_halt(adev);
-               WARN_ON(1);
-       }
+       if (read_arg)
+               *read_arg = args.out_args[0];
 
-       mutex_unlock(&smu->message_lock);
-       return res;
+       return ret;
 }
 
 int smu_cmn_send_smc_msg(struct smu_context *smu,
-- 
2.49.0

Reply via email to