drm/amd/pm: disable pcie speed switching on Intel platform for smu v14.0.2/3
authorKenneth Feng <kenneth.feng@amd.com>
Tue, 19 Nov 2024 06:26:58 +0000 (14:26 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 21 Nov 2024 20:55:40 +0000 (15:55 -0500)
disable pcie speed switching on Intel platform for smu v14.0.2/3
based on Intel's requirement.
v2: align the setting with smu v13.

Signed-off-by: Kenneth Feng <kenneth.feng@amd.com>
Reviewed-by: Lijo Lazar <lijo.lazar@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org # 6.11.x
drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c

index 5e26292..79609da 100644 (file)
@@ -1465,15 +1465,35 @@ 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;
        uint32_t smu_pcie_arg;
        int ret, i;
 
-       for (i = 0; i < pcie_table->num_of_link_levels; i++) {
-               if (pcie_table->pcie_gen[i] > pcie_gen_cap)
+       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;
-               if (pcie_table->pcie_lane[i] > pcie_width_cap)
                        pcie_table->pcie_lane[i] = pcie_width_cap;
+               }
+       } else {
+               for (i = 0; i < num_of_levels; i++) {
+                       if (pcie_table->pcie_gen[i] > pcie_gen_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];