[PATCH 2/2] drm/amd/pm: set pcie default dpm table when updating pcie dpm parameters

Alex Deucher alexdeucher at gmail.com
Fri Jun 13 16:03:10 UTC 2025


On Fri, Jun 13, 2025 at 10:42 AM Kenneth Feng <kenneth.feng at amd.com> wrote:
>
> set pcie default dpm table when updating pcie dpm parameters

Is there a reason to integrate this with the updating?

Alex

>
> Signed-off-by: Kenneth Feng <kenneth.feng at amd.com>
> ---
>  .../drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c  | 104 ++++++++++++++----
>  .../drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c  | 103 +++++++++++++----
>  .../drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c  |  45 ++++----
>  3 files changed, 186 insertions(+), 66 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
> index 5a9711e8cf68..257082c03865 100644
> --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
> +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
> @@ -572,8 +572,6 @@ static int smu_v13_0_0_set_default_dpm_table(struct smu_context *smu)
>         PPTable_t *pptable = table_context->driver_pptable;
>         SkuTable_t *skutable = &pptable->SkuTable;
>         struct smu_13_0_dpm_table *dpm_table;
> -       struct smu_13_0_pcie_table *pcie_table;
> -       uint32_t link_level;
>         int ret = 0;
>
>         /* socclk dpm table setup */
> @@ -689,24 +687,6 @@ static int smu_v13_0_0_set_default_dpm_table(struct smu_context *smu)
>                 dpm_table->max = dpm_table->dpm_levels[0].value;
>         }
>
> -       /* lclk dpm table setup */
> -       pcie_table = &dpm_context->dpm_tables.pcie_table;
> -       pcie_table->num_of_link_levels = 0;
> -       for (link_level = 0; link_level < NUM_LINK_LEVELS; link_level++) {
> -               if (!skutable->PcieGenSpeed[link_level] &&
> -                   !skutable->PcieLaneCount[link_level] &&
> -                   !skutable->LclkFreq[link_level])
> -                       continue;
> -
> -               pcie_table->pcie_gen[pcie_table->num_of_link_levels] =
> -                                       skutable->PcieGenSpeed[link_level];
> -               pcie_table->pcie_lane[pcie_table->num_of_link_levels] =
> -                                       skutable->PcieLaneCount[link_level];
> -               pcie_table->clk_freq[pcie_table->num_of_link_levels] =
> -                                       skutable->LclkFreq[link_level];
> -               pcie_table->num_of_link_levels++;
> -       }
> -
>         /* dcefclk dpm table setup */
>         dpm_table = &dpm_context->dpm_tables.dcef_table;
>         if (smu_cmn_feature_is_enabled(smu, SMU_FEATURE_DPM_DCN_BIT)) {
> @@ -3150,6 +3130,88 @@ static int smu_v13_0_0_set_power_limit(struct smu_context *smu,
>         return 0;
>  }
>
> +static int smu_v13_0_0_update_pcie_parameters(struct smu_context *smu,
> +                                    uint8_t pcie_gen_cap,
> +                                    uint8_t pcie_width_cap)
> +{
> +       struct smu_13_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
> +       struct smu_13_0_pcie_table *pcie_table =
> +                               &dpm_context->dpm_tables.pcie_table;
> +       int num_of_levels;
> +       uint32_t smu_pcie_arg;
> +       uint32_t link_level;
> +       struct smu_table_context *table_context = &smu->smu_table;
> +       PPTable_t *pptable = table_context->driver_pptable;
> +       SkuTable_t *skutable = &pptable->SkuTable;
> +       int ret = 0;
> +       int i;
> +
> +       pcie_table->num_of_link_levels = 0;
> +
> +       for (link_level = 0; link_level < NUM_LINK_LEVELS; link_level++) {
> +               if (!skutable->PcieGenSpeed[link_level] &&
> +                   !skutable->PcieLaneCount[link_level] &&
> +                   !skutable->LclkFreq[link_level])
> +                       continue;
> +
> +               pcie_table->pcie_gen[pcie_table->num_of_link_levels] =
> +                                       skutable->PcieGenSpeed[link_level];
> +               pcie_table->pcie_lane[pcie_table->num_of_link_levels] =
> +                                       skutable->PcieLaneCount[link_level];
> +               pcie_table->clk_freq[pcie_table->num_of_link_levels] =
> +                                       skutable->LclkFreq[link_level];
> +               pcie_table->num_of_link_levels++;
> +       }
> +
> +       num_of_levels = pcie_table->num_of_link_levels;
> +       if (!num_of_levels)
> +               return 0;
> +
> +       if (!(smu->adev->pm.pp_feature & PP_PCIE_DPM_MASK)) {
> +               if (pcie_table->pcie_gen[num_of_levels - 1] < pcie_gen_cap)
> +                       pcie_gen_cap = pcie_table->pcie_gen[num_of_levels - 1];
> +
> +               if (pcie_table->pcie_lane[num_of_levels - 1] < pcie_width_cap)
> +                       pcie_width_cap = pcie_table->pcie_lane[num_of_levels - 1];
> +
> +               /* Force all levels to use the same settings */
> +               for (i = 0; i < num_of_levels; i++) {
> +                       pcie_table->pcie_gen[i] = pcie_gen_cap;
> +                       pcie_table->pcie_lane[i] = pcie_width_cap;
> +                       smu_pcie_arg = i << 16;
> +                       smu_pcie_arg |= pcie_table->pcie_gen[i] << 8;
> +                       smu_pcie_arg |= pcie_table->pcie_lane[i];
> +
> +                       ret = smu_cmn_send_smc_msg_with_param(smu,
> +                                                               SMU_MSG_OverridePcieParameters,
> +                                                               smu_pcie_arg,
> +                                                               NULL);
> +                       if (ret)
> +                               break;
> +               }
> +       } else {
> +               for (i = 0; i < num_of_levels; i++) {
> +                       if (pcie_table->pcie_gen[i] > pcie_gen_cap ||
> +                               pcie_table->pcie_lane[i] > pcie_width_cap) {
> +                               pcie_table->pcie_gen[i] = pcie_gen_cap;
> +                               pcie_table->pcie_lane[i] = pcie_width_cap;
> +                               smu_pcie_arg = i << 16;
> +                               smu_pcie_arg |= pcie_table->pcie_gen[i] << 8;
> +                               smu_pcie_arg |= pcie_table->pcie_lane[i];
> +
> +                               ret = smu_cmn_send_smc_msg_with_param(smu,
> +                                                                       SMU_MSG_OverridePcieParameters,
> +                                                                       smu_pcie_arg,
> +                                                                       NULL);
> +                               if (ret)
> +                                       break;
> +                       }
> +               }
> +       }
> +
> +       return ret;
> +}
> +
>  static const struct pptable_funcs smu_v13_0_0_ppt_funcs = {
>         .get_allowed_feature_mask = smu_v13_0_0_get_allowed_feature_mask,
>         .set_default_dpm_table = smu_v13_0_0_set_default_dpm_table,
> @@ -3179,7 +3241,7 @@ static const struct pptable_funcs smu_v13_0_0_ppt_funcs = {
>         .feature_is_enabled = smu_cmn_feature_is_enabled,
>         .print_clk_levels = smu_v13_0_0_print_clk_levels,
>         .force_clk_levels = smu_v13_0_0_force_clk_levels,
> -       .update_pcie_parameters = smu_v13_0_update_pcie_parameters,
> +       .update_pcie_parameters = smu_v13_0_0_update_pcie_parameters,
>         .get_thermal_temperature_range = smu_v13_0_0_get_thermal_temperature_range,
>         .register_irq_handler = smu_v13_0_register_irq_handler,
>         .enable_thermal_alert = smu_v13_0_enable_thermal_alert,
> diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c
> index c8f4f6fb4083..e96364856e74 100644
> --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c
> +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c
> @@ -579,8 +579,6 @@ static int smu_v13_0_7_set_default_dpm_table(struct smu_context *smu)
>         PPTable_t *driver_ppt = smu->smu_table.driver_pptable;
>         SkuTable_t *skutable = &driver_ppt->SkuTable;
>         struct smu_13_0_dpm_table *dpm_table;
> -       struct smu_13_0_pcie_table *pcie_table;
> -       uint32_t link_level;
>         int ret = 0;
>
>         /* socclk dpm table setup */
> @@ -687,24 +685,6 @@ static int smu_v13_0_7_set_default_dpm_table(struct smu_context *smu)
>                 dpm_table->max = dpm_table->dpm_levels[0].value;
>         }
>
> -       /* lclk dpm table setup */
> -       pcie_table = &dpm_context->dpm_tables.pcie_table;
> -       pcie_table->num_of_link_levels = 0;
> -       for (link_level = 0; link_level < NUM_LINK_LEVELS; link_level++) {
> -               if (!skutable->PcieGenSpeed[link_level] &&
> -                   !skutable->PcieLaneCount[link_level] &&
> -                   !skutable->LclkFreq[link_level])
> -                       continue;
> -
> -               pcie_table->pcie_gen[pcie_table->num_of_link_levels] =
> -                                       skutable->PcieGenSpeed[link_level];
> -               pcie_table->pcie_lane[pcie_table->num_of_link_levels] =
> -                                       skutable->PcieLaneCount[link_level];
> -               pcie_table->clk_freq[pcie_table->num_of_link_levels] =
> -                                       skutable->LclkFreq[link_level];
> -               pcie_table->num_of_link_levels++;
> -       }
> -
>         /* dcefclk dpm table setup */
>         dpm_table = &dpm_context->dpm_tables.dcef_table;
>         if (smu_cmn_feature_is_enabled(smu, SMU_FEATURE_DPM_DCN_BIT)) {
> @@ -2739,6 +2719,87 @@ static int smu_v13_0_7_set_power_limit(struct smu_context *smu,
>         return 0;
>  }
>
> +static int smu_v13_0_7_update_pcie_parameters(struct smu_context *smu,
> +                                    uint8_t pcie_gen_cap,
> +                                    uint8_t pcie_width_cap)
> +{
> +       struct smu_13_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
> +       struct smu_13_0_pcie_table *pcie_table =
> +                               &dpm_context->dpm_tables.pcie_table;
> +       int num_of_levels;
> +       int link_level;
> +       uint32_t smu_pcie_arg;
> +       struct smu_table_context *table_context = &smu->smu_table;
> +       PPTable_t *pptable = table_context->driver_pptable;
> +       SkuTable_t *skutable = &pptable->SkuTable;
> +       int ret = 0;
> +       int i;
> +
> +       pcie_table->num_of_link_levels = 0;
> +       for (link_level = 0; link_level < NUM_LINK_LEVELS; link_level++) {
> +               if (!skutable->PcieGenSpeed[link_level] &&
> +                   !skutable->PcieLaneCount[link_level] &&
> +                   !skutable->LclkFreq[link_level])
> +                       continue;
> +
> +               pcie_table->pcie_gen[pcie_table->num_of_link_levels] =
> +                                       skutable->PcieGenSpeed[link_level];
> +               pcie_table->pcie_lane[pcie_table->num_of_link_levels] =
> +                                       skutable->PcieLaneCount[link_level];
> +               pcie_table->clk_freq[pcie_table->num_of_link_levels] =
> +                                       skutable->LclkFreq[link_level];
> +               pcie_table->num_of_link_levels++;
> +       }
> +
> +       num_of_levels = pcie_table->num_of_link_levels;
> +       if (!num_of_levels)
> +               return 0;
> +
> +       if (!(smu->adev->pm.pp_feature & PP_PCIE_DPM_MASK)) {
> +               if (pcie_table->pcie_gen[num_of_levels - 1] < pcie_gen_cap)
> +                       pcie_gen_cap = pcie_table->pcie_gen[num_of_levels - 1];
> +
> +               if (pcie_table->pcie_lane[num_of_levels - 1] < pcie_width_cap)
> +                       pcie_width_cap = pcie_table->pcie_lane[num_of_levels - 1];
> +
> +               /* Force all levels to use the same settings */
> +               for (i = 0; i < num_of_levels; i++) {
> +                       pcie_table->pcie_gen[i] = pcie_gen_cap;
> +                       pcie_table->pcie_lane[i] = pcie_width_cap;
> +                       smu_pcie_arg = i << 16;
> +                       smu_pcie_arg |= pcie_table->pcie_gen[i] << 8;
> +                       smu_pcie_arg |= pcie_table->pcie_lane[i];
> +
> +                       ret = smu_cmn_send_smc_msg_with_param(smu,
> +                                                               SMU_MSG_OverridePcieParameters,
> +                                                               smu_pcie_arg,
> +                                                               NULL);
> +                       if (ret)
> +                               break;
> +               }
> +       } else {
> +               for (i = 0; i < num_of_levels; i++) {
> +                       if (pcie_table->pcie_gen[i] > pcie_gen_cap ||
> +                               pcie_table->pcie_lane[i] > pcie_width_cap) {
> +                               pcie_table->pcie_gen[i] = pcie_gen_cap;
> +                               pcie_table->pcie_lane[i] = pcie_width_cap;
> +                               smu_pcie_arg = i << 16;
> +                               smu_pcie_arg |= pcie_table->pcie_gen[i] << 8;
> +                               smu_pcie_arg |= pcie_table->pcie_lane[i];
> +
> +                               ret = smu_cmn_send_smc_msg_with_param(smu,
> +                                                                       SMU_MSG_OverridePcieParameters,
> +                                                                       smu_pcie_arg,
> +                                                                       NULL);
> +                               if (ret)
> +                                       break;
> +                       }
> +               }
> +       }
> +
> +       return ret;
> +}
> +
>  static const struct pptable_funcs smu_v13_0_7_ppt_funcs = {
>         .get_allowed_feature_mask = smu_v13_0_7_get_allowed_feature_mask,
>         .set_default_dpm_table = smu_v13_0_7_set_default_dpm_table,
> @@ -2768,7 +2829,7 @@ static const struct pptable_funcs smu_v13_0_7_ppt_funcs = {
>         .feature_is_enabled = smu_cmn_feature_is_enabled,
>         .print_clk_levels = smu_v13_0_7_print_clk_levels,
>         .force_clk_levels = smu_v13_0_7_force_clk_levels,
> -       .update_pcie_parameters = smu_v13_0_update_pcie_parameters,
> +       .update_pcie_parameters = smu_v13_0_7_update_pcie_parameters,
>         .get_thermal_temperature_range = smu_v13_0_7_get_thermal_temperature_range,
>         .register_irq_handler = smu_v13_0_register_irq_handler,
>         .enable_thermal_alert = smu_v13_0_enable_thermal_alert,
> diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c
> index d5a4abd60d06..581a4e59130a 100644
> --- a/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c
> +++ b/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c
> @@ -502,8 +502,6 @@ static int smu_v14_0_2_set_default_dpm_table(struct smu_context *smu)
>         PPTable_t *pptable = table_context->driver_pptable;
>         SkuTable_t *skutable = &pptable->SkuTable;
>         struct smu_14_0_dpm_table *dpm_table;
> -       struct smu_14_0_pcie_table *pcie_table;
> -       uint32_t link_level;
>         int ret = 0;
>
>         /* socclk dpm table setup */
> @@ -619,27 +617,6 @@ static int smu_v14_0_2_set_default_dpm_table(struct smu_context *smu)
>                 dpm_table->max = dpm_table->dpm_levels[0].value;
>         }
>
> -       /* lclk dpm table setup */
> -       pcie_table = &dpm_context->dpm_tables.pcie_table;
> -       pcie_table->num_of_link_levels = 0;
> -       for (link_level = 0; link_level < NUM_LINK_LEVELS; link_level++) {
> -               if (!skutable->PcieGenSpeed[link_level] &&
> -                   !skutable->PcieLaneCount[link_level] &&
> -                   !skutable->LclkFreq[link_level])
> -                       continue;
> -
> -               pcie_table->pcie_gen[pcie_table->num_of_link_levels] =
> -                                       skutable->PcieGenSpeed[link_level];
> -               pcie_table->pcie_lane[pcie_table->num_of_link_levels] =
> -                                       skutable->PcieLaneCount[link_level];
> -               pcie_table->clk_freq[pcie_table->num_of_link_levels] =
> -                                       skutable->LclkFreq[link_level];
> -               pcie_table->num_of_link_levels++;
> -
> -               if (link_level == 0)
> -                       link_level++;
> -       }
> -
>         /* dcefclk dpm table setup */
>         dpm_table = &dpm_context->dpm_tables.dcef_table;
>         if (smu_cmn_feature_is_enabled(smu, SMU_FEATURE_DPM_DCN_BIT)) {
> @@ -1487,11 +1464,31 @@ static int smu_v14_0_2_update_pcie_parameters(struct smu_context *smu,
>         struct smu_14_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
>         struct smu_14_0_pcie_table *pcie_table =
>                                 &dpm_context->dpm_tables.pcie_table;
> -       int num_of_levels = pcie_table->num_of_link_levels;
> +       int num_of_levels;
>         uint32_t smu_pcie_arg;
> +       uint32_t link_level;
> +       struct smu_table_context *table_context = &smu->smu_table;
> +       PPTable_t *pptable = table_context->driver_pptable;
> +       SkuTable_t *skutable = &pptable->SkuTable;
>         int ret = 0;
>         int i;
>
> +       pcie_table->num_of_link_levels = 0;
> +       for (link_level = 0; link_level < NUM_LINK_LEVELS; link_level++) {
> +               if (!skutable->PcieGenSpeed[link_level] &&
> +                   !skutable->PcieLaneCount[link_level] &&
> +                   !skutable->LclkFreq[link_level])
> +                       continue;
> +
> +               pcie_table->pcie_gen[pcie_table->num_of_link_levels] =
> +                                       skutable->PcieGenSpeed[link_level];
> +               pcie_table->pcie_lane[pcie_table->num_of_link_levels] =
> +                                       skutable->PcieLaneCount[link_level];
> +               pcie_table->clk_freq[pcie_table->num_of_link_levels] =
> +                                       skutable->LclkFreq[link_level];
> +               pcie_table->num_of_link_levels++;
> +       }
> +       num_of_levels = pcie_table->num_of_link_levels;
>         if (!num_of_levels)
>                 return 0;
>
> --
> 2.34.1
>


More information about the amd-gfx mailing list