[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