@@ -1465,15 +1465,35 @@ static int smu_v14_0_2_update_pcie_parameters(struct smu_context *smu,
1465
1465
struct smu_14_0_dpm_context * dpm_context = smu -> smu_dpm .dpm_context ;
1466
1466
struct smu_14_0_pcie_table * pcie_table =
1467
1467
& dpm_context -> dpm_tables .pcie_table ;
1468
+ int num_of_levels = pcie_table -> num_of_link_levels ;
1468
1469
uint32_t smu_pcie_arg ;
1469
1470
int ret , i ;
1470
1471
1471
- for (i = 0 ; i < pcie_table -> num_of_link_levels ; i ++ ) {
1472
- if (pcie_table -> pcie_gen [i ] > pcie_gen_cap )
1472
+ if (!num_of_levels )
1473
+ return 0 ;
1474
+
1475
+ if (!(smu -> adev -> pm .pp_feature & PP_PCIE_DPM_MASK )) {
1476
+ if (pcie_table -> pcie_gen [num_of_levels - 1 ] < pcie_gen_cap )
1477
+ pcie_gen_cap = pcie_table -> pcie_gen [num_of_levels - 1 ];
1478
+
1479
+ if (pcie_table -> pcie_lane [num_of_levels - 1 ] < pcie_width_cap )
1480
+ pcie_width_cap = pcie_table -> pcie_lane [num_of_levels - 1 ];
1481
+
1482
+ /* Force all levels to use the same settings */
1483
+ for (i = 0 ; i < num_of_levels ; i ++ ) {
1473
1484
pcie_table -> pcie_gen [i ] = pcie_gen_cap ;
1474
- if (pcie_table -> pcie_lane [i ] > pcie_width_cap )
1475
1485
pcie_table -> pcie_lane [i ] = pcie_width_cap ;
1486
+ }
1487
+ } else {
1488
+ for (i = 0 ; i < num_of_levels ; i ++ ) {
1489
+ if (pcie_table -> pcie_gen [i ] > pcie_gen_cap )
1490
+ pcie_table -> pcie_gen [i ] = pcie_gen_cap ;
1491
+ if (pcie_table -> pcie_lane [i ] > pcie_width_cap )
1492
+ pcie_table -> pcie_lane [i ] = pcie_width_cap ;
1493
+ }
1494
+ }
1476
1495
1496
+ for (i = 0 ; i < num_of_levels ; i ++ ) {
1477
1497
smu_pcie_arg = i << 16 ;
1478
1498
smu_pcie_arg |= pcie_table -> pcie_gen [i ] << 8 ;
1479
1499
smu_pcie_arg |= pcie_table -> pcie_lane [i ];
0 commit comments