add PP_PCIE_DPM_MASK support for navi10.

Signed-off-by: Yang Wang <[email protected]>
---
 .../gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c   | 66 +++++++++++++------
 1 file changed, 45 insertions(+), 21 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 0c26fe6fb949..fab19174343f 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c
@@ -2192,39 +2192,63 @@ static int navi10_update_pcie_parameters(struct 
smu_context *smu,
                                         uint8_t pcie_width_cap)
 {
        struct smu_11_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
+       struct smu_pcie_table *pcie_table =
+                               &dpm_context->dpm_tables.pcie_table;
        PPTable_t *pptable = smu->smu_table.driver_pptable;
        uint32_t smu_pcie_arg;
-       int ret = 0;
-       int i;
+       int i, lclk_levels = NUM_LINK_LEVELS, ret = 0;
 
        /* lclk dpm table setup */
        for (i = 0; i < NUM_LINK_LEVELS; i++) {
-               dpm_context->dpm_tables.pcie_table.pcie_gen[i] = 
pptable->PcieGenSpeed[i];
-               dpm_context->dpm_tables.pcie_table.pcie_lane[i] = 
pptable->PcieLaneCount[i];
-               dpm_context->dpm_tables.pcie_table.lclk_freq[i] =
-                       pptable->LclkFreq[i];
+              pcie_table->pcie_gen[i] = pptable->PcieGenSpeed[i];
+              pcie_table->pcie_lane[i] = pptable->PcieLaneCount[i];
+              pcie_table->lclk_freq[i] = pptable->LclkFreq[i];
        }
-       dpm_context->dpm_tables.pcie_table.lclk_levels = NUM_LINK_LEVELS;
+       pcie_table->lclk_levels = NUM_LINK_LEVELS;
 
-       for (i = 0; i < NUM_LINK_LEVELS; i++) {
-               if (pptable->PcieGenSpeed[i] > pcie_gen_cap ||
-                       pptable->PcieLaneCount[i] > pcie_width_cap) {
-                       dpm_context->dpm_tables.pcie_table.pcie_gen[i] =
-                                                                       
pptable->PcieGenSpeed[i] > pcie_gen_cap ?
-                                                                       
pcie_gen_cap : pptable->PcieGenSpeed[i];
-                       dpm_context->dpm_tables.pcie_table.pcie_lane[i] =
-                                                                       
pptable->PcieLaneCount[i] > pcie_width_cap ?
-                                                                       
pcie_width_cap : pptable->PcieLaneCount[i];
+       if (!(smu->adev->pm.pp_feature & PP_PCIE_DPM_MASK))  {
+               if (pcie_table->pcie_gen[lclk_levels - 1] < pcie_gen_cap)
+                       pcie_gen_cap = pcie_table->pcie_gen[lclk_levels - 1];
+
+               if (pcie_table->pcie_lane[lclk_levels - 1] < pcie_width_cap)
+                       pcie_width_cap = pcie_table->pcie_lane[lclk_levels - 1];
+
+               /* Force all levels to use the same settings */
+               for (i = 0; i < lclk_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 |= 
dpm_context->dpm_tables.pcie_table.pcie_gen[i] << 8;
-                       smu_pcie_arg |= 
dpm_context->dpm_tables.pcie_table.pcie_lane[i];
+                       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);
+                                                     
SMU_MSG_OverridePcieParameters,
+                                                     smu_pcie_arg,
+                                                     NULL);
                        if (ret)
                                break;
                }
+       } else {
+               for (i = 0; i < lclk_levels; i++) {
+                       if (pptable->PcieGenSpeed[i] > pcie_gen_cap ||
+                           pptable->PcieLaneCount[i] > pcie_width_cap) {
+                               pcie_table->pcie_gen[i] =
+                                       pptable->PcieGenSpeed[i] > pcie_gen_cap 
?
+                                       pcie_gen_cap : pptable->PcieGenSpeed[i];
+                               pcie_table->pcie_lane[i] =
+                                       pptable->PcieLaneCount[i] > 
pcie_width_cap ?
+                                       pcie_width_cap : 
pptable->PcieLaneCount[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)
+                                       break;
+                       }
+               }
        }
 
        return ret;
-- 
2.34.1

Reply via email to