]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amd/pm: override pcie dpm parameters only if it is necessary
authorKenneth Feng <kenneth.feng@amd.com>
Thu, 12 Jun 2025 07:56:11 +0000 (15:56 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 18 Jun 2025 16:19:19 +0000 (12:19 -0400)
override pcie dpm parameters only if it is necessary

Signed-off-by: Kenneth Feng <kenneth.feng@amd.com>
Reviewed-by: Yang Wang <kevinyang.wang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c
drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c

index 7fad5dfb39c44087cfef43559e07d3f6f2e56e68..d7d5ec247624dca8bdb0f24afe064c74da646a72 100644 (file)
@@ -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,
index 115e3fa456bcac045f12115e32039ca2ab0aa6f6..d57591509aed181978abb8221f6feba66703273e 100644 (file)
@@ -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,
index 1c7235935d14c5838d3c63585d632b7a35624917..1a1f2a6b2e52128828e820451792da2b34384db3 100644 (file)
@@ -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)
index 82c2db972491d46752961245b0fa343174b068aa..d5a4abd60d06e4c7a18a92008b125183b69023af 100644 (file)
@@ -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[] = {