[PATCH 1/2] drm/amd/pm: override pcie dpm parameters only if it is necessary

Wang, Yang(Kevin) KevinYang.Wang at amd.com
Thu Jun 12 08:26:25 UTC 2025


[AMD Official Use Only - AMD Internal Distribution Only]

Series is

Reviewed-by: Yang Wang <kevinyang.wang at amd.com>

Best Regards,
Kevin
-----Original Message-----
From: Kenneth Feng <kenneth.feng at amd.com>
Sent: Thursday, June 12, 2025 16:02
To: amd-gfx at lists.freedesktop.org
Cc: Wang, Yang(Kevin) <KevinYang.Wang at amd.com>; Feng, Kenneth <Kenneth.Feng at amd.com>
Subject: [PATCH 1/2] drm/amd/pm: override pcie dpm parameters only if it is necessary

override pcie dpm parameters only if it is necessary

Signed-off-by: Kenneth Feng <kenneth.feng at amd.com>
---
 .../gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c   | 31 +++++++------
 .../amd/pm/swsmu/smu11/sienna_cichlid_ppt.c   | 22 ++++++----
 .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c    | 43 +++++++++++--------
 .../drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c  | 37 ++++++++++------
 4 files changed, 77 insertions(+), 56 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c
index 7fad5dfb39c4..d7d5ec247624 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c
@@ -2444,7 +2444,8 @@ static int navi10_update_pcie_parameters(struct smu_context *smu,
        struct smu_11_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
        PPTable_t *pptable = smu->smu_table.driver_pptable;
        uint32_t smu_pcie_arg;
-       int ret, i;
+       int ret = 0;
+       int i;

        /* lclk dpm table setup */
        for (i = 0; i < MAX_PCIE_CONF; i++) {
@@ -2453,25 +2454,23 @@ static int navi10_update_pcie_parameters(struct smu_context *smu,
        }

        for (i = 0; i < NUM_LINK_LEVELS; i++) {
-               smu_pcie_arg = (i << 16) |
-                       ((pptable->PcieGenSpeed[i] <= pcie_gen_cap) ? (pptable->PcieGenSpeed[i] << 8) :
-                               (pcie_gen_cap << 8)) | ((pptable->PcieLaneCount[i] <= pcie_width_cap) ?
-                                       pptable->PcieLaneCount[i] : pcie_width_cap);
-               ret = smu_cmn_send_smc_msg_with_param(smu,
-                                         SMU_MSG_OverridePcieParameters,
-                                         smu_pcie_arg,
-                                         NULL);
-
-               if (ret)
-                       return ret;
-
-               if (pptable->PcieGenSpeed[i] > pcie_gen_cap)
+               if (pptable->PcieGenSpeed[i] > pcie_gen_cap ||
+                       pptable->PcieLaneCount[i] > pcie_width_cap) {
                        dpm_context->dpm_tables.pcie_table.pcie_gen[i] = pcie_gen_cap;
-               if (pptable->PcieLaneCount[i] > pcie_width_cap)
                        dpm_context->dpm_tables.pcie_table.pcie_lane[i] = pcie_width_cap;
+                       smu_pcie_arg = i << 16;
+                       smu_pcie_arg |= pcie_gen_cap << 8;
+                       smu_pcie_arg |= pcie_width_cap;
+                       ret = smu_cmn_send_smc_msg_with_param(smu,
+                                                       SMU_MSG_OverridePcieParameters,
+                                                       smu_pcie_arg,
+                                                       NULL);
+                       if (ret)
+                               break;
+               }
        }

-       return 0;
+       return ret;
 }

 static inline void navi10_dump_od_table(struct smu_context *smu, diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
index 115e3fa456bc..d57591509aed 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
@@ -2145,7 +2145,8 @@ static int sienna_cichlid_update_pcie_parameters(struct smu_context *smu,
        uint8_t min_gen_speed, max_gen_speed;
        uint8_t min_lane_width, max_lane_width;
        uint32_t smu_pcie_arg;
-       int ret, i;
+       int ret = 0;
+       int i;

        GET_PPTABLE_MEMBER(PcieGenSpeed, &table_member1);
        GET_PPTABLE_MEMBER(PcieLaneCount, &table_member2); @@ -2170,19 +2171,22 @@ static int sienna_cichlid_update_pcie_parameters(struct smu_context *smu,
        pcie_table->pcie_lane[1] = max_lane_width;

        for (i = 0; i < NUM_LINK_LEVELS; i++) {
-               smu_pcie_arg = (i << 16 |
+               if (!(smu->adev->pm.pp_feature & PP_PCIE_DPM_MASK) ||
+                       table_member1[i] > pcie_gen_cap || table_member2[i] > pcie_width_cap) {
+                       smu_pcie_arg = (i << 16 |
                                pcie_table->pcie_gen[i] << 8 |
                                pcie_table->pcie_lane[i]);

-               ret = smu_cmn_send_smc_msg_with_param(smu,
-                               SMU_MSG_OverridePcieParameters,
-                               smu_pcie_arg,
-                               NULL);
-               if (ret)
-                       return ret;
+                       ret = smu_cmn_send_smc_msg_with_param(smu,
+                                               SMU_MSG_OverridePcieParameters,
+                                               smu_pcie_arg,
+                                               NULL);
+                       if (ret)
+                               break;
+               }
        }

-       return 0;
+       return ret;
 }

 static int sienna_cichlid_get_dpm_ultimate_freq(struct smu_context *smu, diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c
index 1c7235935d14..1a1f2a6b2e52 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c
@@ -2386,7 +2386,8 @@ int smu_v13_0_update_pcie_parameters(struct smu_context *smu,
                                &dpm_context->dpm_tables.pcie_table;
        int num_of_levels = pcie_table->num_of_link_levels;
        uint32_t smu_pcie_arg;
-       int ret, i;
+       int ret = 0;
+       int i;

        if (!num_of_levels)
                return 0;
@@ -2402,30 +2403,38 @@ int smu_v13_0_update_pcie_parameters(struct smu_context *smu,
                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)
+                       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;
-                       if (pcie_table->pcie_lane[i] > pcie_width_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;
+                       }
                }
        }

-       for (i = 0; i < num_of_levels; i++) {
-               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)
-                       return ret;
-       }
-
-       return 0;
+       return ret;
 }

 int smu_v13_0_disable_pmfw_state(struct smu_context *smu) 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 82c2db972491..d5a4abd60d06 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
@@ -1489,7 +1489,8 @@ static int smu_v14_0_2_update_pcie_parameters(struct smu_context *smu,
                                &dpm_context->dpm_tables.pcie_table;
        int num_of_levels = pcie_table->num_of_link_levels;
        uint32_t smu_pcie_arg;
-       int ret, i;
+       int ret = 0;
+       int i;

        if (!num_of_levels)
                return 0;
@@ -1505,30 +1506,38 @@ static int smu_v14_0_2_update_pcie_parameters(struct smu_context *smu,
                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)
+                       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;
-                       if (pcie_table->pcie_lane[i] > pcie_width_cap)
                                pcie_table->pcie_lane[i] = pcie_width_cap;
-               }
-       }
-
-       for (i = 0; i < num_of_levels; i++) {
-               smu_pcie_arg = i << 16;
-               smu_pcie_arg |= pcie_table->pcie_gen[i] << 8;
-               smu_pcie_arg |= pcie_table->pcie_lane[i];
+                               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,
+                               ret = smu_cmn_send_smc_msg_with_param(smu,
                                                      SMU_MSG_OverridePcieParameters,
                                                      smu_pcie_arg,
                                                      NULL);
-               if (ret)
-                       return ret;
+                               if (ret)
+                                       break;
+                       }
+               }
        }

-       return 0;
+       return ret;
 }

 static const struct smu_temperature_range smu14_thermal_policy[] = {
--
2.34.1



More information about the amd-gfx mailing list