drm/amd/powerplay: refine interface in struct pp_smumgr_func
unify to use struct hwmgr as function parameter in smumgr. Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Rex Zhu <Rex.Zhu@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>hifive-unleashed-5.1
parent
e9c7577c09
commit
d3f8c0abf4
|
@ -83,7 +83,7 @@ static int pp_sw_init(void *handle)
|
|||
if (smumgr->smumgr_funcs->smu_init == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
ret = smumgr->smumgr_funcs->smu_init(smumgr);
|
||||
ret = smumgr->smumgr_funcs->smu_init(pp_handle->hwmgr);
|
||||
|
||||
pr_info("amdgpu: powerplay sw initialized\n");
|
||||
}
|
||||
|
@ -103,7 +103,7 @@ static int pp_sw_fini(void *handle)
|
|||
if (smumgr->smumgr_funcs->smu_fini == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
ret = smumgr->smumgr_funcs->smu_fini(smumgr);
|
||||
ret = smumgr->smumgr_funcs->smu_fini(pp_handle->hwmgr);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
@ -122,9 +122,9 @@ static int pp_hw_init(void *handle)
|
|||
if (smumgr->smumgr_funcs->start_smu == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
if(smumgr->smumgr_funcs->start_smu(smumgr)) {
|
||||
if(smumgr->smumgr_funcs->start_smu(pp_handle->hwmgr)) {
|
||||
pr_err("smc start failed\n");
|
||||
smumgr->smumgr_funcs->smu_fini(smumgr);
|
||||
smumgr->smumgr_funcs->smu_fini(pp_handle->hwmgr);
|
||||
return -EINVAL;;
|
||||
}
|
||||
if (ret == PP_DPM_DISABLED)
|
||||
|
@ -246,10 +246,10 @@ static int pp_resume(void *handle)
|
|||
if (smumgr->smumgr_funcs->start_smu == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
ret = smumgr->smumgr_funcs->start_smu(smumgr);
|
||||
ret = smumgr->smumgr_funcs->start_smu(pp_handle->hwmgr);
|
||||
if (ret) {
|
||||
pr_err("smc start failed\n");
|
||||
smumgr->smumgr_funcs->smu_fini(smumgr);
|
||||
smumgr->smumgr_funcs->smu_fini(pp_handle->hwmgr);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -113,12 +113,12 @@ int cz_enable_disable_uvd_dpm(struct pp_hwmgr *hwmgr, bool enable)
|
|||
PHM_PlatformCaps_UVDDPM)) {
|
||||
cz_hwmgr->dpm_flags |= DPMFlags_UVD_Enabled;
|
||||
dpm_features |= UVD_DPM_MASK;
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_EnableAllSmuFeatures, dpm_features);
|
||||
} else {
|
||||
dpm_features |= UVD_DPM_MASK;
|
||||
cz_hwmgr->dpm_flags &= ~DPMFlags_UVD_Enabled;
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_DisableAllSmuFeatures, dpm_features);
|
||||
}
|
||||
return 0;
|
||||
|
@ -134,12 +134,12 @@ int cz_enable_disable_vce_dpm(struct pp_hwmgr *hwmgr, bool enable)
|
|||
PHM_PlatformCaps_VCEDPM)) {
|
||||
cz_hwmgr->dpm_flags |= DPMFlags_VCE_Enabled;
|
||||
dpm_features |= VCE_DPM_MASK;
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_EnableAllSmuFeatures, dpm_features);
|
||||
} else {
|
||||
dpm_features |= VCE_DPM_MASK;
|
||||
cz_hwmgr->dpm_flags &= ~DPMFlags_VCE_Enabled;
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_DisableAllSmuFeatures, dpm_features);
|
||||
}
|
||||
|
||||
|
|
|
@ -162,8 +162,8 @@ static uint32_t cz_get_max_sclk_level(struct pp_hwmgr *hwmgr)
|
|||
struct cz_hwmgr *cz_hwmgr = (struct cz_hwmgr *)(hwmgr->backend);
|
||||
|
||||
if (cz_hwmgr->max_sclk_level == 0) {
|
||||
smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_GetMaxSclkLevel);
|
||||
cz_hwmgr->max_sclk_level = smum_get_argument(hwmgr->smumgr) + 1;
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetMaxSclkLevel);
|
||||
cz_hwmgr->max_sclk_level = smum_get_argument(hwmgr) + 1;
|
||||
}
|
||||
|
||||
return cz_hwmgr->max_sclk_level;
|
||||
|
@ -462,7 +462,7 @@ static int cz_upload_pptable_to_smu(struct pp_hwmgr *hwmgr)
|
|||
if (!hwmgr->need_pp_table_upload)
|
||||
return 0;
|
||||
|
||||
ret = smum_download_powerplay_table(hwmgr->smumgr, &table);
|
||||
ret = smum_download_powerplay_table(hwmgr, &table);
|
||||
|
||||
PP_ASSERT_WITH_CODE((0 == ret && NULL != table),
|
||||
"Fail to get clock table from SMU!", return -EINVAL;);
|
||||
|
@ -554,7 +554,7 @@ static int cz_upload_pptable_to_smu(struct pp_hwmgr *hwmgr)
|
|||
(uint8_t)dividers.pll_post_divider;
|
||||
|
||||
}
|
||||
ret = smum_upload_powerplay_table(hwmgr->smumgr);
|
||||
ret = smum_upload_powerplay_table(hwmgr);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -598,8 +598,8 @@ static int cz_init_uvd_limit(struct pp_hwmgr *hwmgr)
|
|||
cz_hwmgr->uvd_dpm.soft_min_clk = 0;
|
||||
cz_hwmgr->uvd_dpm.hard_min_clk = 0;
|
||||
|
||||
smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_GetMaxUvdLevel);
|
||||
level = smum_get_argument(hwmgr->smumgr);
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetMaxUvdLevel);
|
||||
level = smum_get_argument(hwmgr);
|
||||
|
||||
if (level < table->count)
|
||||
clock = table->entries[level].vclk;
|
||||
|
@ -625,8 +625,8 @@ static int cz_init_vce_limit(struct pp_hwmgr *hwmgr)
|
|||
cz_hwmgr->vce_dpm.soft_min_clk = 0;
|
||||
cz_hwmgr->vce_dpm.hard_min_clk = 0;
|
||||
|
||||
smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_GetMaxEclkLevel);
|
||||
level = smum_get_argument(hwmgr->smumgr);
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetMaxEclkLevel);
|
||||
level = smum_get_argument(hwmgr);
|
||||
|
||||
if (level < table->count)
|
||||
clock = table->entries[level].ecclk;
|
||||
|
@ -652,8 +652,8 @@ static int cz_init_acp_limit(struct pp_hwmgr *hwmgr)
|
|||
cz_hwmgr->acp_dpm.soft_min_clk = 0;
|
||||
cz_hwmgr->acp_dpm.hard_min_clk = 0;
|
||||
|
||||
smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_GetMaxAclkLevel);
|
||||
level = smum_get_argument(hwmgr->smumgr);
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetMaxAclkLevel);
|
||||
level = smum_get_argument(hwmgr);
|
||||
|
||||
if (level < table->count)
|
||||
clock = table->entries[level].acpclk;
|
||||
|
@ -709,7 +709,7 @@ static int cz_update_sclk_limit(struct pp_hwmgr *hwmgr)
|
|||
if (cz_hwmgr->sclk_dpm.hard_min_clk != clock) {
|
||||
cz_hwmgr->sclk_dpm.hard_min_clk = clock;
|
||||
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetSclkHardMin,
|
||||
cz_get_sclk_level(hwmgr,
|
||||
cz_hwmgr->sclk_dpm.hard_min_clk,
|
||||
|
@ -735,7 +735,7 @@ static int cz_update_sclk_limit(struct pp_hwmgr *hwmgr)
|
|||
|
||||
if (cz_hwmgr->sclk_dpm.soft_min_clk != clock) {
|
||||
cz_hwmgr->sclk_dpm.soft_min_clk = clock;
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetSclkSoftMin,
|
||||
cz_get_sclk_level(hwmgr,
|
||||
cz_hwmgr->sclk_dpm.soft_min_clk,
|
||||
|
@ -746,7 +746,7 @@ static int cz_update_sclk_limit(struct pp_hwmgr *hwmgr)
|
|||
PHM_PlatformCaps_StablePState) &&
|
||||
cz_hwmgr->sclk_dpm.soft_max_clk != clock) {
|
||||
cz_hwmgr->sclk_dpm.soft_max_clk = clock;
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetSclkSoftMax,
|
||||
cz_get_sclk_level(hwmgr,
|
||||
cz_hwmgr->sclk_dpm.soft_max_clk,
|
||||
|
@ -766,7 +766,7 @@ static int cz_set_deep_sleep_sclk_threshold(struct pp_hwmgr *hwmgr)
|
|||
|
||||
PP_DBG_LOG("Setting Deep Sleep Clock: %d\n", clks);
|
||||
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetMinDeepSleepSclk,
|
||||
clks);
|
||||
}
|
||||
|
@ -779,7 +779,7 @@ static int cz_set_watermark_threshold(struct pp_hwmgr *hwmgr)
|
|||
struct cz_hwmgr *cz_hwmgr =
|
||||
(struct cz_hwmgr *)(hwmgr->backend);
|
||||
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetWatermarkFrequency,
|
||||
cz_hwmgr->sclk_dpm.soft_max_clk);
|
||||
|
||||
|
@ -794,13 +794,13 @@ static int cz_nbdpm_pstate_enable_disable(struct pp_hwmgr *hwmgr, bool enable, b
|
|||
if (enable) {
|
||||
PP_DBG_LOG("enable Low Memory PState.\n");
|
||||
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_EnableLowMemoryPstate,
|
||||
(lock ? 1 : 0));
|
||||
} else {
|
||||
PP_DBG_LOG("disable Low Memory PState.\n");
|
||||
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_DisableLowMemoryPstate,
|
||||
(lock ? 1 : 0));
|
||||
}
|
||||
|
@ -820,7 +820,7 @@ static int cz_disable_nb_dpm(struct pp_hwmgr *hwmgr)
|
|||
cz_nbdpm_pstate_enable_disable(hwmgr, true, true);
|
||||
dpm_features |= NB_DPM_MASK;
|
||||
ret = smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr,
|
||||
hwmgr,
|
||||
PPSMC_MSG_DisableAllSmuFeatures,
|
||||
dpm_features);
|
||||
if (ret == 0)
|
||||
|
@ -841,7 +841,7 @@ static int cz_enable_nb_dpm(struct pp_hwmgr *hwmgr)
|
|||
PP_DBG_LOG("enabling ALL SMU features.\n");
|
||||
dpm_features |= NB_DPM_MASK;
|
||||
ret = smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr,
|
||||
hwmgr,
|
||||
PPSMC_MSG_EnableAllSmuFeatures,
|
||||
dpm_features);
|
||||
if (ret == 0)
|
||||
|
@ -968,7 +968,7 @@ static int cz_start_dpm(struct pp_hwmgr *hwmgr)
|
|||
cz_hwmgr->dpm_flags |= DPMFlags_SCLK_Enabled;
|
||||
dpm_features |= SCLK_DPM_MASK;
|
||||
|
||||
ret = smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
ret = smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_EnableAllSmuFeatures,
|
||||
dpm_features);
|
||||
|
||||
|
@ -984,7 +984,7 @@ static int cz_stop_dpm(struct pp_hwmgr *hwmgr)
|
|||
if (cz_hwmgr->dpm_flags & DPMFlags_SCLK_Enabled) {
|
||||
dpm_features |= SCLK_DPM_MASK;
|
||||
cz_hwmgr->dpm_flags &= ~DPMFlags_SCLK_Enabled;
|
||||
ret = smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
ret = smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_DisableAllSmuFeatures,
|
||||
dpm_features);
|
||||
}
|
||||
|
@ -998,13 +998,13 @@ static int cz_program_bootup_state(struct pp_hwmgr *hwmgr)
|
|||
cz_hwmgr->sclk_dpm.soft_min_clk = cz_hwmgr->sys_info.bootup_engine_clock;
|
||||
cz_hwmgr->sclk_dpm.soft_max_clk = cz_hwmgr->sys_info.bootup_engine_clock;
|
||||
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetSclkSoftMin,
|
||||
cz_get_sclk_level(hwmgr,
|
||||
cz_hwmgr->sclk_dpm.soft_min_clk,
|
||||
PPSMC_MSG_SetSclkSoftMin));
|
||||
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetSclkSoftMax,
|
||||
cz_get_sclk_level(hwmgr,
|
||||
cz_hwmgr->sclk_dpm.soft_max_clk,
|
||||
|
@ -1026,9 +1026,9 @@ static bool cz_dpm_check_smu_features(struct pp_hwmgr *hwmgr,
|
|||
int result;
|
||||
unsigned long features;
|
||||
|
||||
result = smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, PPSMC_MSG_GetFeatureStatus, 0);
|
||||
result = smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_GetFeatureStatus, 0);
|
||||
if (result == 0) {
|
||||
features = smum_get_argument(hwmgr->smumgr);
|
||||
features = smum_get_argument(hwmgr);
|
||||
if (features & check_feature)
|
||||
return true;
|
||||
}
|
||||
|
@ -1178,13 +1178,13 @@ static int cz_phm_force_dpm_highest(struct pp_hwmgr *hwmgr)
|
|||
{
|
||||
struct cz_hwmgr *cz_hwmgr = (struct cz_hwmgr *)(hwmgr->backend);
|
||||
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetSclkSoftMin,
|
||||
cz_get_sclk_level(hwmgr,
|
||||
cz_hwmgr->sclk_dpm.soft_max_clk,
|
||||
PPSMC_MSG_SetSclkSoftMin));
|
||||
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetSclkSoftMax,
|
||||
cz_get_sclk_level(hwmgr,
|
||||
cz_hwmgr->sclk_dpm.soft_max_clk,
|
||||
|
@ -1216,13 +1216,13 @@ static int cz_phm_unforce_dpm_levels(struct pp_hwmgr *hwmgr)
|
|||
cz_hwmgr->sclk_dpm.soft_max_clk = clock;
|
||||
cz_hwmgr->sclk_dpm.hard_max_clk = clock;
|
||||
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetSclkSoftMin,
|
||||
cz_get_sclk_level(hwmgr,
|
||||
cz_hwmgr->sclk_dpm.soft_min_clk,
|
||||
PPSMC_MSG_SetSclkSoftMin));
|
||||
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetSclkSoftMax,
|
||||
cz_get_sclk_level(hwmgr,
|
||||
cz_hwmgr->sclk_dpm.soft_max_clk,
|
||||
|
@ -1235,13 +1235,13 @@ static int cz_phm_force_dpm_lowest(struct pp_hwmgr *hwmgr)
|
|||
{
|
||||
struct cz_hwmgr *cz_hwmgr = (struct cz_hwmgr *)(hwmgr->backend);
|
||||
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetSclkSoftMax,
|
||||
cz_get_sclk_level(hwmgr,
|
||||
cz_hwmgr->sclk_dpm.soft_min_clk,
|
||||
PPSMC_MSG_SetSclkSoftMax));
|
||||
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetSclkSoftMin,
|
||||
cz_get_sclk_level(hwmgr,
|
||||
cz_hwmgr->sclk_dpm.soft_min_clk,
|
||||
|
@ -1281,7 +1281,7 @@ int cz_dpm_powerdown_uvd(struct pp_hwmgr *hwmgr)
|
|||
{
|
||||
if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
|
||||
PHM_PlatformCaps_UVDPowerGating))
|
||||
return smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
return smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_UVDPowerOFF);
|
||||
return 0;
|
||||
}
|
||||
|
@ -1293,11 +1293,11 @@ int cz_dpm_powerup_uvd(struct pp_hwmgr *hwmgr)
|
|||
if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
|
||||
PHM_PlatformCaps_UVDDynamicPowerGating)) {
|
||||
return smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr,
|
||||
hwmgr,
|
||||
PPSMC_MSG_UVDPowerON, 1);
|
||||
} else {
|
||||
return smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr,
|
||||
hwmgr,
|
||||
PPSMC_MSG_UVDPowerON, 0);
|
||||
}
|
||||
}
|
||||
|
@ -1319,7 +1319,7 @@ int cz_dpm_update_uvd_dpm(struct pp_hwmgr *hwmgr, bool bgate)
|
|||
cz_hwmgr->uvd_dpm.hard_min_clk =
|
||||
ptable->entries[ptable->count - 1].vclk;
|
||||
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetUvdHardMin,
|
||||
cz_get_uvd_level(hwmgr,
|
||||
cz_hwmgr->uvd_dpm.hard_min_clk,
|
||||
|
@ -1349,7 +1349,7 @@ int cz_dpm_update_vce_dpm(struct pp_hwmgr *hwmgr)
|
|||
cz_hwmgr->vce_dpm.hard_min_clk =
|
||||
ptable->entries[ptable->count - 1].ecclk;
|
||||
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetEclkHardMin,
|
||||
cz_get_eclk_level(hwmgr,
|
||||
cz_hwmgr->vce_dpm.hard_min_clk,
|
||||
|
@ -1357,15 +1357,15 @@ int cz_dpm_update_vce_dpm(struct pp_hwmgr *hwmgr)
|
|||
} else {
|
||||
/*Program HardMin based on the vce_arbiter.ecclk */
|
||||
if (hwmgr->vce_arbiter.ecclk == 0) {
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetEclkHardMin, 0);
|
||||
/* disable ECLK DPM 0. Otherwise VCE could hang if
|
||||
* switching SCLK from DPM 0 to 6/7 */
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetEclkSoftMin, 1);
|
||||
} else {
|
||||
cz_hwmgr->vce_dpm.hard_min_clk = hwmgr->vce_arbiter.ecclk;
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetEclkHardMin,
|
||||
cz_get_eclk_level(hwmgr,
|
||||
cz_hwmgr->vce_dpm.hard_min_clk,
|
||||
|
@ -1379,7 +1379,7 @@ int cz_dpm_powerdown_vce(struct pp_hwmgr *hwmgr)
|
|||
{
|
||||
if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
|
||||
PHM_PlatformCaps_VCEPowerGating))
|
||||
return smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
return smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_VCEPowerOFF);
|
||||
return 0;
|
||||
}
|
||||
|
@ -1388,7 +1388,7 @@ int cz_dpm_powerup_vce(struct pp_hwmgr *hwmgr)
|
|||
{
|
||||
if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
|
||||
PHM_PlatformCaps_VCEPowerGating))
|
||||
return smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
return smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_VCEPowerON);
|
||||
return 0;
|
||||
}
|
||||
|
@ -1538,7 +1538,7 @@ static void cz_hw_print_display_cfg(
|
|||
PP_DBG_LOG("SetDisplaySizePowerParams data: 0x%X\n",
|
||||
data);
|
||||
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetDisplaySizePowerParams,
|
||||
data);
|
||||
}
|
||||
|
@ -1603,10 +1603,10 @@ static int cz_force_clock_level(struct pp_hwmgr *hwmgr,
|
|||
|
||||
switch (type) {
|
||||
case PP_SCLK:
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetSclkSoftMin,
|
||||
mask);
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetSclkSoftMax,
|
||||
mask);
|
||||
break;
|
||||
|
@ -1848,7 +1848,7 @@ static int cz_read_sensor(struct pp_hwmgr *hwmgr, int idx,
|
|||
*((uint32_t *)value) = 0;
|
||||
return 0;
|
||||
case AMDGPU_PP_SENSOR_GPU_LOAD:
|
||||
result = smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_GetAverageGraphicsActivity);
|
||||
result = smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetAverageGraphicsActivity);
|
||||
if (0 == result) {
|
||||
activity_percent = cgs_read_register(hwmgr->device, mmSMU_MP1_SRBM2P_ARG_0);
|
||||
activity_percent = activity_percent > 100 ? 100 : activity_percent;
|
||||
|
|
|
@ -818,7 +818,7 @@ void phm_apply_dal_min_voltage_request(struct pp_hwmgr *hwmgr)
|
|||
for (i = 0; i < vddc_table->count; i++) {
|
||||
if (req_vddc <= vddc_table->entries[i].vddc) {
|
||||
req_volt = (((uint32_t)vddc_table->entries[i].vddc) * VOLTAGE_SCALE);
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_VddC_Request, req_volt);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -174,33 +174,33 @@ static int rv_set_clock_limit(struct pp_hwmgr *hwmgr, const void *input)
|
|||
((hwmgr->uvd_arbiter.dclk_soft_min / 100) != rv_data->dclk_soft_min)) {
|
||||
rv_data->vclk_soft_min = hwmgr->uvd_arbiter.vclk_soft_min / 100;
|
||||
rv_data->dclk_soft_min = hwmgr->uvd_arbiter.dclk_soft_min / 100;
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetSoftMinVcn,
|
||||
(rv_data->vclk_soft_min << 16) | rv_data->vclk_soft_min);
|
||||
}
|
||||
|
||||
if((hwmgr->gfx_arbiter.sclk_hard_min != 0) &&
|
||||
((hwmgr->gfx_arbiter.sclk_hard_min / 100) != rv_data->soc_actual_hard_min_freq)) {
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetHardMinSocclkByFreq,
|
||||
hwmgr->gfx_arbiter.sclk_hard_min / 100);
|
||||
rv_read_arg_from_smc(hwmgr->smumgr, &rv_data->soc_actual_hard_min_freq);
|
||||
rv_read_arg_from_smc(hwmgr, &rv_data->soc_actual_hard_min_freq);
|
||||
}
|
||||
|
||||
if ((hwmgr->gfx_arbiter.gfxclk != 0) &&
|
||||
(rv_data->gfx_actual_soft_min_freq != (hwmgr->gfx_arbiter.gfxclk))) {
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetMinVideoGfxclkFreq,
|
||||
hwmgr->gfx_arbiter.gfxclk / 100);
|
||||
rv_read_arg_from_smc(hwmgr->smumgr, &rv_data->gfx_actual_soft_min_freq);
|
||||
rv_read_arg_from_smc(hwmgr, &rv_data->gfx_actual_soft_min_freq);
|
||||
}
|
||||
|
||||
if ((hwmgr->gfx_arbiter.fclk != 0) &&
|
||||
(rv_data->fabric_actual_soft_min_freq != (hwmgr->gfx_arbiter.fclk / 100))) {
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetMinVideoFclkFreq,
|
||||
hwmgr->gfx_arbiter.fclk / 100);
|
||||
rv_read_arg_from_smc(hwmgr->smumgr, &rv_data->fabric_actual_soft_min_freq);
|
||||
rv_read_arg_from_smc(hwmgr, &rv_data->fabric_actual_soft_min_freq);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -212,7 +212,7 @@ static int rv_set_deep_sleep_dcefclk(struct pp_hwmgr *hwmgr, uint32_t clock)
|
|||
|
||||
if (rv_data->need_min_deep_sleep_dcefclk && rv_data->deep_sleep_dcefclk != clock/100) {
|
||||
rv_data->deep_sleep_dcefclk = clock/100;
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetMinDeepSleepDcefclk,
|
||||
rv_data->deep_sleep_dcefclk);
|
||||
}
|
||||
|
@ -225,7 +225,7 @@ static int rv_set_active_display_count(struct pp_hwmgr *hwmgr, uint32_t count)
|
|||
|
||||
if (rv_data->num_active_display != count) {
|
||||
rv_data->num_active_display = count;
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetDisplayCount,
|
||||
rv_data->num_active_display);
|
||||
}
|
||||
|
@ -277,7 +277,7 @@ static int rv_disable_gfx_off(struct pp_hwmgr *hwmgr)
|
|||
struct rv_hwmgr *rv_data = (struct rv_hwmgr *)(hwmgr->backend);
|
||||
|
||||
if (rv_data->gfx_off_controled_by_driver)
|
||||
smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_DisableGfxOff);
|
||||
|
||||
return 0;
|
||||
|
@ -293,7 +293,7 @@ static int rv_enable_gfx_off(struct pp_hwmgr *hwmgr)
|
|||
struct rv_hwmgr *rv_data = (struct rv_hwmgr *)(hwmgr->backend);
|
||||
|
||||
if (rv_data->gfx_off_controled_by_driver)
|
||||
smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_EnableGfxOff);
|
||||
|
||||
return 0;
|
||||
|
@ -383,7 +383,7 @@ static int rv_populate_clock_table(struct pp_hwmgr *hwmgr)
|
|||
DpmClocks_t *table = &(rv_data->clock_table);
|
||||
struct rv_clock_voltage_information *pinfo = &(rv_data->clock_vol_info);
|
||||
|
||||
result = rv_copy_table_from_smc(hwmgr->smumgr, (uint8_t *)table, CLOCKTABLE);
|
||||
result = rv_copy_table_from_smc(hwmgr, (uint8_t *)table, CLOCKTABLE);
|
||||
|
||||
PP_ASSERT_WITH_CODE((0 == result),
|
||||
"Attempt to copy clock table from smc failed",
|
||||
|
@ -799,7 +799,7 @@ int rv_display_clock_voltage_request(struct pp_hwmgr *hwmgr,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
result = smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, msg,
|
||||
result = smum_send_msg_to_smc_with_parameter(hwmgr, msg,
|
||||
clk_freq);
|
||||
|
||||
return result;
|
||||
|
|
|
@ -27,21 +27,21 @@
|
|||
|
||||
static int smu7_enable_disable_uvd_dpm(struct pp_hwmgr *hwmgr, bool enable)
|
||||
{
|
||||
return smum_send_msg_to_smc(hwmgr->smumgr, enable ?
|
||||
return smum_send_msg_to_smc(hwmgr, enable ?
|
||||
PPSMC_MSG_UVDDPM_Enable :
|
||||
PPSMC_MSG_UVDDPM_Disable);
|
||||
}
|
||||
|
||||
static int smu7_enable_disable_vce_dpm(struct pp_hwmgr *hwmgr, bool enable)
|
||||
{
|
||||
return smum_send_msg_to_smc(hwmgr->smumgr, enable ?
|
||||
return smum_send_msg_to_smc(hwmgr, enable ?
|
||||
PPSMC_MSG_VCEDPM_Enable :
|
||||
PPSMC_MSG_VCEDPM_Disable);
|
||||
}
|
||||
|
||||
static int smu7_enable_disable_samu_dpm(struct pp_hwmgr *hwmgr, bool enable)
|
||||
{
|
||||
return smum_send_msg_to_smc(hwmgr->smumgr, enable ?
|
||||
return smum_send_msg_to_smc(hwmgr, enable ?
|
||||
PPSMC_MSG_SAMUDPM_Enable :
|
||||
PPSMC_MSG_SAMUDPM_Disable);
|
||||
}
|
||||
|
@ -70,7 +70,7 @@ static int smu7_update_samu_dpm(struct pp_hwmgr *hwmgr, bool bgate)
|
|||
int smu7_powerdown_uvd(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
if (phm_cf_want_uvd_power_gating(hwmgr))
|
||||
return smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
return smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_UVDPowerOFF);
|
||||
return 0;
|
||||
}
|
||||
|
@ -80,10 +80,10 @@ static int smu7_powerup_uvd(struct pp_hwmgr *hwmgr)
|
|||
if (phm_cf_want_uvd_power_gating(hwmgr)) {
|
||||
if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
|
||||
PHM_PlatformCaps_UVDDynamicPowerGating)) {
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_UVDPowerON, 1);
|
||||
} else {
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_UVDPowerON, 0);
|
||||
}
|
||||
}
|
||||
|
@ -94,7 +94,7 @@ static int smu7_powerup_uvd(struct pp_hwmgr *hwmgr)
|
|||
static int smu7_powerdown_vce(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
if (phm_cf_want_vce_power_gating(hwmgr))
|
||||
return smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
return smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_VCEPowerOFF);
|
||||
return 0;
|
||||
}
|
||||
|
@ -102,7 +102,7 @@ static int smu7_powerdown_vce(struct pp_hwmgr *hwmgr)
|
|||
static int smu7_powerup_vce(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
if (phm_cf_want_vce_power_gating(hwmgr))
|
||||
return smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
return smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_VCEPowerON);
|
||||
return 0;
|
||||
}
|
||||
|
@ -111,7 +111,7 @@ static int smu7_powerdown_samu(struct pp_hwmgr *hwmgr)
|
|||
{
|
||||
if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
|
||||
PHM_PlatformCaps_SamuPowerGating))
|
||||
return smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
return smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_SAMPowerOFF);
|
||||
return 0;
|
||||
}
|
||||
|
@ -120,7 +120,7 @@ static int smu7_powerup_samu(struct pp_hwmgr *hwmgr)
|
|||
{
|
||||
if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
|
||||
PHM_PlatformCaps_SamuPowerGating))
|
||||
return smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
return smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_SAMPowerON);
|
||||
return 0;
|
||||
}
|
||||
|
@ -235,7 +235,7 @@ int smu7_update_clock_gatings(struct pp_hwmgr *hwmgr,
|
|||
value = CG_GFX_CGCG_MASK;
|
||||
|
||||
if (smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr, msg, value))
|
||||
hwmgr, msg, value))
|
||||
return -EINVAL;
|
||||
}
|
||||
if (PP_STATE_SUPPORT_LS & *msg_id) {
|
||||
|
@ -245,7 +245,7 @@ int smu7_update_clock_gatings(struct pp_hwmgr *hwmgr,
|
|||
value = CG_GFX_CGLS_MASK;
|
||||
|
||||
if (smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr, msg, value))
|
||||
hwmgr, msg, value))
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
|
@ -258,7 +258,7 @@ int smu7_update_clock_gatings(struct pp_hwmgr *hwmgr,
|
|||
value = CG_GFX_3DCG_MASK;
|
||||
|
||||
if (smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr, msg, value))
|
||||
hwmgr, msg, value))
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -269,7 +269,7 @@ int smu7_update_clock_gatings(struct pp_hwmgr *hwmgr,
|
|||
value = CG_GFX_3DLS_MASK;
|
||||
|
||||
if (smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr, msg, value))
|
||||
hwmgr, msg, value))
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
|
@ -282,7 +282,7 @@ int smu7_update_clock_gatings(struct pp_hwmgr *hwmgr,
|
|||
value = CG_GFX_RLC_LS_MASK;
|
||||
|
||||
if (smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr, msg, value))
|
||||
hwmgr, msg, value))
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
|
@ -295,7 +295,7 @@ int smu7_update_clock_gatings(struct pp_hwmgr *hwmgr,
|
|||
value = CG_GFX_CP_LS_MASK;
|
||||
|
||||
if (smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr, msg, value))
|
||||
hwmgr, msg, value))
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
|
@ -309,7 +309,7 @@ int smu7_update_clock_gatings(struct pp_hwmgr *hwmgr,
|
|||
CG_GFX_OTHERS_MGCG_MASK);
|
||||
|
||||
if (smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr, msg, value))
|
||||
hwmgr, msg, value))
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
|
@ -329,7 +329,7 @@ int smu7_update_clock_gatings(struct pp_hwmgr *hwmgr,
|
|||
value = CG_SYS_BIF_MGCG_MASK;
|
||||
|
||||
if (smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr, msg, value))
|
||||
hwmgr, msg, value))
|
||||
return -EINVAL;
|
||||
}
|
||||
if (PP_STATE_SUPPORT_LS & *msg_id) {
|
||||
|
@ -339,7 +339,7 @@ int smu7_update_clock_gatings(struct pp_hwmgr *hwmgr,
|
|||
value = CG_SYS_BIF_MGLS_MASK;
|
||||
|
||||
if (smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr, msg, value))
|
||||
hwmgr, msg, value))
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
|
@ -352,7 +352,7 @@ int smu7_update_clock_gatings(struct pp_hwmgr *hwmgr,
|
|||
value = CG_SYS_MC_MGCG_MASK;
|
||||
|
||||
if (smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr, msg, value))
|
||||
hwmgr, msg, value))
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -363,7 +363,7 @@ int smu7_update_clock_gatings(struct pp_hwmgr *hwmgr,
|
|||
value = CG_SYS_MC_MGLS_MASK;
|
||||
|
||||
if (smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr, msg, value))
|
||||
hwmgr, msg, value))
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
|
@ -376,7 +376,7 @@ int smu7_update_clock_gatings(struct pp_hwmgr *hwmgr,
|
|||
value = CG_SYS_DRM_MGCG_MASK;
|
||||
|
||||
if (smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr, msg, value))
|
||||
hwmgr, msg, value))
|
||||
return -EINVAL;
|
||||
}
|
||||
if (PP_STATE_SUPPORT_LS & *msg_id) {
|
||||
|
@ -386,7 +386,7 @@ int smu7_update_clock_gatings(struct pp_hwmgr *hwmgr,
|
|||
value = CG_SYS_DRM_MGLS_MASK;
|
||||
|
||||
if (smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr, msg, value))
|
||||
hwmgr, msg, value))
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
|
@ -399,7 +399,7 @@ int smu7_update_clock_gatings(struct pp_hwmgr *hwmgr,
|
|||
value = CG_SYS_HDP_MGCG_MASK;
|
||||
|
||||
if (smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr, msg, value))
|
||||
hwmgr, msg, value))
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -410,7 +410,7 @@ int smu7_update_clock_gatings(struct pp_hwmgr *hwmgr,
|
|||
value = CG_SYS_HDP_MGLS_MASK;
|
||||
|
||||
if (smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr, msg, value))
|
||||
hwmgr, msg, value))
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
|
@ -423,7 +423,7 @@ int smu7_update_clock_gatings(struct pp_hwmgr *hwmgr,
|
|||
value = CG_SYS_SDMA_MGCG_MASK;
|
||||
|
||||
if (smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr, msg, value))
|
||||
hwmgr, msg, value))
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -434,7 +434,7 @@ int smu7_update_clock_gatings(struct pp_hwmgr *hwmgr,
|
|||
value = CG_SYS_SDMA_MGLS_MASK;
|
||||
|
||||
if (smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr, msg, value))
|
||||
hwmgr, msg, value))
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
|
@ -447,7 +447,7 @@ int smu7_update_clock_gatings(struct pp_hwmgr *hwmgr,
|
|||
value = CG_SYS_ROM_MASK;
|
||||
|
||||
if (smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr, msg, value))
|
||||
hwmgr, msg, value))
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
|
@ -487,9 +487,9 @@ int smu7_enable_per_cu_power_gating(struct pp_hwmgr *hwmgr, bool enable)
|
|||
active_cus = sys_info.value;
|
||||
|
||||
if (enable)
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_GFX_CU_PG_ENABLE, active_cus);
|
||||
else
|
||||
return smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
return smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_GFX_CU_PG_DISABLE);
|
||||
}
|
||||
|
|
|
@ -164,7 +164,7 @@ static int smu7_get_current_pcie_lane_number(struct pp_hwmgr *hwmgr)
|
|||
static int smu7_enable_smc_voltage_controller(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
if (hwmgr->feature_mask & PP_SMC_VOLTAGE_CONTROL_MASK)
|
||||
smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_Voltage_Cntl_Enable);
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_Voltage_Cntl_Enable);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -301,28 +301,28 @@ static int smu7_construct_voltage_tables(struct pp_hwmgr *hwmgr)
|
|||
"Failed to retrieve SVI2 VDDC table from dependancy table.", return result;);
|
||||
}
|
||||
|
||||
tmp = smum_get_mac_definition(hwmgr->smumgr, SMU_MAX_LEVELS_VDDC);
|
||||
tmp = smum_get_mac_definition(hwmgr, SMU_MAX_LEVELS_VDDC);
|
||||
PP_ASSERT_WITH_CODE(
|
||||
(data->vddc_voltage_table.count <= tmp),
|
||||
"Too many voltage values for VDDC. Trimming to fit state table.",
|
||||
phm_trim_voltage_table_to_fit_state_table(tmp,
|
||||
&(data->vddc_voltage_table)));
|
||||
|
||||
tmp = smum_get_mac_definition(hwmgr->smumgr, SMU_MAX_LEVELS_VDDGFX);
|
||||
tmp = smum_get_mac_definition(hwmgr, SMU_MAX_LEVELS_VDDGFX);
|
||||
PP_ASSERT_WITH_CODE(
|
||||
(data->vddgfx_voltage_table.count <= tmp),
|
||||
"Too many voltage values for VDDC. Trimming to fit state table.",
|
||||
phm_trim_voltage_table_to_fit_state_table(tmp,
|
||||
&(data->vddgfx_voltage_table)));
|
||||
|
||||
tmp = smum_get_mac_definition(hwmgr->smumgr, SMU_MAX_LEVELS_VDDCI);
|
||||
tmp = smum_get_mac_definition(hwmgr, SMU_MAX_LEVELS_VDDCI);
|
||||
PP_ASSERT_WITH_CODE(
|
||||
(data->vddci_voltage_table.count <= tmp),
|
||||
"Too many voltage values for VDDCI. Trimming to fit state table.",
|
||||
phm_trim_voltage_table_to_fit_state_table(tmp,
|
||||
&(data->vddci_voltage_table)));
|
||||
|
||||
tmp = smum_get_mac_definition(hwmgr->smumgr, SMU_MAX_LEVELS_MVDD);
|
||||
tmp = smum_get_mac_definition(hwmgr, SMU_MAX_LEVELS_MVDD);
|
||||
PP_ASSERT_WITH_CODE(
|
||||
(data->mvdd_voltage_table.count <= tmp),
|
||||
"Too many voltage values for MVDD. Trimming to fit state table.",
|
||||
|
@ -471,7 +471,7 @@ static int smu7_copy_and_switch_arb_sets(struct pp_hwmgr *hwmgr,
|
|||
|
||||
static int smu7_reset_to_default(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
return smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_ResetToDefaults);
|
||||
return smum_send_msg_to_smc(hwmgr, PPSMC_MSG_ResetToDefaults);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -529,7 +529,7 @@ static int smu7_setup_default_pcie_table(struct pp_hwmgr *hwmgr)
|
|||
data->pcie_gen_performance = data->pcie_gen_power_saving;
|
||||
data->pcie_lane_performance = data->pcie_lane_power_saving;
|
||||
}
|
||||
tmp = smum_get_mac_definition(hwmgr->smumgr, SMU_MAX_LEVELS_LINK);
|
||||
tmp = smum_get_mac_definition(hwmgr, SMU_MAX_LEVELS_LINK);
|
||||
phm_reset_single_dpm_table(&data->dpm_table.pcie_speed_table,
|
||||
tmp,
|
||||
MAX_REGULAR_DPM_NUMBER);
|
||||
|
@ -610,27 +610,27 @@ static int smu7_reset_dpm_tables(struct pp_hwmgr *hwmgr)
|
|||
|
||||
phm_reset_single_dpm_table(
|
||||
&data->dpm_table.sclk_table,
|
||||
smum_get_mac_definition(hwmgr->smumgr,
|
||||
smum_get_mac_definition(hwmgr,
|
||||
SMU_MAX_LEVELS_GRAPHICS),
|
||||
MAX_REGULAR_DPM_NUMBER);
|
||||
phm_reset_single_dpm_table(
|
||||
&data->dpm_table.mclk_table,
|
||||
smum_get_mac_definition(hwmgr->smumgr,
|
||||
smum_get_mac_definition(hwmgr,
|
||||
SMU_MAX_LEVELS_MEMORY), MAX_REGULAR_DPM_NUMBER);
|
||||
|
||||
phm_reset_single_dpm_table(
|
||||
&data->dpm_table.vddc_table,
|
||||
smum_get_mac_definition(hwmgr->smumgr,
|
||||
smum_get_mac_definition(hwmgr,
|
||||
SMU_MAX_LEVELS_VDDC),
|
||||
MAX_REGULAR_DPM_NUMBER);
|
||||
phm_reset_single_dpm_table(
|
||||
&data->dpm_table.vddci_table,
|
||||
smum_get_mac_definition(hwmgr->smumgr,
|
||||
smum_get_mac_definition(hwmgr,
|
||||
SMU_MAX_LEVELS_VDDCI), MAX_REGULAR_DPM_NUMBER);
|
||||
|
||||
phm_reset_single_dpm_table(
|
||||
&data->dpm_table.mvdd_table,
|
||||
smum_get_mac_definition(hwmgr->smumgr,
|
||||
smum_get_mac_definition(hwmgr,
|
||||
SMU_MAX_LEVELS_MVDD),
|
||||
MAX_REGULAR_DPM_NUMBER);
|
||||
return 0;
|
||||
|
@ -840,7 +840,7 @@ static int smu7_enable_vrhot_gpio_interrupt(struct pp_hwmgr *hwmgr)
|
|||
|
||||
if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
|
||||
PHM_PlatformCaps_RegulatorHot))
|
||||
return smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
return smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_EnableVRHotGPIOInterrupt);
|
||||
|
||||
return 0;
|
||||
|
@ -858,7 +858,7 @@ static int smu7_enable_ulv(struct pp_hwmgr *hwmgr)
|
|||
struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
|
||||
|
||||
if (data->ulv_supported)
|
||||
return smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_EnableULV);
|
||||
return smum_send_msg_to_smc(hwmgr, PPSMC_MSG_EnableULV);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -868,7 +868,7 @@ static int smu7_disable_ulv(struct pp_hwmgr *hwmgr)
|
|||
struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
|
||||
|
||||
if (data->ulv_supported)
|
||||
return smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_DisableULV);
|
||||
return smum_send_msg_to_smc(hwmgr, PPSMC_MSG_DisableULV);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -877,12 +877,12 @@ static int smu7_enable_deep_sleep_master_switch(struct pp_hwmgr *hwmgr)
|
|||
{
|
||||
if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
|
||||
PHM_PlatformCaps_SclkDeepSleep)) {
|
||||
if (smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_MASTER_DeepSleep_ON))
|
||||
if (smum_send_msg_to_smc(hwmgr, PPSMC_MSG_MASTER_DeepSleep_ON))
|
||||
PP_ASSERT_WITH_CODE(false,
|
||||
"Attempt to enable Master Deep Sleep switch failed!",
|
||||
return -EINVAL);
|
||||
} else {
|
||||
if (smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
if (smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_MASTER_DeepSleep_OFF)) {
|
||||
PP_ASSERT_WITH_CODE(false,
|
||||
"Attempt to disable Master Deep Sleep switch failed!",
|
||||
|
@ -897,7 +897,7 @@ static int smu7_disable_deep_sleep_master_switch(struct pp_hwmgr *hwmgr)
|
|||
{
|
||||
if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
|
||||
PHM_PlatformCaps_SclkDeepSleep)) {
|
||||
if (smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
if (smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_MASTER_DeepSleep_OFF)) {
|
||||
PP_ASSERT_WITH_CODE(false,
|
||||
"Attempt to disable Master Deep Sleep switch failed!",
|
||||
|
@ -913,12 +913,12 @@ static int smu7_disable_handshake_uvd(struct pp_hwmgr *hwmgr)
|
|||
struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
|
||||
uint32_t soft_register_value = 0;
|
||||
uint32_t handshake_disables_offset = data->soft_regs_start
|
||||
+ smum_get_offsetof(hwmgr->smumgr,
|
||||
+ smum_get_offsetof(hwmgr,
|
||||
SMU_SoftRegisters, HandshakeDisables);
|
||||
|
||||
soft_register_value = cgs_read_ind_register(hwmgr->device,
|
||||
CGS_IND_REG__SMC, handshake_disables_offset);
|
||||
soft_register_value |= smum_get_mac_definition(hwmgr->smumgr,
|
||||
soft_register_value |= smum_get_mac_definition(hwmgr,
|
||||
SMU_UVD_MCLK_HANDSHAKE_DISABLE);
|
||||
cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC,
|
||||
handshake_disables_offset, soft_register_value);
|
||||
|
@ -932,7 +932,7 @@ static int smu7_enable_sclk_mclk_dpm(struct pp_hwmgr *hwmgr)
|
|||
/* enable SCLK dpm */
|
||||
if (!data->sclk_dpm_key_disabled)
|
||||
PP_ASSERT_WITH_CODE(
|
||||
(0 == smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_DPM_Enable)),
|
||||
(0 == smum_send_msg_to_smc(hwmgr, PPSMC_MSG_DPM_Enable)),
|
||||
"Failed to enable SCLK DPM during DPM Start Function!",
|
||||
return -EINVAL);
|
||||
|
||||
|
@ -941,7 +941,7 @@ static int smu7_enable_sclk_mclk_dpm(struct pp_hwmgr *hwmgr)
|
|||
if (!(hwmgr->feature_mask & PP_UVD_HANDSHAKE_MASK))
|
||||
smu7_disable_handshake_uvd(hwmgr);
|
||||
PP_ASSERT_WITH_CODE(
|
||||
(0 == smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
(0 == smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_MCLKDPM_Enable)),
|
||||
"Failed to enable MCLK DPM during DPM Start Function!",
|
||||
return -EINVAL);
|
||||
|
@ -989,7 +989,7 @@ static int smu7_start_dpm(struct pp_hwmgr *hwmgr)
|
|||
|
||||
cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC,
|
||||
data->soft_regs_start +
|
||||
smum_get_offsetof(hwmgr->smumgr, SMU_SoftRegisters,
|
||||
smum_get_offsetof(hwmgr, SMU_SoftRegisters,
|
||||
VoltageChangeTimeout), 0x1000);
|
||||
PHM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__PCIE,
|
||||
SWRST_COMMAND_1, RESETLC, 0x0);
|
||||
|
@ -1006,7 +1006,7 @@ static int smu7_start_dpm(struct pp_hwmgr *hwmgr)
|
|||
/* enable PCIE dpm */
|
||||
if (0 == data->pcie_dpm_key_disabled) {
|
||||
PP_ASSERT_WITH_CODE(
|
||||
(0 == smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
(0 == smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_PCIeDPM_Enable)),
|
||||
"Failed to enable pcie DPM during DPM Start Function!",
|
||||
return -EINVAL);
|
||||
|
@ -1014,7 +1014,7 @@ static int smu7_start_dpm(struct pp_hwmgr *hwmgr)
|
|||
|
||||
if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
|
||||
PHM_PlatformCaps_Falcon_QuickTransition)) {
|
||||
PP_ASSERT_WITH_CODE((0 == smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE((0 == smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_EnableACDCGPIOInterrupt)),
|
||||
"Failed to enable AC DC GPIO Interrupt!",
|
||||
);
|
||||
|
@ -1032,7 +1032,7 @@ static int smu7_disable_sclk_mclk_dpm(struct pp_hwmgr *hwmgr)
|
|||
PP_ASSERT_WITH_CODE(true == smum_is_dpm_running(hwmgr),
|
||||
"Trying to disable SCLK DPM when DPM is disabled",
|
||||
return 0);
|
||||
smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_DPM_Disable);
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_DPM_Disable);
|
||||
}
|
||||
|
||||
/* disable MCLK dpm */
|
||||
|
@ -1040,7 +1040,7 @@ static int smu7_disable_sclk_mclk_dpm(struct pp_hwmgr *hwmgr)
|
|||
PP_ASSERT_WITH_CODE(true == smum_is_dpm_running(hwmgr),
|
||||
"Trying to disable MCLK DPM when DPM is disabled",
|
||||
return 0);
|
||||
smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_MCLKDPM_Disable);
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_MCLKDPM_Disable);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -1060,7 +1060,7 @@ static int smu7_stop_dpm(struct pp_hwmgr *hwmgr)
|
|||
/* disable PCIE dpm */
|
||||
if (!data->pcie_dpm_key_disabled) {
|
||||
PP_ASSERT_WITH_CODE(
|
||||
(smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
(smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_PCIeDPM_Disable) == 0),
|
||||
"Failed to disable pcie DPM during DPM Stop Function!",
|
||||
return -EINVAL);
|
||||
|
@ -1072,7 +1072,7 @@ static int smu7_stop_dpm(struct pp_hwmgr *hwmgr)
|
|||
"Trying to disable voltage DPM when DPM is disabled",
|
||||
return 0);
|
||||
|
||||
smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_Voltage_Cntl_Disable);
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_Voltage_Cntl_Disable);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1226,7 +1226,7 @@ static int smu7_enable_dpm_tasks(struct pp_hwmgr *hwmgr)
|
|||
PP_ASSERT_WITH_CODE((0 == tmp_result),
|
||||
"Failed to enable VR hot GPIO interrupt!", result = tmp_result);
|
||||
|
||||
smum_send_msg_to_smc(hwmgr->smumgr, (PPSMC_Msg)PPSMC_NoDisplay);
|
||||
smum_send_msg_to_smc(hwmgr, (PPSMC_Msg)PPSMC_NoDisplay);
|
||||
|
||||
tmp_result = smu7_enable_sclk_control(hwmgr);
|
||||
PP_ASSERT_WITH_CODE((0 == tmp_result),
|
||||
|
@ -1692,7 +1692,7 @@ static int phm_add_voltage(struct pp_hwmgr *hwmgr,
|
|||
PP_ASSERT_WITH_CODE((0 != look_up_table->count),
|
||||
"Lookup Table empty.", return -EINVAL);
|
||||
|
||||
i = smum_get_mac_definition(hwmgr->smumgr, SMU_MAX_LEVELS_VDDGFX);
|
||||
i = smum_get_mac_definition(hwmgr, SMU_MAX_LEVELS_VDDGFX);
|
||||
PP_ASSERT_WITH_CODE((i >= look_up_table->count),
|
||||
"Lookup Table is full.", return -EINVAL);
|
||||
|
||||
|
@ -2423,7 +2423,7 @@ static int smu7_force_dpm_highest(struct pp_hwmgr *hwmgr)
|
|||
level++;
|
||||
|
||||
if (level)
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_PCIeDPM_ForceLevel, level);
|
||||
}
|
||||
}
|
||||
|
@ -2436,7 +2436,7 @@ static int smu7_force_dpm_highest(struct pp_hwmgr *hwmgr)
|
|||
level++;
|
||||
|
||||
if (level)
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SCLKDPM_SetEnabledMask,
|
||||
(1 << level));
|
||||
}
|
||||
|
@ -2450,7 +2450,7 @@ static int smu7_force_dpm_highest(struct pp_hwmgr *hwmgr)
|
|||
level++;
|
||||
|
||||
if (level)
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_MCLKDPM_SetEnabledMask,
|
||||
(1 << level));
|
||||
}
|
||||
|
@ -2469,14 +2469,14 @@ static int smu7_upload_dpm_level_enable_mask(struct pp_hwmgr *hwmgr)
|
|||
|
||||
if (!data->sclk_dpm_key_disabled) {
|
||||
if (data->dpm_level_enable_mask.sclk_dpm_enable_mask)
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SCLKDPM_SetEnabledMask,
|
||||
data->dpm_level_enable_mask.sclk_dpm_enable_mask);
|
||||
}
|
||||
|
||||
if (!data->mclk_dpm_key_disabled) {
|
||||
if (data->dpm_level_enable_mask.mclk_dpm_enable_mask)
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_MCLKDPM_SetEnabledMask,
|
||||
data->dpm_level_enable_mask.mclk_dpm_enable_mask);
|
||||
}
|
||||
|
@ -2492,7 +2492,7 @@ static int smu7_unforce_dpm_levels(struct pp_hwmgr *hwmgr)
|
|||
return -EINVAL;
|
||||
|
||||
if (!data->pcie_dpm_key_disabled) {
|
||||
smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_PCIeDPM_UnForceLevel);
|
||||
}
|
||||
|
||||
|
@ -2509,7 +2509,7 @@ static int smu7_force_dpm_lowest(struct pp_hwmgr *hwmgr)
|
|||
if (data->dpm_level_enable_mask.sclk_dpm_enable_mask) {
|
||||
level = phm_get_lowest_enabled_level(hwmgr,
|
||||
data->dpm_level_enable_mask.sclk_dpm_enable_mask);
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SCLKDPM_SetEnabledMask,
|
||||
(1 << level));
|
||||
|
||||
|
@ -2519,7 +2519,7 @@ static int smu7_force_dpm_lowest(struct pp_hwmgr *hwmgr)
|
|||
if (data->dpm_level_enable_mask.mclk_dpm_enable_mask) {
|
||||
level = phm_get_lowest_enabled_level(hwmgr,
|
||||
data->dpm_level_enable_mask.mclk_dpm_enable_mask);
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_MCLKDPM_SetEnabledMask,
|
||||
(1 << level));
|
||||
}
|
||||
|
@ -2529,7 +2529,7 @@ static int smu7_force_dpm_lowest(struct pp_hwmgr *hwmgr)
|
|||
if (data->dpm_level_enable_mask.pcie_dpm_enable_mask) {
|
||||
level = phm_get_lowest_enabled_level(hwmgr,
|
||||
data->dpm_level_enable_mask.pcie_dpm_enable_mask);
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_PCIeDPM_ForceLevel,
|
||||
(level));
|
||||
}
|
||||
|
@ -3005,7 +3005,7 @@ static int smu7_get_pp_table_entry_callback_func_v1(struct pp_hwmgr *hwmgr,
|
|||
[smu7_power_state->performance_level_count++]);
|
||||
|
||||
PP_ASSERT_WITH_CODE(
|
||||
(smu7_power_state->performance_level_count < smum_get_mac_definition(hwmgr->smumgr, SMU_MAX_LEVELS_GRAPHICS)),
|
||||
(smu7_power_state->performance_level_count < smum_get_mac_definition(hwmgr, SMU_MAX_LEVELS_GRAPHICS)),
|
||||
"Performance levels exceeds SMC limit!",
|
||||
return -EINVAL);
|
||||
|
||||
|
@ -3169,7 +3169,7 @@ static int smu7_get_pp_table_entry_callback_func_v0(struct pp_hwmgr *hwmgr,
|
|||
data->highest_mclk = memory_clock;
|
||||
|
||||
PP_ASSERT_WITH_CODE(
|
||||
(ps->performance_level_count < smum_get_mac_definition(hwmgr->smumgr, SMU_MAX_LEVELS_GRAPHICS)),
|
||||
(ps->performance_level_count < smum_get_mac_definition(hwmgr, SMU_MAX_LEVELS_GRAPHICS)),
|
||||
"Performance levels exceeds SMC limit!",
|
||||
return -EINVAL);
|
||||
|
||||
|
@ -3315,14 +3315,14 @@ static int smu7_get_pp_table_entry(struct pp_hwmgr *hwmgr,
|
|||
static int smu7_get_gpu_power(struct pp_hwmgr *hwmgr,
|
||||
struct pp_gpu_power *query)
|
||||
{
|
||||
PP_ASSERT_WITH_CODE(!smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_PmStatusLogStart),
|
||||
"Failed to start pm status log!",
|
||||
return -1);
|
||||
|
||||
msleep_interruptible(20);
|
||||
|
||||
PP_ASSERT_WITH_CODE(!smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_PmStatusLogSample),
|
||||
"Failed to sample pm status log!",
|
||||
return -1);
|
||||
|
@ -3356,19 +3356,19 @@ static int smu7_read_sensor(struct pp_hwmgr *hwmgr, int idx,
|
|||
|
||||
switch (idx) {
|
||||
case AMDGPU_PP_SENSOR_GFX_SCLK:
|
||||
smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_API_GetSclkFrequency);
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_API_GetSclkFrequency);
|
||||
sclk = cgs_read_register(hwmgr->device, mmSMC_MSG_ARG_0);
|
||||
*((uint32_t *)value) = sclk;
|
||||
*size = 4;
|
||||
return 0;
|
||||
case AMDGPU_PP_SENSOR_GFX_MCLK:
|
||||
smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_API_GetMclkFrequency);
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_API_GetMclkFrequency);
|
||||
mclk = cgs_read_register(hwmgr->device, mmSMC_MSG_ARG_0);
|
||||
*((uint32_t *)value) = mclk;
|
||||
*size = 4;
|
||||
return 0;
|
||||
case AMDGPU_PP_SENSOR_GPU_LOAD:
|
||||
offset = data->soft_regs_start + smum_get_offsetof(hwmgr->smumgr,
|
||||
offset = data->soft_regs_start + smum_get_offsetof(hwmgr,
|
||||
SMU_SoftRegisters,
|
||||
AverageGraphicsActivity);
|
||||
|
||||
|
@ -3535,7 +3535,7 @@ static int smu7_freeze_sclk_mclk_dpm(struct pp_hwmgr *hwmgr)
|
|||
PP_ASSERT_WITH_CODE(true == smum_is_dpm_running(hwmgr),
|
||||
"Trying to freeze SCLK DPM when DPM is disabled",
|
||||
);
|
||||
PP_ASSERT_WITH_CODE(0 == smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(0 == smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_SCLKDPM_FreezeLevel),
|
||||
"Failed to freeze SCLK DPM during FreezeSclkMclkDPM Function!",
|
||||
return -EINVAL);
|
||||
|
@ -3547,7 +3547,7 @@ static int smu7_freeze_sclk_mclk_dpm(struct pp_hwmgr *hwmgr)
|
|||
PP_ASSERT_WITH_CODE(true == smum_is_dpm_running(hwmgr),
|
||||
"Trying to freeze MCLK DPM when DPM is disabled",
|
||||
);
|
||||
PP_ASSERT_WITH_CODE(0 == smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(0 == smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_MCLKDPM_FreezeLevel),
|
||||
"Failed to freeze MCLK DPM during FreezeSclkMclkDPM Function!",
|
||||
return -EINVAL);
|
||||
|
@ -3765,7 +3765,7 @@ static int smu7_unfreeze_sclk_mclk_dpm(struct pp_hwmgr *hwmgr)
|
|||
PP_ASSERT_WITH_CODE(true == smum_is_dpm_running(hwmgr),
|
||||
"Trying to Unfreeze SCLK DPM when DPM is disabled",
|
||||
);
|
||||
PP_ASSERT_WITH_CODE(0 == smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(0 == smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_SCLKDPM_UnfreezeLevel),
|
||||
"Failed to unfreeze SCLK DPM during UnFreezeSclkMclkDPM Function!",
|
||||
return -EINVAL);
|
||||
|
@ -3777,7 +3777,7 @@ static int smu7_unfreeze_sclk_mclk_dpm(struct pp_hwmgr *hwmgr)
|
|||
PP_ASSERT_WITH_CODE(true == smum_is_dpm_running(hwmgr),
|
||||
"Trying to Unfreeze MCLK DPM when DPM is disabled",
|
||||
);
|
||||
PP_ASSERT_WITH_CODE(0 == smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(0 == smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_SCLKDPM_UnfreezeLevel),
|
||||
"Failed to unfreeze MCLK DPM during UnFreezeSclkMclkDPM Function!",
|
||||
return -EINVAL);
|
||||
|
@ -3828,9 +3828,9 @@ static int smu7_notify_smc_display(struct pp_hwmgr *hwmgr)
|
|||
int ret = 0;
|
||||
|
||||
if (hwmgr->feature_mask & PP_VBI_TIME_SUPPORT_MASK) {
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
(PPSMC_Msg)PPSMC_MSG_SetVBITimeout, data->frame_time_x2);
|
||||
ret = (smum_send_msg_to_smc(hwmgr->smumgr, (PPSMC_Msg)PPSMC_HasDisplay) == 0) ? 0 : -EINVAL;
|
||||
ret = (smum_send_msg_to_smc(hwmgr, (PPSMC_Msg)PPSMC_HasDisplay) == 0) ? 0 : -EINVAL;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
@ -3905,7 +3905,7 @@ static int smu7_set_max_fan_pwm_output(struct pp_hwmgr *hwmgr, uint16_t us_max_f
|
|||
hwmgr->thermal_controller.
|
||||
advanceFanControlParameters.usMaxFanPWM = us_max_fan_pwm;
|
||||
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetFanPwmMax, us_max_fan_pwm);
|
||||
}
|
||||
|
||||
|
@ -3914,7 +3914,7 @@ smu7_notify_smc_display_change(struct pp_hwmgr *hwmgr, bool has_display)
|
|||
{
|
||||
PPSMC_Msg msg = has_display ? (PPSMC_Msg)PPSMC_HasDisplay : (PPSMC_Msg)PPSMC_NoDisplay;
|
||||
|
||||
return (smum_send_msg_to_smc(hwmgr->smumgr, msg) == 0) ? 0 : -1;
|
||||
return (smum_send_msg_to_smc(hwmgr, msg) == 0) ? 0 : -1;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -3977,12 +3977,12 @@ static int smu7_program_display_gap(struct pp_hwmgr *hwmgr)
|
|||
cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixCG_DISPLAY_GAP_CNTL2, display_gap2);
|
||||
|
||||
cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC,
|
||||
data->soft_regs_start + smum_get_offsetof(hwmgr->smumgr,
|
||||
data->soft_regs_start + smum_get_offsetof(hwmgr,
|
||||
SMU_SoftRegisters,
|
||||
PreVBlankGap), 0x64);
|
||||
|
||||
cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC,
|
||||
data->soft_regs_start + smum_get_offsetof(hwmgr->smumgr,
|
||||
data->soft_regs_start + smum_get_offsetof(hwmgr,
|
||||
SMU_SoftRegisters,
|
||||
VBlankTimeout),
|
||||
(frame_time_in_us - pre_vbi_time_in_us));
|
||||
|
@ -4007,7 +4007,7 @@ static int smu7_set_max_fan_rpm_output(struct pp_hwmgr *hwmgr, uint16_t us_max_f
|
|||
hwmgr->thermal_controller.
|
||||
advanceFanControlParameters.usMaxFanRPM = us_max_fan_rpm;
|
||||
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetFanRpmMax, us_max_fan_rpm);
|
||||
}
|
||||
|
||||
|
@ -4257,13 +4257,13 @@ static int smu7_force_clock_level(struct pp_hwmgr *hwmgr,
|
|||
switch (type) {
|
||||
case PP_SCLK:
|
||||
if (!data->sclk_dpm_key_disabled)
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SCLKDPM_SetEnabledMask,
|
||||
data->dpm_level_enable_mask.sclk_dpm_enable_mask & mask);
|
||||
break;
|
||||
case PP_MCLK:
|
||||
if (!data->mclk_dpm_key_disabled)
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_MCLKDPM_SetEnabledMask,
|
||||
data->dpm_level_enable_mask.mclk_dpm_enable_mask & mask);
|
||||
break;
|
||||
|
@ -4276,7 +4276,7 @@ static int smu7_force_clock_level(struct pp_hwmgr *hwmgr,
|
|||
level++;
|
||||
|
||||
if (!data->pcie_dpm_key_disabled)
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_PCIeDPM_ForceLevel,
|
||||
level);
|
||||
break;
|
||||
|
@ -4300,7 +4300,7 @@ static int smu7_print_clock_levels(struct pp_hwmgr *hwmgr,
|
|||
|
||||
switch (type) {
|
||||
case PP_SCLK:
|
||||
smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_API_GetSclkFrequency);
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_API_GetSclkFrequency);
|
||||
clock = cgs_read_register(hwmgr->device, mmSMC_MSG_ARG_0);
|
||||
|
||||
for (i = 0; i < sclk_table->count; i++) {
|
||||
|
@ -4316,7 +4316,7 @@ static int smu7_print_clock_levels(struct pp_hwmgr *hwmgr,
|
|||
(i == now) ? "*" : "");
|
||||
break;
|
||||
case PP_MCLK:
|
||||
smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_API_GetMclkFrequency);
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_API_GetMclkFrequency);
|
||||
clock = cgs_read_register(hwmgr->device, mmSMC_MSG_ARG_0);
|
||||
|
||||
for (i = 0; i < mclk_table->count; i++) {
|
||||
|
@ -4602,7 +4602,7 @@ static int smu7_set_power_profile_state(struct pp_hwmgr *hwmgr,
|
|||
|
||||
if (sclk_mask) {
|
||||
if (!data->sclk_dpm_key_disabled)
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SCLKDPM_SetEnabledMask,
|
||||
data->dpm_level_enable_mask.
|
||||
sclk_dpm_enable_mask &
|
||||
|
@ -4611,7 +4611,7 @@ static int smu7_set_power_profile_state(struct pp_hwmgr *hwmgr,
|
|||
|
||||
if (mclk_mask) {
|
||||
if (!data->mclk_dpm_key_disabled)
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_MCLKDPM_SetEnabledMask,
|
||||
data->dpm_level_enable_mask.
|
||||
mclk_dpm_enable_mask &
|
||||
|
@ -4623,8 +4623,7 @@ static int smu7_set_power_profile_state(struct pp_hwmgr *hwmgr,
|
|||
|
||||
static int smu7_avfs_control(struct pp_hwmgr *hwmgr, bool enable)
|
||||
{
|
||||
struct pp_smumgr *smumgr = (struct pp_smumgr *)(hwmgr->smumgr);
|
||||
struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(smumgr->backend);
|
||||
struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(hwmgr->smumgr->backend);
|
||||
|
||||
if (smu_data == NULL)
|
||||
return -EINVAL;
|
||||
|
@ -4636,13 +4635,13 @@ static int smu7_avfs_control(struct pp_hwmgr *hwmgr, bool enable)
|
|||
if (!PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device,
|
||||
CGS_IND_REG__SMC, FEATURE_STATUS, AVS_ON))
|
||||
PP_ASSERT_WITH_CODE(!smum_send_msg_to_smc(
|
||||
hwmgr->smumgr, PPSMC_MSG_EnableAvfs),
|
||||
hwmgr, PPSMC_MSG_EnableAvfs),
|
||||
"Failed to enable AVFS!",
|
||||
return -EINVAL);
|
||||
} else if (PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device,
|
||||
CGS_IND_REG__SMC, FEATURE_STATUS, AVS_ON))
|
||||
PP_ASSERT_WITH_CODE(!smum_send_msg_to_smc(
|
||||
hwmgr->smumgr, PPSMC_MSG_DisableAvfs),
|
||||
hwmgr, PPSMC_MSG_DisableAvfs),
|
||||
"Failed to disable AVFS!",
|
||||
return -EINVAL);
|
||||
|
||||
|
|
|
@ -660,7 +660,7 @@ static int smu7_enable_didt(struct pp_hwmgr *hwmgr, const bool enable)
|
|||
didt_block |= block_en << TCP_Enable_SHIFT;
|
||||
|
||||
if (enable)
|
||||
result = smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, PPSMC_MSG_Didt_Block_Function, didt_block);
|
||||
result = smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_Didt_Block_Function, didt_block);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -781,7 +781,7 @@ int smu7_enable_didt_config(struct pp_hwmgr *hwmgr)
|
|||
PP_ASSERT_WITH_CODE((result == 0), "EnableDiDt failed.", return result);
|
||||
|
||||
if (hwmgr->chip_id == CHIP_POLARIS11) {
|
||||
result = smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
result = smum_send_msg_to_smc(hwmgr,
|
||||
(uint16_t)(PPSMC_MSG_EnableDpmDidt));
|
||||
PP_ASSERT_WITH_CODE((0 == result),
|
||||
"Failed to enable DPM DIDT.", return result);
|
||||
|
@ -809,7 +809,7 @@ int smu7_disable_didt_config(struct pp_hwmgr *hwmgr)
|
|||
"Post DIDT enable clock gating failed.",
|
||||
return result);
|
||||
if (hwmgr->chip_id == CHIP_POLARIS11) {
|
||||
result = smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
result = smum_send_msg_to_smc(hwmgr,
|
||||
(uint16_t)(PPSMC_MSG_DisableDpmDidt));
|
||||
PP_ASSERT_WITH_CODE((0 == result),
|
||||
"Failed to disable DPM DIDT.", return result);
|
||||
|
@ -827,7 +827,7 @@ int smu7_enable_smc_cac(struct pp_hwmgr *hwmgr)
|
|||
|
||||
if (PP_CAP(PHM_PlatformCaps_CAC)) {
|
||||
int smc_result;
|
||||
smc_result = smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
smc_result = smum_send_msg_to_smc(hwmgr,
|
||||
(uint16_t)(PPSMC_MSG_EnableCac));
|
||||
PP_ASSERT_WITH_CODE((0 == smc_result),
|
||||
"Failed to enable CAC in SMC.", result = -1);
|
||||
|
@ -843,7 +843,7 @@ int smu7_disable_smc_cac(struct pp_hwmgr *hwmgr)
|
|||
int result = 0;
|
||||
|
||||
if (PP_CAP(PHM_PlatformCaps_CAC) && data->cac_enabled) {
|
||||
int smc_result = smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
int smc_result = smum_send_msg_to_smc(hwmgr,
|
||||
(uint16_t)(PPSMC_MSG_DisableCac));
|
||||
PP_ASSERT_WITH_CODE((smc_result == 0),
|
||||
"Failed to disable CAC in SMC.", result = -1);
|
||||
|
@ -859,7 +859,7 @@ int smu7_set_power_limit(struct pp_hwmgr *hwmgr, uint32_t n)
|
|||
|
||||
if (data->power_containment_features &
|
||||
POWERCONTAINMENT_FEATURE_PkgPwrLimit)
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_PkgPwrSetLimit, n);
|
||||
return 0;
|
||||
}
|
||||
|
@ -867,7 +867,7 @@ int smu7_set_power_limit(struct pp_hwmgr *hwmgr, uint32_t n)
|
|||
static int smu7_set_overdriver_target_tdp(struct pp_hwmgr *hwmgr,
|
||||
uint32_t target_tdp)
|
||||
{
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_OverDriveSetTargetTdp, target_tdp);
|
||||
}
|
||||
|
||||
|
@ -888,7 +888,7 @@ int smu7_enable_power_containment(struct pp_hwmgr *hwmgr)
|
|||
|
||||
if (PP_CAP(PHM_PlatformCaps_PowerContainment)) {
|
||||
if (data->enable_tdc_limit_feature) {
|
||||
smc_result = smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
smc_result = smum_send_msg_to_smc(hwmgr,
|
||||
(uint16_t)(PPSMC_MSG_TDCLimitEnable));
|
||||
PP_ASSERT_WITH_CODE((0 == smc_result),
|
||||
"Failed to enable TDCLimit in SMC.", result = -1;);
|
||||
|
@ -898,7 +898,7 @@ int smu7_enable_power_containment(struct pp_hwmgr *hwmgr)
|
|||
}
|
||||
|
||||
if (data->enable_pkg_pwr_tracking_feature) {
|
||||
smc_result = smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
smc_result = smum_send_msg_to_smc(hwmgr,
|
||||
(uint16_t)(PPSMC_MSG_PkgPwrLimitEnable));
|
||||
PP_ASSERT_WITH_CODE((0 == smc_result),
|
||||
"Failed to enable PkgPwrTracking in SMC.", result = -1;);
|
||||
|
@ -927,7 +927,7 @@ int smu7_disable_power_containment(struct pp_hwmgr *hwmgr)
|
|||
|
||||
if (data->power_containment_features &
|
||||
POWERCONTAINMENT_FEATURE_TDCLimit) {
|
||||
smc_result = smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
smc_result = smum_send_msg_to_smc(hwmgr,
|
||||
(uint16_t)(PPSMC_MSG_TDCLimitDisable));
|
||||
PP_ASSERT_WITH_CODE((smc_result == 0),
|
||||
"Failed to disable TDCLimit in SMC.",
|
||||
|
@ -936,7 +936,7 @@ int smu7_disable_power_containment(struct pp_hwmgr *hwmgr)
|
|||
|
||||
if (data->power_containment_features &
|
||||
POWERCONTAINMENT_FEATURE_DTE) {
|
||||
smc_result = smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
smc_result = smum_send_msg_to_smc(hwmgr,
|
||||
(uint16_t)(PPSMC_MSG_DisableDTE));
|
||||
PP_ASSERT_WITH_CODE((smc_result == 0),
|
||||
"Failed to disable DTE in SMC.",
|
||||
|
@ -945,7 +945,7 @@ int smu7_disable_power_containment(struct pp_hwmgr *hwmgr)
|
|||
|
||||
if (data->power_containment_features &
|
||||
POWERCONTAINMENT_FEATURE_PkgPwrLimit) {
|
||||
smc_result = smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
smc_result = smum_send_msg_to_smc(hwmgr,
|
||||
(uint16_t)(PPSMC_MSG_PkgPwrLimitDisable));
|
||||
PP_ASSERT_WITH_CODE((smc_result == 0),
|
||||
"Failed to disable PkgPwrTracking in SMC.",
|
||||
|
|
|
@ -152,7 +152,7 @@ int smu7_fan_ctrl_start_smc_fan_control(struct pp_hwmgr *hwmgr)
|
|||
|
||||
if (PP_CAP(PHM_PlatformCaps_ODFuzzyFanControlSupport)) {
|
||||
cgs_write_register(hwmgr->device, mmSMC_MSG_ARG_0, FAN_CONTROL_FUZZY);
|
||||
result = smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_StartFanControl);
|
||||
result = smum_send_msg_to_smc(hwmgr, PPSMC_StartFanControl);
|
||||
|
||||
if (PP_CAP(PHM_PlatformCaps_FanSpeedInTableIsRPM))
|
||||
hwmgr->hwmgr_func->set_max_fan_rpm_output(hwmgr,
|
||||
|
@ -165,12 +165,12 @@ int smu7_fan_ctrl_start_smc_fan_control(struct pp_hwmgr *hwmgr)
|
|||
|
||||
} else {
|
||||
cgs_write_register(hwmgr->device, mmSMC_MSG_ARG_0, FAN_CONTROL_TABLE);
|
||||
result = smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_StartFanControl);
|
||||
result = smum_send_msg_to_smc(hwmgr, PPSMC_StartFanControl);
|
||||
}
|
||||
|
||||
if (!result && hwmgr->thermal_controller.
|
||||
advanceFanControlParameters.ucTargetTemperature)
|
||||
result = smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
result = smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetFanTemperatureTarget,
|
||||
hwmgr->thermal_controller.
|
||||
advanceFanControlParameters.ucTargetTemperature);
|
||||
|
@ -183,7 +183,7 @@ int smu7_fan_ctrl_start_smc_fan_control(struct pp_hwmgr *hwmgr)
|
|||
int smu7_fan_ctrl_stop_smc_fan_control(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
hwmgr->fan_ctrl_enabled = false;
|
||||
return smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_StopFanControl);
|
||||
return smum_send_msg_to_smc(hwmgr, PPSMC_StopFanControl);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -371,7 +371,7 @@ static void smu7_thermal_enable_alert(struct pp_hwmgr *hwmgr)
|
|||
CG_THERMAL_INT, THERM_INT_MASK, alert);
|
||||
|
||||
/* send message to SMU to enable internal thermal interrupts */
|
||||
smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_Thermal_Cntl_Enable);
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_Thermal_Cntl_Enable);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -389,7 +389,7 @@ int smu7_thermal_disable_alert(struct pp_hwmgr *hwmgr)
|
|||
CG_THERMAL_INT, THERM_INT_MASK, alert);
|
||||
|
||||
/* send message to SMU to disable internal thermal interrupts */
|
||||
return smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_Thermal_Cntl_Disable);
|
||||
return smum_send_msg_to_smc(hwmgr, PPSMC_MSG_Thermal_Cntl_Disable);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -425,8 +425,8 @@ static void vega10_init_dpm_defaults(struct pp_hwmgr *hwmgr)
|
|||
if (data->registry_data.vr0hot_enabled)
|
||||
data->smu_features[GNLD_VR0HOT].supported = true;
|
||||
|
||||
smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_GetSmuVersion);
|
||||
vega10_read_arg_from_smc(hwmgr->smumgr, &(data->smu_version));
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetSmuVersion);
|
||||
vega10_read_arg_from_smc(hwmgr, &(data->smu_version));
|
||||
/* ACG firmware has major version 5 */
|
||||
if ((data->smu_version & 0xff000000) == 0x5000000)
|
||||
data->smu_features[GNLD_ACG].supported = true;
|
||||
|
@ -922,7 +922,7 @@ static bool vega10_is_dpm_running(struct pp_hwmgr *hwmgr)
|
|||
{
|
||||
uint32_t features_enabled;
|
||||
|
||||
if (!vega10_get_smc_features(hwmgr->smumgr, &features_enabled)) {
|
||||
if (!vega10_get_smc_features(hwmgr, &features_enabled)) {
|
||||
if (features_enabled & SMC_DPM_FEATURES)
|
||||
return true;
|
||||
}
|
||||
|
@ -2272,21 +2272,21 @@ static int vega10_acg_enable(struct pp_hwmgr *hwmgr)
|
|||
uint32_t agc_btc_response;
|
||||
|
||||
if (data->smu_features[GNLD_ACG].supported) {
|
||||
if (0 == vega10_enable_smc_features(hwmgr->smumgr, true,
|
||||
if (0 == vega10_enable_smc_features(hwmgr, true,
|
||||
data->smu_features[GNLD_DPM_PREFETCHER].smu_feature_bitmap))
|
||||
data->smu_features[GNLD_DPM_PREFETCHER].enabled = true;
|
||||
|
||||
smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_InitializeAcg);
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_InitializeAcg);
|
||||
|
||||
smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_RunAcgBtc);
|
||||
vega10_read_arg_from_smc(hwmgr->smumgr, &agc_btc_response);
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_RunAcgBtc);
|
||||
vega10_read_arg_from_smc(hwmgr, &agc_btc_response);
|
||||
|
||||
if (1 == agc_btc_response) {
|
||||
if (1 == data->acg_loop_state)
|
||||
smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_RunAcgInClosedLoop);
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_RunAcgInClosedLoop);
|
||||
else if (2 == data->acg_loop_state)
|
||||
smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_RunAcgInOpenLoop);
|
||||
if (0 == vega10_enable_smc_features(hwmgr->smumgr, true,
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_RunAcgInOpenLoop);
|
||||
if (0 == vega10_enable_smc_features(hwmgr, true,
|
||||
data->smu_features[GNLD_ACG].smu_feature_bitmap))
|
||||
data->smu_features[GNLD_ACG].enabled = true;
|
||||
} else {
|
||||
|
@ -2305,7 +2305,7 @@ static int vega10_acg_disable(struct pp_hwmgr *hwmgr)
|
|||
|
||||
if (data->smu_features[GNLD_ACG].supported &&
|
||||
data->smu_features[GNLD_ACG].enabled)
|
||||
if (!vega10_enable_smc_features(hwmgr->smumgr, false,
|
||||
if (!vega10_enable_smc_features(hwmgr, false,
|
||||
data->smu_features[GNLD_ACG].smu_feature_bitmap))
|
||||
data->smu_features[GNLD_ACG].enabled = false;
|
||||
|
||||
|
@ -2355,14 +2355,14 @@ static int vega10_avfs_enable(struct pp_hwmgr *hwmgr, bool enable)
|
|||
|
||||
if (data->smu_features[GNLD_AVFS].supported) {
|
||||
if (enable) {
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr,
|
||||
true,
|
||||
data->smu_features[GNLD_AVFS].smu_feature_bitmap),
|
||||
"[avfs_control] Attempt to Enable AVFS feature Failed!",
|
||||
return -1);
|
||||
data->smu_features[GNLD_AVFS].enabled = true;
|
||||
} else {
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr,
|
||||
false,
|
||||
data->smu_features[GNLD_AVFS].smu_feature_id),
|
||||
"[avfs_control] Attempt to Disable AVFS feature Failed!",
|
||||
|
@ -2385,11 +2385,11 @@ static int vega10_populate_and_upload_avfs_fuse_override(struct pp_hwmgr *hwmgr)
|
|||
struct vega10_hwmgr *data = (struct vega10_hwmgr *)(hwmgr->backend);
|
||||
AvfsFuseOverride_t *avfs_fuse_table = &(data->smc_state_table.avfs_fuse_override_table);
|
||||
|
||||
smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_ReadSerialNumTop32);
|
||||
vega10_read_arg_from_smc(hwmgr->smumgr, &top32);
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_ReadSerialNumTop32);
|
||||
vega10_read_arg_from_smc(hwmgr, &top32);
|
||||
|
||||
smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_ReadSerialNumBottom32);
|
||||
vega10_read_arg_from_smc(hwmgr->smumgr, &bottom32);
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_ReadSerialNumBottom32);
|
||||
vega10_read_arg_from_smc(hwmgr, &bottom32);
|
||||
|
||||
serial_number = ((uint64_t)bottom32 << 32) | top32;
|
||||
|
||||
|
@ -2403,7 +2403,7 @@ static int vega10_populate_and_upload_avfs_fuse_override(struct pp_hwmgr *hwmgr)
|
|||
avfs_fuse_table->VFT2_b = fuse.VFT2_b;
|
||||
avfs_fuse_table->VFT2_m1 = fuse.VFT2_m1;
|
||||
avfs_fuse_table->VFT2_m2 = fuse.VFT2_m2;
|
||||
result = vega10_copy_table_to_smc(hwmgr->smumgr,
|
||||
result = vega10_copy_table_to_smc(hwmgr,
|
||||
(uint8_t *)avfs_fuse_table, AVFSFUSETABLE);
|
||||
PP_ASSERT_WITH_CODE(!result,
|
||||
"Failed to upload FuseOVerride!",
|
||||
|
@ -2542,14 +2542,14 @@ static int vega10_init_smc_table(struct pp_hwmgr *hwmgr)
|
|||
data->vbios_boot_state.soc_clock = boot_up_values.ulSocClk;
|
||||
data->vbios_boot_state.dcef_clock = boot_up_values.ulDCEFClk;
|
||||
if (0 != boot_up_values.usVddc) {
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetFloorSocVoltage,
|
||||
(boot_up_values.usVddc * 4));
|
||||
data->vbios_boot_state.bsoc_vddc_lock = true;
|
||||
} else {
|
||||
data->vbios_boot_state.bsoc_vddc_lock = false;
|
||||
}
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetMinDeepSleepDcefclk,
|
||||
(uint32_t)(data->vbios_boot_state.dcef_clock / 100));
|
||||
}
|
||||
|
@ -2575,7 +2575,7 @@ static int vega10_init_smc_table(struct pp_hwmgr *hwmgr)
|
|||
|
||||
vega10_populate_and_upload_avfs_fuse_override(hwmgr);
|
||||
|
||||
result = vega10_copy_table_to_smc(hwmgr->smumgr,
|
||||
result = vega10_copy_table_to_smc(hwmgr,
|
||||
(uint8_t *)pp_table, PPTABLE);
|
||||
PP_ASSERT_WITH_CODE(!result,
|
||||
"Failed to upload PPtable!", return result);
|
||||
|
@ -2598,7 +2598,7 @@ static int vega10_enable_thermal_protection(struct pp_hwmgr *hwmgr)
|
|||
pr_info("THERMAL Feature Already enabled!");
|
||||
|
||||
PP_ASSERT_WITH_CODE(
|
||||
!vega10_enable_smc_features(hwmgr->smumgr,
|
||||
!vega10_enable_smc_features(hwmgr,
|
||||
true,
|
||||
data->smu_features[GNLD_THERMAL].smu_feature_bitmap),
|
||||
"Enable THERMAL Feature Failed!",
|
||||
|
@ -2618,7 +2618,7 @@ static int vega10_disable_thermal_protection(struct pp_hwmgr *hwmgr)
|
|||
pr_info("THERMAL Feature Already disabled!");
|
||||
|
||||
PP_ASSERT_WITH_CODE(
|
||||
!vega10_enable_smc_features(hwmgr->smumgr,
|
||||
!vega10_enable_smc_features(hwmgr,
|
||||
false,
|
||||
data->smu_features[GNLD_THERMAL].smu_feature_bitmap),
|
||||
"disable THERMAL Feature Failed!",
|
||||
|
@ -2637,7 +2637,7 @@ static int vega10_enable_vrhot_feature(struct pp_hwmgr *hwmgr)
|
|||
if (PP_CAP(PHM_PlatformCaps_RegulatorHot)) {
|
||||
if (data->smu_features[GNLD_VR0HOT].supported) {
|
||||
PP_ASSERT_WITH_CODE(
|
||||
!vega10_enable_smc_features(hwmgr->smumgr,
|
||||
!vega10_enable_smc_features(hwmgr,
|
||||
true,
|
||||
data->smu_features[GNLD_VR0HOT].smu_feature_bitmap),
|
||||
"Attempt to Enable VR0 Hot feature Failed!",
|
||||
|
@ -2646,7 +2646,7 @@ static int vega10_enable_vrhot_feature(struct pp_hwmgr *hwmgr)
|
|||
} else {
|
||||
if (data->smu_features[GNLD_VR1HOT].supported) {
|
||||
PP_ASSERT_WITH_CODE(
|
||||
!vega10_enable_smc_features(hwmgr->smumgr,
|
||||
!vega10_enable_smc_features(hwmgr,
|
||||
true,
|
||||
data->smu_features[GNLD_VR1HOT].smu_feature_bitmap),
|
||||
"Attempt to Enable VR0 Hot feature Failed!",
|
||||
|
@ -2664,7 +2664,7 @@ static int vega10_enable_ulv(struct pp_hwmgr *hwmgr)
|
|||
(struct vega10_hwmgr *)(hwmgr->backend);
|
||||
|
||||
if (data->registry_data.ulv_support) {
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr,
|
||||
true, data->smu_features[GNLD_ULV].smu_feature_bitmap),
|
||||
"Enable ULV Feature Failed!",
|
||||
return -1);
|
||||
|
@ -2680,7 +2680,7 @@ static int vega10_disable_ulv(struct pp_hwmgr *hwmgr)
|
|||
(struct vega10_hwmgr *)(hwmgr->backend);
|
||||
|
||||
if (data->registry_data.ulv_support) {
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr,
|
||||
false, data->smu_features[GNLD_ULV].smu_feature_bitmap),
|
||||
"disable ULV Feature Failed!",
|
||||
return -EINVAL);
|
||||
|
@ -2696,7 +2696,7 @@ static int vega10_enable_deep_sleep_master_switch(struct pp_hwmgr *hwmgr)
|
|||
(struct vega10_hwmgr *)(hwmgr->backend);
|
||||
|
||||
if (data->smu_features[GNLD_DS_GFXCLK].supported) {
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr,
|
||||
true, data->smu_features[GNLD_DS_GFXCLK].smu_feature_bitmap),
|
||||
"Attempt to Enable DS_GFXCLK Feature Failed!",
|
||||
return -EINVAL);
|
||||
|
@ -2704,7 +2704,7 @@ static int vega10_enable_deep_sleep_master_switch(struct pp_hwmgr *hwmgr)
|
|||
}
|
||||
|
||||
if (data->smu_features[GNLD_DS_SOCCLK].supported) {
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr,
|
||||
true, data->smu_features[GNLD_DS_SOCCLK].smu_feature_bitmap),
|
||||
"Attempt to Enable DS_SOCCLK Feature Failed!",
|
||||
return -EINVAL);
|
||||
|
@ -2712,7 +2712,7 @@ static int vega10_enable_deep_sleep_master_switch(struct pp_hwmgr *hwmgr)
|
|||
}
|
||||
|
||||
if (data->smu_features[GNLD_DS_LCLK].supported) {
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr,
|
||||
true, data->smu_features[GNLD_DS_LCLK].smu_feature_bitmap),
|
||||
"Attempt to Enable DS_LCLK Feature Failed!",
|
||||
return -EINVAL);
|
||||
|
@ -2720,7 +2720,7 @@ static int vega10_enable_deep_sleep_master_switch(struct pp_hwmgr *hwmgr)
|
|||
}
|
||||
|
||||
if (data->smu_features[GNLD_DS_DCEFCLK].supported) {
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr,
|
||||
true, data->smu_features[GNLD_DS_DCEFCLK].smu_feature_bitmap),
|
||||
"Attempt to Enable DS_DCEFCLK Feature Failed!",
|
||||
return -EINVAL);
|
||||
|
@ -2736,7 +2736,7 @@ static int vega10_disable_deep_sleep_master_switch(struct pp_hwmgr *hwmgr)
|
|||
(struct vega10_hwmgr *)(hwmgr->backend);
|
||||
|
||||
if (data->smu_features[GNLD_DS_GFXCLK].supported) {
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr,
|
||||
false, data->smu_features[GNLD_DS_GFXCLK].smu_feature_bitmap),
|
||||
"Attempt to disable DS_GFXCLK Feature Failed!",
|
||||
return -EINVAL);
|
||||
|
@ -2744,7 +2744,7 @@ static int vega10_disable_deep_sleep_master_switch(struct pp_hwmgr *hwmgr)
|
|||
}
|
||||
|
||||
if (data->smu_features[GNLD_DS_SOCCLK].supported) {
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr,
|
||||
false, data->smu_features[GNLD_DS_SOCCLK].smu_feature_bitmap),
|
||||
"Attempt to disable DS_ Feature Failed!",
|
||||
return -EINVAL);
|
||||
|
@ -2752,7 +2752,7 @@ static int vega10_disable_deep_sleep_master_switch(struct pp_hwmgr *hwmgr)
|
|||
}
|
||||
|
||||
if (data->smu_features[GNLD_DS_LCLK].supported) {
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr,
|
||||
false, data->smu_features[GNLD_DS_LCLK].smu_feature_bitmap),
|
||||
"Attempt to disable DS_LCLK Feature Failed!",
|
||||
return -EINVAL);
|
||||
|
@ -2760,7 +2760,7 @@ static int vega10_disable_deep_sleep_master_switch(struct pp_hwmgr *hwmgr)
|
|||
}
|
||||
|
||||
if (data->smu_features[GNLD_DS_DCEFCLK].supported) {
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr,
|
||||
false, data->smu_features[GNLD_DS_DCEFCLK].smu_feature_bitmap),
|
||||
"Attempt to disable DS_DCEFCLK Feature Failed!",
|
||||
return -EINVAL);
|
||||
|
@ -2778,7 +2778,7 @@ static int vega10_stop_dpm(struct pp_hwmgr *hwmgr, uint32_t bitmap)
|
|||
|
||||
|
||||
if(data->smu_features[GNLD_LED_DISPLAY].supported == true){
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr,
|
||||
false, data->smu_features[GNLD_LED_DISPLAY].smu_feature_bitmap),
|
||||
"Attempt to disable LED DPM feature failed!", return -EINVAL);
|
||||
data->smu_features[GNLD_LED_DISPLAY].enabled = false;
|
||||
|
@ -2796,7 +2796,7 @@ static int vega10_stop_dpm(struct pp_hwmgr *hwmgr, uint32_t bitmap)
|
|||
}
|
||||
}
|
||||
|
||||
vega10_enable_smc_features(hwmgr->smumgr, false, feature_mask);
|
||||
vega10_enable_smc_features(hwmgr, false, feature_mask);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -2826,7 +2826,7 @@ static int vega10_start_dpm(struct pp_hwmgr *hwmgr, uint32_t bitmap)
|
|||
}
|
||||
}
|
||||
|
||||
if (vega10_enable_smc_features(hwmgr->smumgr,
|
||||
if (vega10_enable_smc_features(hwmgr,
|
||||
true, feature_mask)) {
|
||||
for (i = 0; i < GNLD_DPM_MAX; i++) {
|
||||
if (data->smu_features[i].smu_feature_bitmap &
|
||||
|
@ -2836,21 +2836,21 @@ static int vega10_start_dpm(struct pp_hwmgr *hwmgr, uint32_t bitmap)
|
|||
}
|
||||
|
||||
if(data->smu_features[GNLD_LED_DISPLAY].supported == true){
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr,
|
||||
true, data->smu_features[GNLD_LED_DISPLAY].smu_feature_bitmap),
|
||||
"Attempt to Enable LED DPM feature Failed!", return -EINVAL);
|
||||
data->smu_features[GNLD_LED_DISPLAY].enabled = true;
|
||||
}
|
||||
|
||||
if (data->vbios_boot_state.bsoc_vddc_lock) {
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetFloorSocVoltage, 0);
|
||||
data->vbios_boot_state.bsoc_vddc_lock = false;
|
||||
}
|
||||
|
||||
if (PP_CAP(PHM_PlatformCaps_Falcon_QuickTransition)) {
|
||||
if (data->smu_features[GNLD_ACDC].supported) {
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr,
|
||||
true, data->smu_features[GNLD_ACDC].smu_feature_bitmap),
|
||||
"Attempt to Enable DS_GFXCLK Feature Failed!",
|
||||
return -1);
|
||||
|
@ -2867,13 +2867,13 @@ static int vega10_enable_dpm_tasks(struct pp_hwmgr *hwmgr)
|
|||
(struct vega10_hwmgr *)(hwmgr->backend);
|
||||
int tmp_result, result = 0;
|
||||
|
||||
tmp_result = smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
tmp_result = smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_ConfigureTelemetry, data->config_telemetry);
|
||||
PP_ASSERT_WITH_CODE(!tmp_result,
|
||||
"Failed to configure telemetry!",
|
||||
return tmp_result);
|
||||
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_NumOfDisplays, 0);
|
||||
|
||||
tmp_result = (!vega10_is_dpm_running(hwmgr)) ? 0 : -1;
|
||||
|
@ -3674,7 +3674,7 @@ static int vega10_upload_dpm_bootup_level(struct pp_hwmgr *hwmgr)
|
|||
if (data->smc_state_table.gfx_boot_level !=
|
||||
data->dpm_table.gfx_table.dpm_state.soft_min_level) {
|
||||
PP_ASSERT_WITH_CODE(!smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr,
|
||||
hwmgr,
|
||||
PPSMC_MSG_SetSoftMinGfxclkByIndex,
|
||||
data->smc_state_table.gfx_boot_level),
|
||||
"Failed to set soft min sclk index!",
|
||||
|
@ -3690,14 +3690,14 @@ static int vega10_upload_dpm_bootup_level(struct pp_hwmgr *hwmgr)
|
|||
if (data->smc_state_table.mem_boot_level == NUM_UCLK_DPM_LEVELS - 1) {
|
||||
socclk_idx = vega10_get_soc_index_for_max_uclk(hwmgr);
|
||||
PP_ASSERT_WITH_CODE(!smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr,
|
||||
hwmgr,
|
||||
PPSMC_MSG_SetSoftMinSocclkByIndex,
|
||||
socclk_idx),
|
||||
"Failed to set soft min uclk index!",
|
||||
return -EINVAL);
|
||||
} else {
|
||||
PP_ASSERT_WITH_CODE(!smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr,
|
||||
hwmgr,
|
||||
PPSMC_MSG_SetSoftMinUclkByIndex,
|
||||
data->smc_state_table.mem_boot_level),
|
||||
"Failed to set soft min uclk index!",
|
||||
|
@ -3722,7 +3722,7 @@ static int vega10_upload_dpm_max_level(struct pp_hwmgr *hwmgr)
|
|||
if (data->smc_state_table.gfx_max_level !=
|
||||
data->dpm_table.gfx_table.dpm_state.soft_max_level) {
|
||||
PP_ASSERT_WITH_CODE(!smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr,
|
||||
hwmgr,
|
||||
PPSMC_MSG_SetSoftMaxGfxclkByIndex,
|
||||
data->smc_state_table.gfx_max_level),
|
||||
"Failed to set soft max sclk index!",
|
||||
|
@ -3736,7 +3736,7 @@ static int vega10_upload_dpm_max_level(struct pp_hwmgr *hwmgr)
|
|||
if (data->smc_state_table.mem_max_level !=
|
||||
data->dpm_table.mem_table.dpm_state.soft_max_level) {
|
||||
PP_ASSERT_WITH_CODE(!smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr,
|
||||
hwmgr,
|
||||
PPSMC_MSG_SetSoftMaxUclkByIndex,
|
||||
data->smc_state_table.mem_max_level),
|
||||
"Failed to set soft max mclk index!",
|
||||
|
@ -3795,7 +3795,7 @@ int vega10_enable_disable_vce_dpm(struct pp_hwmgr *hwmgr, bool enable)
|
|||
(struct vega10_hwmgr *)(hwmgr->backend);
|
||||
|
||||
if (data->smu_features[GNLD_DPM_VCE].supported) {
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr,
|
||||
enable,
|
||||
data->smu_features[GNLD_DPM_VCE].smu_feature_bitmap),
|
||||
"Attempt to Enable/Disable DPM VCE Failed!",
|
||||
|
@ -3825,7 +3825,7 @@ static int vega10_update_sclk_threshold(struct pp_hwmgr *hwmgr)
|
|||
cpu_to_le32(low_sclk_interrupt_threshold);
|
||||
|
||||
/* This message will also enable SmcToHost Interrupt */
|
||||
result = smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
result = smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetLowGfxclkInterruptThreshold,
|
||||
(uint32_t)low_sclk_interrupt_threshold);
|
||||
}
|
||||
|
@ -3861,7 +3861,7 @@ static int vega10_set_power_state_tasks(struct pp_hwmgr *hwmgr,
|
|||
"Failed to update SCLK threshold!",
|
||||
result = tmp_result);
|
||||
|
||||
result = vega10_copy_table_to_smc(hwmgr->smumgr,
|
||||
result = vega10_copy_table_to_smc(hwmgr,
|
||||
(uint8_t *)pp_table, PPTABLE);
|
||||
PP_ASSERT_WITH_CODE(!result,
|
||||
"Failed to upload PPtable!", return result);
|
||||
|
@ -3921,12 +3921,12 @@ static int vega10_get_gpu_power(struct pp_hwmgr *hwmgr,
|
|||
{
|
||||
uint32_t value;
|
||||
|
||||
PP_ASSERT_WITH_CODE(!smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_GetCurrPkgPwr),
|
||||
"Failed to get current package power!",
|
||||
return -EINVAL);
|
||||
|
||||
vega10_read_arg_from_smc(hwmgr->smumgr, &value);
|
||||
vega10_read_arg_from_smc(hwmgr, &value);
|
||||
/* power value is an integer */
|
||||
query->average_gpu_power = value << 8;
|
||||
|
||||
|
@ -3943,25 +3943,25 @@ static int vega10_read_sensor(struct pp_hwmgr *hwmgr, int idx,
|
|||
|
||||
switch (idx) {
|
||||
case AMDGPU_PP_SENSOR_GFX_SCLK:
|
||||
ret = smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_GetCurrentGfxclkIndex);
|
||||
ret = smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetCurrentGfxclkIndex);
|
||||
if (!ret) {
|
||||
vega10_read_arg_from_smc(hwmgr->smumgr, &sclk_idx);
|
||||
vega10_read_arg_from_smc(hwmgr, &sclk_idx);
|
||||
*((uint32_t *)value) = dpm_table->gfx_table.dpm_levels[sclk_idx].value;
|
||||
*size = 4;
|
||||
}
|
||||
break;
|
||||
case AMDGPU_PP_SENSOR_GFX_MCLK:
|
||||
ret = smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_GetCurrentUclkIndex);
|
||||
ret = smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetCurrentUclkIndex);
|
||||
if (!ret) {
|
||||
vega10_read_arg_from_smc(hwmgr->smumgr, &mclk_idx);
|
||||
vega10_read_arg_from_smc(hwmgr, &mclk_idx);
|
||||
*((uint32_t *)value) = dpm_table->mem_table.dpm_levels[mclk_idx].value;
|
||||
*size = 4;
|
||||
}
|
||||
break;
|
||||
case AMDGPU_PP_SENSOR_GPU_LOAD:
|
||||
ret = smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, PPSMC_MSG_GetAverageGfxActivity, 0);
|
||||
ret = smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_GetAverageGfxActivity, 0);
|
||||
if (!ret) {
|
||||
vega10_read_arg_from_smc(hwmgr->smumgr, &activity_percent);
|
||||
vega10_read_arg_from_smc(hwmgr, &activity_percent);
|
||||
*((uint32_t *)value) = activity_percent > 100 ? 100 : activity_percent;
|
||||
*size = 4;
|
||||
}
|
||||
|
@ -3996,7 +3996,7 @@ static int vega10_read_sensor(struct pp_hwmgr *hwmgr, int idx,
|
|||
static int vega10_notify_smc_display_change(struct pp_hwmgr *hwmgr,
|
||||
bool has_disp)
|
||||
{
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetUclkFastSwitch,
|
||||
has_disp ? 0 : 1);
|
||||
}
|
||||
|
@ -4031,7 +4031,7 @@ int vega10_display_clock_voltage_request(struct pp_hwmgr *hwmgr,
|
|||
|
||||
if (!result) {
|
||||
clk_request = (clk_freq << 16) | clk_select;
|
||||
result = smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
result = smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_RequestDisplayClockByFreq,
|
||||
clk_request);
|
||||
}
|
||||
|
@ -4101,7 +4101,7 @@ static int vega10_notify_smc_display_config_after_ps_adjustment(
|
|||
clock_req.clock_freq_in_khz = dpm_table->dpm_levels[i].value;
|
||||
if (!vega10_display_clock_voltage_request(hwmgr, &clock_req)) {
|
||||
PP_ASSERT_WITH_CODE(!smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr, PPSMC_MSG_SetMinDeepSleepDcefclk,
|
||||
hwmgr, PPSMC_MSG_SetMinDeepSleepDcefclk,
|
||||
min_clocks.dcefClockInSR /100),
|
||||
"Attempt to set divider for DCEFCLK Failed!",);
|
||||
} else {
|
||||
|
@ -4113,7 +4113,7 @@ static int vega10_notify_smc_display_config_after_ps_adjustment(
|
|||
|
||||
if (min_clocks.memoryClock != 0) {
|
||||
idx = vega10_get_uclk_index(hwmgr, mclk_table, min_clocks.memoryClock);
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, PPSMC_MSG_SetSoftMinUclkByIndex, idx);
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_SetSoftMinUclkByIndex, idx);
|
||||
data->dpm_table.mem_table.dpm_state.soft_min_level= idx;
|
||||
}
|
||||
|
||||
|
@ -4596,11 +4596,11 @@ static int vega10_print_clock_levels(struct pp_hwmgr *hwmgr,
|
|||
if (data->registry_data.sclk_dpm_key_disabled)
|
||||
break;
|
||||
|
||||
PP_ASSERT_WITH_CODE(!smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_GetCurrentGfxclkIndex),
|
||||
"Attempt to get current sclk index Failed!",
|
||||
return -1);
|
||||
PP_ASSERT_WITH_CODE(!vega10_read_arg_from_smc(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!vega10_read_arg_from_smc(hwmgr,
|
||||
&now),
|
||||
"Attempt to read sclk index Failed!",
|
||||
return -1);
|
||||
|
@ -4614,11 +4614,11 @@ static int vega10_print_clock_levels(struct pp_hwmgr *hwmgr,
|
|||
if (data->registry_data.mclk_dpm_key_disabled)
|
||||
break;
|
||||
|
||||
PP_ASSERT_WITH_CODE(!smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_GetCurrentUclkIndex),
|
||||
"Attempt to get current mclk index Failed!",
|
||||
return -1);
|
||||
PP_ASSERT_WITH_CODE(!vega10_read_arg_from_smc(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!vega10_read_arg_from_smc(hwmgr,
|
||||
&now),
|
||||
"Attempt to read mclk index Failed!",
|
||||
return -1);
|
||||
|
@ -4629,11 +4629,11 @@ static int vega10_print_clock_levels(struct pp_hwmgr *hwmgr,
|
|||
(i == now) ? "*" : "");
|
||||
break;
|
||||
case PP_PCIE:
|
||||
PP_ASSERT_WITH_CODE(!smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_GetCurrentLinkIndex),
|
||||
"Attempt to get current mclk index Failed!",
|
||||
return -1);
|
||||
PP_ASSERT_WITH_CODE(!vega10_read_arg_from_smc(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!vega10_read_arg_from_smc(hwmgr,
|
||||
&now),
|
||||
"Attempt to read mclk index Failed!",
|
||||
return -1);
|
||||
|
@ -4661,7 +4661,7 @@ static int vega10_display_configuration_changed_task(struct pp_hwmgr *hwmgr)
|
|||
|
||||
if ((data->water_marks_bitmap & WaterMarksExist) &&
|
||||
!(data->water_marks_bitmap & WaterMarksLoaded)) {
|
||||
result = vega10_copy_table_to_smc(hwmgr->smumgr,
|
||||
result = vega10_copy_table_to_smc(hwmgr,
|
||||
(uint8_t *)wm_table, WMTABLE);
|
||||
PP_ASSERT_WITH_CODE(result, "Failed to update WMTABLE!", return EINVAL);
|
||||
data->water_marks_bitmap |= WaterMarksLoaded;
|
||||
|
@ -4670,7 +4670,7 @@ static int vega10_display_configuration_changed_task(struct pp_hwmgr *hwmgr)
|
|||
if (data->water_marks_bitmap & WaterMarksLoaded) {
|
||||
cgs_get_active_displays_info(hwmgr->device, &info);
|
||||
num_turned_on_displays = info.display_count;
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_NumOfDisplays, num_turned_on_displays);
|
||||
}
|
||||
|
||||
|
@ -4683,7 +4683,7 @@ int vega10_enable_disable_uvd_dpm(struct pp_hwmgr *hwmgr, bool enable)
|
|||
(struct vega10_hwmgr *)(hwmgr->backend);
|
||||
|
||||
if (data->smu_features[GNLD_DPM_UVD].supported) {
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr,
|
||||
enable,
|
||||
data->smu_features[GNLD_DPM_UVD].smu_feature_bitmap),
|
||||
"Attempt to Enable/Disable DPM UVD Failed!",
|
||||
|
@ -4870,7 +4870,7 @@ static int vega10_set_power_profile_state(struct pp_hwmgr *hwmgr,
|
|||
if (!data->registry_data.sclk_dpm_key_disabled)
|
||||
PP_ASSERT_WITH_CODE(
|
||||
!smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr,
|
||||
hwmgr,
|
||||
PPSMC_MSG_SetSoftMinGfxclkByIndex,
|
||||
sclk_idx),
|
||||
"Failed to set soft min sclk index!",
|
||||
|
@ -4881,7 +4881,7 @@ static int vega10_set_power_profile_state(struct pp_hwmgr *hwmgr,
|
|||
if (!data->registry_data.mclk_dpm_key_disabled)
|
||||
PP_ASSERT_WITH_CODE(
|
||||
!smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr->smumgr,
|
||||
hwmgr,
|
||||
PPSMC_MSG_SetSoftMinUclkByIndex,
|
||||
mclk_idx),
|
||||
"Failed to set soft min mclk index!",
|
||||
|
|
|
@ -926,7 +926,7 @@ static void vega10_didt_set_mask(struct pp_hwmgr *hwmgr, const bool enable)
|
|||
|
||||
if (enable) {
|
||||
/* For Vega10, SMC does not support any mask yet. */
|
||||
result = smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, PPSMC_MSG_ConfigureGfxDidt, didt_block_info);
|
||||
result = smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_ConfigureGfxDidt, didt_block_info);
|
||||
PP_ASSERT((0 == result), "[EnableDiDtConfig] SMC Configure Gfx Didt Failed!");
|
||||
}
|
||||
}
|
||||
|
@ -1243,7 +1243,7 @@ int vega10_enable_didt_config(struct pp_hwmgr *hwmgr)
|
|||
}
|
||||
|
||||
if (0 == result) {
|
||||
PP_ASSERT_WITH_CODE((!vega10_enable_smc_features(hwmgr->smumgr, true, data->smu_features[GNLD_DIDT].smu_feature_bitmap)),
|
||||
PP_ASSERT_WITH_CODE((!vega10_enable_smc_features(hwmgr, true, data->smu_features[GNLD_DIDT].smu_feature_bitmap)),
|
||||
"[EnableDiDtConfig] Attempt to Enable DiDt feature Failed!", return result);
|
||||
data->smu_features[GNLD_DIDT].enabled = true;
|
||||
}
|
||||
|
@ -1290,7 +1290,7 @@ int vega10_disable_didt_config(struct pp_hwmgr *hwmgr)
|
|||
}
|
||||
|
||||
if (0 == result) {
|
||||
PP_ASSERT_WITH_CODE((0 != vega10_enable_smc_features(hwmgr->smumgr, false, data->smu_features[GNLD_DIDT].smu_feature_bitmap)),
|
||||
PP_ASSERT_WITH_CODE((0 != vega10_enable_smc_features(hwmgr, false, data->smu_features[GNLD_DIDT].smu_feature_bitmap)),
|
||||
"[DisableDiDtConfig] Attempt to Disable DiDt feature Failed!", return result);
|
||||
data->smu_features[GNLD_DIDT].enabled = false;
|
||||
}
|
||||
|
@ -1344,7 +1344,7 @@ int vega10_set_power_limit(struct pp_hwmgr *hwmgr, uint32_t n)
|
|||
(struct vega10_hwmgr *)(hwmgr->backend);
|
||||
|
||||
if (data->registry_data.enable_pkg_pwr_tracking_feature)
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetPptLimit, n);
|
||||
|
||||
return 0;
|
||||
|
@ -1363,13 +1363,13 @@ int vega10_enable_power_containment(struct pp_hwmgr *hwmgr)
|
|||
|
||||
if (PP_CAP(PHM_PlatformCaps_PowerContainment)) {
|
||||
if (data->smu_features[GNLD_PPT].supported)
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr,
|
||||
true, data->smu_features[GNLD_PPT].smu_feature_bitmap),
|
||||
"Attempt to enable PPT feature Failed!",
|
||||
data->smu_features[GNLD_PPT].supported = false);
|
||||
|
||||
if (data->smu_features[GNLD_TDC].supported)
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr,
|
||||
true, data->smu_features[GNLD_TDC].smu_feature_bitmap),
|
||||
"Attempt to enable PPT feature Failed!",
|
||||
data->smu_features[GNLD_TDC].supported = false);
|
||||
|
@ -1390,13 +1390,13 @@ int vega10_disable_power_containment(struct pp_hwmgr *hwmgr)
|
|||
|
||||
if (PP_CAP(PHM_PlatformCaps_PowerContainment)) {
|
||||
if (data->smu_features[GNLD_PPT].supported)
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr,
|
||||
false, data->smu_features[GNLD_PPT].smu_feature_bitmap),
|
||||
"Attempt to disable PPT feature Failed!",
|
||||
data->smu_features[GNLD_PPT].supported = false);
|
||||
|
||||
if (data->smu_features[GNLD_TDC].supported)
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr,
|
||||
false, data->smu_features[GNLD_TDC].smu_feature_bitmap),
|
||||
"Attempt to disable PPT feature Failed!",
|
||||
data->smu_features[GNLD_TDC].supported = false);
|
||||
|
@ -1408,7 +1408,7 @@ int vega10_disable_power_containment(struct pp_hwmgr *hwmgr)
|
|||
static int vega10_set_overdrive_target_percentage(struct pp_hwmgr *hwmgr,
|
||||
uint32_t adjust_percent)
|
||||
{
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_OverDriveSetPercentage, adjust_percent);
|
||||
}
|
||||
|
||||
|
|
|
@ -31,11 +31,11 @@
|
|||
|
||||
static int vega10_get_current_rpm(struct pp_hwmgr *hwmgr, uint32_t *current_rpm)
|
||||
{
|
||||
PP_ASSERT_WITH_CODE(!smum_send_msg_to_smc(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_GetCurrentRpm),
|
||||
"Attempt to get current RPM from SMC Failed!",
|
||||
return -1);
|
||||
PP_ASSERT_WITH_CODE(!vega10_read_arg_from_smc(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!vega10_read_arg_from_smc(hwmgr,
|
||||
current_rpm),
|
||||
"Attempt to read current RPM from SMC Failed!",
|
||||
return -1);
|
||||
|
@ -199,7 +199,7 @@ static int vega10_enable_fan_control_feature(struct pp_hwmgr *hwmgr)
|
|||
|
||||
if (data->smu_features[GNLD_FAN_CONTROL].supported) {
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(
|
||||
hwmgr->smumgr, true,
|
||||
hwmgr, true,
|
||||
data->smu_features[GNLD_FAN_CONTROL].
|
||||
smu_feature_bitmap),
|
||||
"Attempt to Enable FAN CONTROL feature Failed!",
|
||||
|
@ -216,7 +216,7 @@ static int vega10_disable_fan_control_feature(struct pp_hwmgr *hwmgr)
|
|||
|
||||
if (data->smu_features[GNLD_FAN_CONTROL].supported) {
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(
|
||||
hwmgr->smumgr, false,
|
||||
hwmgr, false,
|
||||
data->smu_features[GNLD_FAN_CONTROL].
|
||||
smu_feature_bitmap),
|
||||
"Attempt to Enable FAN CONTROL feature Failed!",
|
||||
|
@ -458,7 +458,7 @@ static int vega10_thermal_enable_alert(struct pp_hwmgr *hwmgr)
|
|||
if (data->smu_features[GNLD_FW_CTF].enabled)
|
||||
printk("[Thermal_EnableAlert] FW CTF Already Enabled!\n");
|
||||
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr,
|
||||
true,
|
||||
data->smu_features[GNLD_FW_CTF].smu_feature_bitmap),
|
||||
"Attempt to Enable FW CTF feature Failed!",
|
||||
|
@ -490,7 +490,7 @@ int vega10_thermal_disable_alert(struct pp_hwmgr *hwmgr)
|
|||
printk("[Thermal_EnableAlert] FW CTF Already disabled!\n");
|
||||
|
||||
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
|
||||
PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr,
|
||||
false,
|
||||
data->smu_features[GNLD_FW_CTF].smu_feature_bitmap),
|
||||
"Attempt to disable FW CTF feature Failed!",
|
||||
|
@ -546,7 +546,7 @@ int vega10_thermal_setup_fan_table(struct pp_hwmgr *hwmgr)
|
|||
table->FanTargetTemperature = hwmgr->thermal_controller.
|
||||
advanceFanControlParameters.usTMax;
|
||||
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetFanTemperatureTarget,
|
||||
(uint32_t)table->FanTargetTemperature);
|
||||
|
||||
|
@ -575,7 +575,7 @@ int vega10_thermal_setup_fan_table(struct pp_hwmgr *hwmgr)
|
|||
table->FanStartTemp = hwmgr->thermal_controller.
|
||||
advanceFanControlParameters.usZeroRPMStartTemperature;
|
||||
|
||||
ret = vega10_copy_table_to_smc(hwmgr->smumgr,
|
||||
ret = vega10_copy_table_to_smc(hwmgr,
|
||||
(uint8_t *)(&(data->smc_state_table.pp_table)), PPTABLE);
|
||||
if (ret)
|
||||
pr_info("Failed to update Fan Control Table in PPTable!");
|
||||
|
|
|
@ -103,21 +103,21 @@ enum SMU_MAC_DEFINITION {
|
|||
|
||||
|
||||
struct pp_smumgr_func {
|
||||
int (*smu_init)(struct pp_smumgr *smumgr);
|
||||
int (*smu_fini)(struct pp_smumgr *smumgr);
|
||||
int (*start_smu)(struct pp_smumgr *smumgr);
|
||||
int (*check_fw_load_finish)(struct pp_smumgr *smumgr,
|
||||
int (*smu_init)(struct pp_hwmgr *hwmgr);
|
||||
int (*smu_fini)(struct pp_hwmgr *hwmgr);
|
||||
int (*start_smu)(struct pp_hwmgr *hwmgr);
|
||||
int (*check_fw_load_finish)(struct pp_hwmgr *hwmgr,
|
||||
uint32_t firmware);
|
||||
int (*request_smu_load_fw)(struct pp_smumgr *smumgr);
|
||||
int (*request_smu_load_specific_fw)(struct pp_smumgr *smumgr,
|
||||
int (*request_smu_load_fw)(struct pp_hwmgr *hwmgr);
|
||||
int (*request_smu_load_specific_fw)(struct pp_hwmgr *hwmgr,
|
||||
uint32_t firmware);
|
||||
int (*get_argument)(struct pp_smumgr *smumgr);
|
||||
int (*send_msg_to_smc)(struct pp_smumgr *smumgr, uint16_t msg);
|
||||
int (*send_msg_to_smc_with_parameter)(struct pp_smumgr *smumgr,
|
||||
int (*get_argument)(struct pp_hwmgr *hwmgr);
|
||||
int (*send_msg_to_smc)(struct pp_hwmgr *hwmgr, uint16_t msg);
|
||||
int (*send_msg_to_smc_with_parameter)(struct pp_hwmgr *hwmgr,
|
||||
uint16_t msg, uint32_t parameter);
|
||||
int (*download_pptable_settings)(struct pp_smumgr *smumgr,
|
||||
int (*download_pptable_settings)(struct pp_hwmgr *hwmgr,
|
||||
void **table);
|
||||
int (*upload_pptable_settings)(struct pp_smumgr *smumgr);
|
||||
int (*upload_pptable_settings)(struct pp_hwmgr *hwmgr);
|
||||
int (*update_smc_table)(struct pp_hwmgr *hwmgr, uint32_t type);
|
||||
int (*process_firmware_header)(struct pp_hwmgr *hwmgr);
|
||||
int (*update_sclk_threshold)(struct pp_hwmgr *hwmgr);
|
||||
|
@ -132,7 +132,7 @@ struct pp_smumgr_func {
|
|||
bool (*is_dpm_running)(struct pp_hwmgr *hwmgr);
|
||||
int (*populate_requested_graphic_levels)(struct pp_hwmgr *hwmgr,
|
||||
struct amd_pp_profile *request);
|
||||
bool (*is_hw_avfs_present)(struct pp_smumgr *smumgr);
|
||||
bool (*is_hw_avfs_present)(struct pp_hwmgr *hwmgr);
|
||||
};
|
||||
|
||||
struct pp_smumgr {
|
||||
|
@ -148,30 +148,30 @@ struct pp_smumgr {
|
|||
|
||||
extern int smum_early_init(struct pp_instance *handle);
|
||||
|
||||
extern int smum_get_argument(struct pp_smumgr *smumgr);
|
||||
extern int smum_get_argument(struct pp_hwmgr *hwmgr);
|
||||
|
||||
extern int smum_download_powerplay_table(struct pp_smumgr *smumgr, void **table);
|
||||
extern int smum_download_powerplay_table(struct pp_hwmgr *hwmgr, void **table);
|
||||
|
||||
extern int smum_upload_powerplay_table(struct pp_smumgr *smumgr);
|
||||
extern int smum_upload_powerplay_table(struct pp_hwmgr *hwmgr);
|
||||
|
||||
extern int smum_send_msg_to_smc(struct pp_smumgr *smumgr, uint16_t msg);
|
||||
extern int smum_send_msg_to_smc(struct pp_hwmgr *hwmgr, uint16_t msg);
|
||||
|
||||
extern int smum_send_msg_to_smc_with_parameter(struct pp_smumgr *smumgr,
|
||||
extern int smum_send_msg_to_smc_with_parameter(struct pp_hwmgr *hwmgr,
|
||||
uint16_t msg, uint32_t parameter);
|
||||
|
||||
extern int smum_wait_on_register(struct pp_smumgr *smumgr,
|
||||
extern int smum_wait_on_register(struct pp_hwmgr *hwmgr,
|
||||
uint32_t index, uint32_t value, uint32_t mask);
|
||||
|
||||
extern int smum_wait_for_register_unequal(struct pp_smumgr *smumgr,
|
||||
extern int smum_wait_for_register_unequal(struct pp_hwmgr *hwmgr,
|
||||
uint32_t index, uint32_t value, uint32_t mask);
|
||||
|
||||
extern int smum_wait_on_indirect_register(struct pp_smumgr *smumgr,
|
||||
extern int smum_wait_on_indirect_register(struct pp_hwmgr *hwmgr,
|
||||
uint32_t indirect_port, uint32_t index,
|
||||
uint32_t value, uint32_t mask);
|
||||
|
||||
|
||||
extern void smum_wait_for_indirect_register_unequal(
|
||||
struct pp_smumgr *smumgr,
|
||||
struct pp_hwmgr *hwmgr,
|
||||
uint32_t indirect_port, uint32_t index,
|
||||
uint32_t value, uint32_t mask);
|
||||
|
||||
|
@ -181,7 +181,7 @@ extern int smu_allocate_memory(void *device, uint32_t size,
|
|||
void **kptr, void *handle);
|
||||
|
||||
extern int smu_free_memory(void *device, void *handle);
|
||||
extern int vega10_smum_init(struct pp_smumgr *smumgr);
|
||||
extern int vega10_smum_init(struct pp_hwmgr *hwmgr);
|
||||
|
||||
extern int smum_update_sclk_threshold(struct pp_hwmgr *hwmgr);
|
||||
|
||||
|
@ -193,44 +193,44 @@ extern int smum_init_smc_table(struct pp_hwmgr *hwmgr);
|
|||
extern int smum_populate_all_graphic_levels(struct pp_hwmgr *hwmgr);
|
||||
extern int smum_populate_all_memory_levels(struct pp_hwmgr *hwmgr);
|
||||
extern int smum_initialize_mc_reg_table(struct pp_hwmgr *hwmgr);
|
||||
extern uint32_t smum_get_offsetof(struct pp_smumgr *smumgr,
|
||||
extern uint32_t smum_get_offsetof(struct pp_hwmgr *hwmgr,
|
||||
uint32_t type, uint32_t member);
|
||||
extern uint32_t smum_get_mac_definition(struct pp_smumgr *smumgr, uint32_t value);
|
||||
extern uint32_t smum_get_mac_definition(struct pp_hwmgr *hwmgr, uint32_t value);
|
||||
|
||||
extern bool smum_is_dpm_running(struct pp_hwmgr *hwmgr);
|
||||
|
||||
extern int smum_populate_requested_graphic_levels(struct pp_hwmgr *hwmgr,
|
||||
struct amd_pp_profile *request);
|
||||
|
||||
extern bool smum_is_hw_avfs_present(struct pp_smumgr *smumgr);
|
||||
extern bool smum_is_hw_avfs_present(struct pp_hwmgr *hwmgr);
|
||||
|
||||
#define SMUM_FIELD_SHIFT(reg, field) reg##__##field##__SHIFT
|
||||
|
||||
#define SMUM_FIELD_MASK(reg, field) reg##__##field##_MASK
|
||||
|
||||
#define SMUM_WAIT_INDIRECT_REGISTER_GIVEN_INDEX(smumgr, \
|
||||
#define SMUM_WAIT_INDIRECT_REGISTER_GIVEN_INDEX(hwmgr, \
|
||||
port, index, value, mask) \
|
||||
smum_wait_on_indirect_register(smumgr, \
|
||||
smum_wait_on_indirect_register(hwmgr, \
|
||||
mm##port##_INDEX, index, value, mask)
|
||||
|
||||
#define SMUM_WAIT_INDIRECT_REGISTER(smumgr, port, reg, value, mask) \
|
||||
SMUM_WAIT_INDIRECT_REGISTER_GIVEN_INDEX(smumgr, port, ix##reg, value, mask)
|
||||
#define SMUM_WAIT_INDIRECT_REGISTER(hwmgr, port, reg, value, mask) \
|
||||
SMUM_WAIT_INDIRECT_REGISTER_GIVEN_INDEX(hwmgr, port, ix##reg, value, mask)
|
||||
|
||||
#define SMUM_WAIT_INDIRECT_FIELD(smumgr, port, reg, field, fieldval) \
|
||||
SMUM_WAIT_INDIRECT_REGISTER(smumgr, port, reg, (fieldval) << SMUM_FIELD_SHIFT(reg, field), \
|
||||
#define SMUM_WAIT_INDIRECT_FIELD(hwmgr, port, reg, field, fieldval) \
|
||||
SMUM_WAIT_INDIRECT_REGISTER(hwmgr, port, reg, (fieldval) << SMUM_FIELD_SHIFT(reg, field), \
|
||||
SMUM_FIELD_MASK(reg, field) )
|
||||
|
||||
#define SMUM_WAIT_REGISTER_UNEQUAL_GIVEN_INDEX(smumgr, \
|
||||
#define SMUM_WAIT_REGISTER_UNEQUAL_GIVEN_INDEX(hwmgr, \
|
||||
index, value, mask) \
|
||||
smum_wait_for_register_unequal(smumgr, \
|
||||
smum_wait_for_register_unequal(hwmgr, \
|
||||
index, value, mask)
|
||||
|
||||
#define SMUM_WAIT_REGISTER_UNEQUAL(smumgr, reg, value, mask) \
|
||||
SMUM_WAIT_REGISTER_UNEQUAL_GIVEN_INDEX(smumgr, \
|
||||
#define SMUM_WAIT_REGISTER_UNEQUAL(hwmgr, reg, value, mask) \
|
||||
SMUM_WAIT_REGISTER_UNEQUAL_GIVEN_INDEX(hwmgr, \
|
||||
mm##reg, value, mask)
|
||||
|
||||
#define SMUM_WAIT_FIELD_UNEQUAL(smumgr, reg, field, fieldval) \
|
||||
SMUM_WAIT_REGISTER_UNEQUAL(smumgr, reg, \
|
||||
#define SMUM_WAIT_FIELD_UNEQUAL(hwmgr, reg, field, fieldval) \
|
||||
SMUM_WAIT_REGISTER_UNEQUAL(hwmgr, reg, \
|
||||
(fieldval) << SMUM_FIELD_SHIFT(reg, field), \
|
||||
SMUM_FIELD_MASK(reg, field))
|
||||
|
||||
|
@ -250,22 +250,22 @@ extern bool smum_is_hw_avfs_present(struct pp_smumgr *smumgr);
|
|||
SMUM_GET_FIELD(cgs_read_ind_register(device, port, ix##reg), \
|
||||
reg, field)
|
||||
|
||||
#define SMUM_WAIT_VFPF_INDIRECT_REGISTER_GIVEN_INDEX(smumgr, \
|
||||
#define SMUM_WAIT_VFPF_INDIRECT_REGISTER_GIVEN_INDEX(hwmgr, \
|
||||
port, index, value, mask) \
|
||||
smum_wait_on_indirect_register(smumgr, \
|
||||
smum_wait_on_indirect_register(hwmgr, \
|
||||
mm##port##_INDEX_0, index, value, mask)
|
||||
|
||||
#define SMUM_WAIT_VFPF_INDIRECT_REGISTER_UNEQUAL_GIVEN_INDEX(smumgr, \
|
||||
#define SMUM_WAIT_VFPF_INDIRECT_REGISTER_UNEQUAL_GIVEN_INDEX(hwmgr, \
|
||||
port, index, value, mask) \
|
||||
smum_wait_for_indirect_register_unequal(smumgr, \
|
||||
smum_wait_for_indirect_register_unequal(hwmgr, \
|
||||
mm##port##_INDEX_0, index, value, mask)
|
||||
|
||||
|
||||
#define SMUM_WAIT_VFPF_INDIRECT_REGISTER(smumgr, port, reg, value, mask) \
|
||||
SMUM_WAIT_VFPF_INDIRECT_REGISTER_GIVEN_INDEX(smumgr, port, ix##reg, value, mask)
|
||||
#define SMUM_WAIT_VFPF_INDIRECT_REGISTER(hwmgr, port, reg, value, mask) \
|
||||
SMUM_WAIT_VFPF_INDIRECT_REGISTER_GIVEN_INDEX(hwmgr, port, ix##reg, value, mask)
|
||||
|
||||
#define SMUM_WAIT_VFPF_INDIRECT_REGISTER_UNEQUAL(smumgr, port, reg, value, mask) \
|
||||
SMUM_WAIT_VFPF_INDIRECT_REGISTER_UNEQUAL_GIVEN_INDEX(smumgr, port, ix##reg, value, mask)
|
||||
#define SMUM_WAIT_VFPF_INDIRECT_REGISTER_UNEQUAL(hwmgr, port, reg, value, mask) \
|
||||
SMUM_WAIT_VFPF_INDIRECT_REGISTER_UNEQUAL_GIVEN_INDEX(hwmgr, port, ix##reg, value, mask)
|
||||
|
||||
|
||||
/*Operations on named fields.*/
|
||||
|
@ -290,25 +290,25 @@ extern bool smum_is_hw_avfs_present(struct pp_smumgr *smumgr);
|
|||
reg, field, fieldval))
|
||||
|
||||
|
||||
#define SMUM_WAIT_VFPF_INDIRECT_FIELD(smumgr, port, reg, field, fieldval) \
|
||||
SMUM_WAIT_VFPF_INDIRECT_REGISTER(smumgr, port, reg, \
|
||||
#define SMUM_WAIT_VFPF_INDIRECT_FIELD(hwmgr, port, reg, field, fieldval) \
|
||||
SMUM_WAIT_VFPF_INDIRECT_REGISTER(hwmgr, port, reg, \
|
||||
(fieldval) << SMUM_FIELD_SHIFT(reg, field), \
|
||||
SMUM_FIELD_MASK(reg, field))
|
||||
|
||||
#define SMUM_WAIT_VFPF_INDIRECT_FIELD_UNEQUAL(smumgr, port, reg, field, fieldval) \
|
||||
SMUM_WAIT_VFPF_INDIRECT_REGISTER_UNEQUAL(smumgr, port, reg, \
|
||||
#define SMUM_WAIT_VFPF_INDIRECT_FIELD_UNEQUAL(hwmgr, port, reg, field, fieldval) \
|
||||
SMUM_WAIT_VFPF_INDIRECT_REGISTER_UNEQUAL(hwmgr, port, reg, \
|
||||
(fieldval) << SMUM_FIELD_SHIFT(reg, field), \
|
||||
SMUM_FIELD_MASK(reg, field))
|
||||
|
||||
#define SMUM_WAIT_INDIRECT_REGISTER_UNEQUAL_GIVEN_INDEX(smumgr, port, index, value, mask) \
|
||||
smum_wait_for_indirect_register_unequal(smumgr, \
|
||||
#define SMUM_WAIT_INDIRECT_REGISTER_UNEQUAL_GIVEN_INDEX(hwmgr, port, index, value, mask) \
|
||||
smum_wait_for_indirect_register_unequal(hwmgr, \
|
||||
mm##port##_INDEX, index, value, mask)
|
||||
|
||||
#define SMUM_WAIT_INDIRECT_REGISTER_UNEQUAL(smumgr, port, reg, value, mask) \
|
||||
SMUM_WAIT_INDIRECT_REGISTER_UNEQUAL_GIVEN_INDEX(smumgr, port, ix##reg, value, mask)
|
||||
#define SMUM_WAIT_INDIRECT_REGISTER_UNEQUAL(hwmgr, port, reg, value, mask) \
|
||||
SMUM_WAIT_INDIRECT_REGISTER_UNEQUAL_GIVEN_INDEX(hwmgr, port, ix##reg, value, mask)
|
||||
|
||||
#define SMUM_WAIT_INDIRECT_FIELD_UNEQUAL(smumgr, port, reg, field, fieldval) \
|
||||
SMUM_WAIT_INDIRECT_REGISTER_UNEQUAL(smumgr, port, reg, (fieldval) << SMUM_FIELD_SHIFT(reg, field), \
|
||||
#define SMUM_WAIT_INDIRECT_FIELD_UNEQUAL(hwmgr, port, reg, field, fieldval) \
|
||||
SMUM_WAIT_INDIRECT_REGISTER_UNEQUAL(hwmgr, port, reg, (fieldval) << SMUM_FIELD_SHIFT(reg, field), \
|
||||
SMUM_FIELD_MASK(reg, field) )
|
||||
|
||||
#endif
|
||||
|
|
|
@ -94,7 +94,7 @@ static const struct ci_pt_defaults defaults_saturn_xt = {
|
|||
};
|
||||
|
||||
|
||||
static int ci_set_smc_sram_address(struct pp_smumgr *smumgr,
|
||||
static int ci_set_smc_sram_address(struct pp_hwmgr *hwmgr,
|
||||
uint32_t smc_addr, uint32_t limit)
|
||||
{
|
||||
if ((0 != (3 & smc_addr))
|
||||
|
@ -103,12 +103,12 @@ static int ci_set_smc_sram_address(struct pp_smumgr *smumgr,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
cgs_write_register(smumgr->device, mmSMC_IND_INDEX_0, smc_addr);
|
||||
SMUM_WRITE_FIELD(smumgr->device, SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_0, 0);
|
||||
cgs_write_register(hwmgr->device, mmSMC_IND_INDEX_0, smc_addr);
|
||||
SMUM_WRITE_FIELD(hwmgr->device, SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_0, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ci_copy_bytes_to_smc(struct pp_smumgr *smumgr, uint32_t smc_start_address,
|
||||
static int ci_copy_bytes_to_smc(struct pp_hwmgr *hwmgr, uint32_t smc_start_address,
|
||||
const uint8_t *src, uint32_t byte_count, uint32_t limit)
|
||||
{
|
||||
int result;
|
||||
|
@ -129,12 +129,12 @@ static int ci_copy_bytes_to_smc(struct pp_smumgr *smumgr, uint32_t smc_start_add
|
|||
/* Bytes are written into the SMC address space with the MSB first. */
|
||||
data = src[0] * 0x1000000 + src[1] * 0x10000 + src[2] * 0x100 + src[3];
|
||||
|
||||
result = ci_set_smc_sram_address(smumgr, addr, limit);
|
||||
result = ci_set_smc_sram_address(hwmgr, addr, limit);
|
||||
|
||||
if (0 != result)
|
||||
return result;
|
||||
|
||||
cgs_write_register(smumgr->device, mmSMC_IND_DATA_0, data);
|
||||
cgs_write_register(hwmgr->device, mmSMC_IND_DATA_0, data);
|
||||
|
||||
src += 4;
|
||||
byte_count -= 4;
|
||||
|
@ -145,13 +145,13 @@ static int ci_copy_bytes_to_smc(struct pp_smumgr *smumgr, uint32_t smc_start_add
|
|||
|
||||
data = 0;
|
||||
|
||||
result = ci_set_smc_sram_address(smumgr, addr, limit);
|
||||
result = ci_set_smc_sram_address(hwmgr, addr, limit);
|
||||
|
||||
if (0 != result)
|
||||
return result;
|
||||
|
||||
|
||||
original_data = cgs_read_register(smumgr->device, mmSMC_IND_DATA_0);
|
||||
original_data = cgs_read_register(hwmgr->device, mmSMC_IND_DATA_0);
|
||||
|
||||
extra_shift = 8 * (4 - byte_count);
|
||||
|
||||
|
@ -165,61 +165,61 @@ static int ci_copy_bytes_to_smc(struct pp_smumgr *smumgr, uint32_t smc_start_add
|
|||
|
||||
data |= (original_data & ~((~0UL) << extra_shift));
|
||||
|
||||
result = ci_set_smc_sram_address(smumgr, addr, limit);
|
||||
result = ci_set_smc_sram_address(hwmgr, addr, limit);
|
||||
|
||||
if (0 != result)
|
||||
return result;
|
||||
|
||||
cgs_write_register(smumgr->device, mmSMC_IND_DATA_0, data);
|
||||
cgs_write_register(hwmgr->device, mmSMC_IND_DATA_0, data);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int ci_program_jump_on_start(struct pp_smumgr *smumgr)
|
||||
static int ci_program_jump_on_start(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
static const unsigned char data[4] = { 0xE0, 0x00, 0x80, 0x40 };
|
||||
|
||||
ci_copy_bytes_to_smc(smumgr, 0x0, data, 4, sizeof(data)+1);
|
||||
ci_copy_bytes_to_smc(hwmgr, 0x0, data, 4, sizeof(data)+1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool ci_is_smc_ram_running(struct pp_smumgr *smumgr)
|
||||
bool ci_is_smc_ram_running(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
return ((0 == SMUM_READ_VFPF_INDIRECT_FIELD(smumgr->device,
|
||||
return ((0 == SMUM_READ_VFPF_INDIRECT_FIELD(hwmgr->device,
|
||||
CGS_IND_REG__SMC, SMC_SYSCON_CLOCK_CNTL_0, ck_disable))
|
||||
&& (0x20100 <= cgs_read_ind_register(smumgr->device,
|
||||
&& (0x20100 <= cgs_read_ind_register(hwmgr->device,
|
||||
CGS_IND_REG__SMC, ixSMC_PC_C)));
|
||||
}
|
||||
|
||||
static int ci_read_smc_sram_dword(struct pp_smumgr *smumgr, uint32_t smc_addr,
|
||||
static int ci_read_smc_sram_dword(struct pp_hwmgr *hwmgr, uint32_t smc_addr,
|
||||
uint32_t *value, uint32_t limit)
|
||||
{
|
||||
int result;
|
||||
|
||||
result = ci_set_smc_sram_address(smumgr, smc_addr, limit);
|
||||
result = ci_set_smc_sram_address(hwmgr, smc_addr, limit);
|
||||
|
||||
if (result)
|
||||
return result;
|
||||
|
||||
*value = cgs_read_register(smumgr->device, mmSMC_IND_DATA_0);
|
||||
*value = cgs_read_register(hwmgr->device, mmSMC_IND_DATA_0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ci_send_msg_to_smc(struct pp_smumgr *smumgr, uint16_t msg)
|
||||
int ci_send_msg_to_smc(struct pp_hwmgr *hwmgr, uint16_t msg)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!ci_is_smc_ram_running(smumgr))
|
||||
if (!ci_is_smc_ram_running(hwmgr))
|
||||
return -EINVAL;
|
||||
|
||||
cgs_write_register(smumgr->device, mmSMC_MESSAGE_0, msg);
|
||||
cgs_write_register(hwmgr->device, mmSMC_MESSAGE_0, msg);
|
||||
|
||||
SMUM_WAIT_FIELD_UNEQUAL(smumgr, SMC_RESP_0, SMC_RESP, 0);
|
||||
SMUM_WAIT_FIELD_UNEQUAL(hwmgr, SMC_RESP_0, SMC_RESP, 0);
|
||||
|
||||
ret = SMUM_READ_FIELD(smumgr->device, SMC_RESP_0, SMC_RESP);
|
||||
ret = SMUM_READ_FIELD(hwmgr->device, SMC_RESP_0, SMC_RESP);
|
||||
|
||||
if (ret != 1)
|
||||
pr_info("\n failed to send message %x ret is %d\n", msg, ret);
|
||||
|
@ -227,11 +227,11 @@ int ci_send_msg_to_smc(struct pp_smumgr *smumgr, uint16_t msg)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int ci_send_msg_to_smc_with_parameter(struct pp_smumgr *smumgr,
|
||||
int ci_send_msg_to_smc_with_parameter(struct pp_hwmgr *hwmgr,
|
||||
uint16_t msg, uint32_t parameter)
|
||||
{
|
||||
cgs_write_register(smumgr->device, mmSMC_MSG_ARG_0, parameter);
|
||||
return ci_send_msg_to_smc(smumgr, msg);
|
||||
cgs_write_register(hwmgr->device, mmSMC_MSG_ARG_0, parameter);
|
||||
return ci_send_msg_to_smc(hwmgr, msg);
|
||||
}
|
||||
|
||||
static void ci_initialize_power_tune_defaults(struct pp_hwmgr *hwmgr)
|
||||
|
@ -510,7 +510,7 @@ int ci_populate_all_graphic_levels(struct pp_hwmgr *hwmgr)
|
|||
data->dpm_level_enable_mask.sclk_dpm_enable_mask =
|
||||
phm_get_dpm_level_enable_mask_value(&dpm_table->sclk_table);
|
||||
|
||||
result = ci_copy_bytes_to_smc(hwmgr->smumgr, array,
|
||||
result = ci_copy_bytes_to_smc(hwmgr, array,
|
||||
(u8 *)levels, array_size,
|
||||
SMC_RAM_END);
|
||||
|
||||
|
@ -553,7 +553,7 @@ static int ci_populate_dw8(struct pp_hwmgr *hwmgr, uint32_t fuse_table_offset)
|
|||
const struct ci_pt_defaults *defaults = smu_data->power_tune_defaults;
|
||||
uint32_t temp;
|
||||
|
||||
if (ci_read_smc_sram_dword(hwmgr->smumgr,
|
||||
if (ci_read_smc_sram_dword(hwmgr,
|
||||
fuse_table_offset +
|
||||
offsetof(SMU7_Discrete_PmFuses, TdcWaterfallCtl),
|
||||
(uint32_t *)&temp, SMC_RAM_END))
|
||||
|
@ -686,7 +686,7 @@ static int ci_populate_pm_fuses(struct pp_hwmgr *hwmgr)
|
|||
|
||||
if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
|
||||
PHM_PlatformCaps_PowerContainment)) {
|
||||
if (ci_read_smc_sram_dword(hwmgr->smumgr,
|
||||
if (ci_read_smc_sram_dword(hwmgr,
|
||||
SMU7_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU7_Firmware_Header, PmFuseTable),
|
||||
&pm_fuse_table_offset, SMC_RAM_END)) {
|
||||
|
@ -713,7 +713,7 @@ static int ci_populate_pm_fuses(struct pp_hwmgr *hwmgr)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = ci_copy_bytes_to_smc(hwmgr->smumgr, pm_fuse_table_offset,
|
||||
ret = ci_copy_bytes_to_smc(hwmgr, pm_fuse_table_offset,
|
||||
(uint8_t *)&smu_data->power_tune_table,
|
||||
sizeof(struct SMU7_Discrete_PmFuses), SMC_RAM_END);
|
||||
}
|
||||
|
@ -1343,7 +1343,7 @@ int ci_populate_all_memory_levels(struct pp_hwmgr *hwmgr)
|
|||
data->dpm_level_enable_mask.mclk_dpm_enable_mask = phm_get_dpm_level_enable_mask_value(&dpm_table->mclk_table);
|
||||
smu_data->smc_state_table.MemoryLevel[dpm_table->mclk_table.count-1].DisplayWatermark = PPSMC_DISPLAY_WATERMARK_HIGH;
|
||||
|
||||
result = ci_copy_bytes_to_smc(hwmgr->smumgr,
|
||||
result = ci_copy_bytes_to_smc(hwmgr,
|
||||
level_array_address, (uint8_t *)levels, (uint32_t)level_array_size,
|
||||
SMC_RAM_END);
|
||||
|
||||
|
@ -1705,7 +1705,7 @@ static int ci_program_memory_timing_parameters(struct pp_hwmgr *hwmgr)
|
|||
|
||||
if (0 == result) {
|
||||
result = ci_copy_bytes_to_smc(
|
||||
hwmgr->smumgr,
|
||||
hwmgr,
|
||||
smu_data->arb_table_start,
|
||||
(uint8_t *)&arb_regs,
|
||||
sizeof(SMU7_Discrete_MCArbDramTimingTable),
|
||||
|
@ -1756,10 +1756,10 @@ static int ci_populate_smc_boot_level(struct pp_hwmgr *hwmgr,
|
|||
return result;
|
||||
}
|
||||
|
||||
static int ci_populate_mc_reg_address(struct pp_smumgr *smumgr,
|
||||
static int ci_populate_mc_reg_address(struct pp_hwmgr *hwmgr,
|
||||
SMU7_Discrete_MCRegisters *mc_reg_table)
|
||||
{
|
||||
const struct ci_smumgr *smu_data = (struct ci_smumgr *)smumgr->backend;
|
||||
const struct ci_smumgr *smu_data = (struct ci_smumgr *)hwmgr->smumgr->backend;
|
||||
|
||||
uint32_t i, j;
|
||||
|
||||
|
@ -1796,12 +1796,12 @@ static void ci_convert_mc_registers(
|
|||
}
|
||||
|
||||
static int ci_convert_mc_reg_table_entry_to_smc(
|
||||
struct pp_smumgr *smumgr,
|
||||
struct pp_hwmgr *hwmgr,
|
||||
const uint32_t memory_clock,
|
||||
SMU7_Discrete_MCRegisterSet *mc_reg_table_data
|
||||
)
|
||||
{
|
||||
struct ci_smumgr *smu_data = (struct ci_smumgr *)(smumgr->backend);
|
||||
struct ci_smumgr *smu_data = (struct ci_smumgr *)(hwmgr->smumgr->backend);
|
||||
uint32_t i = 0;
|
||||
|
||||
for (i = 0; i < smu_data->mc_reg_table.num_entries; i++) {
|
||||
|
@ -1831,7 +1831,7 @@ static int ci_convert_mc_reg_table_to_smc(struct pp_hwmgr *hwmgr,
|
|||
|
||||
for (i = 0; i < data->dpm_table.mclk_table.count; i++) {
|
||||
res = ci_convert_mc_reg_table_entry_to_smc(
|
||||
hwmgr->smumgr,
|
||||
hwmgr,
|
||||
data->dpm_table.mclk_table.dpm_levels[i].value,
|
||||
&mc_regs->data[i]
|
||||
);
|
||||
|
@ -1845,8 +1845,7 @@ static int ci_convert_mc_reg_table_to_smc(struct pp_hwmgr *hwmgr,
|
|||
|
||||
static int ci_update_and_upload_mc_reg_table(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct pp_smumgr *smumgr = hwmgr->smumgr;
|
||||
struct ci_smumgr *smu_data = (struct ci_smumgr *)(smumgr->backend);
|
||||
struct ci_smumgr *smu_data = (struct ci_smumgr *)(hwmgr->smumgr->backend);
|
||||
struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
|
||||
uint32_t address;
|
||||
int32_t result;
|
||||
|
@ -1864,7 +1863,7 @@ static int ci_update_and_upload_mc_reg_table(struct pp_hwmgr *hwmgr)
|
|||
|
||||
address = smu_data->mc_reg_table_start + (uint32_t)offsetof(SMU7_Discrete_MCRegisters, data[0]);
|
||||
|
||||
return ci_copy_bytes_to_smc(hwmgr->smumgr, address,
|
||||
return ci_copy_bytes_to_smc(hwmgr, address,
|
||||
(uint8_t *)&smu_data->mc_regs.data[0],
|
||||
sizeof(SMU7_Discrete_MCRegisterSet) * data->dpm_table.mclk_table.count,
|
||||
SMC_RAM_END);
|
||||
|
@ -1873,11 +1872,10 @@ static int ci_update_and_upload_mc_reg_table(struct pp_hwmgr *hwmgr)
|
|||
static int ci_populate_initial_mc_reg_table(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
int result;
|
||||
struct pp_smumgr *smumgr = hwmgr->smumgr;
|
||||
struct ci_smumgr *smu_data = (struct ci_smumgr *)(smumgr->backend);
|
||||
struct ci_smumgr *smu_data = (struct ci_smumgr *)(hwmgr->smumgr->backend);
|
||||
|
||||
memset(&smu_data->mc_regs, 0x00, sizeof(SMU7_Discrete_MCRegisters));
|
||||
result = ci_populate_mc_reg_address(smumgr, &(smu_data->mc_regs));
|
||||
result = ci_populate_mc_reg_address(hwmgr, &(smu_data->mc_regs));
|
||||
PP_ASSERT_WITH_CODE(0 == result,
|
||||
"Failed to initialize MCRegTable for the MC register addresses!", return result;);
|
||||
|
||||
|
@ -1885,7 +1883,7 @@ static int ci_populate_initial_mc_reg_table(struct pp_hwmgr *hwmgr)
|
|||
PP_ASSERT_WITH_CODE(0 == result,
|
||||
"Failed to initialize MCRegTable for driver state!", return result;);
|
||||
|
||||
return ci_copy_bytes_to_smc(smumgr, smu_data->mc_reg_table_start,
|
||||
return ci_copy_bytes_to_smc(hwmgr, smu_data->mc_reg_table_start,
|
||||
(uint8_t *)&smu_data->mc_regs, sizeof(SMU7_Discrete_MCRegisters), SMC_RAM_END);
|
||||
}
|
||||
|
||||
|
@ -1930,17 +1928,17 @@ static int ci_populate_smc_svi2_config(struct pp_hwmgr *hwmgr,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int ci_start_smc(struct pp_smumgr *smumgr)
|
||||
static int ci_start_smc(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
/* set smc instruct start point at 0x0 */
|
||||
ci_program_jump_on_start(smumgr);
|
||||
ci_program_jump_on_start(hwmgr);
|
||||
|
||||
/* enable smc clock */
|
||||
SMUM_WRITE_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC, SMC_SYSCON_CLOCK_CNTL_0, ck_disable, 0);
|
||||
SMUM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, SMC_SYSCON_CLOCK_CNTL_0, ck_disable, 0);
|
||||
|
||||
SMUM_WRITE_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC, SMC_SYSCON_RESET_CNTL, rst_reg, 0);
|
||||
SMUM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, SMC_SYSCON_RESET_CNTL, rst_reg, 0);
|
||||
|
||||
SMUM_WAIT_INDIRECT_FIELD(smumgr, SMC_IND, FIRMWARE_FLAGS,
|
||||
SMUM_WAIT_INDIRECT_FIELD(hwmgr, SMC_IND, FIRMWARE_FLAGS,
|
||||
INTERRUPTS_ENABLED, 1);
|
||||
|
||||
return 0;
|
||||
|
@ -2105,7 +2103,7 @@ int ci_init_smc_table(struct pp_hwmgr *hwmgr)
|
|||
table->BootMVdd = PP_HOST_TO_SMC_US(table->BootMVdd * VOLTAGE_SCALE);
|
||||
|
||||
/* Upload all dpm data to SMC memory.(dpm level, dpm level count etc) */
|
||||
result = ci_copy_bytes_to_smc(hwmgr->smumgr, smu_data->dpm_table_start +
|
||||
result = ci_copy_bytes_to_smc(hwmgr, smu_data->dpm_table_start +
|
||||
offsetof(SMU7_Discrete_DpmTable, SystemFlags),
|
||||
(uint8_t *)&(table->SystemFlags),
|
||||
sizeof(SMU7_Discrete_DpmTable)-3 * sizeof(SMU7_PIDController),
|
||||
|
@ -2122,7 +2120,7 @@ int ci_init_smc_table(struct pp_hwmgr *hwmgr)
|
|||
PP_ASSERT_WITH_CODE(0 == result,
|
||||
"Failed to populate PM fuses to SMC memory!", return result);
|
||||
|
||||
ci_start_smc(hwmgr->smumgr);
|
||||
ci_start_smc(hwmgr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -2197,7 +2195,7 @@ int ci_thermal_setup_fan_table(struct pp_hwmgr *hwmgr)
|
|||
|
||||
fan_table.TempSrc = (uint8_t)PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, CG_MULT_THERMAL_CTRL, TEMP_SEL);
|
||||
|
||||
res = ci_copy_bytes_to_smc(hwmgr->smumgr, ci_data->fan_table_start, (uint8_t *)&fan_table, (uint32_t)sizeof(fan_table), SMC_RAM_END);
|
||||
res = ci_copy_bytes_to_smc(hwmgr, ci_data->fan_table_start, (uint8_t *)&fan_table, (uint32_t)sizeof(fan_table), SMC_RAM_END);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -2233,7 +2231,7 @@ int ci_update_sclk_threshold(struct pp_hwmgr *hwmgr)
|
|||
CONVERT_FROM_HOST_TO_SMC_UL(low_sclk_interrupt_threshold);
|
||||
|
||||
result = ci_copy_bytes_to_smc(
|
||||
hwmgr->smumgr,
|
||||
hwmgr,
|
||||
smu_data->dpm_table_start +
|
||||
offsetof(SMU7_Discrete_DpmTable,
|
||||
LowSclkInterruptT),
|
||||
|
@ -2303,7 +2301,7 @@ uint32_t ci_get_mac_definition(uint32_t value)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int ci_load_smc_ucode(struct pp_smumgr *smumgr)
|
||||
static int ci_load_smc_ucode(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
uint32_t byte_count, start_addr;
|
||||
uint8_t *src;
|
||||
|
@ -2311,9 +2309,9 @@ static int ci_load_smc_ucode(struct pp_smumgr *smumgr)
|
|||
|
||||
struct cgs_firmware_info info = {0};
|
||||
|
||||
cgs_get_firmware_info(smumgr->device, CGS_UCODE_ID_SMU, &info);
|
||||
cgs_get_firmware_info(hwmgr->device, CGS_UCODE_ID_SMU, &info);
|
||||
|
||||
smumgr->is_kicker = info.is_kicker;
|
||||
hwmgr->smumgr->is_kicker = info.is_kicker;
|
||||
byte_count = info.image_size;
|
||||
src = (uint8_t *)info.kptr;
|
||||
start_addr = info.ucode_start_address;
|
||||
|
@ -2323,15 +2321,15 @@ static int ci_load_smc_ucode(struct pp_smumgr *smumgr)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
cgs_write_register(smumgr->device, mmSMC_IND_INDEX_0, start_addr);
|
||||
SMUM_WRITE_FIELD(smumgr->device, SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_0, 1);
|
||||
cgs_write_register(hwmgr->device, mmSMC_IND_INDEX_0, start_addr);
|
||||
SMUM_WRITE_FIELD(hwmgr->device, SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_0, 1);
|
||||
|
||||
for (; byte_count >= 4; byte_count -= 4) {
|
||||
data = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3];
|
||||
cgs_write_register(smumgr->device, mmSMC_IND_DATA_0, data);
|
||||
cgs_write_register(hwmgr->device, mmSMC_IND_DATA_0, data);
|
||||
src += 4;
|
||||
}
|
||||
SMUM_WRITE_FIELD(smumgr->device, SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_0, 0);
|
||||
SMUM_WRITE_FIELD(hwmgr->device, SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_0, 0);
|
||||
|
||||
if (0 != byte_count) {
|
||||
pr_err("SMC size must be dividable by 4\n");
|
||||
|
@ -2343,18 +2341,18 @@ static int ci_load_smc_ucode(struct pp_smumgr *smumgr)
|
|||
|
||||
static int ci_upload_firmware(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
if (ci_is_smc_ram_running(hwmgr->smumgr)) {
|
||||
if (ci_is_smc_ram_running(hwmgr)) {
|
||||
pr_info("smc is running, no need to load smc firmware\n");
|
||||
return 0;
|
||||
}
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD(hwmgr->smumgr, SMC_IND, RCU_UC_EVENTS,
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD(hwmgr, SMC_IND, RCU_UC_EVENTS,
|
||||
boot_seq_done, 1);
|
||||
PHM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, SMC_SYSCON_MISC_CNTL,
|
||||
pre_fetcher_en, 1);
|
||||
|
||||
PHM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, SMC_SYSCON_CLOCK_CNTL_0, ck_disable, 1);
|
||||
PHM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, SMC_SYSCON_RESET_CNTL, rst_reg, 1);
|
||||
return ci_load_smc_ucode(hwmgr->smumgr);
|
||||
return ci_load_smc_ucode(hwmgr);
|
||||
}
|
||||
|
||||
int ci_process_firmware_header(struct pp_hwmgr *hwmgr)
|
||||
|
@ -2369,7 +2367,7 @@ int ci_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
if (ci_upload_firmware(hwmgr))
|
||||
return -EINVAL;
|
||||
|
||||
result = ci_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = ci_read_smc_sram_dword(hwmgr,
|
||||
SMU7_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU7_Firmware_Header, DpmTable),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -2379,7 +2377,7 @@ int ci_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
|
||||
error |= (0 != result);
|
||||
|
||||
result = ci_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = ci_read_smc_sram_dword(hwmgr,
|
||||
SMU7_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU7_Firmware_Header, SoftRegisters),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -2391,7 +2389,7 @@ int ci_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
|
||||
error |= (0 != result);
|
||||
|
||||
result = ci_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = ci_read_smc_sram_dword(hwmgr,
|
||||
SMU7_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU7_Firmware_Header, mcRegisterTable),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -2399,7 +2397,7 @@ int ci_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
if (0 == result)
|
||||
ci_data->mc_reg_table_start = tmp;
|
||||
|
||||
result = ci_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = ci_read_smc_sram_dword(hwmgr,
|
||||
SMU7_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU7_Firmware_Header, FanTable),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -2409,7 +2407,7 @@ int ci_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
|
||||
error |= (0 != result);
|
||||
|
||||
result = ci_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = ci_read_smc_sram_dword(hwmgr,
|
||||
SMU7_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU7_Firmware_Header, mcArbDramTimingTable),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -2419,7 +2417,7 @@ int ci_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
|
||||
error |= (0 != result);
|
||||
|
||||
result = ci_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = ci_read_smc_sram_dword(hwmgr,
|
||||
SMU7_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU7_Firmware_Header, Version),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -2726,7 +2724,7 @@ int ci_initialize_mc_reg_table(struct pp_hwmgr *hwmgr)
|
|||
|
||||
bool ci_is_dpm_running(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
return ci_is_smc_ram_running(hwmgr->smumgr);
|
||||
return ci_is_smc_ram_running(hwmgr);
|
||||
}
|
||||
|
||||
int ci_populate_requested_graphic_levels(struct pp_hwmgr *hwmgr,
|
||||
|
@ -2750,6 +2748,6 @@ int ci_populate_requested_graphic_levels(struct pp_hwmgr *hwmgr,
|
|||
levels[i].DownH = request->down_hyst;
|
||||
}
|
||||
|
||||
return ci_copy_bytes_to_smc(hwmgr->smumgr, array, (uint8_t *)levels,
|
||||
return ci_copy_bytes_to_smc(hwmgr, array, (uint8_t *)levels,
|
||||
array_size, SMC_RAM_END);
|
||||
}
|
||||
|
|
|
@ -30,9 +30,9 @@ struct pp_smumgr;
|
|||
struct pp_hwmgr;
|
||||
struct amd_pp_profile;
|
||||
|
||||
int ci_send_msg_to_smc_with_parameter(struct pp_smumgr *smumgr,
|
||||
int ci_send_msg_to_smc_with_parameter(struct pp_hwmgr *hwmgr,
|
||||
uint16_t msg, uint32_t parameter);
|
||||
int ci_send_msg_to_smc(struct pp_smumgr *smumgr, uint16_t msg);
|
||||
int ci_send_msg_to_smc(struct pp_hwmgr *hwmgr, uint16_t msg);
|
||||
int ci_populate_all_graphic_levels(struct pp_hwmgr *hwmgr);
|
||||
int ci_populate_all_memory_levels(struct pp_hwmgr *hwmgr);
|
||||
int ci_init_smc_table(struct pp_hwmgr *hwmgr);
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
#include "cgs_common.h"
|
||||
#include "ci_smc.h"
|
||||
|
||||
static int ci_smu_init(struct pp_smumgr *smumgr)
|
||||
static int ci_smu_init(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
int i;
|
||||
struct ci_smumgr *ci_priv = NULL;
|
||||
|
@ -43,20 +43,20 @@ static int ci_smu_init(struct pp_smumgr *smumgr)
|
|||
for (i = 0; i < SMU7_MAX_LEVELS_GRAPHICS; i++)
|
||||
ci_priv->activity_target[i] = 30;
|
||||
|
||||
smumgr->backend = ci_priv;
|
||||
hwmgr->smumgr->backend = ci_priv;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ci_smu_fini(struct pp_smumgr *smumgr)
|
||||
static int ci_smu_fini(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
kfree(smumgr->backend);
|
||||
smumgr->backend = NULL;
|
||||
cgs_rel_firmware(smumgr->device, CGS_UCODE_ID_SMU);
|
||||
kfree(hwmgr->smumgr->backend);
|
||||
hwmgr->smumgr->backend = NULL;
|
||||
cgs_rel_firmware(hwmgr->device, CGS_UCODE_ID_SMU);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ci_start_smu(struct pp_smumgr *smumgr)
|
||||
static int ci_start_smu(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -52,53 +52,52 @@ static const enum cz_scratch_entry firmware_list[] = {
|
|||
CZ_SCRATCH_ENTRY_UCODE_ID_RLC_G,
|
||||
};
|
||||
|
||||
static int cz_smum_get_argument(struct pp_smumgr *smumgr)
|
||||
static int cz_smum_get_argument(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
if (smumgr == NULL || smumgr->device == NULL)
|
||||
if (hwmgr == NULL || hwmgr->device == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
return cgs_read_register(smumgr->device,
|
||||
return cgs_read_register(hwmgr->device,
|
||||
mmSMU_MP1_SRBM2P_ARG_0);
|
||||
}
|
||||
|
||||
static int cz_send_msg_to_smc_async(struct pp_smumgr *smumgr,
|
||||
uint16_t msg)
|
||||
static int cz_send_msg_to_smc_async(struct pp_hwmgr *hwmgr, uint16_t msg)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
if (smumgr == NULL || smumgr->device == NULL)
|
||||
if (hwmgr == NULL || hwmgr->device == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
result = SMUM_WAIT_FIELD_UNEQUAL(smumgr,
|
||||
result = SMUM_WAIT_FIELD_UNEQUAL(hwmgr,
|
||||
SMU_MP1_SRBM2P_RESP_0, CONTENT, 0);
|
||||
if (result != 0) {
|
||||
pr_err("cz_send_msg_to_smc_async (0x%04x) failed\n", msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
cgs_write_register(smumgr->device, mmSMU_MP1_SRBM2P_RESP_0, 0);
|
||||
cgs_write_register(smumgr->device, mmSMU_MP1_SRBM2P_MSG_0, msg);
|
||||
cgs_write_register(hwmgr->device, mmSMU_MP1_SRBM2P_RESP_0, 0);
|
||||
cgs_write_register(hwmgr->device, mmSMU_MP1_SRBM2P_MSG_0, msg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Send a message to the SMC, and wait for its response.*/
|
||||
static int cz_send_msg_to_smc(struct pp_smumgr *smumgr, uint16_t msg)
|
||||
static int cz_send_msg_to_smc(struct pp_hwmgr *hwmgr, uint16_t msg)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
result = cz_send_msg_to_smc_async(smumgr, msg);
|
||||
result = cz_send_msg_to_smc_async(hwmgr, msg);
|
||||
if (result != 0)
|
||||
return result;
|
||||
|
||||
return SMUM_WAIT_FIELD_UNEQUAL(smumgr,
|
||||
return SMUM_WAIT_FIELD_UNEQUAL(hwmgr,
|
||||
SMU_MP1_SRBM2P_RESP_0, CONTENT, 0);
|
||||
}
|
||||
|
||||
static int cz_set_smc_sram_address(struct pp_smumgr *smumgr,
|
||||
static int cz_set_smc_sram_address(struct pp_hwmgr *hwmgr,
|
||||
uint32_t smc_address, uint32_t limit)
|
||||
{
|
||||
if (smumgr == NULL || smumgr->device == NULL)
|
||||
if (hwmgr == NULL || hwmgr->device == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
if (0 != (3 & smc_address)) {
|
||||
|
@ -111,39 +110,39 @@ static int cz_set_smc_sram_address(struct pp_smumgr *smumgr,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
cgs_write_register(smumgr->device, mmMP0PUB_IND_INDEX_0,
|
||||
cgs_write_register(hwmgr->device, mmMP0PUB_IND_INDEX_0,
|
||||
SMN_MP1_SRAM_START_ADDR + smc_address);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cz_write_smc_sram_dword(struct pp_smumgr *smumgr,
|
||||
static int cz_write_smc_sram_dword(struct pp_hwmgr *hwmgr,
|
||||
uint32_t smc_address, uint32_t value, uint32_t limit)
|
||||
{
|
||||
int result;
|
||||
|
||||
if (smumgr == NULL || smumgr->device == NULL)
|
||||
if (hwmgr == NULL || hwmgr->device == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
result = cz_set_smc_sram_address(smumgr, smc_address, limit);
|
||||
result = cz_set_smc_sram_address(hwmgr, smc_address, limit);
|
||||
if (!result)
|
||||
cgs_write_register(smumgr->device, mmMP0PUB_IND_DATA_0, value);
|
||||
cgs_write_register(hwmgr->device, mmMP0PUB_IND_DATA_0, value);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static int cz_send_msg_to_smc_with_parameter(struct pp_smumgr *smumgr,
|
||||
static int cz_send_msg_to_smc_with_parameter(struct pp_hwmgr *hwmgr,
|
||||
uint16_t msg, uint32_t parameter)
|
||||
{
|
||||
if (smumgr == NULL || smumgr->device == NULL)
|
||||
if (hwmgr == NULL || hwmgr->device == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
cgs_write_register(smumgr->device, mmSMU_MP1_SRBM2P_ARG_0, parameter);
|
||||
cgs_write_register(hwmgr->device, mmSMU_MP1_SRBM2P_ARG_0, parameter);
|
||||
|
||||
return cz_send_msg_to_smc(smumgr, msg);
|
||||
return cz_send_msg_to_smc(hwmgr, msg);
|
||||
}
|
||||
|
||||
static int cz_check_fw_load_finish(struct pp_smumgr *smumgr,
|
||||
static int cz_check_fw_load_finish(struct pp_hwmgr *hwmgr,
|
||||
uint32_t firmware)
|
||||
{
|
||||
int i;
|
||||
|
@ -151,19 +150,19 @@ static int cz_check_fw_load_finish(struct pp_smumgr *smumgr,
|
|||
SMU8_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(struct SMU8_Firmware_Header, UcodeLoadStatus);
|
||||
|
||||
if (smumgr == NULL || smumgr->device == NULL)
|
||||
if (hwmgr == NULL || hwmgr->device == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
cgs_write_register(smumgr->device, mmMP0PUB_IND_INDEX, index);
|
||||
cgs_write_register(hwmgr->device, mmMP0PUB_IND_INDEX, index);
|
||||
|
||||
for (i = 0; i < smumgr->usec_timeout; i++) {
|
||||
for (i = 0; i < hwmgr->usec_timeout; i++) {
|
||||
if (firmware ==
|
||||
(cgs_read_register(smumgr->device, mmMP0PUB_IND_DATA) & firmware))
|
||||
(cgs_read_register(hwmgr->device, mmMP0PUB_IND_DATA) & firmware))
|
||||
break;
|
||||
udelay(1);
|
||||
}
|
||||
|
||||
if (i >= smumgr->usec_timeout) {
|
||||
if (i >= hwmgr->usec_timeout) {
|
||||
pr_err("SMU check loaded firmware failed.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -171,7 +170,7 @@ static int cz_check_fw_load_finish(struct pp_smumgr *smumgr,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int cz_load_mec_firmware(struct pp_smumgr *smumgr)
|
||||
static int cz_load_mec_firmware(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
uint32_t reg_data;
|
||||
uint32_t tmp;
|
||||
|
@ -179,44 +178,44 @@ static int cz_load_mec_firmware(struct pp_smumgr *smumgr)
|
|||
struct cgs_firmware_info info = {0};
|
||||
struct cz_smumgr *cz_smu;
|
||||
|
||||
if (smumgr == NULL || smumgr->device == NULL)
|
||||
if (hwmgr == NULL || hwmgr->device == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
cz_smu = (struct cz_smumgr *)smumgr->backend;
|
||||
ret = cgs_get_firmware_info(smumgr->device,
|
||||
cz_smu = (struct cz_smumgr *)hwmgr->smumgr->backend;
|
||||
ret = cgs_get_firmware_info(hwmgr->device,
|
||||
CGS_UCODE_ID_CP_MEC, &info);
|
||||
|
||||
if (ret)
|
||||
return -EINVAL;
|
||||
|
||||
/* Disable MEC parsing/prefetching */
|
||||
tmp = cgs_read_register(smumgr->device,
|
||||
tmp = cgs_read_register(hwmgr->device,
|
||||
mmCP_MEC_CNTL);
|
||||
tmp = SMUM_SET_FIELD(tmp, CP_MEC_CNTL, MEC_ME1_HALT, 1);
|
||||
tmp = SMUM_SET_FIELD(tmp, CP_MEC_CNTL, MEC_ME2_HALT, 1);
|
||||
cgs_write_register(smumgr->device, mmCP_MEC_CNTL, tmp);
|
||||
cgs_write_register(hwmgr->device, mmCP_MEC_CNTL, tmp);
|
||||
|
||||
tmp = cgs_read_register(smumgr->device,
|
||||
tmp = cgs_read_register(hwmgr->device,
|
||||
mmCP_CPC_IC_BASE_CNTL);
|
||||
|
||||
tmp = SMUM_SET_FIELD(tmp, CP_CPC_IC_BASE_CNTL, VMID, 0);
|
||||
tmp = SMUM_SET_FIELD(tmp, CP_CPC_IC_BASE_CNTL, ATC, 0);
|
||||
tmp = SMUM_SET_FIELD(tmp, CP_CPC_IC_BASE_CNTL, CACHE_POLICY, 0);
|
||||
tmp = SMUM_SET_FIELD(tmp, CP_CPC_IC_BASE_CNTL, MTYPE, 1);
|
||||
cgs_write_register(smumgr->device, mmCP_CPC_IC_BASE_CNTL, tmp);
|
||||
cgs_write_register(hwmgr->device, mmCP_CPC_IC_BASE_CNTL, tmp);
|
||||
|
||||
reg_data = smu_lower_32_bits(info.mc_addr) &
|
||||
SMUM_FIELD_MASK(CP_CPC_IC_BASE_LO, IC_BASE_LO);
|
||||
cgs_write_register(smumgr->device, mmCP_CPC_IC_BASE_LO, reg_data);
|
||||
cgs_write_register(hwmgr->device, mmCP_CPC_IC_BASE_LO, reg_data);
|
||||
|
||||
reg_data = smu_upper_32_bits(info.mc_addr) &
|
||||
SMUM_FIELD_MASK(CP_CPC_IC_BASE_HI, IC_BASE_HI);
|
||||
cgs_write_register(smumgr->device, mmCP_CPC_IC_BASE_HI, reg_data);
|
||||
cgs_write_register(hwmgr->device, mmCP_CPC_IC_BASE_HI, reg_data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static uint8_t cz_translate_firmware_enum_to_arg(struct pp_smumgr *smumgr,
|
||||
static uint8_t cz_translate_firmware_enum_to_arg(struct pp_hwmgr *hwmgr,
|
||||
enum cz_scratch_entry firmware_enum)
|
||||
{
|
||||
uint8_t ret = 0;
|
||||
|
@ -226,7 +225,7 @@ static uint8_t cz_translate_firmware_enum_to_arg(struct pp_smumgr *smumgr,
|
|||
ret = UCODE_ID_SDMA0;
|
||||
break;
|
||||
case CZ_SCRATCH_ENTRY_UCODE_ID_SDMA1:
|
||||
if (smumgr->chip_id == CHIP_STONEY)
|
||||
if (hwmgr->chip_id == CHIP_STONEY)
|
||||
ret = UCODE_ID_SDMA0;
|
||||
else
|
||||
ret = UCODE_ID_SDMA1;
|
||||
|
@ -244,7 +243,7 @@ static uint8_t cz_translate_firmware_enum_to_arg(struct pp_smumgr *smumgr,
|
|||
ret = UCODE_ID_CP_MEC_JT1;
|
||||
break;
|
||||
case CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT2:
|
||||
if (smumgr->chip_id == CHIP_STONEY)
|
||||
if (hwmgr->chip_id == CHIP_STONEY)
|
||||
ret = UCODE_ID_CP_MEC_JT1;
|
||||
else
|
||||
ret = UCODE_ID_CP_MEC_JT2;
|
||||
|
@ -326,17 +325,17 @@ static enum cgs_ucode_id cz_convert_fw_type_to_cgs(uint32_t fw_type)
|
|||
}
|
||||
|
||||
static int cz_smu_populate_single_scratch_task(
|
||||
struct pp_smumgr *smumgr,
|
||||
struct pp_hwmgr *hwmgr,
|
||||
enum cz_scratch_entry fw_enum,
|
||||
uint8_t type, bool is_last)
|
||||
{
|
||||
uint8_t i;
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)smumgr->backend;
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)hwmgr->smumgr->backend;
|
||||
struct TOC *toc = (struct TOC *)cz_smu->toc_buffer.kaddr;
|
||||
struct SMU_Task *task = &toc->tasks[cz_smu->toc_entry_used_count++];
|
||||
|
||||
task->type = type;
|
||||
task->arg = cz_translate_firmware_enum_to_arg(smumgr, fw_enum);
|
||||
task->arg = cz_translate_firmware_enum_to_arg(hwmgr, fw_enum);
|
||||
task->next = is_last ? END_OF_TASK_LIST : cz_smu->toc_entry_used_count;
|
||||
|
||||
for (i = 0; i < cz_smu->scratch_buffer_length; i++)
|
||||
|
@ -363,17 +362,17 @@ static int cz_smu_populate_single_scratch_task(
|
|||
}
|
||||
|
||||
static int cz_smu_populate_single_ucode_load_task(
|
||||
struct pp_smumgr *smumgr,
|
||||
struct pp_hwmgr *hwmgr,
|
||||
enum cz_scratch_entry fw_enum,
|
||||
bool is_last)
|
||||
{
|
||||
uint8_t i;
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)smumgr->backend;
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)hwmgr->smumgr->backend;
|
||||
struct TOC *toc = (struct TOC *)cz_smu->toc_buffer.kaddr;
|
||||
struct SMU_Task *task = &toc->tasks[cz_smu->toc_entry_used_count++];
|
||||
|
||||
task->type = TASK_TYPE_UCODE_LOAD;
|
||||
task->arg = cz_translate_firmware_enum_to_arg(smumgr, fw_enum);
|
||||
task->arg = cz_translate_firmware_enum_to_arg(hwmgr, fw_enum);
|
||||
task->next = is_last ? END_OF_TASK_LIST : cz_smu->toc_entry_used_count;
|
||||
|
||||
for (i = 0; i < cz_smu->driver_buffer_length; i++)
|
||||
|
@ -392,22 +391,22 @@ static int cz_smu_populate_single_ucode_load_task(
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int cz_smu_construct_toc_for_rlc_aram_save(struct pp_smumgr *smumgr)
|
||||
static int cz_smu_construct_toc_for_rlc_aram_save(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)smumgr->backend;
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)hwmgr->smumgr->backend;
|
||||
|
||||
cz_smu->toc_entry_aram = cz_smu->toc_entry_used_count;
|
||||
cz_smu_populate_single_scratch_task(smumgr,
|
||||
cz_smu_populate_single_scratch_task(hwmgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_RLC_SRM_ARAM,
|
||||
TASK_TYPE_UCODE_SAVE, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cz_smu_initialize_toc_empty_job_list(struct pp_smumgr *smumgr)
|
||||
static int cz_smu_initialize_toc_empty_job_list(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
int i;
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)smumgr->backend;
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)hwmgr->smumgr->backend;
|
||||
struct TOC *toc = (struct TOC *)cz_smu->toc_buffer.kaddr;
|
||||
|
||||
for (i = 0; i < NUM_JOBLIST_ENTRIES; i++)
|
||||
|
@ -416,17 +415,17 @@ static int cz_smu_initialize_toc_empty_job_list(struct pp_smumgr *smumgr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int cz_smu_construct_toc_for_vddgfx_enter(struct pp_smumgr *smumgr)
|
||||
static int cz_smu_construct_toc_for_vddgfx_enter(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)smumgr->backend;
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)hwmgr->smumgr->backend;
|
||||
struct TOC *toc = (struct TOC *)cz_smu->toc_buffer.kaddr;
|
||||
|
||||
toc->JobList[JOB_GFX_SAVE] = (uint8_t)cz_smu->toc_entry_used_count;
|
||||
cz_smu_populate_single_scratch_task(smumgr,
|
||||
cz_smu_populate_single_scratch_task(hwmgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_RLC_SCRATCH,
|
||||
TASK_TYPE_UCODE_SAVE, false);
|
||||
|
||||
cz_smu_populate_single_scratch_task(smumgr,
|
||||
cz_smu_populate_single_scratch_task(hwmgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_RLC_SRM_DRAM,
|
||||
TASK_TYPE_UCODE_SAVE, true);
|
||||
|
||||
|
@ -434,121 +433,120 @@ static int cz_smu_construct_toc_for_vddgfx_enter(struct pp_smumgr *smumgr)
|
|||
}
|
||||
|
||||
|
||||
static int cz_smu_construct_toc_for_vddgfx_exit(struct pp_smumgr *smumgr)
|
||||
static int cz_smu_construct_toc_for_vddgfx_exit(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)smumgr->backend;
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)hwmgr->smumgr->backend;
|
||||
struct TOC *toc = (struct TOC *)cz_smu->toc_buffer.kaddr;
|
||||
|
||||
toc->JobList[JOB_GFX_RESTORE] = (uint8_t)cz_smu->toc_entry_used_count;
|
||||
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
cz_smu_populate_single_ucode_load_task(hwmgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_CP_CE, false);
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
cz_smu_populate_single_ucode_load_task(hwmgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_CP_PFP, false);
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
cz_smu_populate_single_ucode_load_task(hwmgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_CP_ME, false);
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
cz_smu_populate_single_ucode_load_task(hwmgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1, false);
|
||||
|
||||
if (smumgr->chip_id == CHIP_STONEY)
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
if (hwmgr->chip_id == CHIP_STONEY)
|
||||
cz_smu_populate_single_ucode_load_task(hwmgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1, false);
|
||||
else
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
cz_smu_populate_single_ucode_load_task(hwmgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT2, false);
|
||||
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
cz_smu_populate_single_ucode_load_task(hwmgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_RLC_G, false);
|
||||
|
||||
/* populate scratch */
|
||||
cz_smu_populate_single_scratch_task(smumgr,
|
||||
cz_smu_populate_single_scratch_task(hwmgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_RLC_SCRATCH,
|
||||
TASK_TYPE_UCODE_LOAD, false);
|
||||
|
||||
cz_smu_populate_single_scratch_task(smumgr,
|
||||
cz_smu_populate_single_scratch_task(hwmgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_RLC_SRM_ARAM,
|
||||
TASK_TYPE_UCODE_LOAD, false);
|
||||
|
||||
cz_smu_populate_single_scratch_task(smumgr,
|
||||
cz_smu_populate_single_scratch_task(hwmgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_RLC_SRM_DRAM,
|
||||
TASK_TYPE_UCODE_LOAD, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cz_smu_construct_toc_for_power_profiling(
|
||||
struct pp_smumgr *smumgr)
|
||||
static int cz_smu_construct_toc_for_power_profiling(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)smumgr->backend;
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)hwmgr->smumgr->backend;
|
||||
|
||||
cz_smu->toc_entry_power_profiling_index = cz_smu->toc_entry_used_count;
|
||||
|
||||
cz_smu_populate_single_scratch_task(smumgr,
|
||||
cz_smu_populate_single_scratch_task(hwmgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_POWER_PROFILING,
|
||||
TASK_TYPE_INITIALIZE, true);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cz_smu_construct_toc_for_bootup(struct pp_smumgr *smumgr)
|
||||
static int cz_smu_construct_toc_for_bootup(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)smumgr->backend;
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)hwmgr->smumgr->backend;
|
||||
|
||||
cz_smu->toc_entry_initialize_index = cz_smu->toc_entry_used_count;
|
||||
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
cz_smu_populate_single_ucode_load_task(hwmgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_SDMA0, false);
|
||||
if (smumgr->chip_id != CHIP_STONEY)
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
if (hwmgr->chip_id != CHIP_STONEY)
|
||||
cz_smu_populate_single_ucode_load_task(hwmgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_SDMA1, false);
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
cz_smu_populate_single_ucode_load_task(hwmgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_CP_CE, false);
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
cz_smu_populate_single_ucode_load_task(hwmgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_CP_PFP, false);
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
cz_smu_populate_single_ucode_load_task(hwmgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_CP_ME, false);
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
cz_smu_populate_single_ucode_load_task(hwmgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1, false);
|
||||
if (smumgr->chip_id != CHIP_STONEY)
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
if (hwmgr->chip_id != CHIP_STONEY)
|
||||
cz_smu_populate_single_ucode_load_task(hwmgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT2, false);
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
cz_smu_populate_single_ucode_load_task(hwmgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_RLC_G, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cz_smu_construct_toc_for_clock_table(struct pp_smumgr *smumgr)
|
||||
static int cz_smu_construct_toc_for_clock_table(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)smumgr->backend;
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)hwmgr->smumgr->backend;
|
||||
|
||||
cz_smu->toc_entry_clock_table = cz_smu->toc_entry_used_count;
|
||||
|
||||
cz_smu_populate_single_scratch_task(smumgr,
|
||||
cz_smu_populate_single_scratch_task(hwmgr,
|
||||
CZ_SCRATCH_ENTRY_SMU8_FUSION_CLKTABLE,
|
||||
TASK_TYPE_INITIALIZE, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cz_smu_construct_toc(struct pp_smumgr *smumgr)
|
||||
static int cz_smu_construct_toc(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)smumgr->backend;
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)hwmgr->smumgr->backend;
|
||||
|
||||
cz_smu->toc_entry_used_count = 0;
|
||||
cz_smu_initialize_toc_empty_job_list(smumgr);
|
||||
cz_smu_construct_toc_for_rlc_aram_save(smumgr);
|
||||
cz_smu_construct_toc_for_vddgfx_enter(smumgr);
|
||||
cz_smu_construct_toc_for_vddgfx_exit(smumgr);
|
||||
cz_smu_construct_toc_for_power_profiling(smumgr);
|
||||
cz_smu_construct_toc_for_bootup(smumgr);
|
||||
cz_smu_construct_toc_for_clock_table(smumgr);
|
||||
cz_smu_initialize_toc_empty_job_list(hwmgr);
|
||||
cz_smu_construct_toc_for_rlc_aram_save(hwmgr);
|
||||
cz_smu_construct_toc_for_vddgfx_enter(hwmgr);
|
||||
cz_smu_construct_toc_for_vddgfx_exit(hwmgr);
|
||||
cz_smu_construct_toc_for_power_profiling(hwmgr);
|
||||
cz_smu_construct_toc_for_bootup(hwmgr);
|
||||
cz_smu_construct_toc_for_clock_table(hwmgr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cz_smu_populate_firmware_entries(struct pp_smumgr *smumgr)
|
||||
static int cz_smu_populate_firmware_entries(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)smumgr->backend;
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)hwmgr->smumgr->backend;
|
||||
uint32_t firmware_type;
|
||||
uint32_t i;
|
||||
int ret;
|
||||
|
@ -559,12 +557,12 @@ static int cz_smu_populate_firmware_entries(struct pp_smumgr *smumgr)
|
|||
|
||||
for (i = 0; i < ARRAY_SIZE(firmware_list); i++) {
|
||||
|
||||
firmware_type = cz_translate_firmware_enum_to_arg(smumgr,
|
||||
firmware_type = cz_translate_firmware_enum_to_arg(hwmgr,
|
||||
firmware_list[i]);
|
||||
|
||||
ucode_id = cz_convert_fw_type_to_cgs(firmware_type);
|
||||
|
||||
ret = cgs_get_firmware_info(smumgr->device,
|
||||
ret = cgs_get_firmware_info(hwmgr->device,
|
||||
ucode_id, &info);
|
||||
|
||||
if (ret == 0) {
|
||||
|
@ -585,12 +583,12 @@ static int cz_smu_populate_firmware_entries(struct pp_smumgr *smumgr)
|
|||
}
|
||||
|
||||
static int cz_smu_populate_single_scratch_entry(
|
||||
struct pp_smumgr *smumgr,
|
||||
struct pp_hwmgr *hwmgr,
|
||||
enum cz_scratch_entry scratch_type,
|
||||
uint32_t ulsize_byte,
|
||||
struct cz_buffer_entry *entry)
|
||||
{
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)smumgr->backend;
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)hwmgr->smumgr->backend;
|
||||
long long mc_addr =
|
||||
((long long)(cz_smu->smu_buffer.mc_addr_high) << 32)
|
||||
| cz_smu->smu_buffer.mc_addr_low;
|
||||
|
@ -611,9 +609,9 @@ static int cz_smu_populate_single_scratch_entry(
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int cz_download_pptable_settings(struct pp_smumgr *smumgr, void **table)
|
||||
static int cz_download_pptable_settings(struct pp_hwmgr *hwmgr, void **table)
|
||||
{
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)smumgr->backend;
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)hwmgr->smumgr->backend;
|
||||
unsigned long i;
|
||||
|
||||
for (i = 0; i < cz_smu->scratch_buffer_length; i++) {
|
||||
|
@ -624,25 +622,25 @@ static int cz_download_pptable_settings(struct pp_smumgr *smumgr, void **table)
|
|||
|
||||
*table = (struct SMU8_Fusion_ClkTable *)cz_smu->scratch_buffer[i].kaddr;
|
||||
|
||||
cz_send_msg_to_smc_with_parameter(smumgr,
|
||||
cz_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetClkTableAddrHi,
|
||||
cz_smu->scratch_buffer[i].mc_addr_high);
|
||||
|
||||
cz_send_msg_to_smc_with_parameter(smumgr,
|
||||
cz_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetClkTableAddrLo,
|
||||
cz_smu->scratch_buffer[i].mc_addr_low);
|
||||
|
||||
cz_send_msg_to_smc_with_parameter(smumgr, PPSMC_MSG_ExecuteJob,
|
||||
cz_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_ExecuteJob,
|
||||
cz_smu->toc_entry_clock_table);
|
||||
|
||||
cz_send_msg_to_smc(smumgr, PPSMC_MSG_ClkTableXferToDram);
|
||||
cz_send_msg_to_smc(hwmgr, PPSMC_MSG_ClkTableXferToDram);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cz_upload_pptable_settings(struct pp_smumgr *smumgr)
|
||||
static int cz_upload_pptable_settings(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)smumgr->backend;
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)hwmgr->smumgr->backend;
|
||||
unsigned long i;
|
||||
|
||||
for (i = 0; i < cz_smu->scratch_buffer_length; i++) {
|
||||
|
@ -651,63 +649,63 @@ static int cz_upload_pptable_settings(struct pp_smumgr *smumgr)
|
|||
break;
|
||||
}
|
||||
|
||||
cz_send_msg_to_smc_with_parameter(smumgr,
|
||||
cz_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetClkTableAddrHi,
|
||||
cz_smu->scratch_buffer[i].mc_addr_high);
|
||||
|
||||
cz_send_msg_to_smc_with_parameter(smumgr,
|
||||
cz_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetClkTableAddrLo,
|
||||
cz_smu->scratch_buffer[i].mc_addr_low);
|
||||
|
||||
cz_send_msg_to_smc_with_parameter(smumgr, PPSMC_MSG_ExecuteJob,
|
||||
cz_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_ExecuteJob,
|
||||
cz_smu->toc_entry_clock_table);
|
||||
|
||||
cz_send_msg_to_smc(smumgr, PPSMC_MSG_ClkTableXferToSmu);
|
||||
cz_send_msg_to_smc(hwmgr, PPSMC_MSG_ClkTableXferToSmu);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cz_request_smu_load_fw(struct pp_smumgr *smumgr)
|
||||
static int cz_request_smu_load_fw(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)(smumgr->backend);
|
||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)(hwmgr->smumgr->backend);
|
||||
uint32_t smc_address;
|
||||
|
||||
if (!smumgr->reload_fw) {
|
||||
if (!hwmgr->smumgr->reload_fw) {
|
||||
pr_info("skip reloading...\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
cz_smu_populate_firmware_entries(smumgr);
|
||||
cz_smu_populate_firmware_entries(hwmgr);
|
||||
|
||||
cz_smu_construct_toc(smumgr);
|
||||
cz_smu_construct_toc(hwmgr);
|
||||
|
||||
smc_address = SMU8_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(struct SMU8_Firmware_Header, UcodeLoadStatus);
|
||||
|
||||
cz_write_smc_sram_dword(smumgr, smc_address, 0, smc_address+4);
|
||||
cz_write_smc_sram_dword(hwmgr, smc_address, 0, smc_address+4);
|
||||
|
||||
cz_send_msg_to_smc_with_parameter(smumgr,
|
||||
cz_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_DriverDramAddrHi,
|
||||
cz_smu->toc_buffer.mc_addr_high);
|
||||
|
||||
cz_send_msg_to_smc_with_parameter(smumgr,
|
||||
cz_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_DriverDramAddrLo,
|
||||
cz_smu->toc_buffer.mc_addr_low);
|
||||
|
||||
cz_send_msg_to_smc(smumgr, PPSMC_MSG_InitJobs);
|
||||
cz_send_msg_to_smc(hwmgr, PPSMC_MSG_InitJobs);
|
||||
|
||||
cz_send_msg_to_smc_with_parameter(smumgr,
|
||||
cz_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_ExecuteJob,
|
||||
cz_smu->toc_entry_aram);
|
||||
cz_send_msg_to_smc_with_parameter(smumgr, PPSMC_MSG_ExecuteJob,
|
||||
cz_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_ExecuteJob,
|
||||
cz_smu->toc_entry_power_profiling_index);
|
||||
|
||||
return cz_send_msg_to_smc_with_parameter(smumgr,
|
||||
return cz_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_ExecuteJob,
|
||||
cz_smu->toc_entry_initialize_index);
|
||||
}
|
||||
|
||||
static int cz_start_smu(struct pp_smumgr *smumgr)
|
||||
static int cz_start_smu(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
int ret = 0;
|
||||
uint32_t fw_to_check = 0;
|
||||
|
@ -721,23 +719,23 @@ static int cz_start_smu(struct pp_smumgr *smumgr)
|
|||
UCODE_ID_CP_MEC_JT1_MASK |
|
||||
UCODE_ID_CP_MEC_JT2_MASK;
|
||||
|
||||
if (smumgr->chip_id == CHIP_STONEY)
|
||||
if (hwmgr->chip_id == CHIP_STONEY)
|
||||
fw_to_check &= ~(UCODE_ID_SDMA1_MASK | UCODE_ID_CP_MEC_JT2_MASK);
|
||||
|
||||
ret = cz_request_smu_load_fw(smumgr);
|
||||
ret = cz_request_smu_load_fw(hwmgr);
|
||||
if (ret)
|
||||
pr_err("SMU firmware load failed\n");
|
||||
|
||||
cz_check_fw_load_finish(smumgr, fw_to_check);
|
||||
cz_check_fw_load_finish(hwmgr, fw_to_check);
|
||||
|
||||
ret = cz_load_mec_firmware(smumgr);
|
||||
ret = cz_load_mec_firmware(hwmgr);
|
||||
if (ret)
|
||||
pr_err("Mec Firmware load failed\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int cz_smu_init(struct pp_smumgr *smumgr)
|
||||
static int cz_smu_init(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
uint64_t mc_addr = 0;
|
||||
int ret = 0;
|
||||
|
@ -747,7 +745,7 @@ static int cz_smu_init(struct pp_smumgr *smumgr)
|
|||
if (cz_smu == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
smumgr->backend = cz_smu;
|
||||
hwmgr->smumgr->backend = cz_smu;
|
||||
|
||||
cz_smu->toc_buffer.data_size = 4096;
|
||||
cz_smu->smu_buffer.data_size =
|
||||
|
@ -757,7 +755,7 @@ static int cz_smu_init(struct pp_smumgr *smumgr)
|
|||
ALIGN(sizeof(struct SMU8_MultimediaPowerLogData), 32) +
|
||||
ALIGN(sizeof(struct SMU8_Fusion_ClkTable), 32);
|
||||
|
||||
ret = smu_allocate_memory(smumgr->device,
|
||||
ret = smu_allocate_memory(hwmgr->device,
|
||||
cz_smu->toc_buffer.data_size,
|
||||
CGS_GPU_MEM_TYPE__GART_CACHEABLE,
|
||||
PAGE_SIZE,
|
||||
|
@ -770,7 +768,7 @@ static int cz_smu_init(struct pp_smumgr *smumgr)
|
|||
cz_smu->toc_buffer.mc_addr_high = smu_upper_32_bits(mc_addr);
|
||||
cz_smu->toc_buffer.mc_addr_low = smu_lower_32_bits(mc_addr);
|
||||
|
||||
ret = smu_allocate_memory(smumgr->device,
|
||||
ret = smu_allocate_memory(hwmgr->device,
|
||||
cz_smu->smu_buffer.data_size,
|
||||
CGS_GPU_MEM_TYPE__GART_CACHEABLE,
|
||||
PAGE_SIZE,
|
||||
|
@ -783,7 +781,7 @@ static int cz_smu_init(struct pp_smumgr *smumgr)
|
|||
cz_smu->smu_buffer.mc_addr_high = smu_upper_32_bits(mc_addr);
|
||||
cz_smu->smu_buffer.mc_addr_low = smu_lower_32_bits(mc_addr);
|
||||
|
||||
if (0 != cz_smu_populate_single_scratch_entry(smumgr,
|
||||
if (0 != cz_smu_populate_single_scratch_entry(hwmgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_RLC_SCRATCH,
|
||||
UCODE_ID_RLC_SCRATCH_SIZE_BYTE,
|
||||
&cz_smu->scratch_buffer[cz_smu->scratch_buffer_length++])) {
|
||||
|
@ -791,14 +789,14 @@ static int cz_smu_init(struct pp_smumgr *smumgr)
|
|||
return -1;
|
||||
}
|
||||
|
||||
if (0 != cz_smu_populate_single_scratch_entry(smumgr,
|
||||
if (0 != cz_smu_populate_single_scratch_entry(hwmgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_RLC_SRM_ARAM,
|
||||
UCODE_ID_RLC_SRM_ARAM_SIZE_BYTE,
|
||||
&cz_smu->scratch_buffer[cz_smu->scratch_buffer_length++])) {
|
||||
pr_err("Error when Populate Firmware Entry.\n");
|
||||
return -1;
|
||||
}
|
||||
if (0 != cz_smu_populate_single_scratch_entry(smumgr,
|
||||
if (0 != cz_smu_populate_single_scratch_entry(hwmgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_RLC_SRM_DRAM,
|
||||
UCODE_ID_RLC_SRM_DRAM_SIZE_BYTE,
|
||||
&cz_smu->scratch_buffer[cz_smu->scratch_buffer_length++])) {
|
||||
|
@ -806,7 +804,7 @@ static int cz_smu_init(struct pp_smumgr *smumgr)
|
|||
return -1;
|
||||
}
|
||||
|
||||
if (0 != cz_smu_populate_single_scratch_entry(smumgr,
|
||||
if (0 != cz_smu_populate_single_scratch_entry(hwmgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_POWER_PROFILING,
|
||||
sizeof(struct SMU8_MultimediaPowerLogData),
|
||||
&cz_smu->scratch_buffer[cz_smu->scratch_buffer_length++])) {
|
||||
|
@ -814,7 +812,7 @@ static int cz_smu_init(struct pp_smumgr *smumgr)
|
|||
return -1;
|
||||
}
|
||||
|
||||
if (0 != cz_smu_populate_single_scratch_entry(smumgr,
|
||||
if (0 != cz_smu_populate_single_scratch_entry(hwmgr,
|
||||
CZ_SCRATCH_ENTRY_SMU8_FUSION_CLKTABLE,
|
||||
sizeof(struct SMU8_Fusion_ClkTable),
|
||||
&cz_smu->scratch_buffer[cz_smu->scratch_buffer_length++])) {
|
||||
|
@ -825,18 +823,18 @@ static int cz_smu_init(struct pp_smumgr *smumgr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int cz_smu_fini(struct pp_smumgr *smumgr)
|
||||
static int cz_smu_fini(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct cz_smumgr *cz_smu;
|
||||
|
||||
if (smumgr == NULL || smumgr->device == NULL)
|
||||
if (hwmgr == NULL || hwmgr->device == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
cz_smu = (struct cz_smumgr *)smumgr->backend;
|
||||
cz_smu = (struct cz_smumgr *)hwmgr->smumgr->backend;
|
||||
if (cz_smu) {
|
||||
cgs_free_gpu_mem(smumgr->device,
|
||||
cgs_free_gpu_mem(hwmgr->device,
|
||||
cz_smu->toc_buffer.handle);
|
||||
cgs_free_gpu_mem(smumgr->device,
|
||||
cgs_free_gpu_mem(hwmgr->device,
|
||||
cz_smu->smu_buffer.handle);
|
||||
kfree(cz_smu);
|
||||
}
|
||||
|
|
|
@ -338,7 +338,7 @@ static int fiji_populate_dw8(struct pp_hwmgr *hwmgr, uint32_t fuse_table_offset)
|
|||
const struct fiji_pt_defaults *defaults = smu_data->power_tune_defaults;
|
||||
uint32_t temp;
|
||||
|
||||
if (smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
if (smu7_read_smc_sram_dword(hwmgr,
|
||||
fuse_table_offset +
|
||||
offsetof(SMU73_Discrete_PmFuses, TdcWaterfallCtl),
|
||||
(uint32_t *)&temp, SMC_RAM_END))
|
||||
|
@ -425,7 +425,7 @@ static int fiji_populate_pm_fuses(struct pp_hwmgr *hwmgr)
|
|||
|
||||
if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
|
||||
PHM_PlatformCaps_PowerContainment)) {
|
||||
if (smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
if (smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU7_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU73_Firmware_Header, PmFuseTable),
|
||||
&pm_fuse_table_offset, SMC_RAM_END))
|
||||
|
@ -473,7 +473,7 @@ static int fiji_populate_pm_fuses(struct pp_hwmgr *hwmgr)
|
|||
"Attempt to populate BapmVddCBaseLeakage Hi and Lo "
|
||||
"Sidd Failed!", return -EINVAL);
|
||||
|
||||
if (smu7_copy_bytes_to_smc(hwmgr->smumgr, pm_fuse_table_offset,
|
||||
if (smu7_copy_bytes_to_smc(hwmgr, pm_fuse_table_offset,
|
||||
(uint8_t *)&smu_data->power_tune_table,
|
||||
sizeof(struct SMU73_Discrete_PmFuses), SMC_RAM_END))
|
||||
PP_ASSERT_WITH_CODE(false,
|
||||
|
@ -848,7 +848,7 @@ int fiji_populate_all_graphic_levels(struct pp_hwmgr *hwmgr)
|
|||
levels[1].pcieDpmLevel = mid_pcie_level_enabled;
|
||||
}
|
||||
/* level count will send to smc once at init smc table and never change */
|
||||
result = smu7_copy_bytes_to_smc(hwmgr->smumgr, array, (uint8_t *)levels,
|
||||
result = smu7_copy_bytes_to_smc(hwmgr, array, (uint8_t *)levels,
|
||||
(uint32_t)array_size, SMC_RAM_END);
|
||||
|
||||
return result;
|
||||
|
@ -1032,7 +1032,7 @@ int fiji_populate_all_memory_levels(struct pp_hwmgr *hwmgr)
|
|||
PPSMC_DISPLAY_WATERMARK_HIGH;
|
||||
|
||||
/* level count will send to smc once at init smc table and never change */
|
||||
result = smu7_copy_bytes_to_smc(hwmgr->smumgr, array, (uint8_t *)levels,
|
||||
result = smu7_copy_bytes_to_smc(hwmgr, array, (uint8_t *)levels,
|
||||
(uint32_t)array_size, SMC_RAM_END);
|
||||
|
||||
return result;
|
||||
|
@ -1359,7 +1359,7 @@ static int fiji_program_memory_timing_parameters(struct pp_hwmgr *hwmgr)
|
|||
|
||||
if (!result)
|
||||
result = smu7_copy_bytes_to_smc(
|
||||
hwmgr->smumgr,
|
||||
hwmgr,
|
||||
smu_data->smu7_data.arb_table_start,
|
||||
(uint8_t *)&arb_regs,
|
||||
sizeof(SMU73_Discrete_MCArbDramTimingTable),
|
||||
|
@ -1683,9 +1683,9 @@ static int fiji_populate_vr_config(struct pp_hwmgr *hwmgr,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int fiji_init_arb_table_index(struct pp_smumgr *smumgr)
|
||||
static int fiji_init_arb_table_index(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct fiji_smumgr *smu_data = (struct fiji_smumgr *)(smumgr->backend);
|
||||
struct fiji_smumgr *smu_data = (struct fiji_smumgr *)(hwmgr->smumgr->backend);
|
||||
uint32_t tmp;
|
||||
int result;
|
||||
|
||||
|
@ -1697,7 +1697,7 @@ static int fiji_init_arb_table_index(struct pp_smumgr *smumgr)
|
|||
* In reality this field should not be in that structure
|
||||
* but in a soft register.
|
||||
*/
|
||||
result = smu7_read_smc_sram_dword(smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
smu_data->smu7_data.arb_table_start, &tmp, SMC_RAM_END);
|
||||
|
||||
if (result)
|
||||
|
@ -1706,7 +1706,7 @@ static int fiji_init_arb_table_index(struct pp_smumgr *smumgr)
|
|||
tmp &= 0x00FFFFFF;
|
||||
tmp |= ((uint32_t)MC_CG_ARB_FREQ_F1) << 24;
|
||||
|
||||
return smu7_write_smc_sram_dword(smumgr,
|
||||
return smu7_write_smc_sram_dword(hwmgr,
|
||||
smu_data->smu7_data.arb_table_start, tmp, SMC_RAM_END);
|
||||
}
|
||||
|
||||
|
@ -1771,7 +1771,7 @@ static int fiji_setup_dpm_led_config(struct pp_hwmgr *hwmgr)
|
|||
}
|
||||
}
|
||||
if (mask)
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_LedConfig,
|
||||
mask);
|
||||
return 0;
|
||||
|
@ -1974,7 +1974,7 @@ int fiji_init_smc_table(struct pp_hwmgr *hwmgr)
|
|||
CONVERT_FROM_HOST_TO_SMC_US(table->PhaseResponseTime);
|
||||
|
||||
/* Upload all dpm data to SMC memory.(dpm level, dpm level count etc) */
|
||||
result = smu7_copy_bytes_to_smc(hwmgr->smumgr,
|
||||
result = smu7_copy_bytes_to_smc(hwmgr,
|
||||
smu_data->smu7_data.dpm_table_start +
|
||||
offsetof(SMU73_Discrete_DpmTable, SystemFlags),
|
||||
(uint8_t *)&(table->SystemFlags),
|
||||
|
@ -1983,7 +1983,7 @@ int fiji_init_smc_table(struct pp_hwmgr *hwmgr)
|
|||
PP_ASSERT_WITH_CODE(0 == result,
|
||||
"Failed to upload dpm data to SMC memory!", return result);
|
||||
|
||||
result = fiji_init_arb_table_index(hwmgr->smumgr);
|
||||
result = fiji_init_arb_table_index(hwmgr);
|
||||
PP_ASSERT_WITH_CODE(0 == result,
|
||||
"Failed to upload arb data to SMC memory!", return result);
|
||||
|
||||
|
@ -2093,20 +2093,20 @@ int fiji_thermal_setup_fan_table(struct pp_hwmgr *hwmgr)
|
|||
hwmgr->device, CGS_IND_REG__SMC,
|
||||
CG_MULT_THERMAL_CTRL, TEMP_SEL);
|
||||
|
||||
res = smu7_copy_bytes_to_smc(hwmgr->smumgr, smu_data->smu7_data.fan_table_start,
|
||||
res = smu7_copy_bytes_to_smc(hwmgr, smu_data->smu7_data.fan_table_start,
|
||||
(uint8_t *)&fan_table, (uint32_t)sizeof(fan_table),
|
||||
SMC_RAM_END);
|
||||
|
||||
if (!res && hwmgr->thermal_controller.
|
||||
advanceFanControlParameters.ucMinimumPWMLimit)
|
||||
res = smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
res = smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetFanMinPwm,
|
||||
hwmgr->thermal_controller.
|
||||
advanceFanControlParameters.ucMinimumPWMLimit);
|
||||
|
||||
if (!res && hwmgr->thermal_controller.
|
||||
advanceFanControlParameters.ulMinFanSCLKAcousticLimit)
|
||||
res = smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
res = smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetFanSclkTarget,
|
||||
hwmgr->thermal_controller.
|
||||
advanceFanControlParameters.ulMinFanSCLKAcousticLimit);
|
||||
|
@ -2122,13 +2122,12 @@ int fiji_thermal_setup_fan_table(struct pp_hwmgr *hwmgr)
|
|||
int fiji_thermal_avfs_enable(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
int ret;
|
||||
struct pp_smumgr *smumgr = (struct pp_smumgr *)(hwmgr->smumgr);
|
||||
struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(smumgr->backend);
|
||||
struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(hwmgr->smumgr->backend);
|
||||
|
||||
if (smu_data->avfs.avfs_btc_status != AVFS_BTC_ENABLEAVFS)
|
||||
return 0;
|
||||
|
||||
ret = smum_send_msg_to_smc(smumgr, PPSMC_MSG_EnableAvfs);
|
||||
ret = smum_send_msg_to_smc(hwmgr, PPSMC_MSG_EnableAvfs);
|
||||
|
||||
if (!ret)
|
||||
/* If this param is not changed, this function could fire unnecessarily */
|
||||
|
@ -2168,7 +2167,7 @@ int fiji_update_sclk_threshold(struct pp_hwmgr *hwmgr)
|
|||
CONVERT_FROM_HOST_TO_SMC_UL(low_sclk_interrupt_threshold);
|
||||
|
||||
result = smu7_copy_bytes_to_smc(
|
||||
hwmgr->smumgr,
|
||||
hwmgr,
|
||||
smu_data->smu7_data.dpm_table_start +
|
||||
offsetof(SMU73_Discrete_DpmTable,
|
||||
LowSclkInterruptThreshold),
|
||||
|
@ -2269,7 +2268,7 @@ static int fiji_update_uvd_smc_table(struct pp_hwmgr *hwmgr)
|
|||
PHM_PlatformCaps_UVDDPM) ||
|
||||
phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
|
||||
PHM_PlatformCaps_StablePState))
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_UVDDPM_SetEnabledMask,
|
||||
(uint32_t)(1 << smu_data->smc_state_table.UvdBootLevel));
|
||||
return 0;
|
||||
|
@ -2301,7 +2300,7 @@ static int fiji_update_vce_smc_table(struct pp_hwmgr *hwmgr)
|
|||
CGS_IND_REG__SMC, mm_boot_level_offset, mm_boot_level_value);
|
||||
|
||||
if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_StablePState))
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_VCEDPM_SetEnabledMask,
|
||||
(uint32_t)1 << smu_data->smc_state_table.VceBootLevel);
|
||||
return 0;
|
||||
|
@ -2328,7 +2327,7 @@ static int fiji_update_samu_smc_table(struct pp_hwmgr *hwmgr)
|
|||
|
||||
if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
|
||||
PHM_PlatformCaps_StablePState))
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SAMUDPM_SetEnabledMask,
|
||||
(uint32_t)(1 << smu_data->smc_state_table.SamuBootLevel));
|
||||
return 0;
|
||||
|
@ -2367,7 +2366,7 @@ int fiji_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
int result;
|
||||
bool error = false;
|
||||
|
||||
result = smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU7_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU73_Firmware_Header, DpmTable),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -2377,7 +2376,7 @@ int fiji_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
|
||||
error |= (0 != result);
|
||||
|
||||
result = smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU7_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU73_Firmware_Header, SoftRegisters),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -2389,7 +2388,7 @@ int fiji_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
|
||||
error |= (0 != result);
|
||||
|
||||
result = smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU7_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU73_Firmware_Header, mcRegisterTable),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -2397,7 +2396,7 @@ int fiji_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
if (!result)
|
||||
smu_data->smu7_data.mc_reg_table_start = tmp;
|
||||
|
||||
result = smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU7_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU73_Firmware_Header, FanTable),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -2407,7 +2406,7 @@ int fiji_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
|
||||
error |= (0 != result);
|
||||
|
||||
result = smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU7_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU73_Firmware_Header, mcArbDramTimingTable),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -2417,7 +2416,7 @@ int fiji_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
|
||||
error |= (0 != result);
|
||||
|
||||
result = smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU7_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU73_Firmware_Header, Version),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -2482,6 +2481,6 @@ int fiji_populate_requested_graphic_levels(struct pp_hwmgr *hwmgr,
|
|||
levels[i].DownHyst = request->down_hyst;
|
||||
}
|
||||
|
||||
return smu7_copy_bytes_to_smc(hwmgr->smumgr, array, (uint8_t *)levels,
|
||||
return smu7_copy_bytes_to_smc(hwmgr, array, (uint8_t *)levels,
|
||||
array_size, SMC_RAM_END);
|
||||
}
|
||||
|
|
|
@ -58,122 +58,122 @@ static const struct SMU73_Discrete_GraphicsLevel avfs_graphics_level[8] = {
|
|||
{ 0xf811d047, 0x80380100, 0x01, 0x00, 0x1e00, 0x00000610, 0x87020000, 0x21680000, 0x12000000, 0, 0, 0x0c, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00 }
|
||||
};
|
||||
|
||||
static int fiji_start_smu_in_protection_mode(struct pp_smumgr *smumgr)
|
||||
static int fiji_start_smu_in_protection_mode(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
/* Wait for smc boot up */
|
||||
/* SMUM_WAIT_INDIRECT_FIELD_UNEQUAL(smumgr, SMC_IND,
|
||||
/* SMUM_WAIT_INDIRECT_FIELD_UNEQUAL(hwmgr, SMC_IND,
|
||||
RCU_UC_EVENTS, boot_seq_done, 0); */
|
||||
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
SMC_SYSCON_RESET_CNTL, rst_reg, 1);
|
||||
|
||||
result = smu7_upload_smu_firmware_image(smumgr);
|
||||
result = smu7_upload_smu_firmware_image(hwmgr);
|
||||
if (result)
|
||||
return result;
|
||||
|
||||
/* Clear status */
|
||||
cgs_write_ind_register(smumgr->device, CGS_IND_REG__SMC,
|
||||
cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC,
|
||||
ixSMU_STATUS, 0);
|
||||
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
SMC_SYSCON_CLOCK_CNTL_0, ck_disable, 0);
|
||||
|
||||
/* De-assert reset */
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
SMC_SYSCON_RESET_CNTL, rst_reg, 0);
|
||||
|
||||
/* Wait for ROM firmware to initialize interrupt hendler */
|
||||
/*SMUM_WAIT_VFPF_INDIRECT_REGISTER(smumgr, SMC_IND,
|
||||
/*SMUM_WAIT_VFPF_INDIRECT_REGISTER(hwmgr, SMC_IND,
|
||||
SMC_INTR_CNTL_MASK_0, 0x10040, 0xFFFFFFFF); */
|
||||
|
||||
/* Set SMU Auto Start */
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
SMU_INPUT_DATA, AUTO_START, 1);
|
||||
|
||||
/* Clear firmware interrupt enable flag */
|
||||
cgs_write_ind_register(smumgr->device, CGS_IND_REG__SMC,
|
||||
cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC,
|
||||
ixFIRMWARE_FLAGS, 0);
|
||||
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD(smumgr, SMC_IND, RCU_UC_EVENTS,
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD(hwmgr, SMC_IND, RCU_UC_EVENTS,
|
||||
INTERRUPTS_ENABLED, 1);
|
||||
|
||||
cgs_write_register(smumgr->device, mmSMC_MSG_ARG_0, 0x20000);
|
||||
cgs_write_register(smumgr->device, mmSMC_MESSAGE_0, PPSMC_MSG_Test);
|
||||
SMUM_WAIT_FIELD_UNEQUAL(smumgr, SMC_RESP_0, SMC_RESP, 0);
|
||||
cgs_write_register(hwmgr->device, mmSMC_MSG_ARG_0, 0x20000);
|
||||
cgs_write_register(hwmgr->device, mmSMC_MESSAGE_0, PPSMC_MSG_Test);
|
||||
SMUM_WAIT_FIELD_UNEQUAL(hwmgr, SMC_RESP_0, SMC_RESP, 0);
|
||||
|
||||
/* Wait for done bit to be set */
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD_UNEQUAL(smumgr, SMC_IND,
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD_UNEQUAL(hwmgr, SMC_IND,
|
||||
SMU_STATUS, SMU_DONE, 0);
|
||||
|
||||
/* Check pass/failed indicator */
|
||||
if (SMUM_READ_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
|
||||
if (SMUM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
SMU_STATUS, SMU_PASS) != 1) {
|
||||
PP_ASSERT_WITH_CODE(false,
|
||||
"SMU Firmware start failed!", return -1);
|
||||
}
|
||||
|
||||
/* Wait for firmware to initialize */
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD(smumgr, SMC_IND,
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD(hwmgr, SMC_IND,
|
||||
FIRMWARE_FLAGS, INTERRUPTS_ENABLED, 1);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static int fiji_start_smu_in_non_protection_mode(struct pp_smumgr *smumgr)
|
||||
static int fiji_start_smu_in_non_protection_mode(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
/* wait for smc boot up */
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD_UNEQUAL(smumgr, SMC_IND,
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD_UNEQUAL(hwmgr, SMC_IND,
|
||||
RCU_UC_EVENTS, boot_seq_done, 0);
|
||||
|
||||
/* Clear firmware interrupt enable flag */
|
||||
cgs_write_ind_register(smumgr->device, CGS_IND_REG__SMC,
|
||||
cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC,
|
||||
ixFIRMWARE_FLAGS, 0);
|
||||
|
||||
/* Assert reset */
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
SMC_SYSCON_RESET_CNTL, rst_reg, 1);
|
||||
|
||||
result = smu7_upload_smu_firmware_image(smumgr);
|
||||
result = smu7_upload_smu_firmware_image(hwmgr);
|
||||
if (result)
|
||||
return result;
|
||||
|
||||
/* Set smc instruct start point at 0x0 */
|
||||
smu7_program_jump_on_start(smumgr);
|
||||
smu7_program_jump_on_start(hwmgr);
|
||||
|
||||
/* Enable clock */
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
SMC_SYSCON_CLOCK_CNTL_0, ck_disable, 0);
|
||||
|
||||
/* De-assert reset */
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
SMC_SYSCON_RESET_CNTL, rst_reg, 0);
|
||||
|
||||
/* Wait for firmware to initialize */
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD(smumgr, SMC_IND,
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD(hwmgr, SMC_IND,
|
||||
FIRMWARE_FLAGS, INTERRUPTS_ENABLED, 1);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static int fiji_setup_pwr_virus(struct pp_smumgr *smumgr)
|
||||
static int fiji_setup_pwr_virus(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
int i;
|
||||
int result = -EINVAL;
|
||||
uint32_t reg, data;
|
||||
|
||||
const PWR_Command_Table *pvirus = PwrVirusTable;
|
||||
struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(smumgr->backend);
|
||||
struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(hwmgr->smumgr->backend);
|
||||
|
||||
for (i = 0; i < PWR_VIRUS_TABLE_SIZE; i++) {
|
||||
switch (pvirus->command) {
|
||||
case PwrCmdWrite:
|
||||
reg = pvirus->reg;
|
||||
data = pvirus->data;
|
||||
cgs_write_register(smumgr->device, reg, data);
|
||||
cgs_write_register(hwmgr->device, reg, data);
|
||||
break;
|
||||
|
||||
case PwrCmdEnd:
|
||||
|
@ -192,13 +192,13 @@ static int fiji_setup_pwr_virus(struct pp_smumgr *smumgr)
|
|||
return result;
|
||||
}
|
||||
|
||||
static int fiji_start_avfs_btc(struct pp_smumgr *smumgr)
|
||||
static int fiji_start_avfs_btc(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
int result = 0;
|
||||
struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(smumgr->backend);
|
||||
struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(hwmgr->smumgr->backend);
|
||||
|
||||
if (0 != smu_data->avfs.avfs_btc_param) {
|
||||
if (0 != smu7_send_msg_to_smc_with_parameter(smumgr,
|
||||
if (0 != smu7_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_PerformBtc, smu_data->avfs.avfs_btc_param)) {
|
||||
pr_info("[AVFS][Fiji_PerformBtc] PerformBTC SMU msg failed");
|
||||
result = -EINVAL;
|
||||
|
@ -206,23 +206,23 @@ static int fiji_start_avfs_btc(struct pp_smumgr *smumgr)
|
|||
}
|
||||
/* Soft-Reset to reset the engine before loading uCode */
|
||||
/* halt */
|
||||
cgs_write_register(smumgr->device, mmCP_MEC_CNTL, 0x50000000);
|
||||
cgs_write_register(hwmgr->device, mmCP_MEC_CNTL, 0x50000000);
|
||||
/* reset everything */
|
||||
cgs_write_register(smumgr->device, mmGRBM_SOFT_RESET, 0xffffffff);
|
||||
cgs_write_register(hwmgr->device, mmGRBM_SOFT_RESET, 0xffffffff);
|
||||
/* clear reset */
|
||||
cgs_write_register(smumgr->device, mmGRBM_SOFT_RESET, 0);
|
||||
cgs_write_register(hwmgr->device, mmGRBM_SOFT_RESET, 0);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static int fiji_setup_graphics_level_structure(struct pp_smumgr *smumgr)
|
||||
static int fiji_setup_graphics_level_structure(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
int32_t vr_config;
|
||||
uint32_t table_start;
|
||||
uint32_t level_addr, vr_config_addr;
|
||||
uint32_t level_size = sizeof(avfs_graphics_level);
|
||||
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_read_smc_sram_dword(smumgr,
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU7_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU73_Firmware_Header, DpmTable),
|
||||
&table_start, 0x40000),
|
||||
|
@ -237,7 +237,7 @@ static int fiji_setup_graphics_level_structure(struct pp_smumgr *smumgr)
|
|||
vr_config_addr = table_start +
|
||||
offsetof(SMU73_Discrete_DpmTable, VRConfig);
|
||||
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_copy_bytes_to_smc(smumgr, vr_config_addr,
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_copy_bytes_to_smc(hwmgr, vr_config_addr,
|
||||
(uint8_t *)&vr_config, sizeof(int32_t), 0x40000),
|
||||
"[AVFS][Fiji_SetupGfxLvlStruct] Problems copying "
|
||||
"vr_config value over to SMC",
|
||||
|
@ -245,7 +245,7 @@ static int fiji_setup_graphics_level_structure(struct pp_smumgr *smumgr)
|
|||
|
||||
level_addr = table_start + offsetof(SMU73_Discrete_DpmTable, GraphicsLevel);
|
||||
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_copy_bytes_to_smc(smumgr, level_addr,
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_copy_bytes_to_smc(hwmgr, level_addr,
|
||||
(uint8_t *)(&avfs_graphics_level), level_size, 0x40000),
|
||||
"[AVFS][Fiji_SetupGfxLvlStruct] Copying of DPM table failed!",
|
||||
return -1;);
|
||||
|
@ -253,9 +253,9 @@ static int fiji_setup_graphics_level_structure(struct pp_smumgr *smumgr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int fiji_avfs_event_mgr(struct pp_smumgr *smumgr, bool smu_started)
|
||||
static int fiji_avfs_event_mgr(struct pp_hwmgr *hwmgr, bool smu_started)
|
||||
{
|
||||
struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(smumgr->backend);
|
||||
struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(hwmgr->smumgr->backend);
|
||||
|
||||
switch (smu_data->avfs.avfs_btc_status) {
|
||||
case AVFS_BTC_COMPLETED_PREVIOUSLY:
|
||||
|
@ -265,17 +265,17 @@ static int fiji_avfs_event_mgr(struct pp_smumgr *smumgr, bool smu_started)
|
|||
if (!smu_started)
|
||||
break;
|
||||
smu_data->avfs.avfs_btc_status = AVFS_BTC_FAILED;
|
||||
PP_ASSERT_WITH_CODE(0 == fiji_setup_graphics_level_structure(smumgr),
|
||||
PP_ASSERT_WITH_CODE(0 == fiji_setup_graphics_level_structure(hwmgr),
|
||||
"[AVFS][fiji_avfs_event_mgr] Could not Copy Graphics Level"
|
||||
" table over to SMU",
|
||||
return -EINVAL;);
|
||||
smu_data->avfs.avfs_btc_status = AVFS_BTC_VIRUS_FAIL;
|
||||
PP_ASSERT_WITH_CODE(0 == fiji_setup_pwr_virus(smumgr),
|
||||
PP_ASSERT_WITH_CODE(0 == fiji_setup_pwr_virus(hwmgr),
|
||||
"[AVFS][fiji_avfs_event_mgr] Could not setup "
|
||||
"Pwr Virus for AVFS ",
|
||||
return -EINVAL;);
|
||||
smu_data->avfs.avfs_btc_status = AVFS_BTC_FAILED;
|
||||
PP_ASSERT_WITH_CODE(0 == fiji_start_avfs_btc(smumgr),
|
||||
PP_ASSERT_WITH_CODE(0 == fiji_start_avfs_btc(hwmgr),
|
||||
"[AVFS][fiji_avfs_event_mgr] Failure at "
|
||||
"fiji_start_avfs_btc. AVFS Disabled",
|
||||
return -EINVAL;);
|
||||
|
@ -293,64 +293,64 @@ static int fiji_avfs_event_mgr(struct pp_smumgr *smumgr, bool smu_started)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int fiji_start_smu(struct pp_smumgr *smumgr)
|
||||
static int fiji_start_smu(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
int result = 0;
|
||||
struct fiji_smumgr *priv = (struct fiji_smumgr *)(smumgr->backend);
|
||||
struct fiji_smumgr *priv = (struct fiji_smumgr *)(hwmgr->smumgr->backend);
|
||||
|
||||
/* Only start SMC if SMC RAM is not running */
|
||||
if (!(smu7_is_smc_ram_running(smumgr)
|
||||
|| cgs_is_virtualization_enabled(smumgr->device))) {
|
||||
fiji_avfs_event_mgr(smumgr, false);
|
||||
if (!(smu7_is_smc_ram_running(hwmgr)
|
||||
|| cgs_is_virtualization_enabled(hwmgr->device))) {
|
||||
fiji_avfs_event_mgr(hwmgr, false);
|
||||
|
||||
/* Check if SMU is running in protected mode */
|
||||
if (0 == SMUM_READ_VFPF_INDIRECT_FIELD(smumgr->device,
|
||||
if (0 == SMUM_READ_VFPF_INDIRECT_FIELD(hwmgr->device,
|
||||
CGS_IND_REG__SMC,
|
||||
SMU_FIRMWARE, SMU_MODE)) {
|
||||
result = fiji_start_smu_in_non_protection_mode(smumgr);
|
||||
result = fiji_start_smu_in_non_protection_mode(hwmgr);
|
||||
if (result)
|
||||
return result;
|
||||
} else {
|
||||
result = fiji_start_smu_in_protection_mode(smumgr);
|
||||
result = fiji_start_smu_in_protection_mode(hwmgr);
|
||||
if (result)
|
||||
return result;
|
||||
}
|
||||
fiji_avfs_event_mgr(smumgr, true);
|
||||
fiji_avfs_event_mgr(hwmgr, true);
|
||||
}
|
||||
|
||||
/* To initialize all clock gating before RLC loaded and running.*/
|
||||
cgs_set_clockgating_state(smumgr->device,
|
||||
cgs_set_clockgating_state(hwmgr->device,
|
||||
AMD_IP_BLOCK_TYPE_GFX, AMD_CG_STATE_GATE);
|
||||
cgs_set_clockgating_state(smumgr->device,
|
||||
cgs_set_clockgating_state(hwmgr->device,
|
||||
AMD_IP_BLOCK_TYPE_GMC, AMD_CG_STATE_GATE);
|
||||
cgs_set_clockgating_state(smumgr->device,
|
||||
cgs_set_clockgating_state(hwmgr->device,
|
||||
AMD_IP_BLOCK_TYPE_SDMA, AMD_CG_STATE_GATE);
|
||||
cgs_set_clockgating_state(smumgr->device,
|
||||
cgs_set_clockgating_state(hwmgr->device,
|
||||
AMD_IP_BLOCK_TYPE_COMMON, AMD_CG_STATE_GATE);
|
||||
|
||||
/* Setup SoftRegsStart here for register lookup in case
|
||||
* DummyBackEnd is used and ProcessFirmwareHeader is not executed
|
||||
*/
|
||||
smu7_read_smc_sram_dword(smumgr,
|
||||
smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU7_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU73_Firmware_Header, SoftRegisters),
|
||||
&(priv->smu7_data.soft_regs_start), 0x40000);
|
||||
|
||||
result = smu7_request_smu_load_fw(smumgr);
|
||||
result = smu7_request_smu_load_fw(hwmgr);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static bool fiji_is_hw_avfs_present(struct pp_smumgr *smumgr)
|
||||
static bool fiji_is_hw_avfs_present(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
|
||||
uint32_t efuse = 0;
|
||||
uint32_t mask = (1 << ((AVFS_EN_MSB - AVFS_EN_LSB) + 1)) - 1;
|
||||
|
||||
if (cgs_is_virtualization_enabled(smumgr->device))
|
||||
if (cgs_is_virtualization_enabled(hwmgr->device))
|
||||
return 0;
|
||||
|
||||
if (!atomctrl_read_efuse(smumgr->device, AVFS_EN_LSB, AVFS_EN_MSB,
|
||||
if (!atomctrl_read_efuse(hwmgr->device, AVFS_EN_LSB, AVFS_EN_MSB,
|
||||
mask, &efuse)) {
|
||||
if (efuse)
|
||||
return true;
|
||||
|
@ -365,7 +365,7 @@ static bool fiji_is_hw_avfs_present(struct pp_smumgr *smumgr)
|
|||
* @param smc_addr the address in the SMC RAM to access.
|
||||
* @param value to write to the SMC SRAM.
|
||||
*/
|
||||
static int fiji_smu_init(struct pp_smumgr *smumgr)
|
||||
static int fiji_smu_init(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
int i;
|
||||
struct fiji_smumgr *fiji_priv = NULL;
|
||||
|
@ -375,9 +375,9 @@ static int fiji_smu_init(struct pp_smumgr *smumgr)
|
|||
if (fiji_priv == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
smumgr->backend = fiji_priv;
|
||||
hwmgr->smumgr->backend = fiji_priv;
|
||||
|
||||
if (smu7_init(smumgr))
|
||||
if (smu7_init(hwmgr))
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 0; i < SMU73_MAX_LEVELS_GRAPHICS; i++)
|
||||
|
|
|
@ -163,7 +163,7 @@ static int iceland_populate_dw8(struct pp_hwmgr *hwmgr, uint32_t fuse_table_offs
|
|||
const struct iceland_pt_defaults *defaults = smu_data->power_tune_defaults;
|
||||
uint32_t temp;
|
||||
|
||||
if (smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
if (smu7_read_smc_sram_dword(hwmgr,
|
||||
fuse_table_offset +
|
||||
offsetof(SMU71_Discrete_PmFuses, TdcWaterfallCtl),
|
||||
(uint32_t *)&temp, SMC_RAM_END))
|
||||
|
@ -264,7 +264,7 @@ static int iceland_populate_pm_fuses(struct pp_hwmgr *hwmgr)
|
|||
|
||||
if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
|
||||
PHM_PlatformCaps_PowerContainment)) {
|
||||
if (smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
if (smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU71_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU71_Firmware_Header, PmFuseTable),
|
||||
&pm_fuse_table_offset, SMC_RAM_END))
|
||||
|
@ -318,7 +318,7 @@ static int iceland_populate_pm_fuses(struct pp_hwmgr *hwmgr)
|
|||
"Attempt to populate BapmVddCBaseLeakage Hi and Lo Sidd Failed!",
|
||||
return -EINVAL);
|
||||
|
||||
if (smu7_copy_bytes_to_smc(hwmgr->smumgr, pm_fuse_table_offset,
|
||||
if (smu7_copy_bytes_to_smc(hwmgr, pm_fuse_table_offset,
|
||||
(uint8_t *)&smu_data->power_tune_table,
|
||||
sizeof(struct SMU71_Discrete_PmFuses), SMC_RAM_END))
|
||||
PP_ASSERT_WITH_CODE(false,
|
||||
|
@ -881,7 +881,7 @@ int iceland_populate_all_graphic_levels(struct pp_hwmgr *hwmgr)
|
|||
smu_data->smc_state_table.GraphicsLevel[1].pcieDpmLevel = mid_pcie_level_enabled;
|
||||
|
||||
/* level count will send to smc once at init smc table and never change*/
|
||||
result = smu7_copy_bytes_to_smc(hwmgr->smumgr, level_array_adress,
|
||||
result = smu7_copy_bytes_to_smc(hwmgr, level_array_adress,
|
||||
(uint8_t *)levels, (uint32_t)level_array_size,
|
||||
SMC_RAM_END);
|
||||
|
||||
|
@ -1246,7 +1246,7 @@ int iceland_populate_all_memory_levels(struct pp_hwmgr *hwmgr)
|
|||
smu_data->smc_state_table.MemoryLevel[dpm_table->mclk_table.count-1].DisplayWatermark = PPSMC_DISPLAY_WATERMARK_HIGH;
|
||||
|
||||
/* level count will send to smc once at init smc table and never change*/
|
||||
result = smu7_copy_bytes_to_smc(hwmgr->smumgr,
|
||||
result = smu7_copy_bytes_to_smc(hwmgr,
|
||||
level_array_adress, (uint8_t *)levels, (uint32_t)level_array_size,
|
||||
SMC_RAM_END);
|
||||
|
||||
|
@ -1507,7 +1507,7 @@ static int iceland_program_memory_timing_parameters(struct pp_hwmgr *hwmgr)
|
|||
|
||||
if (0 == result) {
|
||||
result = smu7_copy_bytes_to_smc(
|
||||
hwmgr->smumgr,
|
||||
hwmgr,
|
||||
smu_data->smu7_data.arb_table_start,
|
||||
(uint8_t *)&arb_regs,
|
||||
sizeof(SMU71_Discrete_MCArbDramTimingTable),
|
||||
|
@ -1561,10 +1561,10 @@ static int iceland_populate_smc_boot_level(struct pp_hwmgr *hwmgr,
|
|||
return result;
|
||||
}
|
||||
|
||||
static int iceland_populate_mc_reg_address(struct pp_smumgr *smumgr,
|
||||
static int iceland_populate_mc_reg_address(struct pp_hwmgr *hwmgr,
|
||||
SMU71_Discrete_MCRegisters *mc_reg_table)
|
||||
{
|
||||
const struct iceland_smumgr *smu_data = (struct iceland_smumgr *)smumgr->backend;
|
||||
const struct iceland_smumgr *smu_data = (struct iceland_smumgr *)hwmgr->smumgr->backend;
|
||||
|
||||
uint32_t i, j;
|
||||
|
||||
|
@ -1601,13 +1601,12 @@ static void iceland_convert_mc_registers(
|
|||
}
|
||||
}
|
||||
|
||||
static int iceland_convert_mc_reg_table_entry_to_smc(
|
||||
struct pp_smumgr *smumgr,
|
||||
static int iceland_convert_mc_reg_table_entry_to_smc(struct pp_hwmgr *hwmgr,
|
||||
const uint32_t memory_clock,
|
||||
SMU71_Discrete_MCRegisterSet *mc_reg_table_data
|
||||
)
|
||||
{
|
||||
struct iceland_smumgr *smu_data = (struct iceland_smumgr *)(smumgr->backend);
|
||||
struct iceland_smumgr *smu_data = (struct iceland_smumgr *)(hwmgr->smumgr->backend);
|
||||
uint32_t i = 0;
|
||||
|
||||
for (i = 0; i < smu_data->mc_reg_table.num_entries; i++) {
|
||||
|
@ -1637,7 +1636,7 @@ static int iceland_convert_mc_reg_table_to_smc(struct pp_hwmgr *hwmgr,
|
|||
|
||||
for (i = 0; i < data->dpm_table.mclk_table.count; i++) {
|
||||
res = iceland_convert_mc_reg_table_entry_to_smc(
|
||||
hwmgr->smumgr,
|
||||
hwmgr,
|
||||
data->dpm_table.mclk_table.dpm_levels[i].value,
|
||||
&mc_regs->data[i]
|
||||
);
|
||||
|
@ -1651,8 +1650,7 @@ static int iceland_convert_mc_reg_table_to_smc(struct pp_hwmgr *hwmgr,
|
|||
|
||||
static int iceland_update_and_upload_mc_reg_table(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct pp_smumgr *smumgr = hwmgr->smumgr;
|
||||
struct iceland_smumgr *smu_data = (struct iceland_smumgr *)(smumgr->backend);
|
||||
struct iceland_smumgr *smu_data = (struct iceland_smumgr *)(hwmgr->smumgr->backend);
|
||||
struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
|
||||
uint32_t address;
|
||||
int32_t result;
|
||||
|
@ -1671,7 +1669,7 @@ static int iceland_update_and_upload_mc_reg_table(struct pp_hwmgr *hwmgr)
|
|||
|
||||
address = smu_data->smu7_data.mc_reg_table_start + (uint32_t)offsetof(SMU71_Discrete_MCRegisters, data[0]);
|
||||
|
||||
return smu7_copy_bytes_to_smc(hwmgr->smumgr, address,
|
||||
return smu7_copy_bytes_to_smc(hwmgr, address,
|
||||
(uint8_t *)&smu_data->mc_regs.data[0],
|
||||
sizeof(SMU71_Discrete_MCRegisterSet) * data->dpm_table.mclk_table.count,
|
||||
SMC_RAM_END);
|
||||
|
@ -1680,11 +1678,10 @@ static int iceland_update_and_upload_mc_reg_table(struct pp_hwmgr *hwmgr)
|
|||
static int iceland_populate_initial_mc_reg_table(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
int result;
|
||||
struct pp_smumgr *smumgr = hwmgr->smumgr;
|
||||
struct iceland_smumgr *smu_data = (struct iceland_smumgr *)(smumgr->backend);
|
||||
struct iceland_smumgr *smu_data = (struct iceland_smumgr *)(hwmgr->smumgr->backend);
|
||||
|
||||
memset(&smu_data->mc_regs, 0x00, sizeof(SMU71_Discrete_MCRegisters));
|
||||
result = iceland_populate_mc_reg_address(smumgr, &(smu_data->mc_regs));
|
||||
result = iceland_populate_mc_reg_address(hwmgr, &(smu_data->mc_regs));
|
||||
PP_ASSERT_WITH_CODE(0 == result,
|
||||
"Failed to initialize MCRegTable for the MC register addresses!", return result;);
|
||||
|
||||
|
@ -1692,7 +1689,7 @@ static int iceland_populate_initial_mc_reg_table(struct pp_hwmgr *hwmgr)
|
|||
PP_ASSERT_WITH_CODE(0 == result,
|
||||
"Failed to initialize MCRegTable for driver state!", return result;);
|
||||
|
||||
return smu7_copy_bytes_to_smc(smumgr, smu_data->smu7_data.mc_reg_table_start,
|
||||
return smu7_copy_bytes_to_smc(hwmgr, smu_data->smu7_data.mc_reg_table_start,
|
||||
(uint8_t *)&smu_data->mc_regs, sizeof(SMU71_Discrete_MCRegisters), SMC_RAM_END);
|
||||
}
|
||||
|
||||
|
@ -1944,7 +1941,7 @@ int iceland_init_smc_table(struct pp_hwmgr *hwmgr)
|
|||
table->BootMVdd = PP_HOST_TO_SMC_US(table->BootMVdd * VOLTAGE_SCALE);
|
||||
|
||||
/* Upload all dpm data to SMC memory.(dpm level, dpm level count etc) */
|
||||
result = smu7_copy_bytes_to_smc(hwmgr->smumgr, smu_data->smu7_data.dpm_table_start +
|
||||
result = smu7_copy_bytes_to_smc(hwmgr, smu_data->smu7_data.dpm_table_start +
|
||||
offsetof(SMU71_Discrete_DpmTable, SystemFlags),
|
||||
(uint8_t *)&(table->SystemFlags),
|
||||
sizeof(SMU71_Discrete_DpmTable)-3 * sizeof(SMU71_PIDController),
|
||||
|
@ -1954,7 +1951,7 @@ int iceland_init_smc_table(struct pp_hwmgr *hwmgr)
|
|||
"Failed to upload dpm data to SMC memory!", return result;);
|
||||
|
||||
/* Upload all ulv setting to SMC memory.(dpm level, dpm level count etc) */
|
||||
result = smu7_copy_bytes_to_smc(hwmgr->smumgr,
|
||||
result = smu7_copy_bytes_to_smc(hwmgr,
|
||||
smu_data->smu7_data.ulv_setting_starts,
|
||||
(uint8_t *)&(smu_data->ulv_setting),
|
||||
sizeof(SMU71_Discrete_Ulv),
|
||||
|
@ -2053,7 +2050,7 @@ int iceland_thermal_setup_fan_table(struct pp_hwmgr *hwmgr)
|
|||
|
||||
/* fan_table.FanControl_GL_Flag = 1; */
|
||||
|
||||
res = smu7_copy_bytes_to_smc(hwmgr->smumgr, smu7_data->fan_table_start, (uint8_t *)&fan_table, (uint32_t)sizeof(fan_table), SMC_RAM_END);
|
||||
res = smu7_copy_bytes_to_smc(hwmgr, smu7_data->fan_table_start, (uint8_t *)&fan_table, (uint32_t)sizeof(fan_table), SMC_RAM_END);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -2090,7 +2087,7 @@ int iceland_update_sclk_threshold(struct pp_hwmgr *hwmgr)
|
|||
CONVERT_FROM_HOST_TO_SMC_UL(low_sclk_interrupt_threshold);
|
||||
|
||||
result = smu7_copy_bytes_to_smc(
|
||||
hwmgr->smumgr,
|
||||
hwmgr,
|
||||
smu_data->smu7_data.dpm_table_start +
|
||||
offsetof(SMU71_Discrete_DpmTable,
|
||||
LowSclkInterruptThreshold),
|
||||
|
@ -2177,7 +2174,7 @@ int iceland_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
int result;
|
||||
bool error = false;
|
||||
|
||||
result = smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU71_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU71_Firmware_Header, DpmTable),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -2188,7 +2185,7 @@ int iceland_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
|
||||
error |= (0 != result);
|
||||
|
||||
result = smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU71_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU71_Firmware_Header, SoftRegisters),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -2201,7 +2198,7 @@ int iceland_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
error |= (0 != result);
|
||||
|
||||
|
||||
result = smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU71_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU71_Firmware_Header, mcRegisterTable),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -2210,7 +2207,7 @@ int iceland_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
smu7_data->mc_reg_table_start = tmp;
|
||||
}
|
||||
|
||||
result = smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU71_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU71_Firmware_Header, FanTable),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -2221,7 +2218,7 @@ int iceland_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
|
||||
error |= (0 != result);
|
||||
|
||||
result = smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU71_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU71_Firmware_Header, mcArbDramTimingTable),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -2233,7 +2230,7 @@ int iceland_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
error |= (0 != result);
|
||||
|
||||
|
||||
result = smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU71_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU71_Firmware_Header, Version),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -2244,7 +2241,7 @@ int iceland_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
|
||||
error |= (0 != result);
|
||||
|
||||
result = smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU71_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU71_Firmware_Header, UlvSettings),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
|
|
@ -39,55 +39,55 @@
|
|||
|
||||
#define ICELAND_SMC_SIZE 0x20000
|
||||
|
||||
static int iceland_start_smc(struct pp_smumgr *smumgr)
|
||||
static int iceland_start_smc(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
SMUM_WRITE_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
|
||||
SMUM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
SMC_SYSCON_RESET_CNTL, rst_reg, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void iceland_reset_smc(struct pp_smumgr *smumgr)
|
||||
static void iceland_reset_smc(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
SMUM_WRITE_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
|
||||
SMUM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
SMC_SYSCON_RESET_CNTL,
|
||||
rst_reg, 1);
|
||||
}
|
||||
|
||||
|
||||
static void iceland_stop_smc_clock(struct pp_smumgr *smumgr)
|
||||
static void iceland_stop_smc_clock(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
SMUM_WRITE_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
|
||||
SMUM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
SMC_SYSCON_CLOCK_CNTL_0,
|
||||
ck_disable, 1);
|
||||
}
|
||||
|
||||
static void iceland_start_smc_clock(struct pp_smumgr *smumgr)
|
||||
static void iceland_start_smc_clock(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
SMUM_WRITE_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
|
||||
SMUM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
SMC_SYSCON_CLOCK_CNTL_0,
|
||||
ck_disable, 0);
|
||||
}
|
||||
|
||||
static int iceland_smu_start_smc(struct pp_smumgr *smumgr)
|
||||
static int iceland_smu_start_smc(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
/* set smc instruct start point at 0x0 */
|
||||
smu7_program_jump_on_start(smumgr);
|
||||
smu7_program_jump_on_start(hwmgr);
|
||||
|
||||
/* enable smc clock */
|
||||
iceland_start_smc_clock(smumgr);
|
||||
iceland_start_smc_clock(hwmgr);
|
||||
|
||||
/* de-assert reset */
|
||||
iceland_start_smc(smumgr);
|
||||
iceland_start_smc(hwmgr);
|
||||
|
||||
SMUM_WAIT_INDIRECT_FIELD(smumgr, SMC_IND, FIRMWARE_FLAGS,
|
||||
SMUM_WAIT_INDIRECT_FIELD(hwmgr, SMC_IND, FIRMWARE_FLAGS,
|
||||
INTERRUPTS_ENABLED, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int iceland_upload_smc_firmware_data(struct pp_smumgr *smumgr,
|
||||
static int iceland_upload_smc_firmware_data(struct pp_hwmgr *hwmgr,
|
||||
uint32_t length, const uint8_t *src,
|
||||
uint32_t limit, uint32_t start_addr)
|
||||
{
|
||||
|
@ -96,17 +96,17 @@ static int iceland_upload_smc_firmware_data(struct pp_smumgr *smumgr,
|
|||
|
||||
PP_ASSERT_WITH_CODE((limit >= byte_count), "SMC address is beyond the SMC RAM area.", return -EINVAL);
|
||||
|
||||
cgs_write_register(smumgr->device, mmSMC_IND_INDEX_0, start_addr);
|
||||
SMUM_WRITE_FIELD(smumgr->device, SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_0, 1);
|
||||
cgs_write_register(hwmgr->device, mmSMC_IND_INDEX_0, start_addr);
|
||||
SMUM_WRITE_FIELD(hwmgr->device, SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_0, 1);
|
||||
|
||||
while (byte_count >= 4) {
|
||||
data = src[0] * 0x1000000 + src[1] * 0x10000 + src[2] * 0x100 + src[3];
|
||||
cgs_write_register(smumgr->device, mmSMC_IND_DATA_0, data);
|
||||
cgs_write_register(hwmgr->device, mmSMC_IND_DATA_0, data);
|
||||
src += 4;
|
||||
byte_count -= 4;
|
||||
}
|
||||
|
||||
SMUM_WRITE_FIELD(smumgr->device, SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_0, 0);
|
||||
SMUM_WRITE_FIELD(hwmgr->device, SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_0, 0);
|
||||
|
||||
PP_ASSERT_WITH_CODE((0 == byte_count), "SMC size must be dividable by 4.", return -EINVAL);
|
||||
|
||||
|
@ -114,16 +114,16 @@ static int iceland_upload_smc_firmware_data(struct pp_smumgr *smumgr,
|
|||
}
|
||||
|
||||
|
||||
static int iceland_smu_upload_firmware_image(struct pp_smumgr *smumgr)
|
||||
static int iceland_smu_upload_firmware_image(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
uint32_t val;
|
||||
struct cgs_firmware_info info = {0};
|
||||
|
||||
if (smumgr == NULL || smumgr->device == NULL)
|
||||
if (hwmgr == NULL || hwmgr->device == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
/* load SMC firmware */
|
||||
cgs_get_firmware_info(smumgr->device,
|
||||
cgs_get_firmware_info(hwmgr->device,
|
||||
smu7_convert_fw_type_to_cgs(UCODE_ID_SMU), &info);
|
||||
|
||||
if (info.image_size & 3) {
|
||||
|
@ -137,56 +137,56 @@ static int iceland_smu_upload_firmware_image(struct pp_smumgr *smumgr)
|
|||
}
|
||||
|
||||
/* wait for smc boot up */
|
||||
SMUM_WAIT_INDIRECT_FIELD_UNEQUAL(smumgr, SMC_IND,
|
||||
SMUM_WAIT_INDIRECT_FIELD_UNEQUAL(hwmgr, SMC_IND,
|
||||
RCU_UC_EVENTS, boot_seq_done, 0);
|
||||
|
||||
/* clear firmware interrupt enable flag */
|
||||
val = cgs_read_ind_register(smumgr->device, CGS_IND_REG__SMC,
|
||||
val = cgs_read_ind_register(hwmgr->device, CGS_IND_REG__SMC,
|
||||
ixSMC_SYSCON_MISC_CNTL);
|
||||
cgs_write_ind_register(smumgr->device, CGS_IND_REG__SMC,
|
||||
cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC,
|
||||
ixSMC_SYSCON_MISC_CNTL, val | 1);
|
||||
|
||||
/* stop smc clock */
|
||||
iceland_stop_smc_clock(smumgr);
|
||||
iceland_stop_smc_clock(hwmgr);
|
||||
|
||||
/* reset smc */
|
||||
iceland_reset_smc(smumgr);
|
||||
iceland_upload_smc_firmware_data(smumgr, info.image_size,
|
||||
iceland_reset_smc(hwmgr);
|
||||
iceland_upload_smc_firmware_data(hwmgr, info.image_size,
|
||||
(uint8_t *)info.kptr, ICELAND_SMC_SIZE,
|
||||
info.ucode_start_address);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int iceland_request_smu_load_specific_fw(struct pp_smumgr *smumgr,
|
||||
static int iceland_request_smu_load_specific_fw(struct pp_hwmgr *hwmgr,
|
||||
uint32_t firmwareType)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int iceland_start_smu(struct pp_smumgr *smumgr)
|
||||
static int iceland_start_smu(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
int result;
|
||||
|
||||
result = iceland_smu_upload_firmware_image(smumgr);
|
||||
result = iceland_smu_upload_firmware_image(hwmgr);
|
||||
if (result)
|
||||
return result;
|
||||
result = iceland_smu_start_smc(smumgr);
|
||||
result = iceland_smu_start_smc(hwmgr);
|
||||
if (result)
|
||||
return result;
|
||||
|
||||
if (!smu7_is_smc_ram_running(smumgr)) {
|
||||
if (!smu7_is_smc_ram_running(hwmgr)) {
|
||||
pr_info("smu not running, upload firmware again \n");
|
||||
result = iceland_smu_upload_firmware_image(smumgr);
|
||||
result = iceland_smu_upload_firmware_image(hwmgr);
|
||||
if (result)
|
||||
return result;
|
||||
|
||||
result = iceland_smu_start_smc(smumgr);
|
||||
result = iceland_smu_start_smc(hwmgr);
|
||||
if (result)
|
||||
return result;
|
||||
}
|
||||
|
||||
result = smu7_request_smu_load_fw(smumgr);
|
||||
result = smu7_request_smu_load_fw(hwmgr);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -198,7 +198,7 @@ static int iceland_start_smu(struct pp_smumgr *smumgr)
|
|||
* @param smcAddress the address in the SMC RAM to access.
|
||||
* @param value to write to the SMC SRAM.
|
||||
*/
|
||||
static int iceland_smu_init(struct pp_smumgr *smumgr)
|
||||
static int iceland_smu_init(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
int i;
|
||||
struct iceland_smumgr *iceland_priv = NULL;
|
||||
|
@ -208,9 +208,9 @@ static int iceland_smu_init(struct pp_smumgr *smumgr)
|
|||
if (iceland_priv == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
smumgr->backend = iceland_priv;
|
||||
hwmgr->smumgr->backend = iceland_priv;
|
||||
|
||||
if (smu7_init(smumgr))
|
||||
if (smu7_init(hwmgr))
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 0; i < SMU71_MAX_LEVELS_GRAPHICS; i++)
|
||||
|
|
|
@ -231,7 +231,7 @@ static int polaris10_populate_dw8(struct pp_hwmgr *hwmgr, uint32_t fuse_table_of
|
|||
const struct polaris10_pt_defaults *defaults = smu_data->power_tune_defaults;
|
||||
uint32_t temp;
|
||||
|
||||
if (smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
if (smu7_read_smc_sram_dword(hwmgr,
|
||||
fuse_table_offset +
|
||||
offsetof(SMU74_Discrete_PmFuses, TdcWaterfallCtl),
|
||||
(uint32_t *)&temp, SMC_RAM_END))
|
||||
|
@ -315,7 +315,7 @@ static int polaris10_populate_pm_fuses(struct pp_hwmgr *hwmgr)
|
|||
|
||||
if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
|
||||
PHM_PlatformCaps_PowerContainment)) {
|
||||
if (smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
if (smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU7_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU74_Firmware_Header, PmFuseTable),
|
||||
&pm_fuse_table_offset, SMC_RAM_END))
|
||||
|
@ -358,7 +358,7 @@ static int polaris10_populate_pm_fuses(struct pp_hwmgr *hwmgr)
|
|||
"Attempt to populate BapmVddCBaseLeakage Hi and Lo "
|
||||
"Sidd Failed!", return -EINVAL);
|
||||
|
||||
if (smu7_copy_bytes_to_smc(hwmgr->smumgr, pm_fuse_table_offset,
|
||||
if (smu7_copy_bytes_to_smc(hwmgr, pm_fuse_table_offset,
|
||||
(uint8_t *)&smu_data->power_tune_table,
|
||||
(sizeof(struct SMU74_Discrete_PmFuses) - 92), SMC_RAM_END))
|
||||
PP_ASSERT_WITH_CODE(false,
|
||||
|
@ -484,7 +484,6 @@ static int polaris10_populate_ulv_level(struct pp_hwmgr *hwmgr,
|
|||
struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
|
||||
struct phm_ppt_v1_information *table_info =
|
||||
(struct phm_ppt_v1_information *)(hwmgr->pptable);
|
||||
struct pp_smumgr *smumgr = hwmgr->smumgr;
|
||||
|
||||
state->CcPwrDynRm = 0;
|
||||
state->CcPwrDynRm1 = 0;
|
||||
|
@ -493,7 +492,7 @@ static int polaris10_populate_ulv_level(struct pp_hwmgr *hwmgr,
|
|||
state->VddcOffsetVid = (uint8_t)(table_info->us_ulv_voltage_offset *
|
||||
VOLTAGE_VID_OFFSET_SCALE2 / VOLTAGE_VID_OFFSET_SCALE1);
|
||||
|
||||
if (smumgr->chip_id == CHIP_POLARIS12 || smumgr->is_kicker)
|
||||
if (hwmgr->chip_id == CHIP_POLARIS12 || hwmgr->smumgr->is_kicker)
|
||||
state->VddcPhase = data->vddc_phase_shed_control ^ 0x3;
|
||||
else
|
||||
state->VddcPhase = (data->vddc_phase_shed_control) ? 0 : 1;
|
||||
|
@ -546,8 +545,7 @@ static int polaris10_populate_smc_link_level(struct pp_hwmgr *hwmgr,
|
|||
static void polaris10_get_sclk_range_table(struct pp_hwmgr *hwmgr,
|
||||
SMU74_Discrete_DpmTable *table)
|
||||
{
|
||||
struct pp_smumgr *smumgr = hwmgr->smumgr;
|
||||
struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(smumgr->backend);
|
||||
struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(hwmgr->smumgr->backend);
|
||||
uint32_t i, ref_clk;
|
||||
|
||||
struct pp_atom_ctrl_sclk_range_table range_table_from_vbios = { { {0} } };
|
||||
|
@ -597,8 +595,7 @@ static void polaris10_get_sclk_range_table(struct pp_hwmgr *hwmgr,
|
|||
static int polaris10_calculate_sclk_params(struct pp_hwmgr *hwmgr,
|
||||
uint32_t clock, SMU_SclkSetting *sclk_setting)
|
||||
{
|
||||
struct pp_smumgr *smumgr = hwmgr->smumgr;
|
||||
struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(smumgr->backend);
|
||||
struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(hwmgr->smumgr->backend);
|
||||
const SMU74_Discrete_DpmTable *table = &(smu_data->smc_state_table);
|
||||
struct pp_atomctrl_clock_dividers_ai dividers;
|
||||
uint32_t ref_clock;
|
||||
|
@ -741,9 +738,8 @@ static int polaris10_populate_single_graphic_level(struct pp_hwmgr *hwmgr,
|
|||
*/
|
||||
int polaris10_populate_all_graphic_levels(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct pp_smumgr *smumgr = hwmgr->smumgr;
|
||||
struct smu7_hwmgr *hw_data = (struct smu7_hwmgr *)(hwmgr->backend);
|
||||
struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(smumgr->backend);
|
||||
struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(hwmgr->smumgr->backend);
|
||||
struct smu7_dpm_table *dpm_table = &hw_data->dpm_table;
|
||||
struct phm_ppt_v1_information *table_info =
|
||||
(struct phm_ppt_v1_information *)(hwmgr->pptable);
|
||||
|
@ -828,7 +824,7 @@ int polaris10_populate_all_graphic_levels(struct pp_hwmgr *hwmgr)
|
|||
levels[1].pcieDpmLevel = mid_pcie_level_enabled;
|
||||
}
|
||||
/* level count will send to smc once at init smc table and never change */
|
||||
result = smu7_copy_bytes_to_smc(smumgr, array, (uint8_t *)levels,
|
||||
result = smu7_copy_bytes_to_smc(hwmgr, array, (uint8_t *)levels,
|
||||
(uint32_t)array_size, SMC_RAM_END);
|
||||
|
||||
return result;
|
||||
|
@ -890,9 +886,8 @@ static int polaris10_populate_single_memory_level(struct pp_hwmgr *hwmgr,
|
|||
*/
|
||||
int polaris10_populate_all_memory_levels(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct pp_smumgr *smumgr = hwmgr->smumgr;
|
||||
struct smu7_hwmgr *hw_data = (struct smu7_hwmgr *)(hwmgr->backend);
|
||||
struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(smumgr->backend);
|
||||
struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(hwmgr->smumgr->backend);
|
||||
struct smu7_dpm_table *dpm_table = &hw_data->dpm_table;
|
||||
int result;
|
||||
/* populate MCLK dpm table to SMU7 */
|
||||
|
@ -933,7 +928,7 @@ int polaris10_populate_all_memory_levels(struct pp_hwmgr *hwmgr)
|
|||
phm_get_dpm_level_enable_mask_value(&dpm_table->mclk_table);
|
||||
|
||||
/* level count will send to smc once at init smc table and never change */
|
||||
result = smu7_copy_bytes_to_smc(hwmgr->smumgr, array, (uint8_t *)levels,
|
||||
result = smu7_copy_bytes_to_smc(hwmgr, array, (uint8_t *)levels,
|
||||
(uint32_t)array_size, SMC_RAM_END);
|
||||
|
||||
return result;
|
||||
|
@ -1191,9 +1186,8 @@ static int polaris10_populate_memory_timing_parameters(struct pp_hwmgr *hwmgr,
|
|||
|
||||
static int polaris10_program_memory_timing_parameters(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct pp_smumgr *smumgr = hwmgr->smumgr;
|
||||
struct smu7_hwmgr *hw_data = (struct smu7_hwmgr *)(hwmgr->backend);
|
||||
struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(smumgr->backend);
|
||||
struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(hwmgr->smumgr->backend);
|
||||
struct SMU74_Discrete_MCArbDramTimingTable arb_regs;
|
||||
uint32_t i, j;
|
||||
int result = 0;
|
||||
|
@ -1212,7 +1206,7 @@ static int polaris10_program_memory_timing_parameters(struct pp_hwmgr *hwmgr)
|
|||
}
|
||||
|
||||
result = smu7_copy_bytes_to_smc(
|
||||
hwmgr->smumgr,
|
||||
hwmgr,
|
||||
smu_data->smu7_data.arb_table_start,
|
||||
(uint8_t *)&arb_regs,
|
||||
sizeof(SMU74_Discrete_MCArbDramTimingTable),
|
||||
|
@ -1311,9 +1305,8 @@ static int polaris10_populate_smc_boot_level(struct pp_hwmgr *hwmgr,
|
|||
|
||||
static int polaris10_populate_smc_initailial_state(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct pp_smumgr *smumgr = hwmgr->smumgr;
|
||||
struct smu7_hwmgr *hw_data = (struct smu7_hwmgr *)(hwmgr->backend);
|
||||
struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(smumgr->backend);
|
||||
struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(hwmgr->smumgr->backend);
|
||||
struct phm_ppt_v1_information *table_info =
|
||||
(struct phm_ppt_v1_information *)(hwmgr->pptable);
|
||||
uint8_t count, level;
|
||||
|
@ -1344,8 +1337,7 @@ static int polaris10_populate_smc_initailial_state(struct pp_hwmgr *hwmgr)
|
|||
static int polaris10_populate_clock_stretcher_data_table(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
uint32_t ro, efuse, volt_without_cks, volt_with_cks, value, max, min;
|
||||
struct pp_smumgr *smumgr = hwmgr->smumgr;
|
||||
struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(smumgr->backend);
|
||||
struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(hwmgr->smumgr->backend);
|
||||
|
||||
uint8_t i, stretch_amount, stretch_amount2, volt_offset = 0;
|
||||
struct phm_ppt_v1_information *table_info =
|
||||
|
@ -1472,8 +1464,7 @@ static int polaris10_populate_vr_config(struct pp_hwmgr *hwmgr,
|
|||
static int polaris10_populate_avfs_parameters(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
|
||||
struct pp_smumgr *smumgr = hwmgr->smumgr;
|
||||
struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(smumgr->backend);
|
||||
struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(hwmgr->smumgr->backend);
|
||||
|
||||
SMU74_Discrete_DpmTable *table = &(smu_data->smc_state_table);
|
||||
int result = 0;
|
||||
|
@ -1524,20 +1515,20 @@ static int polaris10_populate_avfs_parameters(struct pp_hwmgr *hwmgr)
|
|||
AVFS_SclkOffset.Sclk_Offset[i] = PP_HOST_TO_SMC_US((uint16_t)(sclk_table->entries[i].sclk_offset) / 100);
|
||||
}
|
||||
|
||||
result = smu7_read_smc_sram_dword(smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU7_FIRMWARE_HEADER_LOCATION + offsetof(SMU74_Firmware_Header, AvfsMeanNSigma),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
||||
smu7_copy_bytes_to_smc(smumgr,
|
||||
smu7_copy_bytes_to_smc(hwmgr,
|
||||
tmp,
|
||||
(uint8_t *)&AVFS_meanNsigma,
|
||||
sizeof(AVFS_meanNsigma_t),
|
||||
SMC_RAM_END);
|
||||
|
||||
result = smu7_read_smc_sram_dword(smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU7_FIRMWARE_HEADER_LOCATION + offsetof(SMU74_Firmware_Header, AvfsSclkOffsetTable),
|
||||
&tmp, SMC_RAM_END);
|
||||
smu7_copy_bytes_to_smc(smumgr,
|
||||
smu7_copy_bytes_to_smc(hwmgr,
|
||||
tmp,
|
||||
(uint8_t *)&AVFS_SclkOffset,
|
||||
sizeof(AVFS_Sclk_Offset_t),
|
||||
|
@ -1559,9 +1550,9 @@ static int polaris10_populate_avfs_parameters(struct pp_hwmgr *hwmgr)
|
|||
* @param hwmgr the address of the powerplay hardware manager.
|
||||
* @return always 0
|
||||
*/
|
||||
static int polaris10_init_arb_table_index(struct pp_smumgr *smumgr)
|
||||
static int polaris10_init_arb_table_index(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(smumgr->backend);
|
||||
struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(hwmgr->smumgr->backend);
|
||||
uint32_t tmp;
|
||||
int result;
|
||||
|
||||
|
@ -1573,7 +1564,7 @@ static int polaris10_init_arb_table_index(struct pp_smumgr *smumgr)
|
|||
* In reality this field should not be in that structure
|
||||
* but in a soft register.
|
||||
*/
|
||||
result = smu7_read_smc_sram_dword(smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
smu_data->smu7_data.arb_table_start, &tmp, SMC_RAM_END);
|
||||
|
||||
if (result)
|
||||
|
@ -1582,7 +1573,7 @@ static int polaris10_init_arb_table_index(struct pp_smumgr *smumgr)
|
|||
tmp &= 0x00FFFFFF;
|
||||
tmp |= ((uint32_t)MC_CG_ARB_FREQ_F1) << 24;
|
||||
|
||||
return smu7_write_smc_sram_dword(smumgr,
|
||||
return smu7_write_smc_sram_dword(hwmgr,
|
||||
smu_data->smu7_data.arb_table_start, tmp, SMC_RAM_END);
|
||||
}
|
||||
|
||||
|
@ -1648,9 +1639,8 @@ static void polaris10_save_default_power_profile(struct pp_hwmgr *hwmgr)
|
|||
int polaris10_init_smc_table(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
int result;
|
||||
struct pp_smumgr *smumgr = hwmgr->smumgr;
|
||||
struct smu7_hwmgr *hw_data = (struct smu7_hwmgr *)(hwmgr->backend);
|
||||
struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(smumgr->backend);
|
||||
struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(hwmgr->smumgr->backend);
|
||||
struct phm_ppt_v1_information *table_info =
|
||||
(struct phm_ppt_v1_information *)(hwmgr->pptable);
|
||||
struct SMU74_Discrete_DpmTable *table = &(smu_data->smc_state_table);
|
||||
|
@ -1842,7 +1832,7 @@ int polaris10_init_smc_table(struct pp_hwmgr *hwmgr)
|
|||
CONVERT_FROM_HOST_TO_SMC_US(table->PhaseResponseTime);
|
||||
|
||||
/* Upload all dpm data to SMC memory.(dpm level, dpm level count etc) */
|
||||
result = smu7_copy_bytes_to_smc(hwmgr->smumgr,
|
||||
result = smu7_copy_bytes_to_smc(hwmgr,
|
||||
smu_data->smu7_data.dpm_table_start +
|
||||
offsetof(SMU74_Discrete_DpmTable, SystemFlags),
|
||||
(uint8_t *)&(table->SystemFlags),
|
||||
|
@ -1851,7 +1841,7 @@ int polaris10_init_smc_table(struct pp_hwmgr *hwmgr)
|
|||
PP_ASSERT_WITH_CODE(0 == result,
|
||||
"Failed to upload dpm data to SMC memory!", return result);
|
||||
|
||||
result = polaris10_init_arb_table_index(hwmgr->smumgr);
|
||||
result = polaris10_init_arb_table_index(hwmgr);
|
||||
PP_ASSERT_WITH_CODE(0 == result,
|
||||
"Failed to upload arb data to SMC memory!", return result);
|
||||
|
||||
|
@ -1878,17 +1868,16 @@ static int polaris10_program_mem_timing_parameters(struct pp_hwmgr *hwmgr)
|
|||
int polaris10_thermal_avfs_enable(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
int ret;
|
||||
struct pp_smumgr *smumgr = (struct pp_smumgr *)(hwmgr->smumgr);
|
||||
struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(smumgr->backend);
|
||||
struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(hwmgr->smumgr->backend);
|
||||
struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
|
||||
|
||||
if (smu_data->avfs.avfs_btc_status == AVFS_BTC_NOTSUPPORTED)
|
||||
return 0;
|
||||
|
||||
ret = smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
ret = smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetGBDroopSettings, data->avfs_vdroop_override_setting);
|
||||
|
||||
ret = (smum_send_msg_to_smc(smumgr, PPSMC_MSG_EnableAvfs) == 0) ?
|
||||
ret = (smum_send_msg_to_smc(hwmgr, PPSMC_MSG_EnableAvfs) == 0) ?
|
||||
0 : -1;
|
||||
|
||||
if (!ret)
|
||||
|
@ -1990,20 +1979,20 @@ int polaris10_thermal_setup_fan_table(struct pp_hwmgr *hwmgr)
|
|||
hwmgr->device, CGS_IND_REG__SMC,
|
||||
CG_MULT_THERMAL_CTRL, TEMP_SEL);
|
||||
|
||||
res = smu7_copy_bytes_to_smc(hwmgr->smumgr, smu_data->smu7_data.fan_table_start,
|
||||
res = smu7_copy_bytes_to_smc(hwmgr, smu_data->smu7_data.fan_table_start,
|
||||
(uint8_t *)&fan_table, (uint32_t)sizeof(fan_table),
|
||||
SMC_RAM_END);
|
||||
|
||||
if (!res && hwmgr->thermal_controller.
|
||||
advanceFanControlParameters.ucMinimumPWMLimit)
|
||||
res = smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
res = smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetFanMinPwm,
|
||||
hwmgr->thermal_controller.
|
||||
advanceFanControlParameters.ucMinimumPWMLimit);
|
||||
|
||||
if (!res && hwmgr->thermal_controller.
|
||||
advanceFanControlParameters.ulMinFanSCLKAcousticLimit)
|
||||
res = smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
res = smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetFanSclkTarget,
|
||||
hwmgr->thermal_controller.
|
||||
advanceFanControlParameters.ulMinFanSCLKAcousticLimit);
|
||||
|
@ -2041,7 +2030,7 @@ static int polaris10_update_uvd_smc_table(struct pp_hwmgr *hwmgr)
|
|||
PHM_PlatformCaps_UVDDPM) ||
|
||||
phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
|
||||
PHM_PlatformCaps_StablePState))
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_UVDDPM_SetEnabledMask,
|
||||
(uint32_t)(1 << smu_data->smc_state_table.UvdBootLevel));
|
||||
return 0;
|
||||
|
@ -2073,7 +2062,7 @@ static int polaris10_update_vce_smc_table(struct pp_hwmgr *hwmgr)
|
|||
CGS_IND_REG__SMC, mm_boot_level_offset, mm_boot_level_value);
|
||||
|
||||
if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_StablePState))
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_VCEDPM_SetEnabledMask,
|
||||
(uint32_t)1 << smu_data->smc_state_table.VceBootLevel);
|
||||
return 0;
|
||||
|
@ -2100,7 +2089,7 @@ static int polaris10_update_samu_smc_table(struct pp_hwmgr *hwmgr)
|
|||
|
||||
if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
|
||||
PHM_PlatformCaps_StablePState))
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SAMUDPM_SetEnabledMask,
|
||||
(uint32_t)(1 << smu_data->smc_state_table.SamuBootLevel));
|
||||
return 0;
|
||||
|
@ -2164,7 +2153,7 @@ int polaris10_update_sclk_threshold(struct pp_hwmgr *hwmgr)
|
|||
CONVERT_FROM_HOST_TO_SMC_UL(low_sclk_interrupt_threshold);
|
||||
|
||||
result = smu7_copy_bytes_to_smc(
|
||||
hwmgr->smumgr,
|
||||
hwmgr,
|
||||
smu_data->smu7_data.dpm_table_start +
|
||||
offsetof(SMU74_Discrete_DpmTable,
|
||||
LowSclkInterruptThreshold),
|
||||
|
@ -2258,7 +2247,7 @@ int polaris10_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
int result;
|
||||
bool error = false;
|
||||
|
||||
result = smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU7_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU74_Firmware_Header, DpmTable),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -2268,7 +2257,7 @@ int polaris10_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
|
||||
error |= (0 != result);
|
||||
|
||||
result = smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU7_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU74_Firmware_Header, SoftRegisters),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -2280,7 +2269,7 @@ int polaris10_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
|
||||
error |= (0 != result);
|
||||
|
||||
result = smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU7_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU74_Firmware_Header, mcRegisterTable),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -2288,7 +2277,7 @@ int polaris10_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
if (!result)
|
||||
smu_data->smu7_data.mc_reg_table_start = tmp;
|
||||
|
||||
result = smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU7_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU74_Firmware_Header, FanTable),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -2298,7 +2287,7 @@ int polaris10_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
|
||||
error |= (0 != result);
|
||||
|
||||
result = smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU7_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU74_Firmware_Header, mcArbDramTimingTable),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -2308,7 +2297,7 @@ int polaris10_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
|
||||
error |= (0 != result);
|
||||
|
||||
result = smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU7_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU74_Firmware_Header, Version),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -2349,6 +2338,6 @@ int polaris10_populate_requested_graphic_levels(struct pp_hwmgr *hwmgr,
|
|||
levels[i].DownHyst = request->down_hyst;
|
||||
}
|
||||
|
||||
return smu7_copy_bytes_to_smc(hwmgr->smumgr, array, (uint8_t *)levels,
|
||||
return smu7_copy_bytes_to_smc(hwmgr, array, (uint8_t *)levels,
|
||||
array_size, SMC_RAM_END);
|
||||
}
|
||||
|
|
|
@ -60,21 +60,21 @@ static const SMU74_Discrete_GraphicsLevel avfs_graphics_level_polaris10[8] = {
|
|||
static const SMU74_Discrete_MemoryLevel avfs_memory_level_polaris10 = {
|
||||
0x100ea446, 0, 0x30750000, 0x01, 0x01, 0x01, 0x00, 0x00, 0x64, 0x00, 0x00, 0x1f00, 0x00, 0x00};
|
||||
|
||||
static int polaris10_setup_pwr_virus(struct pp_smumgr *smumgr)
|
||||
static int polaris10_setup_pwr_virus(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
int i;
|
||||
int result = -EINVAL;
|
||||
uint32_t reg, data;
|
||||
|
||||
const PWR_Command_Table *pvirus = pwr_virus_table;
|
||||
struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(smumgr->backend);
|
||||
struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(hwmgr->smumgr->backend);
|
||||
|
||||
for (i = 0; i < PWR_VIRUS_TABLE_SIZE; i++) {
|
||||
switch (pvirus->command) {
|
||||
case PwrCmdWrite:
|
||||
reg = pvirus->reg;
|
||||
data = pvirus->data;
|
||||
cgs_write_register(smumgr->device, reg, data);
|
||||
cgs_write_register(hwmgr->device, reg, data);
|
||||
break;
|
||||
|
||||
case PwrCmdEnd:
|
||||
|
@ -93,13 +93,13 @@ static int polaris10_setup_pwr_virus(struct pp_smumgr *smumgr)
|
|||
return result;
|
||||
}
|
||||
|
||||
static int polaris10_perform_btc(struct pp_smumgr *smumgr)
|
||||
static int polaris10_perform_btc(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
int result = 0;
|
||||
struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(smumgr->backend);
|
||||
struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(hwmgr->smumgr->backend);
|
||||
|
||||
if (0 != smu_data->avfs.avfs_btc_param) {
|
||||
if (0 != smu7_send_msg_to_smc_with_parameter(smumgr, PPSMC_MSG_PerformBtc, smu_data->avfs.avfs_btc_param)) {
|
||||
if (0 != smu7_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_PerformBtc, smu_data->avfs.avfs_btc_param)) {
|
||||
pr_info("[AVFS][SmuPolaris10_PerformBtc] PerformBTC SMU msg failed");
|
||||
result = -1;
|
||||
}
|
||||
|
@ -107,16 +107,16 @@ static int polaris10_perform_btc(struct pp_smumgr *smumgr)
|
|||
if (smu_data->avfs.avfs_btc_param > 1) {
|
||||
/* Soft-Reset to reset the engine before loading uCode */
|
||||
/* halt */
|
||||
cgs_write_register(smumgr->device, mmCP_MEC_CNTL, 0x50000000);
|
||||
cgs_write_register(hwmgr->device, mmCP_MEC_CNTL, 0x50000000);
|
||||
/* reset everything */
|
||||
cgs_write_register(smumgr->device, mmGRBM_SOFT_RESET, 0xffffffff);
|
||||
cgs_write_register(smumgr->device, mmGRBM_SOFT_RESET, 0);
|
||||
cgs_write_register(hwmgr->device, mmGRBM_SOFT_RESET, 0xffffffff);
|
||||
cgs_write_register(hwmgr->device, mmGRBM_SOFT_RESET, 0);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
static int polaris10_setup_graphics_level_structure(struct pp_smumgr *smumgr)
|
||||
static int polaris10_setup_graphics_level_structure(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
uint32_t vr_config;
|
||||
uint32_t dpm_table_start;
|
||||
|
@ -127,7 +127,7 @@ static int polaris10_setup_graphics_level_structure(struct pp_smumgr *smumgr)
|
|||
graphics_level_size = sizeof(avfs_graphics_level_polaris10);
|
||||
u16_boot_mvdd = PP_HOST_TO_SMC_US(1300 * VOLTAGE_SCALE);
|
||||
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_read_smc_sram_dword(smumgr,
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU7_FIRMWARE_HEADER_LOCATION + offsetof(SMU74_Firmware_Header, DpmTable),
|
||||
&dpm_table_start, 0x40000),
|
||||
"[AVFS][Polaris10_SetupGfxLvlStruct] SMU could not communicate starting address of DPM table",
|
||||
|
@ -138,14 +138,14 @@ static int polaris10_setup_graphics_level_structure(struct pp_smumgr *smumgr)
|
|||
|
||||
vr_config_address = dpm_table_start + offsetof(SMU74_Discrete_DpmTable, VRConfig);
|
||||
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_copy_bytes_to_smc(smumgr, vr_config_address,
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_copy_bytes_to_smc(hwmgr, vr_config_address,
|
||||
(uint8_t *)&vr_config, sizeof(uint32_t), 0x40000),
|
||||
"[AVFS][Polaris10_SetupGfxLvlStruct] Problems copying VRConfig value over to SMC",
|
||||
return -1);
|
||||
|
||||
graphics_level_address = dpm_table_start + offsetof(SMU74_Discrete_DpmTable, GraphicsLevel);
|
||||
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_copy_bytes_to_smc(smumgr, graphics_level_address,
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_copy_bytes_to_smc(hwmgr, graphics_level_address,
|
||||
(uint8_t *)(&avfs_graphics_level_polaris10),
|
||||
graphics_level_size, 0x40000),
|
||||
"[AVFS][Polaris10_SetupGfxLvlStruct] Copying of SCLK DPM table failed!",
|
||||
|
@ -153,7 +153,7 @@ static int polaris10_setup_graphics_level_structure(struct pp_smumgr *smumgr)
|
|||
|
||||
graphics_level_address = dpm_table_start + offsetof(SMU74_Discrete_DpmTable, MemoryLevel);
|
||||
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_copy_bytes_to_smc(smumgr, graphics_level_address,
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_copy_bytes_to_smc(hwmgr, graphics_level_address,
|
||||
(uint8_t *)(&avfs_memory_level_polaris10), sizeof(avfs_memory_level_polaris10), 0x40000),
|
||||
"[AVFS][Polaris10_SetupGfxLvlStruct] Copying of MCLK DPM table failed!",
|
||||
return -1);
|
||||
|
@ -162,7 +162,7 @@ static int polaris10_setup_graphics_level_structure(struct pp_smumgr *smumgr)
|
|||
|
||||
graphics_level_address = dpm_table_start + offsetof(SMU74_Discrete_DpmTable, BootMVdd);
|
||||
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_copy_bytes_to_smc(smumgr, graphics_level_address,
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_copy_bytes_to_smc(hwmgr, graphics_level_address,
|
||||
(uint8_t *)(&u16_boot_mvdd), sizeof(u16_boot_mvdd), 0x40000),
|
||||
"[AVFS][Polaris10_SetupGfxLvlStruct] Copying of DPM table failed!",
|
||||
return -1);
|
||||
|
@ -172,9 +172,9 @@ static int polaris10_setup_graphics_level_structure(struct pp_smumgr *smumgr)
|
|||
|
||||
|
||||
static int
|
||||
polaris10_avfs_event_mgr(struct pp_smumgr *smumgr, bool SMU_VFT_INTACT)
|
||||
polaris10_avfs_event_mgr(struct pp_hwmgr *hwmgr, bool SMU_VFT_INTACT)
|
||||
{
|
||||
struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(smumgr->backend);
|
||||
struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(hwmgr->smumgr->backend);
|
||||
|
||||
switch (smu_data->avfs.avfs_btc_status) {
|
||||
case AVFS_BTC_COMPLETED_PREVIOUSLY:
|
||||
|
@ -183,20 +183,20 @@ polaris10_avfs_event_mgr(struct pp_smumgr *smumgr, bool SMU_VFT_INTACT)
|
|||
case AVFS_BTC_BOOT: /* Cold Boot State - Post SMU Start */
|
||||
|
||||
smu_data->avfs.avfs_btc_status = AVFS_BTC_DPMTABLESETUP_FAILED;
|
||||
PP_ASSERT_WITH_CODE(0 == polaris10_setup_graphics_level_structure(smumgr),
|
||||
PP_ASSERT_WITH_CODE(0 == polaris10_setup_graphics_level_structure(hwmgr),
|
||||
"[AVFS][Polaris10_AVFSEventMgr] Could not Copy Graphics Level table over to SMU",
|
||||
return -EINVAL);
|
||||
|
||||
if (smu_data->avfs.avfs_btc_param > 1) {
|
||||
pr_info("[AVFS][Polaris10_AVFSEventMgr] AC BTC has not been successfully verified on Fiji. There may be in this setting.");
|
||||
smu_data->avfs.avfs_btc_status = AVFS_BTC_VIRUS_FAIL;
|
||||
PP_ASSERT_WITH_CODE(0 == polaris10_setup_pwr_virus(smumgr),
|
||||
PP_ASSERT_WITH_CODE(0 == polaris10_setup_pwr_virus(hwmgr),
|
||||
"[AVFS][Polaris10_AVFSEventMgr] Could not setup Pwr Virus for AVFS ",
|
||||
return -EINVAL);
|
||||
}
|
||||
|
||||
smu_data->avfs.avfs_btc_status = AVFS_BTC_FAILED;
|
||||
PP_ASSERT_WITH_CODE(0 == polaris10_perform_btc(smumgr),
|
||||
PP_ASSERT_WITH_CODE(0 == polaris10_perform_btc(hwmgr),
|
||||
"[AVFS][Polaris10_AVFSEventMgr] Failure at SmuPolaris10_PerformBTC. AVFS Disabled",
|
||||
return -EINVAL);
|
||||
smu_data->avfs.avfs_btc_status = AVFS_BTC_ENABLEAVFS;
|
||||
|
@ -215,7 +215,7 @@ polaris10_avfs_event_mgr(struct pp_smumgr *smumgr, bool SMU_VFT_INTACT)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int polaris10_start_smu_in_protection_mode(struct pp_smumgr *smumgr)
|
||||
static int polaris10_start_smu_in_protection_mode(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
|
@ -223,138 +223,138 @@ static int polaris10_start_smu_in_protection_mode(struct pp_smumgr *smumgr)
|
|||
/* SMUM_WAIT_VFPF_INDIRECT_FIELD_UNEQUAL(smumgr, SMC_IND, RCU_UC_EVENTS, boot_seq_done, 0) */
|
||||
|
||||
/* Assert reset */
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
SMC_SYSCON_RESET_CNTL, rst_reg, 1);
|
||||
|
||||
result = smu7_upload_smu_firmware_image(smumgr);
|
||||
result = smu7_upload_smu_firmware_image(hwmgr);
|
||||
if (result != 0)
|
||||
return result;
|
||||
|
||||
/* Clear status */
|
||||
cgs_write_ind_register(smumgr->device, CGS_IND_REG__SMC, ixSMU_STATUS, 0);
|
||||
cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixSMU_STATUS, 0);
|
||||
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
SMC_SYSCON_CLOCK_CNTL_0, ck_disable, 0);
|
||||
|
||||
/* De-assert reset */
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
SMC_SYSCON_RESET_CNTL, rst_reg, 0);
|
||||
|
||||
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD(smumgr, SMC_IND, RCU_UC_EVENTS, INTERRUPTS_ENABLED, 1);
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD(hwmgr, SMC_IND, RCU_UC_EVENTS, INTERRUPTS_ENABLED, 1);
|
||||
|
||||
|
||||
/* Call Test SMU message with 0x20000 offset to trigger SMU start */
|
||||
smu7_send_msg_to_smc_offset(smumgr);
|
||||
smu7_send_msg_to_smc_offset(hwmgr);
|
||||
|
||||
/* Wait done bit to be set */
|
||||
/* Check pass/failed indicator */
|
||||
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD_UNEQUAL(smumgr, SMC_IND, SMU_STATUS, SMU_DONE, 0);
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD_UNEQUAL(hwmgr, SMC_IND, SMU_STATUS, SMU_DONE, 0);
|
||||
|
||||
if (1 != SMUM_READ_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
|
||||
if (1 != SMUM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
SMU_STATUS, SMU_PASS))
|
||||
PP_ASSERT_WITH_CODE(false, "SMU Firmware start failed!", return -1);
|
||||
|
||||
cgs_write_ind_register(smumgr->device, CGS_IND_REG__SMC, ixFIRMWARE_FLAGS, 0);
|
||||
cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixFIRMWARE_FLAGS, 0);
|
||||
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
SMC_SYSCON_RESET_CNTL, rst_reg, 1);
|
||||
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
SMC_SYSCON_RESET_CNTL, rst_reg, 0);
|
||||
|
||||
/* Wait for firmware to initialize */
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD(smumgr, SMC_IND, FIRMWARE_FLAGS, INTERRUPTS_ENABLED, 1);
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD(hwmgr, SMC_IND, FIRMWARE_FLAGS, INTERRUPTS_ENABLED, 1);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static int polaris10_start_smu_in_non_protection_mode(struct pp_smumgr *smumgr)
|
||||
static int polaris10_start_smu_in_non_protection_mode(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
/* wait for smc boot up */
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD_UNEQUAL(smumgr, SMC_IND, RCU_UC_EVENTS, boot_seq_done, 0);
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD_UNEQUAL(hwmgr, SMC_IND, RCU_UC_EVENTS, boot_seq_done, 0);
|
||||
|
||||
/* Clear firmware interrupt enable flag */
|
||||
/* SMUM_WRITE_VFPF_INDIRECT_FIELD(pSmuMgr, SMC_IND, SMC_SYSCON_MISC_CNTL, pre_fetcher_en, 1); */
|
||||
cgs_write_ind_register(smumgr->device, CGS_IND_REG__SMC,
|
||||
cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC,
|
||||
ixFIRMWARE_FLAGS, 0);
|
||||
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
SMC_SYSCON_RESET_CNTL,
|
||||
rst_reg, 1);
|
||||
|
||||
result = smu7_upload_smu_firmware_image(smumgr);
|
||||
result = smu7_upload_smu_firmware_image(hwmgr);
|
||||
if (result != 0)
|
||||
return result;
|
||||
|
||||
/* Set smc instruct start point at 0x0 */
|
||||
smu7_program_jump_on_start(smumgr);
|
||||
smu7_program_jump_on_start(hwmgr);
|
||||
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
SMC_SYSCON_CLOCK_CNTL_0, ck_disable, 0);
|
||||
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
SMC_SYSCON_RESET_CNTL, rst_reg, 0);
|
||||
|
||||
/* Wait for firmware to initialize */
|
||||
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD(smumgr, SMC_IND,
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD(hwmgr, SMC_IND,
|
||||
FIRMWARE_FLAGS, INTERRUPTS_ENABLED, 1);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static int polaris10_start_smu(struct pp_smumgr *smumgr)
|
||||
static int polaris10_start_smu(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
int result = 0;
|
||||
struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(smumgr->backend);
|
||||
struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(hwmgr->smumgr->backend);
|
||||
bool SMU_VFT_INTACT;
|
||||
|
||||
/* Only start SMC if SMC RAM is not running */
|
||||
if (!smu7_is_smc_ram_running(smumgr)) {
|
||||
if (!smu7_is_smc_ram_running(hwmgr)) {
|
||||
SMU_VFT_INTACT = false;
|
||||
smu_data->protected_mode = (uint8_t) (SMUM_READ_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC, SMU_FIRMWARE, SMU_MODE));
|
||||
smu_data->smu7_data.security_hard_key = (uint8_t) (SMUM_READ_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC, SMU_FIRMWARE, SMU_SEL));
|
||||
smu_data->protected_mode = (uint8_t) (SMUM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, SMU_FIRMWARE, SMU_MODE));
|
||||
smu_data->smu7_data.security_hard_key = (uint8_t) (SMUM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, SMU_FIRMWARE, SMU_SEL));
|
||||
|
||||
/* Check if SMU is running in protected mode */
|
||||
if (smu_data->protected_mode == 0) {
|
||||
result = polaris10_start_smu_in_non_protection_mode(smumgr);
|
||||
result = polaris10_start_smu_in_non_protection_mode(hwmgr);
|
||||
} else {
|
||||
result = polaris10_start_smu_in_protection_mode(smumgr);
|
||||
result = polaris10_start_smu_in_protection_mode(hwmgr);
|
||||
|
||||
/* If failed, try with different security Key. */
|
||||
if (result != 0) {
|
||||
smu_data->smu7_data.security_hard_key ^= 1;
|
||||
cgs_rel_firmware(smumgr->device, CGS_UCODE_ID_SMU);
|
||||
result = polaris10_start_smu_in_protection_mode(smumgr);
|
||||
cgs_rel_firmware(hwmgr->device, CGS_UCODE_ID_SMU);
|
||||
result = polaris10_start_smu_in_protection_mode(hwmgr);
|
||||
}
|
||||
}
|
||||
|
||||
if (result != 0)
|
||||
PP_ASSERT_WITH_CODE(0, "Failed to load SMU ucode.", return result);
|
||||
|
||||
polaris10_avfs_event_mgr(smumgr, true);
|
||||
polaris10_avfs_event_mgr(hwmgr, true);
|
||||
} else
|
||||
SMU_VFT_INTACT = true; /*Driver went offline but SMU was still alive and contains the VFT table */
|
||||
|
||||
polaris10_avfs_event_mgr(smumgr, SMU_VFT_INTACT);
|
||||
polaris10_avfs_event_mgr(hwmgr, SMU_VFT_INTACT);
|
||||
/* Setup SoftRegsStart here for register lookup in case DummyBackEnd is used and ProcessFirmwareHeader is not executed */
|
||||
smu7_read_smc_sram_dword(smumgr, SMU7_FIRMWARE_HEADER_LOCATION + offsetof(SMU74_Firmware_Header, SoftRegisters),
|
||||
smu7_read_smc_sram_dword(hwmgr, SMU7_FIRMWARE_HEADER_LOCATION + offsetof(SMU74_Firmware_Header, SoftRegisters),
|
||||
&(smu_data->smu7_data.soft_regs_start), 0x40000);
|
||||
|
||||
result = smu7_request_smu_load_fw(smumgr);
|
||||
result = smu7_request_smu_load_fw(hwmgr);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static bool polaris10_is_hw_avfs_present(struct pp_smumgr *smumgr)
|
||||
static bool polaris10_is_hw_avfs_present(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
uint32_t efuse;
|
||||
|
||||
efuse = cgs_read_ind_register(smumgr->device, CGS_IND_REG__SMC, ixSMU_EFUSE_0 + (49*4));
|
||||
efuse = cgs_read_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixSMU_EFUSE_0 + (49*4));
|
||||
efuse &= 0x00000001;
|
||||
if (efuse)
|
||||
return true;
|
||||
|
@ -362,7 +362,7 @@ static bool polaris10_is_hw_avfs_present(struct pp_smumgr *smumgr)
|
|||
return false;
|
||||
}
|
||||
|
||||
static int polaris10_smu_init(struct pp_smumgr *smumgr)
|
||||
static int polaris10_smu_init(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct polaris10_smumgr *smu_data;
|
||||
int i;
|
||||
|
@ -371,9 +371,9 @@ static int polaris10_smu_init(struct pp_smumgr *smumgr)
|
|||
if (smu_data == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
smumgr->backend = smu_data;
|
||||
hwmgr->smumgr->backend = smu_data;
|
||||
|
||||
if (smu7_init(smumgr))
|
||||
if (smu7_init(hwmgr))
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 0; i < SMU74_MAX_LEVELS_GRAPHICS; i++)
|
||||
|
|
|
@ -48,20 +48,20 @@
|
|||
#define smnMP1_FIRMWARE_FLAGS 0x3010028
|
||||
|
||||
|
||||
bool rv_is_smc_ram_running(struct pp_smumgr *smumgr)
|
||||
bool rv_is_smc_ram_running(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
uint32_t mp1_fw_flags, reg;
|
||||
|
||||
reg = soc15_get_register_offset(NBIF_HWID, 0,
|
||||
mmPCIE_INDEX2_BASE_IDX, mmPCIE_INDEX2);
|
||||
|
||||
cgs_write_register(smumgr->device, reg,
|
||||
cgs_write_register(hwmgr->device, reg,
|
||||
(MP1_Public | (smnMP1_FIRMWARE_FLAGS & 0xffffffff)));
|
||||
|
||||
reg = soc15_get_register_offset(NBIF_HWID, 0,
|
||||
mmPCIE_DATA2_BASE_IDX, mmPCIE_DATA2);
|
||||
|
||||
mp1_fw_flags = cgs_read_register(smumgr->device, reg);
|
||||
mp1_fw_flags = cgs_read_register(hwmgr->device, reg);
|
||||
|
||||
if (mp1_fw_flags & MP1_FIRMWARE_FLAGS__INTERRUPTS_ENABLED_MASK)
|
||||
return true;
|
||||
|
@ -69,97 +69,97 @@ bool rv_is_smc_ram_running(struct pp_smumgr *smumgr)
|
|||
return false;
|
||||
}
|
||||
|
||||
static uint32_t rv_wait_for_response(struct pp_smumgr *smumgr)
|
||||
static uint32_t rv_wait_for_response(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
uint32_t reg;
|
||||
|
||||
if (!rv_is_smc_ram_running(smumgr))
|
||||
if (!rv_is_smc_ram_running(hwmgr))
|
||||
return -EINVAL;
|
||||
|
||||
reg = soc15_get_register_offset(MP1_HWID, 0,
|
||||
mmMP1_SMN_C2PMSG_90_BASE_IDX, mmMP1_SMN_C2PMSG_90);
|
||||
|
||||
smum_wait_for_register_unequal(smumgr, reg,
|
||||
smum_wait_for_register_unequal(hwmgr, reg,
|
||||
0, MP1_C2PMSG_90__CONTENT_MASK);
|
||||
|
||||
return cgs_read_register(smumgr->device, reg);
|
||||
return cgs_read_register(hwmgr->device, reg);
|
||||
}
|
||||
|
||||
int rv_send_msg_to_smc_without_waiting(struct pp_smumgr *smumgr,
|
||||
int rv_send_msg_to_smc_without_waiting(struct pp_hwmgr *hwmgr,
|
||||
uint16_t msg)
|
||||
{
|
||||
uint32_t reg;
|
||||
|
||||
if (!rv_is_smc_ram_running(smumgr))
|
||||
if (!rv_is_smc_ram_running(hwmgr))
|
||||
return -EINVAL;
|
||||
|
||||
reg = soc15_get_register_offset(MP1_HWID, 0,
|
||||
mmMP1_SMN_C2PMSG_66_BASE_IDX, mmMP1_SMN_C2PMSG_66);
|
||||
cgs_write_register(smumgr->device, reg, msg);
|
||||
cgs_write_register(hwmgr->device, reg, msg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rv_read_arg_from_smc(struct pp_smumgr *smumgr, uint32_t *arg)
|
||||
int rv_read_arg_from_smc(struct pp_hwmgr *hwmgr, uint32_t *arg)
|
||||
{
|
||||
uint32_t reg;
|
||||
|
||||
reg = soc15_get_register_offset(MP1_HWID, 0,
|
||||
mmMP1_SMN_C2PMSG_82_BASE_IDX, mmMP1_SMN_C2PMSG_82);
|
||||
|
||||
*arg = cgs_read_register(smumgr->device, reg);
|
||||
*arg = cgs_read_register(hwmgr->device, reg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rv_send_msg_to_smc(struct pp_smumgr *smumgr, uint16_t msg)
|
||||
int rv_send_msg_to_smc(struct pp_hwmgr *hwmgr, uint16_t msg)
|
||||
{
|
||||
uint32_t reg;
|
||||
|
||||
rv_wait_for_response(smumgr);
|
||||
rv_wait_for_response(hwmgr);
|
||||
|
||||
reg = soc15_get_register_offset(MP1_HWID, 0,
|
||||
mmMP1_SMN_C2PMSG_90_BASE_IDX, mmMP1_SMN_C2PMSG_90);
|
||||
cgs_write_register(smumgr->device, reg, 0);
|
||||
cgs_write_register(hwmgr->device, reg, 0);
|
||||
|
||||
rv_send_msg_to_smc_without_waiting(smumgr, msg);
|
||||
rv_send_msg_to_smc_without_waiting(hwmgr, msg);
|
||||
|
||||
if (rv_wait_for_response(smumgr) == 0)
|
||||
if (rv_wait_for_response(hwmgr) == 0)
|
||||
printk("Failed to send Message %x.\n", msg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int rv_send_msg_to_smc_with_parameter(struct pp_smumgr *smumgr,
|
||||
int rv_send_msg_to_smc_with_parameter(struct pp_hwmgr *hwmgr,
|
||||
uint16_t msg, uint32_t parameter)
|
||||
{
|
||||
uint32_t reg;
|
||||
|
||||
rv_wait_for_response(smumgr);
|
||||
rv_wait_for_response(hwmgr);
|
||||
|
||||
reg = soc15_get_register_offset(MP1_HWID, 0,
|
||||
mmMP1_SMN_C2PMSG_90_BASE_IDX, mmMP1_SMN_C2PMSG_90);
|
||||
cgs_write_register(smumgr->device, reg, 0);
|
||||
cgs_write_register(hwmgr->device, reg, 0);
|
||||
|
||||
reg = soc15_get_register_offset(MP1_HWID, 0,
|
||||
mmMP1_SMN_C2PMSG_82_BASE_IDX, mmMP1_SMN_C2PMSG_82);
|
||||
cgs_write_register(smumgr->device, reg, parameter);
|
||||
cgs_write_register(hwmgr->device, reg, parameter);
|
||||
|
||||
rv_send_msg_to_smc_without_waiting(smumgr, msg);
|
||||
rv_send_msg_to_smc_without_waiting(hwmgr, msg);
|
||||
|
||||
|
||||
if (rv_wait_for_response(smumgr) == 0)
|
||||
if (rv_wait_for_response(hwmgr) == 0)
|
||||
printk("Failed to send Message %x.\n", msg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rv_copy_table_from_smc(struct pp_smumgr *smumgr,
|
||||
int rv_copy_table_from_smc(struct pp_hwmgr *hwmgr,
|
||||
uint8_t *table, int16_t table_id)
|
||||
{
|
||||
struct rv_smumgr *priv =
|
||||
(struct rv_smumgr *)(smumgr->backend);
|
||||
(struct rv_smumgr *)(hwmgr->smumgr->backend);
|
||||
|
||||
PP_ASSERT_WITH_CODE(table_id < MAX_SMU_TABLE,
|
||||
"Invalid SMU Table ID!", return -EINVAL;);
|
||||
|
@ -167,16 +167,16 @@ int rv_copy_table_from_smc(struct pp_smumgr *smumgr,
|
|||
"Invalid SMU Table version!", return -EINVAL;);
|
||||
PP_ASSERT_WITH_CODE(priv->smu_tables.entry[table_id].size != 0,
|
||||
"Invalid SMU Table Length!", return -EINVAL;);
|
||||
PP_ASSERT_WITH_CODE(rv_send_msg_to_smc_with_parameter(smumgr,
|
||||
PP_ASSERT_WITH_CODE(rv_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetDriverDramAddrHigh,
|
||||
priv->smu_tables.entry[table_id].table_addr_high) == 0,
|
||||
"[CopyTableFromSMC] Attempt to Set Dram Addr High Failed!", return -EINVAL;);
|
||||
PP_ASSERT_WITH_CODE(rv_send_msg_to_smc_with_parameter(smumgr,
|
||||
PP_ASSERT_WITH_CODE(rv_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetDriverDramAddrLow,
|
||||
priv->smu_tables.entry[table_id].table_addr_low) == 0,
|
||||
"[CopyTableFromSMC] Attempt to Set Dram Addr Low Failed!",
|
||||
return -EINVAL;);
|
||||
PP_ASSERT_WITH_CODE(rv_send_msg_to_smc_with_parameter(smumgr,
|
||||
PP_ASSERT_WITH_CODE(rv_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_TransferTableSmu2Dram,
|
||||
priv->smu_tables.entry[table_id].table_id) == 0,
|
||||
"[CopyTableFromSMC] Attempt to Transfer Table From SMU Failed!",
|
||||
|
@ -188,11 +188,11 @@ int rv_copy_table_from_smc(struct pp_smumgr *smumgr,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int rv_copy_table_to_smc(struct pp_smumgr *smumgr,
|
||||
int rv_copy_table_to_smc(struct pp_hwmgr *hwmgr,
|
||||
uint8_t *table, int16_t table_id)
|
||||
{
|
||||
struct rv_smumgr *priv =
|
||||
(struct rv_smumgr *)(smumgr->backend);
|
||||
(struct rv_smumgr *)(hwmgr->smumgr->backend);
|
||||
|
||||
PP_ASSERT_WITH_CODE(table_id < MAX_SMU_TABLE,
|
||||
"Invalid SMU Table ID!", return -EINVAL;);
|
||||
|
@ -204,17 +204,17 @@ int rv_copy_table_to_smc(struct pp_smumgr *smumgr,
|
|||
memcpy(priv->smu_tables.entry[table_id].table, table,
|
||||
priv->smu_tables.entry[table_id].size);
|
||||
|
||||
PP_ASSERT_WITH_CODE(rv_send_msg_to_smc_with_parameter(smumgr,
|
||||
PP_ASSERT_WITH_CODE(rv_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetDriverDramAddrHigh,
|
||||
priv->smu_tables.entry[table_id].table_addr_high) == 0,
|
||||
"[CopyTableToSMC] Attempt to Set Dram Addr High Failed!",
|
||||
return -EINVAL;);
|
||||
PP_ASSERT_WITH_CODE(rv_send_msg_to_smc_with_parameter(smumgr,
|
||||
PP_ASSERT_WITH_CODE(rv_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetDriverDramAddrLow,
|
||||
priv->smu_tables.entry[table_id].table_addr_low) == 0,
|
||||
"[CopyTableToSMC] Attempt to Set Dram Addr Low Failed!",
|
||||
return -EINVAL;);
|
||||
PP_ASSERT_WITH_CODE(rv_send_msg_to_smc_with_parameter(smumgr,
|
||||
PP_ASSERT_WITH_CODE(rv_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_TransferTableDram2Smu,
|
||||
priv->smu_tables.entry[table_id].table_id) == 0,
|
||||
"[CopyTableToSMC] Attempt to Transfer Table To SMU Failed!",
|
||||
|
@ -223,15 +223,15 @@ int rv_copy_table_to_smc(struct pp_smumgr *smumgr,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int rv_verify_smc_interface(struct pp_smumgr *smumgr)
|
||||
static int rv_verify_smc_interface(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
uint32_t smc_driver_if_version;
|
||||
|
||||
PP_ASSERT_WITH_CODE(!rv_send_msg_to_smc(smumgr,
|
||||
PP_ASSERT_WITH_CODE(!rv_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_GetDriverIfVersion),
|
||||
"Attempt to get SMC IF Version Number Failed!",
|
||||
return -EINVAL);
|
||||
PP_ASSERT_WITH_CODE(!rv_read_arg_from_smc(smumgr,
|
||||
PP_ASSERT_WITH_CODE(!rv_read_arg_from_smc(hwmgr,
|
||||
&smc_driver_if_version),
|
||||
"Attempt to read SMC IF Version Number Failed!",
|
||||
return -EINVAL);
|
||||
|
@ -243,9 +243,9 @@ static int rv_verify_smc_interface(struct pp_smumgr *smumgr)
|
|||
}
|
||||
|
||||
/* sdma is disabled by default in vbios, need to re-enable in driver */
|
||||
static int rv_smc_enable_sdma(struct pp_smumgr *smumgr)
|
||||
static int rv_smc_enable_sdma(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
PP_ASSERT_WITH_CODE(!rv_send_msg_to_smc(smumgr,
|
||||
PP_ASSERT_WITH_CODE(!rv_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_PowerUpSdma),
|
||||
"Attempt to power up sdma Failed!",
|
||||
return -EINVAL);
|
||||
|
@ -253,9 +253,9 @@ static int rv_smc_enable_sdma(struct pp_smumgr *smumgr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int rv_smc_disable_sdma(struct pp_smumgr *smumgr)
|
||||
static int rv_smc_disable_sdma(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
PP_ASSERT_WITH_CODE(!rv_send_msg_to_smc(smumgr,
|
||||
PP_ASSERT_WITH_CODE(!rv_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_PowerDownSdma),
|
||||
"Attempt to power down sdma Failed!",
|
||||
return -EINVAL);
|
||||
|
@ -264,9 +264,9 @@ static int rv_smc_disable_sdma(struct pp_smumgr *smumgr)
|
|||
}
|
||||
|
||||
/* vcn is disabled by default in vbios, need to re-enable in driver */
|
||||
static int rv_smc_enable_vcn(struct pp_smumgr *smumgr)
|
||||
static int rv_smc_enable_vcn(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
PP_ASSERT_WITH_CODE(!rv_send_msg_to_smc_with_parameter(smumgr,
|
||||
PP_ASSERT_WITH_CODE(!rv_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_PowerUpVcn, 0),
|
||||
"Attempt to power up vcn Failed!",
|
||||
return -EINVAL);
|
||||
|
@ -274,9 +274,9 @@ static int rv_smc_enable_vcn(struct pp_smumgr *smumgr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int rv_smc_disable_vcn(struct pp_smumgr *smumgr)
|
||||
static int rv_smc_disable_vcn(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
PP_ASSERT_WITH_CODE(!rv_send_msg_to_smc_with_parameter(smumgr,
|
||||
PP_ASSERT_WITH_CODE(!rv_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_PowerDownVcn, 0),
|
||||
"Attempt to power down vcn Failed!",
|
||||
return -EINVAL);
|
||||
|
@ -284,38 +284,38 @@ static int rv_smc_disable_vcn(struct pp_smumgr *smumgr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int rv_smu_fini(struct pp_smumgr *smumgr)
|
||||
static int rv_smu_fini(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct rv_smumgr *priv =
|
||||
(struct rv_smumgr *)(smumgr->backend);
|
||||
(struct rv_smumgr *)(hwmgr->smumgr->backend);
|
||||
|
||||
if (priv) {
|
||||
rv_smc_disable_sdma(smumgr);
|
||||
rv_smc_disable_vcn(smumgr);
|
||||
cgs_free_gpu_mem(smumgr->device,
|
||||
rv_smc_disable_sdma(hwmgr);
|
||||
rv_smc_disable_vcn(hwmgr);
|
||||
cgs_free_gpu_mem(hwmgr->device,
|
||||
priv->smu_tables.entry[WMTABLE].handle);
|
||||
cgs_free_gpu_mem(smumgr->device,
|
||||
cgs_free_gpu_mem(hwmgr->device,
|
||||
priv->smu_tables.entry[CLOCKTABLE].handle);
|
||||
kfree(smumgr->backend);
|
||||
smumgr->backend = NULL;
|
||||
kfree(hwmgr->smumgr->backend);
|
||||
hwmgr->smumgr->backend = NULL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rv_start_smu(struct pp_smumgr *smumgr)
|
||||
static int rv_start_smu(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
if (rv_verify_smc_interface(smumgr))
|
||||
if (rv_verify_smc_interface(hwmgr))
|
||||
return -EINVAL;
|
||||
if (rv_smc_enable_sdma(smumgr))
|
||||
if (rv_smc_enable_sdma(hwmgr))
|
||||
return -EINVAL;
|
||||
if (rv_smc_enable_vcn(smumgr))
|
||||
if (rv_smc_enable_vcn(hwmgr))
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rv_smu_init(struct pp_smumgr *smumgr)
|
||||
static int rv_smu_init(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct rv_smumgr *priv;
|
||||
uint64_t mc_addr;
|
||||
|
@ -327,10 +327,10 @@ static int rv_smu_init(struct pp_smumgr *smumgr)
|
|||
if (!priv)
|
||||
return -ENOMEM;
|
||||
|
||||
smumgr->backend = priv;
|
||||
hwmgr->smumgr->backend = priv;
|
||||
|
||||
/* allocate space for watermarks table */
|
||||
smu_allocate_memory(smumgr->device,
|
||||
smu_allocate_memory(hwmgr->device,
|
||||
sizeof(Watermarks_t),
|
||||
CGS_GPU_MEM_TYPE__GART_CACHEABLE,
|
||||
PAGE_SIZE,
|
||||
|
@ -340,8 +340,8 @@ static int rv_smu_init(struct pp_smumgr *smumgr)
|
|||
|
||||
PP_ASSERT_WITH_CODE(kaddr,
|
||||
"[rv_smu_init] Out of memory for wmtable.",
|
||||
kfree(smumgr->backend);
|
||||
smumgr->backend = NULL;
|
||||
kfree(hwmgr->smumgr->backend);
|
||||
hwmgr->smumgr->backend = NULL;
|
||||
return -EINVAL);
|
||||
|
||||
priv->smu_tables.entry[WMTABLE].version = 0x01;
|
||||
|
@ -355,7 +355,7 @@ static int rv_smu_init(struct pp_smumgr *smumgr)
|
|||
priv->smu_tables.entry[WMTABLE].handle = handle;
|
||||
|
||||
/* allocate space for watermarks table */
|
||||
smu_allocate_memory(smumgr->device,
|
||||
smu_allocate_memory(hwmgr->device,
|
||||
sizeof(DpmClocks_t),
|
||||
CGS_GPU_MEM_TYPE__GART_CACHEABLE,
|
||||
PAGE_SIZE,
|
||||
|
@ -365,10 +365,10 @@ static int rv_smu_init(struct pp_smumgr *smumgr)
|
|||
|
||||
PP_ASSERT_WITH_CODE(kaddr,
|
||||
"[rv_smu_init] Out of memory for CLOCKTABLE.",
|
||||
cgs_free_gpu_mem(smumgr->device,
|
||||
cgs_free_gpu_mem(hwmgr->device,
|
||||
(cgs_handle_t)priv->smu_tables.entry[WMTABLE].handle);
|
||||
kfree(smumgr->backend);
|
||||
smumgr->backend = NULL;
|
||||
kfree(hwmgr->smumgr->backend);
|
||||
hwmgr->smumgr->backend = NULL;
|
||||
return -EINVAL);
|
||||
|
||||
priv->smu_tables.entry[CLOCKTABLE].version = 0x01;
|
||||
|
|
|
@ -51,11 +51,11 @@ struct rv_smumgr {
|
|||
struct smu_table_array smu_tables;
|
||||
};
|
||||
|
||||
int rv_read_arg_from_smc(struct pp_smumgr *smumgr, uint32_t *arg);
|
||||
bool rv_is_smc_ram_running(struct pp_smumgr *smumgr);
|
||||
int rv_copy_table_from_smc(struct pp_smumgr *smumgr,
|
||||
int rv_read_arg_from_smc(struct pp_hwmgr *hwmgr, uint32_t *arg);
|
||||
bool rv_is_smc_ram_running(struct pp_hwmgr *hwmgr);
|
||||
int rv_copy_table_from_smc(struct pp_hwmgr *hwmgr,
|
||||
uint8_t *table, int16_t table_id);
|
||||
int rv_copy_table_to_smc(struct pp_smumgr *smumgr,
|
||||
int rv_copy_table_to_smc(struct pp_hwmgr *hwmgr,
|
||||
uint8_t *table, int16_t table_id);
|
||||
|
||||
|
||||
|
|
|
@ -34,18 +34,18 @@
|
|||
|
||||
#define SMU7_SMC_SIZE 0x20000
|
||||
|
||||
static int smu7_set_smc_sram_address(struct pp_smumgr *smumgr, uint32_t smc_addr, uint32_t limit)
|
||||
static int smu7_set_smc_sram_address(struct pp_hwmgr *hwmgr, uint32_t smc_addr, uint32_t limit)
|
||||
{
|
||||
PP_ASSERT_WITH_CODE((0 == (3 & smc_addr)), "SMC address must be 4 byte aligned.", return -EINVAL);
|
||||
PP_ASSERT_WITH_CODE((limit > (smc_addr + 3)), "SMC addr is beyond the SMC RAM area.", return -EINVAL);
|
||||
|
||||
cgs_write_register(smumgr->device, mmSMC_IND_INDEX_11, smc_addr);
|
||||
SMUM_WRITE_FIELD(smumgr->device, SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_11, 0); /* on ci, SMC_IND_ACCESS_CNTL is different */
|
||||
cgs_write_register(hwmgr->device, mmSMC_IND_INDEX_11, smc_addr);
|
||||
SMUM_WRITE_FIELD(hwmgr->device, SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_11, 0); /* on ci, SMC_IND_ACCESS_CNTL is different */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int smu7_copy_bytes_from_smc(struct pp_smumgr *smumgr, uint32_t smc_start_address, uint32_t *dest, uint32_t byte_count, uint32_t limit)
|
||||
int smu7_copy_bytes_from_smc(struct pp_hwmgr *hwmgr, uint32_t smc_start_address, uint32_t *dest, uint32_t byte_count, uint32_t limit)
|
||||
{
|
||||
uint32_t data;
|
||||
uint32_t addr;
|
||||
|
@ -59,7 +59,7 @@ int smu7_copy_bytes_from_smc(struct pp_smumgr *smumgr, uint32_t smc_start_addres
|
|||
addr = smc_start_address;
|
||||
|
||||
while (byte_count >= 4) {
|
||||
smu7_read_smc_sram_dword(smumgr, addr, &data, limit);
|
||||
smu7_read_smc_sram_dword(hwmgr, addr, &data, limit);
|
||||
|
||||
*dest = PP_SMC_TO_HOST_UL(data);
|
||||
|
||||
|
@ -69,7 +69,7 @@ int smu7_copy_bytes_from_smc(struct pp_smumgr *smumgr, uint32_t smc_start_addres
|
|||
}
|
||||
|
||||
if (byte_count) {
|
||||
smu7_read_smc_sram_dword(smumgr, addr, &data, limit);
|
||||
smu7_read_smc_sram_dword(hwmgr, addr, &data, limit);
|
||||
*pdata = PP_SMC_TO_HOST_UL(data);
|
||||
/* Cast dest into byte type in dest_byte. This way, we don't overflow if the allocated memory is not 4-byte aligned. */
|
||||
dest_byte = (uint8_t *)dest;
|
||||
|
@ -81,7 +81,7 @@ int smu7_copy_bytes_from_smc(struct pp_smumgr *smumgr, uint32_t smc_start_addres
|
|||
}
|
||||
|
||||
|
||||
int smu7_copy_bytes_to_smc(struct pp_smumgr *smumgr, uint32_t smc_start_address,
|
||||
int smu7_copy_bytes_to_smc(struct pp_hwmgr *hwmgr, uint32_t smc_start_address,
|
||||
const uint8_t *src, uint32_t byte_count, uint32_t limit)
|
||||
{
|
||||
int result;
|
||||
|
@ -99,12 +99,12 @@ int smu7_copy_bytes_to_smc(struct pp_smumgr *smumgr, uint32_t smc_start_address,
|
|||
/* Bytes are written into the SMC addres space with the MSB first. */
|
||||
data = src[0] * 0x1000000 + src[1] * 0x10000 + src[2] * 0x100 + src[3];
|
||||
|
||||
result = smu7_set_smc_sram_address(smumgr, addr, limit);
|
||||
result = smu7_set_smc_sram_address(hwmgr, addr, limit);
|
||||
|
||||
if (0 != result)
|
||||
return result;
|
||||
|
||||
cgs_write_register(smumgr->device, mmSMC_IND_DATA_11, data);
|
||||
cgs_write_register(hwmgr->device, mmSMC_IND_DATA_11, data);
|
||||
|
||||
src += 4;
|
||||
byte_count -= 4;
|
||||
|
@ -115,13 +115,13 @@ int smu7_copy_bytes_to_smc(struct pp_smumgr *smumgr, uint32_t smc_start_address,
|
|||
|
||||
data = 0;
|
||||
|
||||
result = smu7_set_smc_sram_address(smumgr, addr, limit);
|
||||
result = smu7_set_smc_sram_address(hwmgr, addr, limit);
|
||||
|
||||
if (0 != result)
|
||||
return result;
|
||||
|
||||
|
||||
original_data = cgs_read_register(smumgr->device, mmSMC_IND_DATA_11);
|
||||
original_data = cgs_read_register(hwmgr->device, mmSMC_IND_DATA_11);
|
||||
|
||||
extra_shift = 8 * (4 - byte_count);
|
||||
|
||||
|
@ -135,53 +135,53 @@ int smu7_copy_bytes_to_smc(struct pp_smumgr *smumgr, uint32_t smc_start_address,
|
|||
|
||||
data |= (original_data & ~((~0UL) << extra_shift));
|
||||
|
||||
result = smu7_set_smc_sram_address(smumgr, addr, limit);
|
||||
result = smu7_set_smc_sram_address(hwmgr, addr, limit);
|
||||
|
||||
if (0 != result)
|
||||
return result;
|
||||
|
||||
cgs_write_register(smumgr->device, mmSMC_IND_DATA_11, data);
|
||||
cgs_write_register(hwmgr->device, mmSMC_IND_DATA_11, data);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int smu7_program_jump_on_start(struct pp_smumgr *smumgr)
|
||||
int smu7_program_jump_on_start(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
static const unsigned char data[4] = { 0xE0, 0x00, 0x80, 0x40 };
|
||||
|
||||
smu7_copy_bytes_to_smc(smumgr, 0x0, data, 4, sizeof(data)+1);
|
||||
smu7_copy_bytes_to_smc(hwmgr, 0x0, data, 4, sizeof(data)+1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool smu7_is_smc_ram_running(struct pp_smumgr *smumgr)
|
||||
bool smu7_is_smc_ram_running(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
return ((0 == SMUM_READ_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC, SMC_SYSCON_CLOCK_CNTL_0, ck_disable))
|
||||
&& (0x20100 <= cgs_read_ind_register(smumgr->device, CGS_IND_REG__SMC, ixSMC_PC_C)));
|
||||
return ((0 == SMUM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, SMC_SYSCON_CLOCK_CNTL_0, ck_disable))
|
||||
&& (0x20100 <= cgs_read_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixSMC_PC_C)));
|
||||
}
|
||||
|
||||
int smu7_send_msg_to_smc(struct pp_smumgr *smumgr, uint16_t msg)
|
||||
int smu7_send_msg_to_smc(struct pp_hwmgr *hwmgr, uint16_t msg)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!smu7_is_smc_ram_running(smumgr))
|
||||
if (!smu7_is_smc_ram_running(hwmgr))
|
||||
return -EINVAL;
|
||||
|
||||
|
||||
SMUM_WAIT_FIELD_UNEQUAL(smumgr, SMC_RESP_0, SMC_RESP, 0);
|
||||
SMUM_WAIT_FIELD_UNEQUAL(hwmgr, SMC_RESP_0, SMC_RESP, 0);
|
||||
|
||||
ret = SMUM_READ_FIELD(smumgr->device, SMC_RESP_0, SMC_RESP);
|
||||
ret = SMUM_READ_FIELD(hwmgr->device, SMC_RESP_0, SMC_RESP);
|
||||
|
||||
if (ret != 1)
|
||||
pr_info("\n failed to send pre message %x ret is %d \n", msg, ret);
|
||||
|
||||
cgs_write_register(smumgr->device, mmSMC_MESSAGE_0, msg);
|
||||
cgs_write_register(hwmgr->device, mmSMC_MESSAGE_0, msg);
|
||||
|
||||
SMUM_WAIT_FIELD_UNEQUAL(smumgr, SMC_RESP_0, SMC_RESP, 0);
|
||||
SMUM_WAIT_FIELD_UNEQUAL(hwmgr, SMC_RESP_0, SMC_RESP, 0);
|
||||
|
||||
ret = SMUM_READ_FIELD(smumgr->device, SMC_RESP_0, SMC_RESP);
|
||||
ret = SMUM_READ_FIELD(hwmgr->device, SMC_RESP_0, SMC_RESP);
|
||||
|
||||
if (ret != 1)
|
||||
pr_info("\n failed to send message %x ret is %d \n", msg, ret);
|
||||
|
@ -189,53 +189,53 @@ int smu7_send_msg_to_smc(struct pp_smumgr *smumgr, uint16_t msg)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int smu7_send_msg_to_smc_without_waiting(struct pp_smumgr *smumgr, uint16_t msg)
|
||||
int smu7_send_msg_to_smc_without_waiting(struct pp_hwmgr *hwmgr, uint16_t msg)
|
||||
{
|
||||
cgs_write_register(smumgr->device, mmSMC_MESSAGE_0, msg);
|
||||
cgs_write_register(hwmgr->device, mmSMC_MESSAGE_0, msg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int smu7_send_msg_to_smc_with_parameter(struct pp_smumgr *smumgr, uint16_t msg, uint32_t parameter)
|
||||
int smu7_send_msg_to_smc_with_parameter(struct pp_hwmgr *hwmgr, uint16_t msg, uint32_t parameter)
|
||||
{
|
||||
if (!smu7_is_smc_ram_running(smumgr)) {
|
||||
if (!smu7_is_smc_ram_running(hwmgr)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
SMUM_WAIT_FIELD_UNEQUAL(smumgr, SMC_RESP_0, SMC_RESP, 0);
|
||||
SMUM_WAIT_FIELD_UNEQUAL(hwmgr, SMC_RESP_0, SMC_RESP, 0);
|
||||
|
||||
cgs_write_register(smumgr->device, mmSMC_MSG_ARG_0, parameter);
|
||||
cgs_write_register(hwmgr->device, mmSMC_MSG_ARG_0, parameter);
|
||||
|
||||
return smu7_send_msg_to_smc(smumgr, msg);
|
||||
return smu7_send_msg_to_smc(hwmgr, msg);
|
||||
}
|
||||
|
||||
int smu7_send_msg_to_smc_with_parameter_without_waiting(struct pp_smumgr *smumgr, uint16_t msg, uint32_t parameter)
|
||||
int smu7_send_msg_to_smc_with_parameter_without_waiting(struct pp_hwmgr *hwmgr, uint16_t msg, uint32_t parameter)
|
||||
{
|
||||
cgs_write_register(smumgr->device, mmSMC_MSG_ARG_0, parameter);
|
||||
cgs_write_register(hwmgr->device, mmSMC_MSG_ARG_0, parameter);
|
||||
|
||||
return smu7_send_msg_to_smc_without_waiting(smumgr, msg);
|
||||
return smu7_send_msg_to_smc_without_waiting(hwmgr, msg);
|
||||
}
|
||||
|
||||
int smu7_send_msg_to_smc_offset(struct pp_smumgr *smumgr)
|
||||
int smu7_send_msg_to_smc_offset(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
cgs_write_register(smumgr->device, mmSMC_MSG_ARG_0, 0x20000);
|
||||
cgs_write_register(hwmgr->device, mmSMC_MSG_ARG_0, 0x20000);
|
||||
|
||||
cgs_write_register(smumgr->device, mmSMC_MESSAGE_0, PPSMC_MSG_Test);
|
||||
cgs_write_register(hwmgr->device, mmSMC_MESSAGE_0, PPSMC_MSG_Test);
|
||||
|
||||
SMUM_WAIT_FIELD_UNEQUAL(smumgr, SMC_RESP_0, SMC_RESP, 0);
|
||||
SMUM_WAIT_FIELD_UNEQUAL(hwmgr, SMC_RESP_0, SMC_RESP, 0);
|
||||
|
||||
if (1 != SMUM_READ_FIELD(smumgr->device, SMC_RESP_0, SMC_RESP))
|
||||
if (1 != SMUM_READ_FIELD(hwmgr->device, SMC_RESP_0, SMC_RESP))
|
||||
pr_info("Failed to send Message.\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int smu7_wait_for_smc_inactive(struct pp_smumgr *smumgr)
|
||||
int smu7_wait_for_smc_inactive(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
if (!smu7_is_smc_ram_running(smumgr))
|
||||
if (!smu7_is_smc_ram_running(hwmgr))
|
||||
return -EINVAL;
|
||||
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD(smumgr, SMC_IND, SMC_SYSCON_CLOCK_CNTL_0, cken, 0);
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD(hwmgr, SMC_IND, SMC_SYSCON_CLOCK_CNTL_0, cken, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -289,29 +289,29 @@ enum cgs_ucode_id smu7_convert_fw_type_to_cgs(uint32_t fw_type)
|
|||
}
|
||||
|
||||
|
||||
int smu7_read_smc_sram_dword(struct pp_smumgr *smumgr, uint32_t smc_addr, uint32_t *value, uint32_t limit)
|
||||
int smu7_read_smc_sram_dword(struct pp_hwmgr *hwmgr, uint32_t smc_addr, uint32_t *value, uint32_t limit)
|
||||
{
|
||||
int result;
|
||||
|
||||
result = smu7_set_smc_sram_address(smumgr, smc_addr, limit);
|
||||
result = smu7_set_smc_sram_address(hwmgr, smc_addr, limit);
|
||||
|
||||
if (result)
|
||||
return result;
|
||||
|
||||
*value = cgs_read_register(smumgr->device, mmSMC_IND_DATA_11);
|
||||
*value = cgs_read_register(hwmgr->device, mmSMC_IND_DATA_11);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int smu7_write_smc_sram_dword(struct pp_smumgr *smumgr, uint32_t smc_addr, uint32_t value, uint32_t limit)
|
||||
int smu7_write_smc_sram_dword(struct pp_hwmgr *hwmgr, uint32_t smc_addr, uint32_t value, uint32_t limit)
|
||||
{
|
||||
int result;
|
||||
|
||||
result = smu7_set_smc_sram_address(smumgr, smc_addr, limit);
|
||||
result = smu7_set_smc_sram_address(hwmgr, smc_addr, limit);
|
||||
|
||||
if (result)
|
||||
return result;
|
||||
|
||||
cgs_write_register(smumgr->device, mmSMC_IND_DATA_11, value);
|
||||
cgs_write_register(hwmgr->device, mmSMC_IND_DATA_11, value);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -354,14 +354,14 @@ static uint32_t smu7_get_mask_for_firmware_type(uint32_t fw_type)
|
|||
return result;
|
||||
}
|
||||
|
||||
static int smu7_populate_single_firmware_entry(struct pp_smumgr *smumgr,
|
||||
static int smu7_populate_single_firmware_entry(struct pp_hwmgr *hwmgr,
|
||||
uint32_t fw_type,
|
||||
struct SMU_Entry *entry)
|
||||
{
|
||||
int result = 0;
|
||||
struct cgs_firmware_info info = {0};
|
||||
|
||||
result = cgs_get_firmware_info(smumgr->device,
|
||||
result = cgs_get_firmware_info(hwmgr->device,
|
||||
smu7_convert_fw_type_to_cgs(fw_type),
|
||||
&info);
|
||||
|
||||
|
@ -374,7 +374,7 @@ static int smu7_populate_single_firmware_entry(struct pp_smumgr *smumgr,
|
|||
entry->meta_data_addr_low = 0;
|
||||
|
||||
/* digest need be excluded out */
|
||||
if (cgs_is_virtualization_enabled(smumgr->device))
|
||||
if (cgs_is_virtualization_enabled(hwmgr->device))
|
||||
info.image_size -= 20;
|
||||
entry->data_size_byte = info.image_size;
|
||||
entry->num_register_entries = 0;
|
||||
|
@ -389,30 +389,30 @@ static int smu7_populate_single_firmware_entry(struct pp_smumgr *smumgr,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int smu7_request_smu_load_fw(struct pp_smumgr *smumgr)
|
||||
int smu7_request_smu_load_fw(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(smumgr->backend);
|
||||
struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(hwmgr->smumgr->backend);
|
||||
uint32_t fw_to_load;
|
||||
int result = 0;
|
||||
struct SMU_DRAMData_TOC *toc;
|
||||
|
||||
if (!smumgr->reload_fw) {
|
||||
if (!hwmgr->smumgr->reload_fw) {
|
||||
pr_info("skip reloading...\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (smu_data->soft_regs_start)
|
||||
cgs_write_ind_register(smumgr->device, CGS_IND_REG__SMC,
|
||||
smu_data->soft_regs_start + smum_get_offsetof(smumgr,
|
||||
cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC,
|
||||
smu_data->soft_regs_start + smum_get_offsetof(hwmgr,
|
||||
SMU_SoftRegisters, UcodeLoadStatus),
|
||||
0x0);
|
||||
|
||||
if (smumgr->chip_id > CHIP_TOPAZ) { /* add support for Topaz */
|
||||
if (!cgs_is_virtualization_enabled(smumgr->device)) {
|
||||
smu7_send_msg_to_smc_with_parameter(smumgr,
|
||||
if (hwmgr->chip_id > CHIP_TOPAZ) { /* add support for Topaz */
|
||||
if (!cgs_is_virtualization_enabled(hwmgr->device)) {
|
||||
smu7_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SMU_DRAM_ADDR_HI,
|
||||
smu_data->smu_buffer.mc_addr_high);
|
||||
smu7_send_msg_to_smc_with_parameter(smumgr,
|
||||
smu7_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SMU_DRAM_ADDR_LO,
|
||||
smu_data->smu_buffer.mc_addr_low);
|
||||
}
|
||||
|
@ -439,80 +439,80 @@ int smu7_request_smu_load_fw(struct pp_smumgr *smumgr)
|
|||
toc->num_entries = 0;
|
||||
toc->structure_version = 1;
|
||||
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(smumgr,
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
|
||||
UCODE_ID_RLC_G, &toc->entry[toc->num_entries++]),
|
||||
"Failed to Get Firmware Entry.", return -EINVAL);
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(smumgr,
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
|
||||
UCODE_ID_CP_CE, &toc->entry[toc->num_entries++]),
|
||||
"Failed to Get Firmware Entry.", return -EINVAL);
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(smumgr,
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
|
||||
UCODE_ID_CP_PFP, &toc->entry[toc->num_entries++]),
|
||||
"Failed to Get Firmware Entry.", return -EINVAL);
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(smumgr,
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
|
||||
UCODE_ID_CP_ME, &toc->entry[toc->num_entries++]),
|
||||
"Failed to Get Firmware Entry.", return -EINVAL);
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(smumgr,
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
|
||||
UCODE_ID_CP_MEC, &toc->entry[toc->num_entries++]),
|
||||
"Failed to Get Firmware Entry.", return -EINVAL);
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(smumgr,
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
|
||||
UCODE_ID_CP_MEC_JT1, &toc->entry[toc->num_entries++]),
|
||||
"Failed to Get Firmware Entry.", return -EINVAL);
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(smumgr,
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
|
||||
UCODE_ID_CP_MEC_JT2, &toc->entry[toc->num_entries++]),
|
||||
"Failed to Get Firmware Entry.", return -EINVAL);
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(smumgr,
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
|
||||
UCODE_ID_SDMA0, &toc->entry[toc->num_entries++]),
|
||||
"Failed to Get Firmware Entry.", return -EINVAL);
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(smumgr,
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
|
||||
UCODE_ID_SDMA1, &toc->entry[toc->num_entries++]),
|
||||
"Failed to Get Firmware Entry.", return -EINVAL);
|
||||
if (cgs_is_virtualization_enabled(smumgr->device))
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(smumgr,
|
||||
if (cgs_is_virtualization_enabled(hwmgr->device))
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
|
||||
UCODE_ID_MEC_STORAGE, &toc->entry[toc->num_entries++]),
|
||||
"Failed to Get Firmware Entry.", return -EINVAL);
|
||||
|
||||
smu7_send_msg_to_smc_with_parameter(smumgr, PPSMC_MSG_DRV_DRAM_ADDR_HI, smu_data->header_buffer.mc_addr_high);
|
||||
smu7_send_msg_to_smc_with_parameter(smumgr, PPSMC_MSG_DRV_DRAM_ADDR_LO, smu_data->header_buffer.mc_addr_low);
|
||||
smu7_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_DRV_DRAM_ADDR_HI, smu_data->header_buffer.mc_addr_high);
|
||||
smu7_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_DRV_DRAM_ADDR_LO, smu_data->header_buffer.mc_addr_low);
|
||||
|
||||
if (smu7_send_msg_to_smc_with_parameter(smumgr, PPSMC_MSG_LoadUcodes, fw_to_load))
|
||||
if (smu7_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_LoadUcodes, fw_to_load))
|
||||
pr_err("Fail to Request SMU Load uCode");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Check if the FW has been loaded, SMU will not return if loading has not finished. */
|
||||
int smu7_check_fw_load_finish(struct pp_smumgr *smumgr, uint32_t fw_type)
|
||||
int smu7_check_fw_load_finish(struct pp_hwmgr *hwmgr, uint32_t fw_type)
|
||||
{
|
||||
struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(smumgr->backend);
|
||||
struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(hwmgr->smumgr->backend);
|
||||
uint32_t fw_mask = smu7_get_mask_for_firmware_type(fw_type);
|
||||
uint32_t ret;
|
||||
|
||||
ret = smum_wait_on_indirect_register(smumgr, mmSMC_IND_INDEX_11,
|
||||
smu_data->soft_regs_start + smum_get_offsetof(smumgr,
|
||||
ret = smum_wait_on_indirect_register(hwmgr, mmSMC_IND_INDEX_11,
|
||||
smu_data->soft_regs_start + smum_get_offsetof(hwmgr,
|
||||
SMU_SoftRegisters, UcodeLoadStatus),
|
||||
fw_mask, fw_mask);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int smu7_reload_firmware(struct pp_smumgr *smumgr)
|
||||
int smu7_reload_firmware(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
return smumgr->smumgr_funcs->start_smu(smumgr);
|
||||
return hwmgr->smumgr->smumgr_funcs->start_smu(hwmgr);
|
||||
}
|
||||
|
||||
static int smu7_upload_smc_firmware_data(struct pp_smumgr *smumgr, uint32_t length, uint32_t *src, uint32_t limit)
|
||||
static int smu7_upload_smc_firmware_data(struct pp_hwmgr *hwmgr, uint32_t length, uint32_t *src, uint32_t limit)
|
||||
{
|
||||
uint32_t byte_count = length;
|
||||
|
||||
PP_ASSERT_WITH_CODE((limit >= byte_count), "SMC address is beyond the SMC RAM area.", return -EINVAL);
|
||||
|
||||
cgs_write_register(smumgr->device, mmSMC_IND_INDEX_11, 0x20000);
|
||||
SMUM_WRITE_FIELD(smumgr->device, SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_11, 1);
|
||||
cgs_write_register(hwmgr->device, mmSMC_IND_INDEX_11, 0x20000);
|
||||
SMUM_WRITE_FIELD(hwmgr->device, SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_11, 1);
|
||||
|
||||
for (; byte_count >= 4; byte_count -= 4)
|
||||
cgs_write_register(smumgr->device, mmSMC_IND_DATA_11, *src++);
|
||||
cgs_write_register(hwmgr->device, mmSMC_IND_DATA_11, *src++);
|
||||
|
||||
SMUM_WRITE_FIELD(smumgr->device, SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_11, 0);
|
||||
SMUM_WRITE_FIELD(hwmgr->device, SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_11, 0);
|
||||
|
||||
PP_ASSERT_WITH_CODE((0 == byte_count), "SMC size must be dividable by 4.", return -EINVAL);
|
||||
|
||||
|
@ -520,41 +520,41 @@ static int smu7_upload_smc_firmware_data(struct pp_smumgr *smumgr, uint32_t leng
|
|||
}
|
||||
|
||||
|
||||
int smu7_upload_smu_firmware_image(struct pp_smumgr *smumgr)
|
||||
int smu7_upload_smu_firmware_image(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
int result = 0;
|
||||
struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(smumgr->backend);
|
||||
struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(hwmgr->smumgr->backend);
|
||||
|
||||
struct cgs_firmware_info info = {0};
|
||||
|
||||
if (smu_data->security_hard_key == 1)
|
||||
cgs_get_firmware_info(smumgr->device,
|
||||
cgs_get_firmware_info(hwmgr->device,
|
||||
smu7_convert_fw_type_to_cgs(UCODE_ID_SMU), &info);
|
||||
else
|
||||
cgs_get_firmware_info(smumgr->device,
|
||||
cgs_get_firmware_info(hwmgr->device,
|
||||
smu7_convert_fw_type_to_cgs(UCODE_ID_SMU_SK), &info);
|
||||
|
||||
smumgr->is_kicker = info.is_kicker;
|
||||
hwmgr->smumgr->is_kicker = info.is_kicker;
|
||||
|
||||
result = smu7_upload_smc_firmware_data(smumgr, info.image_size, (uint32_t *)info.kptr, SMU7_SMC_SIZE);
|
||||
result = smu7_upload_smc_firmware_data(hwmgr, info.image_size, (uint32_t *)info.kptr, SMU7_SMC_SIZE);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
int smu7_init(struct pp_smumgr *smumgr)
|
||||
int smu7_init(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct smu7_smumgr *smu_data;
|
||||
uint8_t *internal_buf;
|
||||
uint64_t mc_addr = 0;
|
||||
|
||||
/* Allocate memory for backend private data */
|
||||
smu_data = (struct smu7_smumgr *)(smumgr->backend);
|
||||
smu_data = (struct smu7_smumgr *)(hwmgr->smumgr->backend);
|
||||
smu_data->header_buffer.data_size =
|
||||
((sizeof(struct SMU_DRAMData_TOC) / 4096) + 1) * 4096;
|
||||
|
||||
/* Allocate FW image data structure and header buffer and
|
||||
* send the header buffer address to SMU */
|
||||
smu_allocate_memory(smumgr->device,
|
||||
smu_allocate_memory(hwmgr->device,
|
||||
smu_data->header_buffer.data_size,
|
||||
CGS_GPU_MEM_TYPE__VISIBLE_CONTIG_FB,
|
||||
PAGE_SIZE,
|
||||
|
@ -568,16 +568,16 @@ int smu7_init(struct pp_smumgr *smumgr)
|
|||
|
||||
PP_ASSERT_WITH_CODE((NULL != smu_data->header),
|
||||
"Out of memory.",
|
||||
kfree(smumgr->backend);
|
||||
cgs_free_gpu_mem(smumgr->device,
|
||||
kfree(hwmgr->smumgr->backend);
|
||||
cgs_free_gpu_mem(hwmgr->device,
|
||||
(cgs_handle_t)smu_data->header_buffer.handle);
|
||||
return -EINVAL);
|
||||
|
||||
if (cgs_is_virtualization_enabled(smumgr->device))
|
||||
if (cgs_is_virtualization_enabled(hwmgr->device))
|
||||
return 0;
|
||||
|
||||
smu_data->smu_buffer.data_size = 200*4096;
|
||||
smu_allocate_memory(smumgr->device,
|
||||
smu_allocate_memory(hwmgr->device,
|
||||
smu_data->smu_buffer.data_size,
|
||||
CGS_GPU_MEM_TYPE__VISIBLE_CONTIG_FB,
|
||||
PAGE_SIZE,
|
||||
|
@ -591,12 +591,12 @@ int smu7_init(struct pp_smumgr *smumgr)
|
|||
|
||||
PP_ASSERT_WITH_CODE((NULL != internal_buf),
|
||||
"Out of memory.",
|
||||
kfree(smumgr->backend);
|
||||
cgs_free_gpu_mem(smumgr->device,
|
||||
kfree(hwmgr->smumgr->backend);
|
||||
cgs_free_gpu_mem(hwmgr->device,
|
||||
(cgs_handle_t)smu_data->smu_buffer.handle);
|
||||
return -EINVAL);
|
||||
|
||||
if (smum_is_hw_avfs_present(smumgr))
|
||||
if (smum_is_hw_avfs_present(hwmgr))
|
||||
smu_data->avfs.avfs_btc_status = AVFS_BTC_BOOT;
|
||||
else
|
||||
smu_data->avfs.avfs_btc_status = AVFS_BTC_NOTSUPPORTED;
|
||||
|
@ -605,10 +605,10 @@ int smu7_init(struct pp_smumgr *smumgr)
|
|||
}
|
||||
|
||||
|
||||
int smu7_smu_fini(struct pp_smumgr *smumgr)
|
||||
int smu7_smu_fini(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
kfree(smumgr->backend);
|
||||
smumgr->backend = NULL;
|
||||
cgs_rel_firmware(smumgr->device, CGS_UCODE_ID_SMU);
|
||||
kfree(hwmgr->smumgr->backend);
|
||||
hwmgr->smumgr->backend = NULL;
|
||||
cgs_rel_firmware(hwmgr->device, CGS_UCODE_ID_SMU);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -60,32 +60,32 @@ struct smu7_smumgr {
|
|||
};
|
||||
|
||||
|
||||
int smu7_copy_bytes_from_smc(struct pp_smumgr *smumgr, uint32_t smc_start_address,
|
||||
int smu7_copy_bytes_from_smc(struct pp_hwmgr *hwmgr, uint32_t smc_start_address,
|
||||
uint32_t *dest, uint32_t byte_count, uint32_t limit);
|
||||
int smu7_copy_bytes_to_smc(struct pp_smumgr *smumgr, uint32_t smc_start_address,
|
||||
int smu7_copy_bytes_to_smc(struct pp_hwmgr *hwmgr, uint32_t smc_start_address,
|
||||
const uint8_t *src, uint32_t byte_count, uint32_t limit);
|
||||
int smu7_program_jump_on_start(struct pp_smumgr *smumgr);
|
||||
bool smu7_is_smc_ram_running(struct pp_smumgr *smumgr);
|
||||
int smu7_send_msg_to_smc(struct pp_smumgr *smumgr, uint16_t msg);
|
||||
int smu7_send_msg_to_smc_without_waiting(struct pp_smumgr *smumgr, uint16_t msg);
|
||||
int smu7_send_msg_to_smc_with_parameter(struct pp_smumgr *smumgr, uint16_t msg,
|
||||
int smu7_program_jump_on_start(struct pp_hwmgr *hwmgr);
|
||||
bool smu7_is_smc_ram_running(struct pp_hwmgr *hwmgr);
|
||||
int smu7_send_msg_to_smc(struct pp_hwmgr *hwmgr, uint16_t msg);
|
||||
int smu7_send_msg_to_smc_without_waiting(struct pp_hwmgr *hwmgr, uint16_t msg);
|
||||
int smu7_send_msg_to_smc_with_parameter(struct pp_hwmgr *hwmgr, uint16_t msg,
|
||||
uint32_t parameter);
|
||||
int smu7_send_msg_to_smc_with_parameter_without_waiting(struct pp_smumgr *smumgr,
|
||||
int smu7_send_msg_to_smc_with_parameter_without_waiting(struct pp_hwmgr *hwmgr,
|
||||
uint16_t msg, uint32_t parameter);
|
||||
int smu7_send_msg_to_smc_offset(struct pp_smumgr *smumgr);
|
||||
int smu7_wait_for_smc_inactive(struct pp_smumgr *smumgr);
|
||||
int smu7_send_msg_to_smc_offset(struct pp_hwmgr *hwmgr);
|
||||
int smu7_wait_for_smc_inactive(struct pp_hwmgr *hwmgr);
|
||||
|
||||
enum cgs_ucode_id smu7_convert_fw_type_to_cgs(uint32_t fw_type);
|
||||
int smu7_read_smc_sram_dword(struct pp_smumgr *smumgr, uint32_t smc_addr,
|
||||
int smu7_read_smc_sram_dword(struct pp_hwmgr *hwmgr, uint32_t smc_addr,
|
||||
uint32_t *value, uint32_t limit);
|
||||
int smu7_write_smc_sram_dword(struct pp_smumgr *smumgr, uint32_t smc_addr,
|
||||
int smu7_write_smc_sram_dword(struct pp_hwmgr *hwmgr, uint32_t smc_addr,
|
||||
uint32_t value, uint32_t limit);
|
||||
|
||||
int smu7_request_smu_load_fw(struct pp_smumgr *smumgr);
|
||||
int smu7_check_fw_load_finish(struct pp_smumgr *smumgr, uint32_t fw_type);
|
||||
int smu7_reload_firmware(struct pp_smumgr *smumgr);
|
||||
int smu7_upload_smu_firmware_image(struct pp_smumgr *smumgr);
|
||||
int smu7_init(struct pp_smumgr *smumgr);
|
||||
int smu7_smu_fini(struct pp_smumgr *smumgr);
|
||||
int smu7_request_smu_load_fw(struct pp_hwmgr *hwmgr);
|
||||
int smu7_check_fw_load_finish(struct pp_hwmgr *hwmgr, uint32_t fw_type);
|
||||
int smu7_reload_firmware(struct pp_hwmgr *hwmgr);
|
||||
int smu7_upload_smu_firmware_image(struct pp_hwmgr *hwmgr);
|
||||
int smu7_init(struct pp_hwmgr *hwmgr);
|
||||
int smu7_smu_fini(struct pp_hwmgr *hwmgr);
|
||||
|
||||
#endif
|
|
@ -151,10 +151,10 @@ int smum_update_smc_table(struct pp_hwmgr *hwmgr, uint32_t type)
|
|||
return 0;
|
||||
}
|
||||
|
||||
uint32_t smum_get_offsetof(struct pp_smumgr *smumgr, uint32_t type, uint32_t member)
|
||||
uint32_t smum_get_offsetof(struct pp_hwmgr *hwmgr, uint32_t type, uint32_t member)
|
||||
{
|
||||
if (NULL != smumgr->smumgr_funcs->get_offsetof)
|
||||
return smumgr->smumgr_funcs->get_offsetof(type, member);
|
||||
if (NULL != hwmgr->smumgr->smumgr_funcs->get_offsetof)
|
||||
return hwmgr->smumgr->smumgr_funcs->get_offsetof(type, member);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -166,97 +166,96 @@ int smum_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int smum_get_argument(struct pp_smumgr *smumgr)
|
||||
int smum_get_argument(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
if (NULL != smumgr->smumgr_funcs->get_argument)
|
||||
return smumgr->smumgr_funcs->get_argument(smumgr);
|
||||
if (NULL != hwmgr->smumgr->smumgr_funcs->get_argument)
|
||||
return hwmgr->smumgr->smumgr_funcs->get_argument(hwmgr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t smum_get_mac_definition(struct pp_smumgr *smumgr, uint32_t value)
|
||||
uint32_t smum_get_mac_definition(struct pp_hwmgr *hwmgr, uint32_t value)
|
||||
{
|
||||
if (NULL != smumgr->smumgr_funcs->get_mac_definition)
|
||||
return smumgr->smumgr_funcs->get_mac_definition(value);
|
||||
if (NULL != hwmgr->smumgr->smumgr_funcs->get_mac_definition)
|
||||
return hwmgr->smumgr->smumgr_funcs->get_mac_definition(value);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int smum_download_powerplay_table(struct pp_smumgr *smumgr,
|
||||
void **table)
|
||||
int smum_download_powerplay_table(struct pp_hwmgr *hwmgr, void **table)
|
||||
{
|
||||
if (NULL != smumgr->smumgr_funcs->download_pptable_settings)
|
||||
return smumgr->smumgr_funcs->download_pptable_settings(smumgr,
|
||||
if (NULL != hwmgr->smumgr->smumgr_funcs->download_pptable_settings)
|
||||
return hwmgr->smumgr->smumgr_funcs->download_pptable_settings(hwmgr,
|
||||
table);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int smum_upload_powerplay_table(struct pp_smumgr *smumgr)
|
||||
int smum_upload_powerplay_table(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
if (NULL != smumgr->smumgr_funcs->upload_pptable_settings)
|
||||
return smumgr->smumgr_funcs->upload_pptable_settings(smumgr);
|
||||
if (NULL != hwmgr->smumgr->smumgr_funcs->upload_pptable_settings)
|
||||
return hwmgr->smumgr->smumgr_funcs->upload_pptable_settings(hwmgr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int smum_send_msg_to_smc(struct pp_smumgr *smumgr, uint16_t msg)
|
||||
int smum_send_msg_to_smc(struct pp_hwmgr *hwmgr, uint16_t msg)
|
||||
{
|
||||
if (smumgr == NULL || smumgr->smumgr_funcs->send_msg_to_smc == NULL)
|
||||
if (hwmgr == NULL || hwmgr->smumgr->smumgr_funcs->send_msg_to_smc == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
return smumgr->smumgr_funcs->send_msg_to_smc(smumgr, msg);
|
||||
return hwmgr->smumgr->smumgr_funcs->send_msg_to_smc(hwmgr, msg);
|
||||
}
|
||||
|
||||
int smum_send_msg_to_smc_with_parameter(struct pp_smumgr *smumgr,
|
||||
int smum_send_msg_to_smc_with_parameter(struct pp_hwmgr *hwmgr,
|
||||
uint16_t msg, uint32_t parameter)
|
||||
{
|
||||
if (smumgr == NULL ||
|
||||
smumgr->smumgr_funcs->send_msg_to_smc_with_parameter == NULL)
|
||||
if (hwmgr == NULL ||
|
||||
hwmgr->smumgr->smumgr_funcs->send_msg_to_smc_with_parameter == NULL)
|
||||
return -EINVAL;
|
||||
return smumgr->smumgr_funcs->send_msg_to_smc_with_parameter(
|
||||
smumgr, msg, parameter);
|
||||
return hwmgr->smumgr->smumgr_funcs->send_msg_to_smc_with_parameter(
|
||||
hwmgr, msg, parameter);
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns once the part of the register indicated by the mask has
|
||||
* reached the given value.
|
||||
*/
|
||||
int smum_wait_on_register(struct pp_smumgr *smumgr,
|
||||
int smum_wait_on_register(struct pp_hwmgr *hwmgr,
|
||||
uint32_t index,
|
||||
uint32_t value, uint32_t mask)
|
||||
{
|
||||
uint32_t i;
|
||||
uint32_t cur_value;
|
||||
|
||||
if (smumgr == NULL || smumgr->device == NULL)
|
||||
if (hwmgr == NULL || hwmgr->device == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 0; i < smumgr->usec_timeout; i++) {
|
||||
cur_value = cgs_read_register(smumgr->device, index);
|
||||
for (i = 0; i < hwmgr->usec_timeout; i++) {
|
||||
cur_value = cgs_read_register(hwmgr->device, index);
|
||||
if ((cur_value & mask) == (value & mask))
|
||||
break;
|
||||
udelay(1);
|
||||
}
|
||||
|
||||
/* timeout means wrong logic*/
|
||||
if (i == smumgr->usec_timeout)
|
||||
if (i == hwmgr->usec_timeout)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int smum_wait_for_register_unequal(struct pp_smumgr *smumgr,
|
||||
int smum_wait_for_register_unequal(struct pp_hwmgr *hwmgr,
|
||||
uint32_t index,
|
||||
uint32_t value, uint32_t mask)
|
||||
{
|
||||
uint32_t i;
|
||||
uint32_t cur_value;
|
||||
|
||||
if (smumgr == NULL)
|
||||
if (hwmgr == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 0; i < smumgr->usec_timeout; i++) {
|
||||
cur_value = cgs_read_register(smumgr->device,
|
||||
for (i = 0; i < hwmgr->usec_timeout; i++) {
|
||||
cur_value = cgs_read_register(hwmgr->device,
|
||||
index);
|
||||
if ((cur_value & mask) != (value & mask))
|
||||
break;
|
||||
|
@ -264,7 +263,7 @@ int smum_wait_for_register_unequal(struct pp_smumgr *smumgr,
|
|||
}
|
||||
|
||||
/* timeout means wrong logic */
|
||||
if (i == smumgr->usec_timeout)
|
||||
if (i == hwmgr->usec_timeout)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
|
@ -276,31 +275,31 @@ int smum_wait_for_register_unequal(struct pp_smumgr *smumgr,
|
|||
* has reached the given value.The indirect space is described by
|
||||
* giving the memory-mapped index of the indirect index register.
|
||||
*/
|
||||
int smum_wait_on_indirect_register(struct pp_smumgr *smumgr,
|
||||
int smum_wait_on_indirect_register(struct pp_hwmgr *hwmgr,
|
||||
uint32_t indirect_port,
|
||||
uint32_t index,
|
||||
uint32_t value,
|
||||
uint32_t mask)
|
||||
{
|
||||
if (smumgr == NULL || smumgr->device == NULL)
|
||||
if (hwmgr == NULL || hwmgr->device == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
cgs_write_register(smumgr->device, indirect_port, index);
|
||||
return smum_wait_on_register(smumgr, indirect_port + 1,
|
||||
cgs_write_register(hwmgr->device, indirect_port, index);
|
||||
return smum_wait_on_register(hwmgr, indirect_port + 1,
|
||||
mask, value);
|
||||
}
|
||||
|
||||
void smum_wait_for_indirect_register_unequal(
|
||||
struct pp_smumgr *smumgr,
|
||||
struct pp_hwmgr *hwmgr,
|
||||
uint32_t indirect_port,
|
||||
uint32_t index,
|
||||
uint32_t value,
|
||||
uint32_t mask)
|
||||
{
|
||||
if (smumgr == NULL || smumgr->device == NULL)
|
||||
if (hwmgr == NULL || hwmgr->device == NULL)
|
||||
return;
|
||||
cgs_write_register(smumgr->device, indirect_port, index);
|
||||
smum_wait_for_register_unequal(smumgr, indirect_port + 1,
|
||||
cgs_write_register(hwmgr->device, indirect_port, index);
|
||||
smum_wait_for_register_unequal(hwmgr, indirect_port + 1,
|
||||
value, mask);
|
||||
}
|
||||
|
||||
|
@ -406,10 +405,10 @@ int smum_populate_requested_graphic_levels(struct pp_hwmgr *hwmgr,
|
|||
return 0;
|
||||
}
|
||||
|
||||
bool smum_is_hw_avfs_present(struct pp_smumgr *smumgr)
|
||||
bool smum_is_hw_avfs_present(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
if (smumgr->smumgr_funcs->is_hw_avfs_present)
|
||||
return smumgr->smumgr_funcs->is_hw_avfs_present(smumgr);
|
||||
if (hwmgr->smumgr->smumgr_funcs->is_hw_avfs_present)
|
||||
return hwmgr->smumgr->smumgr_funcs->is_hw_avfs_present(hwmgr);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -690,7 +690,7 @@ int tonga_populate_all_graphic_levels(struct pp_hwmgr *hwmgr)
|
|||
smu_data->smc_state_table.GraphicsLevel[1].pcieDpmLevel = mid_pcie_level_enabled;
|
||||
}
|
||||
/* level count will send to smc once at init smc table and never change*/
|
||||
result = smu7_copy_bytes_to_smc(hwmgr->smumgr, level_array_address,
|
||||
result = smu7_copy_bytes_to_smc(hwmgr, level_array_address,
|
||||
(uint8_t *)levels, (uint32_t)level_array_size,
|
||||
SMC_RAM_END);
|
||||
|
||||
|
@ -1048,7 +1048,7 @@ int tonga_populate_all_memory_levels(struct pp_hwmgr *hwmgr)
|
|||
smu_data->smc_state_table.MemoryLevel[dpm_table->mclk_table.count-1].DisplayWatermark = PPSMC_DISPLAY_WATERMARK_HIGH;
|
||||
|
||||
/* level count will send to smc once at init smc table and never change*/
|
||||
result = smu7_copy_bytes_to_smc(hwmgr->smumgr,
|
||||
result = smu7_copy_bytes_to_smc(hwmgr,
|
||||
level_array_address, (uint8_t *)levels, (uint32_t)level_array_size,
|
||||
SMC_RAM_END);
|
||||
|
||||
|
@ -1475,7 +1475,7 @@ static int tonga_program_memory_timing_parameters(struct pp_hwmgr *hwmgr)
|
|||
|
||||
if (!result) {
|
||||
result = smu7_copy_bytes_to_smc(
|
||||
hwmgr->smumgr,
|
||||
hwmgr,
|
||||
smu_data->smu7_data.arb_table_start,
|
||||
(uint8_t *)&arb_regs,
|
||||
sizeof(SMU72_Discrete_MCArbDramTimingTable),
|
||||
|
@ -1782,9 +1782,9 @@ static int tonga_populate_vr_config(struct pp_hwmgr *hwmgr,
|
|||
* @param hwmgr the address of the powerplay hardware manager.
|
||||
* @return always 0
|
||||
*/
|
||||
static int tonga_init_arb_table_index(struct pp_smumgr *smumgr)
|
||||
static int tonga_init_arb_table_index(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct tonga_smumgr *smu_data = (struct tonga_smumgr *)(smumgr->backend);
|
||||
struct tonga_smumgr *smu_data = (struct tonga_smumgr *)(hwmgr->smumgr->backend);
|
||||
uint32_t tmp;
|
||||
int result;
|
||||
|
||||
|
@ -1797,7 +1797,7 @@ static int tonga_init_arb_table_index(struct pp_smumgr *smumgr)
|
|||
* In reality this field should not be in that structure
|
||||
* but in a soft register.
|
||||
*/
|
||||
result = smu7_read_smc_sram_dword(smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
smu_data->smu7_data.arb_table_start, &tmp, SMC_RAM_END);
|
||||
|
||||
if (result != 0)
|
||||
|
@ -1806,7 +1806,7 @@ static int tonga_init_arb_table_index(struct pp_smumgr *smumgr)
|
|||
tmp &= 0x00FFFFFF;
|
||||
tmp |= ((uint32_t)MC_CG_ARB_FREQ_F1) << 24;
|
||||
|
||||
return smu7_write_smc_sram_dword(smumgr,
|
||||
return smu7_write_smc_sram_dword(hwmgr,
|
||||
smu_data->smu7_data.arb_table_start, tmp, SMC_RAM_END);
|
||||
}
|
||||
|
||||
|
@ -1901,7 +1901,7 @@ static int tonga_populate_dw8(struct pp_hwmgr *hwmgr, uint32_t fuse_table_offset
|
|||
const struct tonga_pt_defaults *defaults = smu_data->power_tune_defaults;
|
||||
uint32_t temp;
|
||||
|
||||
if (smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
if (smu7_read_smc_sram_dword(hwmgr,
|
||||
fuse_table_offset +
|
||||
offsetof(SMU72_Discrete_PmFuses, TdcWaterfallCtl),
|
||||
(uint32_t *)&temp, SMC_RAM_END))
|
||||
|
@ -1987,7 +1987,7 @@ static int tonga_populate_pm_fuses(struct pp_hwmgr *hwmgr)
|
|||
|
||||
if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
|
||||
PHM_PlatformCaps_PowerContainment)) {
|
||||
if (smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
if (smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU72_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU72_Firmware_Header, PmFuseTable),
|
||||
&pm_fuse_table_offset, SMC_RAM_END))
|
||||
|
@ -2038,7 +2038,7 @@ static int tonga_populate_pm_fuses(struct pp_hwmgr *hwmgr)
|
|||
"Hi and Lo Sidd Failed !",
|
||||
return -EINVAL);
|
||||
|
||||
if (smu7_copy_bytes_to_smc(hwmgr->smumgr, pm_fuse_table_offset,
|
||||
if (smu7_copy_bytes_to_smc(hwmgr, pm_fuse_table_offset,
|
||||
(uint8_t *)&smu_data->power_tune_table,
|
||||
sizeof(struct SMU72_Discrete_PmFuses), SMC_RAM_END))
|
||||
PP_ASSERT_WITH_CODE(false,
|
||||
|
@ -2048,10 +2048,10 @@ static int tonga_populate_pm_fuses(struct pp_hwmgr *hwmgr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int tonga_populate_mc_reg_address(struct pp_smumgr *smumgr,
|
||||
static int tonga_populate_mc_reg_address(struct pp_hwmgr *hwmgr,
|
||||
SMU72_Discrete_MCRegisters *mc_reg_table)
|
||||
{
|
||||
const struct tonga_smumgr *smu_data = (struct tonga_smumgr *)smumgr->backend;
|
||||
const struct tonga_smumgr *smu_data = (struct tonga_smumgr *)hwmgr->smumgr->backend;
|
||||
|
||||
uint32_t i, j;
|
||||
|
||||
|
@ -2092,12 +2092,12 @@ static void tonga_convert_mc_registers(
|
|||
}
|
||||
|
||||
static int tonga_convert_mc_reg_table_entry_to_smc(
|
||||
struct pp_smumgr *smumgr,
|
||||
struct pp_hwmgr *hwmgr,
|
||||
const uint32_t memory_clock,
|
||||
SMU72_Discrete_MCRegisterSet *mc_reg_table_data
|
||||
)
|
||||
{
|
||||
struct tonga_smumgr *smu_data = (struct tonga_smumgr *)(smumgr->backend);
|
||||
struct tonga_smumgr *smu_data = (struct tonga_smumgr *)(hwmgr->smumgr->backend);
|
||||
uint32_t i = 0;
|
||||
|
||||
for (i = 0; i < smu_data->mc_reg_table.num_entries; i++) {
|
||||
|
@ -2127,7 +2127,7 @@ static int tonga_convert_mc_reg_table_to_smc(struct pp_hwmgr *hwmgr,
|
|||
|
||||
for (i = 0; i < data->dpm_table.mclk_table.count; i++) {
|
||||
res = tonga_convert_mc_reg_table_entry_to_smc(
|
||||
hwmgr->smumgr,
|
||||
hwmgr,
|
||||
data->dpm_table.mclk_table.dpm_levels[i].value,
|
||||
&mc_regs->data[i]
|
||||
);
|
||||
|
@ -2141,8 +2141,7 @@ static int tonga_convert_mc_reg_table_to_smc(struct pp_hwmgr *hwmgr,
|
|||
|
||||
static int tonga_update_and_upload_mc_reg_table(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct pp_smumgr *smumgr = hwmgr->smumgr;
|
||||
struct tonga_smumgr *smu_data = (struct tonga_smumgr *)(smumgr->backend);
|
||||
struct tonga_smumgr *smu_data = (struct tonga_smumgr *)(hwmgr->smumgr->backend);
|
||||
struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
|
||||
uint32_t address;
|
||||
int32_t result;
|
||||
|
@ -2163,7 +2162,7 @@ static int tonga_update_and_upload_mc_reg_table(struct pp_hwmgr *hwmgr)
|
|||
(uint32_t)offsetof(SMU72_Discrete_MCRegisters, data[0]);
|
||||
|
||||
return smu7_copy_bytes_to_smc(
|
||||
hwmgr->smumgr, address,
|
||||
hwmgr, address,
|
||||
(uint8_t *)&smu_data->mc_regs.data[0],
|
||||
sizeof(SMU72_Discrete_MCRegisterSet) *
|
||||
data->dpm_table.mclk_table.count,
|
||||
|
@ -2173,11 +2172,10 @@ static int tonga_update_and_upload_mc_reg_table(struct pp_hwmgr *hwmgr)
|
|||
static int tonga_populate_initial_mc_reg_table(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
int result;
|
||||
struct pp_smumgr *smumgr = hwmgr->smumgr;
|
||||
struct tonga_smumgr *smu_data = (struct tonga_smumgr *)(smumgr->backend);
|
||||
struct tonga_smumgr *smu_data = (struct tonga_smumgr *)(hwmgr->smumgr->backend);
|
||||
|
||||
memset(&smu_data->mc_regs, 0x00, sizeof(SMU72_Discrete_MCRegisters));
|
||||
result = tonga_populate_mc_reg_address(smumgr, &(smu_data->mc_regs));
|
||||
result = tonga_populate_mc_reg_address(hwmgr, &(smu_data->mc_regs));
|
||||
PP_ASSERT_WITH_CODE(!result,
|
||||
"Failed to initialize MCRegTable for the MC register addresses !",
|
||||
return result;);
|
||||
|
@ -2187,7 +2185,7 @@ static int tonga_populate_initial_mc_reg_table(struct pp_hwmgr *hwmgr)
|
|||
"Failed to initialize MCRegTable for driver state !",
|
||||
return result;);
|
||||
|
||||
return smu7_copy_bytes_to_smc(smumgr, smu_data->smu7_data.mc_reg_table_start,
|
||||
return smu7_copy_bytes_to_smc(hwmgr, smu_data->smu7_data.mc_reg_table_start,
|
||||
(uint8_t *)&smu_data->mc_regs, sizeof(SMU72_Discrete_MCRegisters), SMC_RAM_END);
|
||||
}
|
||||
|
||||
|
@ -2471,7 +2469,7 @@ int tonga_init_smc_table(struct pp_hwmgr *hwmgr)
|
|||
|
||||
/* Upload all dpm data to SMC memory.(dpm level, dpm level count etc) */
|
||||
result = smu7_copy_bytes_to_smc(
|
||||
hwmgr->smumgr,
|
||||
hwmgr,
|
||||
smu_data->smu7_data.dpm_table_start + offsetof(SMU72_Discrete_DpmTable, SystemFlags),
|
||||
(uint8_t *)&(table->SystemFlags),
|
||||
sizeof(SMU72_Discrete_DpmTable) - 3 * sizeof(SMU72_PIDController),
|
||||
|
@ -2480,7 +2478,7 @@ int tonga_init_smc_table(struct pp_hwmgr *hwmgr)
|
|||
PP_ASSERT_WITH_CODE(!result,
|
||||
"Failed to upload dpm data to SMC memory !", return result;);
|
||||
|
||||
result = tonga_init_arb_table_index(hwmgr->smumgr);
|
||||
result = tonga_init_arb_table_index(hwmgr);
|
||||
PP_ASSERT_WITH_CODE(!result,
|
||||
"Failed to upload arb data to SMC memory !", return result);
|
||||
|
||||
|
@ -2588,7 +2586,7 @@ int tonga_thermal_setup_fan_table(struct pp_hwmgr *hwmgr)
|
|||
|
||||
fan_table.FanControl_GL_Flag = 1;
|
||||
|
||||
res = smu7_copy_bytes_to_smc(hwmgr->smumgr,
|
||||
res = smu7_copy_bytes_to_smc(hwmgr,
|
||||
smu_data->smu7_data.fan_table_start,
|
||||
(uint8_t *)&fan_table,
|
||||
(uint32_t)sizeof(fan_table),
|
||||
|
@ -2630,7 +2628,7 @@ int tonga_update_sclk_threshold(struct pp_hwmgr *hwmgr)
|
|||
CONVERT_FROM_HOST_TO_SMC_UL(low_sclk_interrupt_threshold);
|
||||
|
||||
result = smu7_copy_bytes_to_smc(
|
||||
hwmgr->smumgr,
|
||||
hwmgr,
|
||||
smu_data->smu7_data.dpm_table_start +
|
||||
offsetof(SMU72_Discrete_DpmTable,
|
||||
LowSclkInterruptThreshold),
|
||||
|
@ -2741,7 +2739,7 @@ static int tonga_update_uvd_smc_table(struct pp_hwmgr *hwmgr)
|
|||
PHM_PlatformCaps_UVDDPM) ||
|
||||
phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
|
||||
PHM_PlatformCaps_StablePState))
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_UVDDPM_SetEnabledMask,
|
||||
(uint32_t)(1 << smu_data->smc_state_table.UvdBootLevel));
|
||||
return 0;
|
||||
|
@ -2772,7 +2770,7 @@ static int tonga_update_vce_smc_table(struct pp_hwmgr *hwmgr)
|
|||
|
||||
if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
|
||||
PHM_PlatformCaps_StablePState))
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_VCEDPM_SetEnabledMask,
|
||||
(uint32_t)1 << smu_data->smc_state_table.VceBootLevel);
|
||||
return 0;
|
||||
|
@ -2798,7 +2796,7 @@ static int tonga_update_samu_smc_table(struct pp_hwmgr *hwmgr)
|
|||
|
||||
if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
|
||||
PHM_PlatformCaps_StablePState))
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SAMUDPM_SetEnabledMask,
|
||||
(uint32_t)(1 << smu_data->smc_state_table.SamuBootLevel));
|
||||
return 0;
|
||||
|
@ -2838,7 +2836,7 @@ int tonga_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
int result;
|
||||
bool error = false;
|
||||
|
||||
result = smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU72_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU72_Firmware_Header, DpmTable),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -2848,7 +2846,7 @@ int tonga_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
|
||||
error |= (result != 0);
|
||||
|
||||
result = smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU72_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU72_Firmware_Header, SoftRegisters),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -2861,7 +2859,7 @@ int tonga_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
error |= (result != 0);
|
||||
|
||||
|
||||
result = smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU72_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU72_Firmware_Header, mcRegisterTable),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -2869,7 +2867,7 @@ int tonga_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
if (!result)
|
||||
smu_data->smu7_data.mc_reg_table_start = tmp;
|
||||
|
||||
result = smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU72_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU72_Firmware_Header, FanTable),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -2879,7 +2877,7 @@ int tonga_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
|
||||
error |= (result != 0);
|
||||
|
||||
result = smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU72_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU72_Firmware_Header, mcArbDramTimingTable),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -2889,7 +2887,7 @@ int tonga_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
|
||||
error |= (result != 0);
|
||||
|
||||
result = smu7_read_smc_sram_dword(hwmgr->smumgr,
|
||||
result = smu7_read_smc_sram_dword(hwmgr,
|
||||
SMU72_FIRMWARE_HEADER_LOCATION +
|
||||
offsetof(SMU72_Firmware_Header, Version),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
@ -3258,6 +3256,6 @@ int tonga_populate_requested_graphic_levels(struct pp_hwmgr *hwmgr,
|
|||
levels[i].DownHyst = request->down_hyst;
|
||||
}
|
||||
|
||||
return smu7_copy_bytes_to_smc(hwmgr->smumgr, array, (uint8_t *)levels,
|
||||
return smu7_copy_bytes_to_smc(hwmgr, array, (uint8_t *)levels,
|
||||
array_size, SMC_RAM_END);
|
||||
}
|
||||
|
|
|
@ -37,125 +37,125 @@
|
|||
#include "smu7_smumgr.h"
|
||||
|
||||
|
||||
static int tonga_start_in_protection_mode(struct pp_smumgr *smumgr)
|
||||
static int tonga_start_in_protection_mode(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
int result;
|
||||
|
||||
/* Assert reset */
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
SMC_SYSCON_RESET_CNTL, rst_reg, 1);
|
||||
|
||||
result = smu7_upload_smu_firmware_image(smumgr);
|
||||
result = smu7_upload_smu_firmware_image(hwmgr);
|
||||
if (result)
|
||||
return result;
|
||||
|
||||
/* Clear status */
|
||||
cgs_write_ind_register(smumgr->device, CGS_IND_REG__SMC,
|
||||
cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC,
|
||||
ixSMU_STATUS, 0);
|
||||
|
||||
/* Enable clock */
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
SMC_SYSCON_CLOCK_CNTL_0, ck_disable, 0);
|
||||
|
||||
/* De-assert reset */
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
SMC_SYSCON_RESET_CNTL, rst_reg, 0);
|
||||
|
||||
/* Set SMU Auto Start */
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
SMU_INPUT_DATA, AUTO_START, 1);
|
||||
|
||||
/* Clear firmware interrupt enable flag */
|
||||
cgs_write_ind_register(smumgr->device, CGS_IND_REG__SMC,
|
||||
cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC,
|
||||
ixFIRMWARE_FLAGS, 0);
|
||||
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD(smumgr, SMC_IND,
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD(hwmgr, SMC_IND,
|
||||
RCU_UC_EVENTS, INTERRUPTS_ENABLED, 1);
|
||||
|
||||
/**
|
||||
* Call Test SMU message with 0x20000 offset to trigger SMU start
|
||||
*/
|
||||
smu7_send_msg_to_smc_offset(smumgr);
|
||||
smu7_send_msg_to_smc_offset(hwmgr);
|
||||
|
||||
/* Wait for done bit to be set */
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD_UNEQUAL(smumgr, SMC_IND,
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD_UNEQUAL(hwmgr, SMC_IND,
|
||||
SMU_STATUS, SMU_DONE, 0);
|
||||
|
||||
/* Check pass/failed indicator */
|
||||
if (1 != SMUM_READ_VFPF_INDIRECT_FIELD(smumgr->device,
|
||||
if (1 != SMUM_READ_VFPF_INDIRECT_FIELD(hwmgr->device,
|
||||
CGS_IND_REG__SMC, SMU_STATUS, SMU_PASS)) {
|
||||
pr_err("SMU Firmware start failed\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Wait for firmware to initialize */
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD(smumgr, SMC_IND,
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD(hwmgr, SMC_IND,
|
||||
FIRMWARE_FLAGS, INTERRUPTS_ENABLED, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int tonga_start_in_non_protection_mode(struct pp_smumgr *smumgr)
|
||||
static int tonga_start_in_non_protection_mode(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
/* wait for smc boot up */
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD_UNEQUAL(smumgr, SMC_IND,
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD_UNEQUAL(hwmgr, SMC_IND,
|
||||
RCU_UC_EVENTS, boot_seq_done, 0);
|
||||
|
||||
/*Clear firmware interrupt enable flag*/
|
||||
cgs_write_ind_register(smumgr->device, CGS_IND_REG__SMC,
|
||||
cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC,
|
||||
ixFIRMWARE_FLAGS, 0);
|
||||
|
||||
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
SMC_SYSCON_RESET_CNTL, rst_reg, 1);
|
||||
|
||||
result = smu7_upload_smu_firmware_image(smumgr);
|
||||
result = smu7_upload_smu_firmware_image(hwmgr);
|
||||
|
||||
if (result != 0)
|
||||
return result;
|
||||
|
||||
/* Set smc instruct start point at 0x0 */
|
||||
smu7_program_jump_on_start(smumgr);
|
||||
smu7_program_jump_on_start(hwmgr);
|
||||
|
||||
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
SMC_SYSCON_CLOCK_CNTL_0, ck_disable, 0);
|
||||
|
||||
/*De-assert reset*/
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
|
||||
SMUM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
SMC_SYSCON_RESET_CNTL, rst_reg, 0);
|
||||
|
||||
/* Wait for firmware to initialize */
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD(smumgr, SMC_IND,
|
||||
SMUM_WAIT_VFPF_INDIRECT_FIELD(hwmgr, SMC_IND,
|
||||
FIRMWARE_FLAGS, INTERRUPTS_ENABLED, 1);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static int tonga_start_smu(struct pp_smumgr *smumgr)
|
||||
static int tonga_start_smu(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
int result;
|
||||
|
||||
/* Only start SMC if SMC RAM is not running */
|
||||
if (!(smu7_is_smc_ram_running(smumgr) ||
|
||||
cgs_is_virtualization_enabled(smumgr->device))) {
|
||||
if (!(smu7_is_smc_ram_running(hwmgr) ||
|
||||
cgs_is_virtualization_enabled(hwmgr->device))) {
|
||||
/*Check if SMU is running in protected mode*/
|
||||
if (0 == SMUM_READ_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
|
||||
if (0 == SMUM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
SMU_FIRMWARE, SMU_MODE)) {
|
||||
result = tonga_start_in_non_protection_mode(smumgr);
|
||||
result = tonga_start_in_non_protection_mode(hwmgr);
|
||||
if (result)
|
||||
return result;
|
||||
} else {
|
||||
result = tonga_start_in_protection_mode(smumgr);
|
||||
result = tonga_start_in_protection_mode(hwmgr);
|
||||
if (result)
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
result = smu7_request_smu_load_fw(smumgr);
|
||||
result = smu7_request_smu_load_fw(hwmgr);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -167,7 +167,7 @@ static int tonga_start_smu(struct pp_smumgr *smumgr)
|
|||
* @param smcAddress the address in the SMC RAM to access.
|
||||
* @param value to write to the SMC SRAM.
|
||||
*/
|
||||
static int tonga_smu_init(struct pp_smumgr *smumgr)
|
||||
static int tonga_smu_init(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct tonga_smumgr *tonga_priv = NULL;
|
||||
int i;
|
||||
|
@ -176,9 +176,9 @@ static int tonga_smu_init(struct pp_smumgr *smumgr)
|
|||
if (tonga_priv == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
smumgr->backend = tonga_priv;
|
||||
hwmgr->smumgr->backend = tonga_priv;
|
||||
|
||||
if (smu7_init(smumgr))
|
||||
if (smu7_init(hwmgr))
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 0; i < SMU72_MAX_LEVELS_GRAPHICS; i++)
|
||||
|
|
|
@ -53,20 +53,20 @@
|
|||
#define smnMP0_FW_INTF 0x3010104
|
||||
#define smnMP1_PUB_CTRL 0x3010b14
|
||||
|
||||
static bool vega10_is_smc_ram_running(struct pp_smumgr *smumgr)
|
||||
static bool vega10_is_smc_ram_running(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
uint32_t mp1_fw_flags, reg;
|
||||
|
||||
reg = soc15_get_register_offset(NBIF_HWID, 0,
|
||||
mmPCIE_INDEX2_BASE_IDX, mmPCIE_INDEX2);
|
||||
|
||||
cgs_write_register(smumgr->device, reg,
|
||||
cgs_write_register(hwmgr->device, reg,
|
||||
(MP1_Public | (smnMP1_FIRMWARE_FLAGS & 0xffffffff)));
|
||||
|
||||
reg = soc15_get_register_offset(NBIF_HWID, 0,
|
||||
mmPCIE_DATA2_BASE_IDX, mmPCIE_DATA2);
|
||||
|
||||
mp1_fw_flags = cgs_read_register(smumgr->device, reg);
|
||||
mp1_fw_flags = cgs_read_register(hwmgr->device, reg);
|
||||
|
||||
if (mp1_fw_flags & MP1_FIRMWARE_FLAGS__INTERRUPTS_ENABLED_MASK)
|
||||
return true;
|
||||
|
@ -80,20 +80,20 @@ static bool vega10_is_smc_ram_running(struct pp_smumgr *smumgr)
|
|||
* @param smumgr the address of the powerplay hardware manager.
|
||||
* @return TRUE SMC has responded, FALSE otherwise.
|
||||
*/
|
||||
static uint32_t vega10_wait_for_response(struct pp_smumgr *smumgr)
|
||||
static uint32_t vega10_wait_for_response(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
uint32_t reg;
|
||||
|
||||
if (!vega10_is_smc_ram_running(smumgr))
|
||||
if (!vega10_is_smc_ram_running(hwmgr))
|
||||
return -EINVAL;
|
||||
|
||||
reg = soc15_get_register_offset(MP1_HWID, 0,
|
||||
mmMP1_SMN_C2PMSG_90_BASE_IDX, mmMP1_SMN_C2PMSG_90);
|
||||
|
||||
smum_wait_for_register_unequal(smumgr, reg,
|
||||
smum_wait_for_register_unequal(hwmgr, reg,
|
||||
0, MP1_C2PMSG_90__CONTENT_MASK);
|
||||
|
||||
return cgs_read_register(smumgr->device, reg);
|
||||
return cgs_read_register(hwmgr->device, reg);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -102,43 +102,43 @@ static uint32_t vega10_wait_for_response(struct pp_smumgr *smumgr)
|
|||
* @param msg the message to send.
|
||||
* @return Always return 0.
|
||||
*/
|
||||
int vega10_send_msg_to_smc_without_waiting(struct pp_smumgr *smumgr,
|
||||
int vega10_send_msg_to_smc_without_waiting(struct pp_hwmgr *hwmgr,
|
||||
uint16_t msg)
|
||||
{
|
||||
uint32_t reg;
|
||||
|
||||
if (!vega10_is_smc_ram_running(smumgr))
|
||||
if (!vega10_is_smc_ram_running(hwmgr))
|
||||
return -EINVAL;
|
||||
|
||||
reg = soc15_get_register_offset(MP1_HWID, 0,
|
||||
mmMP1_SMN_C2PMSG_66_BASE_IDX, mmMP1_SMN_C2PMSG_66);
|
||||
cgs_write_register(smumgr->device, reg, msg);
|
||||
cgs_write_register(hwmgr->device, reg, msg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Send a message to the SMC, and wait for its response.
|
||||
* @param smumgr the address of the powerplay hardware manager.
|
||||
* @param hwmgr the address of the powerplay hardware manager.
|
||||
* @param msg the message to send.
|
||||
* @return Always return 0.
|
||||
*/
|
||||
int vega10_send_msg_to_smc(struct pp_smumgr *smumgr, uint16_t msg)
|
||||
int vega10_send_msg_to_smc(struct pp_hwmgr *hwmgr, uint16_t msg)
|
||||
{
|
||||
uint32_t reg;
|
||||
|
||||
if (!vega10_is_smc_ram_running(smumgr))
|
||||
if (!vega10_is_smc_ram_running(hwmgr))
|
||||
return -EINVAL;
|
||||
|
||||
vega10_wait_for_response(smumgr);
|
||||
vega10_wait_for_response(hwmgr);
|
||||
|
||||
reg = soc15_get_register_offset(MP1_HWID, 0,
|
||||
mmMP1_SMN_C2PMSG_90_BASE_IDX, mmMP1_SMN_C2PMSG_90);
|
||||
cgs_write_register(smumgr->device, reg, 0);
|
||||
cgs_write_register(hwmgr->device, reg, 0);
|
||||
|
||||
vega10_send_msg_to_smc_without_waiting(smumgr, msg);
|
||||
vega10_send_msg_to_smc_without_waiting(hwmgr, msg);
|
||||
|
||||
if (vega10_wait_for_response(smumgr) != 1)
|
||||
if (vega10_wait_for_response(hwmgr) != 1)
|
||||
pr_err("Failed to send message: 0x%x\n", msg);
|
||||
|
||||
return 0;
|
||||
|
@ -146,32 +146,32 @@ int vega10_send_msg_to_smc(struct pp_smumgr *smumgr, uint16_t msg)
|
|||
|
||||
/*
|
||||
* Send a message to the SMC with parameter
|
||||
* @param smumgr: the address of the powerplay hardware manager.
|
||||
* @param hwmgr: the address of the powerplay hardware manager.
|
||||
* @param msg: the message to send.
|
||||
* @param parameter: the parameter to send
|
||||
* @return Always return 0.
|
||||
*/
|
||||
int vega10_send_msg_to_smc_with_parameter(struct pp_smumgr *smumgr,
|
||||
int vega10_send_msg_to_smc_with_parameter(struct pp_hwmgr *hwmgr,
|
||||
uint16_t msg, uint32_t parameter)
|
||||
{
|
||||
uint32_t reg;
|
||||
|
||||
if (!vega10_is_smc_ram_running(smumgr))
|
||||
if (!vega10_is_smc_ram_running(hwmgr))
|
||||
return -EINVAL;
|
||||
|
||||
vega10_wait_for_response(smumgr);
|
||||
vega10_wait_for_response(hwmgr);
|
||||
|
||||
reg = soc15_get_register_offset(MP1_HWID, 0,
|
||||
mmMP1_SMN_C2PMSG_90_BASE_IDX, mmMP1_SMN_C2PMSG_90);
|
||||
cgs_write_register(smumgr->device, reg, 0);
|
||||
cgs_write_register(hwmgr->device, reg, 0);
|
||||
|
||||
reg = soc15_get_register_offset(MP1_HWID, 0,
|
||||
mmMP1_SMN_C2PMSG_82_BASE_IDX, mmMP1_SMN_C2PMSG_82);
|
||||
cgs_write_register(smumgr->device, reg, parameter);
|
||||
cgs_write_register(hwmgr->device, reg, parameter);
|
||||
|
||||
vega10_send_msg_to_smc_without_waiting(smumgr, msg);
|
||||
vega10_send_msg_to_smc_without_waiting(hwmgr, msg);
|
||||
|
||||
if (vega10_wait_for_response(smumgr) != 1)
|
||||
if (vega10_wait_for_response(hwmgr) != 1)
|
||||
pr_err("Failed to send message: 0x%x\n", msg);
|
||||
|
||||
return 0;
|
||||
|
@ -180,51 +180,51 @@ int vega10_send_msg_to_smc_with_parameter(struct pp_smumgr *smumgr,
|
|||
|
||||
/*
|
||||
* Send a message to the SMC with parameter, do not wait for response
|
||||
* @param smumgr: the address of the powerplay hardware manager.
|
||||
* @param hwmgr: the address of the powerplay hardware manager.
|
||||
* @param msg: the message to send.
|
||||
* @param parameter: the parameter to send
|
||||
* @return The response that came from the SMC.
|
||||
*/
|
||||
int vega10_send_msg_to_smc_with_parameter_without_waiting(
|
||||
struct pp_smumgr *smumgr, uint16_t msg, uint32_t parameter)
|
||||
struct pp_hwmgr *hwmgr, uint16_t msg, uint32_t parameter)
|
||||
{
|
||||
uint32_t reg;
|
||||
|
||||
reg = soc15_get_register_offset(MP1_HWID, 0,
|
||||
mmMP1_SMN_C2PMSG_82_BASE_IDX, mmMP1_SMN_C2PMSG_82);
|
||||
cgs_write_register(smumgr->device, reg, parameter);
|
||||
cgs_write_register(hwmgr->device, reg, parameter);
|
||||
|
||||
return vega10_send_msg_to_smc_without_waiting(smumgr, msg);
|
||||
return vega10_send_msg_to_smc_without_waiting(hwmgr, msg);
|
||||
}
|
||||
|
||||
/*
|
||||
* Retrieve an argument from SMC.
|
||||
* @param smumgr the address of the powerplay hardware manager.
|
||||
* @param hwmgr the address of the powerplay hardware manager.
|
||||
* @param arg pointer to store the argument from SMC.
|
||||
* @return Always return 0.
|
||||
*/
|
||||
int vega10_read_arg_from_smc(struct pp_smumgr *smumgr, uint32_t *arg)
|
||||
int vega10_read_arg_from_smc(struct pp_hwmgr *hwmgr, uint32_t *arg)
|
||||
{
|
||||
uint32_t reg;
|
||||
|
||||
reg = soc15_get_register_offset(MP1_HWID, 0,
|
||||
mmMP1_SMN_C2PMSG_82_BASE_IDX, mmMP1_SMN_C2PMSG_82);
|
||||
|
||||
*arg = cgs_read_register(smumgr->device, reg);
|
||||
*arg = cgs_read_register(hwmgr->device, reg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Copy table from SMC into driver FB
|
||||
* @param smumgr the address of the SMC manager
|
||||
* @param hwmgr the address of the HW manager
|
||||
* @param table_id the driver's table ID to copy from
|
||||
*/
|
||||
int vega10_copy_table_from_smc(struct pp_smumgr *smumgr,
|
||||
int vega10_copy_table_from_smc(struct pp_hwmgr *hwmgr,
|
||||
uint8_t *table, int16_t table_id)
|
||||
{
|
||||
struct vega10_smumgr *priv =
|
||||
(struct vega10_smumgr *)(smumgr->backend);
|
||||
(struct vega10_smumgr *)(hwmgr->smumgr->backend);
|
||||
|
||||
PP_ASSERT_WITH_CODE(table_id < MAX_SMU_TABLE,
|
||||
"Invalid SMU Table ID!", return -EINVAL);
|
||||
|
@ -232,16 +232,16 @@ int vega10_copy_table_from_smc(struct pp_smumgr *smumgr,
|
|||
"Invalid SMU Table version!", return -EINVAL);
|
||||
PP_ASSERT_WITH_CODE(priv->smu_tables.entry[table_id].size != 0,
|
||||
"Invalid SMU Table Length!", return -EINVAL);
|
||||
PP_ASSERT_WITH_CODE(vega10_send_msg_to_smc_with_parameter(smumgr,
|
||||
PP_ASSERT_WITH_CODE(vega10_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetDriverDramAddrHigh,
|
||||
priv->smu_tables.entry[table_id].table_addr_high) == 0,
|
||||
"[CopyTableFromSMC] Attempt to Set Dram Addr High Failed!", return -EINVAL);
|
||||
PP_ASSERT_WITH_CODE(vega10_send_msg_to_smc_with_parameter(smumgr,
|
||||
PP_ASSERT_WITH_CODE(vega10_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetDriverDramAddrLow,
|
||||
priv->smu_tables.entry[table_id].table_addr_low) == 0,
|
||||
"[CopyTableFromSMC] Attempt to Set Dram Addr Low Failed!",
|
||||
return -EINVAL);
|
||||
PP_ASSERT_WITH_CODE(vega10_send_msg_to_smc_with_parameter(smumgr,
|
||||
PP_ASSERT_WITH_CODE(vega10_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_TransferTableSmu2Dram,
|
||||
priv->smu_tables.entry[table_id].table_id) == 0,
|
||||
"[CopyTableFromSMC] Attempt to Transfer Table From SMU Failed!",
|
||||
|
@ -255,14 +255,14 @@ int vega10_copy_table_from_smc(struct pp_smumgr *smumgr,
|
|||
|
||||
/*
|
||||
* Copy table from Driver FB into SMC
|
||||
* @param smumgr the address of the SMC manager
|
||||
* @param hwmgr the address of the HW manager
|
||||
* @param table_id the table to copy from
|
||||
*/
|
||||
int vega10_copy_table_to_smc(struct pp_smumgr *smumgr,
|
||||
int vega10_copy_table_to_smc(struct pp_hwmgr *hwmgr,
|
||||
uint8_t *table, int16_t table_id)
|
||||
{
|
||||
struct vega10_smumgr *priv =
|
||||
(struct vega10_smumgr *)(smumgr->backend);
|
||||
(struct vega10_smumgr *)(hwmgr->smumgr->backend);
|
||||
|
||||
PP_ASSERT_WITH_CODE(table_id < MAX_SMU_TABLE,
|
||||
"Invalid SMU Table ID!", return -EINVAL);
|
||||
|
@ -274,17 +274,17 @@ int vega10_copy_table_to_smc(struct pp_smumgr *smumgr,
|
|||
memcpy(priv->smu_tables.entry[table_id].table, table,
|
||||
priv->smu_tables.entry[table_id].size);
|
||||
|
||||
PP_ASSERT_WITH_CODE(vega10_send_msg_to_smc_with_parameter(smumgr,
|
||||
PP_ASSERT_WITH_CODE(vega10_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetDriverDramAddrHigh,
|
||||
priv->smu_tables.entry[table_id].table_addr_high) == 0,
|
||||
"[CopyTableToSMC] Attempt to Set Dram Addr High Failed!",
|
||||
return -EINVAL;);
|
||||
PP_ASSERT_WITH_CODE(vega10_send_msg_to_smc_with_parameter(smumgr,
|
||||
PP_ASSERT_WITH_CODE(vega10_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetDriverDramAddrLow,
|
||||
priv->smu_tables.entry[table_id].table_addr_low) == 0,
|
||||
"[CopyTableToSMC] Attempt to Set Dram Addr Low Failed!",
|
||||
return -EINVAL);
|
||||
PP_ASSERT_WITH_CODE(vega10_send_msg_to_smc_with_parameter(smumgr,
|
||||
PP_ASSERT_WITH_CODE(vega10_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_TransferTableDram2Smu,
|
||||
priv->smu_tables.entry[table_id].table_id) == 0,
|
||||
"[CopyTableToSMC] Attempt to Transfer Table To SMU Failed!",
|
||||
|
@ -293,87 +293,87 @@ int vega10_copy_table_to_smc(struct pp_smumgr *smumgr,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int vega10_save_vft_table(struct pp_smumgr *smumgr, uint8_t *avfs_table)
|
||||
int vega10_save_vft_table(struct pp_hwmgr *hwmgr, uint8_t *avfs_table)
|
||||
{
|
||||
PP_ASSERT_WITH_CODE(avfs_table,
|
||||
"No access to SMC AVFS Table",
|
||||
return -EINVAL);
|
||||
|
||||
return vega10_copy_table_from_smc(smumgr, avfs_table, AVFSTABLE);
|
||||
return vega10_copy_table_from_smc(hwmgr, avfs_table, AVFSTABLE);
|
||||
}
|
||||
|
||||
int vega10_restore_vft_table(struct pp_smumgr *smumgr, uint8_t *avfs_table)
|
||||
int vega10_restore_vft_table(struct pp_hwmgr *hwmgr, uint8_t *avfs_table)
|
||||
{
|
||||
PP_ASSERT_WITH_CODE(avfs_table,
|
||||
"No access to SMC AVFS Table",
|
||||
return -EINVAL);
|
||||
|
||||
return vega10_copy_table_to_smc(smumgr, avfs_table, AVFSTABLE);
|
||||
return vega10_copy_table_to_smc(hwmgr, avfs_table, AVFSTABLE);
|
||||
}
|
||||
|
||||
int vega10_enable_smc_features(struct pp_smumgr *smumgr,
|
||||
int vega10_enable_smc_features(struct pp_hwmgr *hwmgr,
|
||||
bool enable, uint32_t feature_mask)
|
||||
{
|
||||
int msg = enable ? PPSMC_MSG_EnableSmuFeatures :
|
||||
PPSMC_MSG_DisableSmuFeatures;
|
||||
|
||||
return vega10_send_msg_to_smc_with_parameter(smumgr,
|
||||
return vega10_send_msg_to_smc_with_parameter(hwmgr,
|
||||
msg, feature_mask);
|
||||
}
|
||||
|
||||
int vega10_get_smc_features(struct pp_smumgr *smumgr,
|
||||
int vega10_get_smc_features(struct pp_hwmgr *hwmgr,
|
||||
uint32_t *features_enabled)
|
||||
{
|
||||
if (features_enabled == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
if (!vega10_send_msg_to_smc(smumgr,
|
||||
if (!vega10_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_GetEnabledSmuFeatures)) {
|
||||
vega10_read_arg_from_smc(smumgr, features_enabled);
|
||||
vega10_read_arg_from_smc(hwmgr, features_enabled);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
int vega10_set_tools_address(struct pp_smumgr *smumgr)
|
||||
int vega10_set_tools_address(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct vega10_smumgr *priv =
|
||||
(struct vega10_smumgr *)(smumgr->backend);
|
||||
(struct vega10_smumgr *)(hwmgr->smumgr->backend);
|
||||
|
||||
if (priv->smu_tables.entry[TOOLSTABLE].table_addr_high ||
|
||||
priv->smu_tables.entry[TOOLSTABLE].table_addr_low) {
|
||||
if (!vega10_send_msg_to_smc_with_parameter(smumgr,
|
||||
if (!vega10_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetToolsDramAddrHigh,
|
||||
priv->smu_tables.entry[TOOLSTABLE].table_addr_high))
|
||||
vega10_send_msg_to_smc_with_parameter(smumgr,
|
||||
vega10_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetToolsDramAddrLow,
|
||||
priv->smu_tables.entry[TOOLSTABLE].table_addr_low);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vega10_verify_smc_interface(struct pp_smumgr *smumgr)
|
||||
static int vega10_verify_smc_interface(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
uint32_t smc_driver_if_version;
|
||||
struct cgs_system_info sys_info = {0};
|
||||
uint32_t dev_id;
|
||||
uint32_t rev_id;
|
||||
|
||||
PP_ASSERT_WITH_CODE(!vega10_send_msg_to_smc(smumgr,
|
||||
PP_ASSERT_WITH_CODE(!vega10_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_GetDriverIfVersion),
|
||||
"Attempt to get SMC IF Version Number Failed!",
|
||||
return -EINVAL);
|
||||
vega10_read_arg_from_smc(smumgr, &smc_driver_if_version);
|
||||
vega10_read_arg_from_smc(hwmgr, &smc_driver_if_version);
|
||||
|
||||
sys_info.size = sizeof(struct cgs_system_info);
|
||||
sys_info.info_id = CGS_SYSTEM_INFO_PCIE_DEV;
|
||||
cgs_query_system_info(smumgr->device, &sys_info);
|
||||
cgs_query_system_info(hwmgr->device, &sys_info);
|
||||
dev_id = (uint32_t)sys_info.value;
|
||||
|
||||
sys_info.size = sizeof(struct cgs_system_info);
|
||||
sys_info.info_id = CGS_SYSTEM_INFO_PCIE_REV;
|
||||
cgs_query_system_info(smumgr->device, &sys_info);
|
||||
cgs_query_system_info(hwmgr->device, &sys_info);
|
||||
rev_id = (uint32_t)sys_info.value;
|
||||
|
||||
if (!((dev_id == 0x687f) &&
|
||||
|
@ -392,7 +392,7 @@ static int vega10_verify_smc_interface(struct pp_smumgr *smumgr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int vega10_smu_init(struct pp_smumgr *smumgr)
|
||||
static int vega10_smu_init(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct vega10_smumgr *priv;
|
||||
uint64_t mc_addr;
|
||||
|
@ -401,7 +401,7 @@ static int vega10_smu_init(struct pp_smumgr *smumgr)
|
|||
int ret;
|
||||
struct cgs_firmware_info info = {0};
|
||||
|
||||
ret = cgs_get_firmware_info(smumgr->device,
|
||||
ret = cgs_get_firmware_info(hwmgr->device,
|
||||
smu7_convert_fw_type_to_cgs(UCODE_ID_SMU),
|
||||
&info);
|
||||
if (ret || !info.kptr)
|
||||
|
@ -412,10 +412,10 @@ static int vega10_smu_init(struct pp_smumgr *smumgr)
|
|||
if (!priv)
|
||||
return -ENOMEM;
|
||||
|
||||
smumgr->backend = priv;
|
||||
hwmgr->smumgr->backend = priv;
|
||||
|
||||
/* allocate space for pptable */
|
||||
smu_allocate_memory(smumgr->device,
|
||||
smu_allocate_memory(hwmgr->device,
|
||||
sizeof(PPTable_t),
|
||||
CGS_GPU_MEM_TYPE__VISIBLE_CONTIG_FB,
|
||||
PAGE_SIZE,
|
||||
|
@ -425,8 +425,8 @@ static int vega10_smu_init(struct pp_smumgr *smumgr)
|
|||
|
||||
PP_ASSERT_WITH_CODE(kaddr,
|
||||
"[vega10_smu_init] Out of memory for pptable.",
|
||||
kfree(smumgr->backend);
|
||||
cgs_free_gpu_mem(smumgr->device,
|
||||
kfree(hwmgr->smumgr->backend);
|
||||
cgs_free_gpu_mem(hwmgr->device,
|
||||
(cgs_handle_t)handle);
|
||||
return -EINVAL);
|
||||
|
||||
|
@ -441,7 +441,7 @@ static int vega10_smu_init(struct pp_smumgr *smumgr)
|
|||
priv->smu_tables.entry[PPTABLE].handle = handle;
|
||||
|
||||
/* allocate space for watermarks table */
|
||||
smu_allocate_memory(smumgr->device,
|
||||
smu_allocate_memory(hwmgr->device,
|
||||
sizeof(Watermarks_t),
|
||||
CGS_GPU_MEM_TYPE__VISIBLE_CONTIG_FB,
|
||||
PAGE_SIZE,
|
||||
|
@ -451,10 +451,10 @@ static int vega10_smu_init(struct pp_smumgr *smumgr)
|
|||
|
||||
PP_ASSERT_WITH_CODE(kaddr,
|
||||
"[vega10_smu_init] Out of memory for wmtable.",
|
||||
kfree(smumgr->backend);
|
||||
cgs_free_gpu_mem(smumgr->device,
|
||||
kfree(hwmgr->smumgr->backend);
|
||||
cgs_free_gpu_mem(hwmgr->device,
|
||||
(cgs_handle_t)priv->smu_tables.entry[PPTABLE].handle);
|
||||
cgs_free_gpu_mem(smumgr->device,
|
||||
cgs_free_gpu_mem(hwmgr->device,
|
||||
(cgs_handle_t)handle);
|
||||
return -EINVAL);
|
||||
|
||||
|
@ -469,7 +469,7 @@ static int vega10_smu_init(struct pp_smumgr *smumgr)
|
|||
priv->smu_tables.entry[WMTABLE].handle = handle;
|
||||
|
||||
/* allocate space for AVFS table */
|
||||
smu_allocate_memory(smumgr->device,
|
||||
smu_allocate_memory(hwmgr->device,
|
||||
sizeof(AvfsTable_t),
|
||||
CGS_GPU_MEM_TYPE__VISIBLE_CONTIG_FB,
|
||||
PAGE_SIZE,
|
||||
|
@ -479,12 +479,12 @@ static int vega10_smu_init(struct pp_smumgr *smumgr)
|
|||
|
||||
PP_ASSERT_WITH_CODE(kaddr,
|
||||
"[vega10_smu_init] Out of memory for avfs table.",
|
||||
kfree(smumgr->backend);
|
||||
cgs_free_gpu_mem(smumgr->device,
|
||||
kfree(hwmgr->smumgr->backend);
|
||||
cgs_free_gpu_mem(hwmgr->device,
|
||||
(cgs_handle_t)priv->smu_tables.entry[PPTABLE].handle);
|
||||
cgs_free_gpu_mem(smumgr->device,
|
||||
cgs_free_gpu_mem(hwmgr->device,
|
||||
(cgs_handle_t)priv->smu_tables.entry[WMTABLE].handle);
|
||||
cgs_free_gpu_mem(smumgr->device,
|
||||
cgs_free_gpu_mem(hwmgr->device,
|
||||
(cgs_handle_t)handle);
|
||||
return -EINVAL);
|
||||
|
||||
|
@ -500,7 +500,7 @@ static int vega10_smu_init(struct pp_smumgr *smumgr)
|
|||
|
||||
tools_size = 0x19000;
|
||||
if (tools_size) {
|
||||
smu_allocate_memory(smumgr->device,
|
||||
smu_allocate_memory(hwmgr->device,
|
||||
tools_size,
|
||||
CGS_GPU_MEM_TYPE__VISIBLE_CONTIG_FB,
|
||||
PAGE_SIZE,
|
||||
|
@ -522,7 +522,7 @@ static int vega10_smu_init(struct pp_smumgr *smumgr)
|
|||
}
|
||||
|
||||
/* allocate space for AVFS Fuse table */
|
||||
smu_allocate_memory(smumgr->device,
|
||||
smu_allocate_memory(hwmgr->device,
|
||||
sizeof(AvfsFuseOverride_t),
|
||||
CGS_GPU_MEM_TYPE__VISIBLE_CONTIG_FB,
|
||||
PAGE_SIZE,
|
||||
|
@ -532,16 +532,16 @@ static int vega10_smu_init(struct pp_smumgr *smumgr)
|
|||
|
||||
PP_ASSERT_WITH_CODE(kaddr,
|
||||
"[vega10_smu_init] Out of memory for avfs fuse table.",
|
||||
kfree(smumgr->backend);
|
||||
cgs_free_gpu_mem(smumgr->device,
|
||||
kfree(hwmgr->smumgr->backend);
|
||||
cgs_free_gpu_mem(hwmgr->device,
|
||||
(cgs_handle_t)priv->smu_tables.entry[PPTABLE].handle);
|
||||
cgs_free_gpu_mem(smumgr->device,
|
||||
cgs_free_gpu_mem(hwmgr->device,
|
||||
(cgs_handle_t)priv->smu_tables.entry[WMTABLE].handle);
|
||||
cgs_free_gpu_mem(smumgr->device,
|
||||
cgs_free_gpu_mem(hwmgr->device,
|
||||
(cgs_handle_t)priv->smu_tables.entry[AVFSTABLE].handle);
|
||||
cgs_free_gpu_mem(smumgr->device,
|
||||
cgs_free_gpu_mem(hwmgr->device,
|
||||
(cgs_handle_t)priv->smu_tables.entry[TOOLSTABLE].handle);
|
||||
cgs_free_gpu_mem(smumgr->device,
|
||||
cgs_free_gpu_mem(hwmgr->device,
|
||||
(cgs_handle_t)handle);
|
||||
return -EINVAL);
|
||||
|
||||
|
@ -558,36 +558,36 @@ static int vega10_smu_init(struct pp_smumgr *smumgr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int vega10_smu_fini(struct pp_smumgr *smumgr)
|
||||
static int vega10_smu_fini(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct vega10_smumgr *priv =
|
||||
(struct vega10_smumgr *)(smumgr->backend);
|
||||
(struct vega10_smumgr *)(hwmgr->smumgr->backend);
|
||||
|
||||
if (priv) {
|
||||
cgs_free_gpu_mem(smumgr->device,
|
||||
cgs_free_gpu_mem(hwmgr->device,
|
||||
(cgs_handle_t)priv->smu_tables.entry[PPTABLE].handle);
|
||||
cgs_free_gpu_mem(smumgr->device,
|
||||
cgs_free_gpu_mem(hwmgr->device,
|
||||
(cgs_handle_t)priv->smu_tables.entry[WMTABLE].handle);
|
||||
cgs_free_gpu_mem(smumgr->device,
|
||||
cgs_free_gpu_mem(hwmgr->device,
|
||||
(cgs_handle_t)priv->smu_tables.entry[AVFSTABLE].handle);
|
||||
if (priv->smu_tables.entry[TOOLSTABLE].table)
|
||||
cgs_free_gpu_mem(smumgr->device,
|
||||
cgs_free_gpu_mem(hwmgr->device,
|
||||
(cgs_handle_t)priv->smu_tables.entry[TOOLSTABLE].handle);
|
||||
cgs_free_gpu_mem(smumgr->device,
|
||||
cgs_free_gpu_mem(hwmgr->device,
|
||||
(cgs_handle_t)priv->smu_tables.entry[AVFSFUSETABLE].handle);
|
||||
kfree(smumgr->backend);
|
||||
smumgr->backend = NULL;
|
||||
kfree(hwmgr->smumgr->backend);
|
||||
hwmgr->smumgr->backend = NULL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vega10_start_smu(struct pp_smumgr *smumgr)
|
||||
static int vega10_start_smu(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
PP_ASSERT_WITH_CODE(!vega10_verify_smc_interface(smumgr),
|
||||
PP_ASSERT_WITH_CODE(!vega10_verify_smc_interface(hwmgr),
|
||||
"Failed to verify SMC interface!",
|
||||
return -EINVAL);
|
||||
|
||||
vega10_set_tools_address(smumgr);
|
||||
vega10_set_tools_address(hwmgr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -52,19 +52,19 @@ struct vega10_smumgr {
|
|||
struct smu_table_array smu_tables;
|
||||
};
|
||||
|
||||
int vega10_read_arg_from_smc(struct pp_smumgr *smumgr, uint32_t *arg);
|
||||
int vega10_copy_table_from_smc(struct pp_smumgr *smumgr,
|
||||
int vega10_read_arg_from_smc(struct pp_hwmgr *hwmgr, uint32_t *arg);
|
||||
int vega10_copy_table_from_smc(struct pp_hwmgr *hwmgr,
|
||||
uint8_t *table, int16_t table_id);
|
||||
int vega10_copy_table_to_smc(struct pp_smumgr *smumgr,
|
||||
int vega10_copy_table_to_smc(struct pp_hwmgr *hwmgr,
|
||||
uint8_t *table, int16_t table_id);
|
||||
int vega10_enable_smc_features(struct pp_smumgr *smumgr,
|
||||
int vega10_enable_smc_features(struct pp_hwmgr *hwmgr,
|
||||
bool enable, uint32_t feature_mask);
|
||||
int vega10_get_smc_features(struct pp_smumgr *smumgr,
|
||||
int vega10_get_smc_features(struct pp_hwmgr *hwmgr,
|
||||
uint32_t *features_enabled);
|
||||
int vega10_save_vft_table(struct pp_smumgr *smumgr, uint8_t *avfs_table);
|
||||
int vega10_restore_vft_table(struct pp_smumgr *smumgr, uint8_t *avfs_table);
|
||||
int vega10_save_vft_table(struct pp_hwmgr *hwmgr, uint8_t *avfs_table);
|
||||
int vega10_restore_vft_table(struct pp_hwmgr *hwmgr, uint8_t *avfs_table);
|
||||
|
||||
int vega10_set_tools_address(struct pp_smumgr *smumgr);
|
||||
int vega10_set_tools_address(struct pp_hwmgr *hwmgr);
|
||||
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Reference in New Issue