[PATCH 4/5] drm/amd/pp: Update smu7 dpm table with OD clock/voltage
Alex Deucher
alexdeucher at gmail.com
Thu Jan 18 16:41:53 UTC 2018
On Thu, Jan 18, 2018 at 3:38 AM, Rex Zhu <Rex.Zhu at amd.com> wrote:
> delete old OD type code path when populate clk.
>
> Change-Id: I9beb7e751ac720edb4ffb1deaf7984e86e2e41b1
> Signed-off-by: Rex Zhu <Rex.Zhu at amd.com>
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | 110 ++++-----------------
> drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c | 18 +++-
> .../drm/amd/powerplay/smumgr/polaris10_smumgr.c | 18 +++-
> .../gpu/drm/amd/powerplay/smumgr/tonga_smumgr.c | 18 +++-
> 4 files changed, 62 insertions(+), 102 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
> index 0d14299..ee70ef2 100644
> --- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
> +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
> @@ -3482,8 +3482,6 @@ static int smu7_find_dpm_states_clocks_in_dpm_table(struct pp_hwmgr *hwmgr, cons
> uint32_t i;
> struct cgs_display_info info = {0};
>
> - data->need_update_smu7_dpm_table = 0;
> -
> for (i = 0; i < sclk_table->count; i++) {
> if (sclk == sclk_table->dpm_levels[i].value)
> break;
> @@ -3625,106 +3623,27 @@ static int smu7_populate_and_upload_sclk_mclk_dpm_levels(
> struct pp_hwmgr *hwmgr, const void *input)
> {
> int result = 0;
> - const struct phm_set_power_state_input *states =
> - (const struct phm_set_power_state_input *)input;
> - const struct smu7_power_state *smu7_ps =
> - cast_const_phw_smu7_power_state(states->pnew_state);
> struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
> - uint32_t sclk = smu7_ps->performance_levels
> - [smu7_ps->performance_level_count - 1].engine_clock;
> - uint32_t mclk = smu7_ps->performance_levels
> - [smu7_ps->performance_level_count - 1].memory_clock;
> struct smu7_dpm_table *dpm_table = &data->dpm_table;
> -
> - struct smu7_dpm_table *golden_dpm_table = &data->golden_dpm_table;
> - uint32_t dpm_count, clock_percent;
> - uint32_t i;
> + uint32_t count;
> + struct smu7_odn_dpm_table *odn_table = &(data->odn_dpm_table);
> + struct phm_odn_clock_levels *odn_sclk_table = &(odn_table->odn_core_clock_dpm_levels);
> + struct phm_odn_clock_levels *odn_mclk_table = &(odn_table->odn_memory_clock_dpm_levels);
>
> if (0 == data->need_update_smu7_dpm_table)
> return 0;
>
> - if (data->need_update_smu7_dpm_table & DPMTABLE_OD_UPDATE_SCLK) {
> - dpm_table->sclk_table.dpm_levels
> - [dpm_table->sclk_table.count - 1].value = sclk;
> -
> - if (hwmgr->od_enabled) {
> - /* Need to do calculation based on the golden DPM table
> - * as the Heatmap GPU Clock axis is also based on the default values
> - */
> - PP_ASSERT_WITH_CODE(
> - (golden_dpm_table->sclk_table.dpm_levels
> - [golden_dpm_table->sclk_table.count - 1].value != 0),
> - "Divide by 0!",
> - return -EINVAL);
> - dpm_count = dpm_table->sclk_table.count < 2 ? 0 : dpm_table->sclk_table.count - 2;
> -
> - for (i = dpm_count; i > 1; i--) {
> - if (sclk > golden_dpm_table->sclk_table.dpm_levels[golden_dpm_table->sclk_table.count-1].value) {
> - clock_percent =
> - ((sclk
> - - golden_dpm_table->sclk_table.dpm_levels[golden_dpm_table->sclk_table.count-1].value
> - ) * 100)
> - / golden_dpm_table->sclk_table.dpm_levels[golden_dpm_table->sclk_table.count-1].value;
> -
> - dpm_table->sclk_table.dpm_levels[i].value =
> - golden_dpm_table->sclk_table.dpm_levels[i].value +
> - (golden_dpm_table->sclk_table.dpm_levels[i].value *
> - clock_percent)/100;
> -
> - } else if (golden_dpm_table->sclk_table.dpm_levels[dpm_table->sclk_table.count-1].value > sclk) {
> - clock_percent =
> - ((golden_dpm_table->sclk_table.dpm_levels[golden_dpm_table->sclk_table.count - 1].value
> - - sclk) * 100)
> - / golden_dpm_table->sclk_table.dpm_levels[golden_dpm_table->sclk_table.count-1].value;
> -
> - dpm_table->sclk_table.dpm_levels[i].value =
> - golden_dpm_table->sclk_table.dpm_levels[i].value -
> - (golden_dpm_table->sclk_table.dpm_levels[i].value *
> - clock_percent) / 100;
> - } else
> - dpm_table->sclk_table.dpm_levels[i].value =
> - golden_dpm_table->sclk_table.dpm_levels[i].value;
> - }
> + if (hwmgr->od_enabled && data->need_update_smu7_dpm_table & DPMTABLE_OD_UPDATE_SCLK) {
> + for (count = 0; count < dpm_table->sclk_table.count; count++) {
> + dpm_table->sclk_table.dpm_levels[count].enabled = odn_sclk_table->entries[count].enabled;
> + dpm_table->sclk_table.dpm_levels[count].value = odn_sclk_table->entries[count].clock;
> }
> }
>
> - if (data->need_update_smu7_dpm_table & DPMTABLE_OD_UPDATE_MCLK) {
> - dpm_table->mclk_table.dpm_levels
> - [dpm_table->mclk_table.count - 1].value = mclk;
> -
> - if (hwmgr->od_enabled) {
> -
> - PP_ASSERT_WITH_CODE(
> - (golden_dpm_table->mclk_table.dpm_levels
> - [golden_dpm_table->mclk_table.count-1].value != 0),
> - "Divide by 0!",
> - return -EINVAL);
> - dpm_count = dpm_table->mclk_table.count < 2 ? 0 : dpm_table->mclk_table.count - 2;
> - for (i = dpm_count; i > 1; i--) {
> - if (golden_dpm_table->mclk_table.dpm_levels[golden_dpm_table->mclk_table.count-1].value < mclk) {
> - clock_percent = ((mclk -
> - golden_dpm_table->mclk_table.dpm_levels[golden_dpm_table->mclk_table.count-1].value) * 100)
> - / golden_dpm_table->mclk_table.dpm_levels[golden_dpm_table->mclk_table.count-1].value;
> -
> - dpm_table->mclk_table.dpm_levels[i].value =
> - golden_dpm_table->mclk_table.dpm_levels[i].value +
> - (golden_dpm_table->mclk_table.dpm_levels[i].value *
> - clock_percent) / 100;
> -
> - } else if (golden_dpm_table->mclk_table.dpm_levels[dpm_table->mclk_table.count-1].value > mclk) {
> - clock_percent = (
> - (golden_dpm_table->mclk_table.dpm_levels[golden_dpm_table->mclk_table.count-1].value - mclk)
> - * 100)
> - / golden_dpm_table->mclk_table.dpm_levels[golden_dpm_table->mclk_table.count-1].value;
> -
> - dpm_table->mclk_table.dpm_levels[i].value =
> - golden_dpm_table->mclk_table.dpm_levels[i].value -
> - (golden_dpm_table->mclk_table.dpm_levels[i].value *
> - clock_percent) / 100;
> - } else
> - dpm_table->mclk_table.dpm_levels[i].value =
> - golden_dpm_table->mclk_table.dpm_levels[i].value;
> - }
> + if (hwmgr->od_enabled && data->need_update_smu7_dpm_table & DPMTABLE_OD_UPDATE_MCLK) {
> + for (count = 0; count < dpm_table->mclk_table.count; count++) {
> + dpm_table->mclk_table.dpm_levels[count].enabled = odn_mclk_table->entries[count].enabled;
> + dpm_table->mclk_table.dpm_levels[count].value = odn_mclk_table->entries[count].clock;
> }
> }
>
> @@ -4114,6 +4033,7 @@ static int smu7_check_states_equal(struct pp_hwmgr *hwmgr,
> const struct smu7_power_state *psa;
> const struct smu7_power_state *psb;
> int i;
> + struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
>
> if (pstate1 == NULL || pstate2 == NULL || equal == NULL)
> return -EINVAL;
> @@ -4138,6 +4058,10 @@ static int smu7_check_states_equal(struct pp_hwmgr *hwmgr,
> *equal = ((psa->uvd_clks.vclk == psb->uvd_clks.vclk) && (psa->uvd_clks.dclk == psb->uvd_clks.dclk));
> *equal &= ((psa->vce_clks.evclk == psb->vce_clks.evclk) && (psa->vce_clks.ecclk == psb->vce_clks.ecclk));
> *equal &= (psa->sclk_threshold == psb->sclk_threshold);
> + /* For OD call, set value based on flag */
> + *equal &= !(data->need_update_smu7_dpm_table & (DPMTABLE_OD_UPDATE_SCLK |
> + DPMTABLE_OD_UPDATE_MCLK |
> + DPMTABLE_OD_UPDATE_VDDC));
>
> return 0;
> }
> diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c
> index 7d9e2cb..c4a94d0 100644
> --- a/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c
> +++ b/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c
> @@ -981,12 +981,18 @@ static int fiji_populate_single_graphic_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);
> + phm_ppt_v1_clock_voltage_dependency_table *vdd_dep_table = NULL;
>
> result = fiji_calculate_sclk_params(hwmgr, clock, level);
>
> + if (data->need_update_smu7_dpm_table & DPMTABLE_OD_UPDATE_VDDC)
> + vdd_dep_table = (phm_ppt_v1_clock_voltage_dependency_table *)&data->odn_dpm_table.vdd_dependency_on_sclk;
> + else
> + vdd_dep_table = table_info->vdd_dep_on_sclk;
> +
> /* populate graphics levels */
> result = fiji_get_dependency_volt_by_clk(hwmgr,
> - table_info->vdd_dep_on_sclk, clock,
> + vdd_dep_table, clock,
> (uint32_t *)(&level->MinVoltage), &mvdd);
> PP_ASSERT_WITH_CODE((0 == result),
> "can not find VDDC voltage value for "
> @@ -1202,10 +1208,16 @@ static int fiji_populate_single_memory_level(struct pp_hwmgr *hwmgr,
> (struct phm_ppt_v1_information *)(hwmgr->pptable);
> int result = 0;
> uint32_t mclk_stutter_mode_threshold = 60000;
> + phm_ppt_v1_clock_voltage_dependency_table *vdd_dep_table = NULL;
> +
> + if (data->need_update_smu7_dpm_table & DPMTABLE_OD_UPDATE_VDDC)
> + vdd_dep_table = (phm_ppt_v1_clock_voltage_dependency_table *)&data->odn_dpm_table.vdd_dependency_on_sclk;
> + else
> + vdd_dep_table = table_info->vdd_dep_on_mclk;
>
> - if (table_info->vdd_dep_on_mclk) {
> + if (vdd_dep_table) {
> result = fiji_get_dependency_volt_by_clk(hwmgr,
> - table_info->vdd_dep_on_mclk, clock,
> + vdd_dep_table, clock,
> (uint32_t *)(&mem_level->MinVoltage), &mem_level->MinMvdd);
> PP_ASSERT_WITH_CODE((0 == result),
> "can not find MinVddc voltage value from memory "
> diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c
> index f1a3bc8..c0c627f 100644
> --- a/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c
> +++ b/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c
> @@ -948,12 +948,18 @@ static int polaris10_populate_single_graphic_level(struct pp_hwmgr *hwmgr,
> struct phm_ppt_v1_information *table_info =
> (struct phm_ppt_v1_information *)(hwmgr->pptable);
> SMU_SclkSetting curr_sclk_setting = { 0 };
> + phm_ppt_v1_clock_voltage_dependency_table *vdd_dep_table = NULL;
>
> result = polaris10_calculate_sclk_params(hwmgr, clock, &curr_sclk_setting);
>
> + if (data->need_update_smu7_dpm_table & DPMTABLE_OD_UPDATE_VDDC)
> + vdd_dep_table = (phm_ppt_v1_clock_voltage_dependency_table *)&data->odn_dpm_table.vdd_dependency_on_sclk;
> + else
> + vdd_dep_table = table_info->vdd_dep_on_sclk;
> +
> /* populate graphics levels */
> result = polaris10_get_dependency_volt_by_clk(hwmgr,
> - table_info->vdd_dep_on_sclk, clock,
> + vdd_dep_table, clock,
> &level->MinVoltage, &mvdd);
>
> PP_ASSERT_WITH_CODE((0 == result),
> @@ -1107,12 +1113,18 @@ static int polaris10_populate_single_memory_level(struct pp_hwmgr *hwmgr,
> int result = 0;
> struct cgs_display_info info = {0, 0, NULL};
> uint32_t mclk_stutter_mode_threshold = 40000;
> + phm_ppt_v1_clock_voltage_dependency_table *vdd_dep_table = NULL;
>
> cgs_get_active_displays_info(hwmgr->device, &info);
>
> - if (table_info->vdd_dep_on_mclk) {
> + if (data->need_update_smu7_dpm_table & DPMTABLE_OD_UPDATE_VDDC)
> + vdd_dep_table = (phm_ppt_v1_clock_voltage_dependency_table *)&data->odn_dpm_table.vdd_dependency_on_sclk;
> + else
> + vdd_dep_table = table_info->vdd_dep_on_mclk;
> +
> + if (vdd_dep_table) {
> result = polaris10_get_dependency_volt_by_clk(hwmgr,
> - table_info->vdd_dep_on_mclk, clock,
> + vdd_dep_table, clock,
> &mem_level->MinVoltage, &mem_level->MinMvdd);
> PP_ASSERT_WITH_CODE((0 == result),
> "can not find MinVddc voltage value from memory "
> diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/tonga_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/tonga_smumgr.c
> index a03a345..52e69e8 100644
> --- a/drivers/gpu/drm/amd/powerplay/smumgr/tonga_smumgr.c
> +++ b/drivers/gpu/drm/amd/powerplay/smumgr/tonga_smumgr.c
> @@ -620,12 +620,18 @@ static int tonga_populate_single_graphic_level(struct pp_hwmgr *hwmgr,
> struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
> struct phm_ppt_v1_information *pptable_info =
> (struct phm_ppt_v1_information *)(hwmgr->pptable);
> + phm_ppt_v1_clock_voltage_dependency_table *vdd_dep_table = NULL;
>
> result = tonga_calculate_sclk_params(hwmgr, engine_clock, graphic_level);
>
> + if (data->need_update_smu7_dpm_table & DPMTABLE_OD_UPDATE_VDDC)
> + vdd_dep_table = (phm_ppt_v1_clock_voltage_dependency_table *)&data->odn_dpm_table.vdd_dependency_on_sclk;
> + else
> + vdd_dep_table = pptable_info->vdd_dep_on_sclk;
> +
> /* populate graphics levels*/
> result = tonga_get_dependency_volt_by_clk(hwmgr,
> - pptable_info->vdd_dep_on_sclk, engine_clock,
> + vdd_dep_table, engine_clock,
> &graphic_level->MinVoltage, &mvdd);
> PP_ASSERT_WITH_CODE((!result),
> "can not find VDDC voltage value for VDDC "
> @@ -966,10 +972,16 @@ static int tonga_populate_single_memory_level(
> uint32_t mclk_stutter_mode_threshold = 30000;
> uint32_t mclk_edc_enable_threshold = 40000;
> uint32_t mclk_strobe_mode_threshold = 40000;
> + phm_ppt_v1_clock_voltage_dependency_table *vdd_dep_table = NULL;
> +
> + if (data->need_update_smu7_dpm_table & DPMTABLE_OD_UPDATE_VDDC)
> + vdd_dep_table = (phm_ppt_v1_clock_voltage_dependency_table *)&data->odn_dpm_table.vdd_dependency_on_sclk;
> + else
> + vdd_dep_table = pptable_info->vdd_dep_on_mclk;
>
> - if (NULL != pptable_info->vdd_dep_on_mclk) {
> + if (NULL != vdd_dep_table) {
> result = tonga_get_dependency_volt_by_clk(hwmgr,
> - pptable_info->vdd_dep_on_mclk,
> + vdd_dep_table,
> memory_clock,
> &memory_level->MinVoltage, &mvdd);
> PP_ASSERT_WITH_CODE(
> --
> 1.9.1
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
More information about the amd-gfx
mailing list