Commit 2e4b2f7b authored by Evan Quan's avatar Evan Quan Committed by Alex Deucher

drm/amd/pm: unify the interface for loading SMU microcode

No need to have special handling for swSMU supported ASICs.
Signed-off-by: default avatarEvan Quan <evan.quan@amd.com>
Reviewed-by: default avatarLijo Lazar <lijo.lazar@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 1fb4968b
...@@ -7170,16 +7170,10 @@ static int gfx_v10_0_hw_init(void *handle) ...@@ -7170,16 +7170,10 @@ static int gfx_v10_0_hw_init(void *handle)
* loaded firstly, so in direct type, it has to load smc ucode * loaded firstly, so in direct type, it has to load smc ucode
* here before rlc. * here before rlc.
*/ */
if (adev->smu.ppt_funcs != NULL && !(adev->flags & AMD_IS_APU)) { if (!(adev->flags & AMD_IS_APU)) {
r = smu_load_microcode(&adev->smu); r = amdgpu_pm_load_smu_firmware(adev, NULL);
if (r) if (r)
return r; return r;
r = smu_check_fw_status(&adev->smu);
if (r) {
pr_err("SMC firmware status is not correct\n");
return r;
}
} }
gfx_v10_0_disable_gpa_mode(adev); gfx_v10_0_disable_gpa_mode(adev);
} }
......
...@@ -1606,7 +1606,10 @@ int amdgpu_pm_load_smu_firmware(struct amdgpu_device *adev, uint32_t *smu_versio ...@@ -1606,7 +1606,10 @@ int amdgpu_pm_load_smu_firmware(struct amdgpu_device *adev, uint32_t *smu_versio
pr_err("smu firmware loading failed\n"); pr_err("smu firmware loading failed\n");
return r; return r;
} }
if (smu_version)
*smu_version = adev->pm.fw_version; *smu_version = adev->pm.fw_version;
} }
return 0; return 0;
} }
...@@ -1252,10 +1252,6 @@ enum smu_cmn2asic_mapping_type { ...@@ -1252,10 +1252,6 @@ enum smu_cmn2asic_mapping_type {
[profile] = {1, (workload)} [profile] = {1, (workload)}
#if !defined(SWSMU_CODE_LAYER_L2) && !defined(SWSMU_CODE_LAYER_L3) && !defined(SWSMU_CODE_LAYER_L4) #if !defined(SWSMU_CODE_LAYER_L2) && !defined(SWSMU_CODE_LAYER_L3) && !defined(SWSMU_CODE_LAYER_L4)
int smu_load_microcode(struct smu_context *smu);
int smu_check_fw_status(struct smu_context *smu);
int smu_get_power_limit(struct smu_context *smu, int smu_get_power_limit(struct smu_context *smu,
uint32_t *limit, uint32_t *limit,
enum smu_ppt_limit_level limit_level); enum smu_ppt_limit_level limit_level);
......
...@@ -2095,36 +2095,34 @@ const struct amdgpu_ip_block_version smu_v13_0_ip_block = ...@@ -2095,36 +2095,34 @@ const struct amdgpu_ip_block_version smu_v13_0_ip_block =
.funcs = &smu_ip_funcs, .funcs = &smu_ip_funcs,
}; };
int smu_load_microcode(struct smu_context *smu) static int smu_load_microcode(void *handle)
{ {
struct smu_context *smu = handle;
struct amdgpu_device *adev = smu->adev;
int ret = 0; int ret = 0;
if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) if (!smu->pm_enabled)
return -EOPNOTSUPP; return -EOPNOTSUPP;
mutex_lock(&smu->mutex); /* This should be used for non PSP loading */
if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP)
return 0;
if (smu->ppt_funcs->load_microcode) if (smu->ppt_funcs->load_microcode) {
ret = smu->ppt_funcs->load_microcode(smu); ret = smu->ppt_funcs->load_microcode(smu);
if (ret) {
mutex_unlock(&smu->mutex); dev_err(adev->dev, "Load microcode failed\n");
return ret; return ret;
} }
}
int smu_check_fw_status(struct smu_context *smu)
{
int ret = 0;
if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled)
return -EOPNOTSUPP;
mutex_lock(&smu->mutex);
if (smu->ppt_funcs->check_fw_status) if (smu->ppt_funcs->check_fw_status) {
ret = smu->ppt_funcs->check_fw_status(smu); ret = smu->ppt_funcs->check_fw_status(smu);
if (ret) {
mutex_unlock(&smu->mutex); dev_err(adev->dev, "SMC is not ready\n");
return ret;
}
}
return ret; return ret;
} }
...@@ -2981,6 +2979,7 @@ static const struct amd_pm_funcs swsmu_pm_funcs = { ...@@ -2981,6 +2979,7 @@ static const struct amd_pm_funcs swsmu_pm_funcs = {
.set_watermarks_for_clock_ranges = smu_set_watermarks_for_clock_ranges, .set_watermarks_for_clock_ranges = smu_set_watermarks_for_clock_ranges,
.display_disable_memory_clock_switch = smu_display_disable_memory_clock_switch, .display_disable_memory_clock_switch = smu_display_disable_memory_clock_switch,
.get_max_sustainable_clocks_by_dc = smu_get_max_sustainable_clocks_by_dc, .get_max_sustainable_clocks_by_dc = smu_get_max_sustainable_clocks_by_dc,
.load_firmware = smu_load_microcode,
}; };
int smu_wait_for_event(struct amdgpu_device *adev, enum smu_event_type event, int smu_wait_for_event(struct amdgpu_device *adev, enum smu_event_type event,
......
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