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