Commit 4fde03a7 authored by Kevin Wang's avatar Kevin Wang Committed by Alex Deucher

drm/amd/powerplay: add helper function to get smu firmware & if version

add this helper function to get smc version.
Signed-off-by: default avatarKevin Wang <kevin1.wang@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent eef2d67e
...@@ -30,6 +30,36 @@ ...@@ -30,6 +30,36 @@
#include "atom.h" #include "atom.h"
#include "amd_pcie.h" #include "amd_pcie.h"
int smu_get_smc_version(struct smu_context *smu, uint32_t *if_version, uint32_t *smu_version)
{
int ret = 0;
if (!if_version && !smu_version)
return -EINVAL;
if (if_version) {
ret = smu_send_smc_msg(smu, SMU_MSG_GetDriverIfVersion);
if (ret)
return ret;
ret = smu_read_smc_arg(smu, if_version);
if (ret)
return ret;
}
if (smu_version) {
ret = smu_send_smc_msg(smu, SMU_MSG_GetSmuVersion);
if (ret)
return ret;
ret = smu_read_smc_arg(smu, smu_version);
if (ret)
return ret;
}
return ret;
}
int smu_dpm_set_power_gate(struct smu_context *smu, uint32_t block_type, int smu_dpm_set_power_gate(struct smu_context *smu, uint32_t block_type,
bool gate) bool gate)
{ {
......
...@@ -767,4 +767,5 @@ extern int smu_dpm_set_power_gate(struct smu_context *smu,uint32_t block_type, b ...@@ -767,4 +767,5 @@ extern int smu_dpm_set_power_gate(struct smu_context *smu,uint32_t block_type, b
extern int smu_handle_task(struct smu_context *smu, extern int smu_handle_task(struct smu_context *smu,
enum amd_dpm_forced_level level, enum amd_dpm_forced_level level,
enum amd_pp_task task_id); enum amd_pp_task task_id);
int smu_get_smc_version(struct smu_context *smu, uint32_t *if_version, uint32_t *smu_version);
#endif #endif
...@@ -223,20 +223,27 @@ static int smu_v11_0_check_fw_status(struct smu_context *smu) ...@@ -223,20 +223,27 @@ static int smu_v11_0_check_fw_status(struct smu_context *smu)
static int smu_v11_0_check_fw_version(struct smu_context *smu) static int smu_v11_0_check_fw_version(struct smu_context *smu)
{ {
uint32_t smu_version = 0xff; uint32_t if_version = 0xff, smu_version = 0xff;
uint16_t smu_major;
uint8_t smu_minor, smu_debug;
int ret = 0; int ret = 0;
ret = smu_send_smc_msg(smu, SMU_MSG_GetDriverIfVersion); ret = smu_get_smc_version(smu, &if_version, &smu_version);
if (ret) if (ret)
goto err; return ret;
ret = smu_read_smc_arg(smu, &smu_version); smu_major = (smu_version >> 16) & 0xffff;
if (ret) smu_minor = (smu_version >> 8) & 0xff;
goto err; smu_debug = (smu_version >> 0) & 0xff;
pr_info("SMU Driver IF Version = 0x%08x, SMU FW Version = 0x%08x (%d.%d.%d)\n",
if_version, smu_version, smu_major, smu_minor, smu_debug);
if (smu_version != smu->smc_if_version) if (if_version != smu->smc_if_version) {
pr_err("SMU driver if version not matched\n");
ret = -EINVAL; ret = -EINVAL;
err: }
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment