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