Reviewed-by: Alex Deucher <alexander.deucher@xxxxxxx> Does Renoir need a similar fix? Alex On Mon, May 22, 2023 at 6:10 AM Tim Huang <Tim.Huang@xxxxxxx> wrote: > > This patch reverses the DPM clocks levels output of pp_dpm_mclk > and pp_dpm_fclk. > > On dGPUs and older APUs we expose the levels from lowest clocks > to highest clocks. But for some APUs, the clocks levels that from > the DFPstateTable are given the reversed orders by PMFW. Like the > memory DPM clocks that are exposed by pp_dpm_mclk. > > It's not intuitive that they are reversed on these APUs. All tools > and software that talks to the driver then has to know different ways > to interpret the data depending on the asic. > > So we need to reverse them to expose the clocks levels from the > driver consistently. > > Signed-off-by: Tim Huang <Tim.Huang@xxxxxxx> > --- > drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c | 10 ++++++---- > 1 file changed, 6 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c > index 7433dcaa16e0..067b4e0b026c 100644 > --- a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c > +++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c > @@ -582,7 +582,7 @@ static int vangogh_print_legacy_clk_levels(struct smu_context *smu, > DpmClocks_t *clk_table = smu->smu_table.clocks_table; > SmuMetrics_legacy_t metrics; > struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm); > - int i, size = 0, ret = 0; > + int i, idx, size = 0, ret = 0; > uint32_t cur_value = 0, value = 0, count = 0; > bool cur_value_match_level = false; > > @@ -656,7 +656,8 @@ static int vangogh_print_legacy_clk_levels(struct smu_context *smu, > case SMU_MCLK: > case SMU_FCLK: > for (i = 0; i < count; i++) { > - ret = vangogh_get_dpm_clk_limited(smu, clk_type, i, &value); > + idx = (clk_type == SMU_FCLK || clk_type == SMU_MCLK) ? (count - i - 1) : i; > + ret = vangogh_get_dpm_clk_limited(smu, clk_type, idx, &value); > if (ret) > return ret; > if (!value) > @@ -683,7 +684,7 @@ static int vangogh_print_clk_levels(struct smu_context *smu, > DpmClocks_t *clk_table = smu->smu_table.clocks_table; > SmuMetrics_t metrics; > struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm); > - int i, size = 0, ret = 0; > + int i, idx, size = 0, ret = 0; > uint32_t cur_value = 0, value = 0, count = 0; > bool cur_value_match_level = false; > uint32_t min, max; > @@ -765,7 +766,8 @@ static int vangogh_print_clk_levels(struct smu_context *smu, > case SMU_MCLK: > case SMU_FCLK: > for (i = 0; i < count; i++) { > - ret = vangogh_get_dpm_clk_limited(smu, clk_type, i, &value); > + idx = (clk_type == SMU_FCLK || clk_type == SMU_MCLK) ? (count - i - 1) : i; > + ret = vangogh_get_dpm_clk_limited(smu, clk_type, idx, &value); > if (ret) > return ret; > if (!value) > -- > 2.34.1 >