@@ -2398,16 +2398,37 @@ void dcn30_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params
2398
2398
dc -> dml .soc .dispclk_dppclk_vco_speed_mhz = dc -> clk_mgr -> dentist_vco_freq_khz / 1000.0 ;
2399
2399
2400
2400
if (bw_params -> clk_table .entries [0 ].memclk_mhz ) {
2401
+ int max_dcfclk_mhz = 0 , max_dispclk_mhz = 0 , max_dppclk_mhz = 0 , max_phyclk_mhz = 0 ;
2402
+
2403
+ for (i = 0 ; i < MAX_NUM_DPM_LVL ; i ++ ) {
2404
+ if (bw_params -> clk_table .entries [i ].dcfclk_mhz > max_dcfclk_mhz )
2405
+ max_dcfclk_mhz = bw_params -> clk_table .entries [i ].dcfclk_mhz ;
2406
+ if (bw_params -> clk_table .entries [i ].dispclk_mhz > max_dispclk_mhz )
2407
+ max_dispclk_mhz = bw_params -> clk_table .entries [i ].dispclk_mhz ;
2408
+ if (bw_params -> clk_table .entries [i ].dppclk_mhz > max_dppclk_mhz )
2409
+ max_dppclk_mhz = bw_params -> clk_table .entries [i ].dppclk_mhz ;
2410
+ if (bw_params -> clk_table .entries [i ].phyclk_mhz > max_phyclk_mhz )
2411
+ max_phyclk_mhz = bw_params -> clk_table .entries [i ].phyclk_mhz ;
2412
+ }
2413
+
2414
+ if (!max_dcfclk_mhz )
2415
+ max_dcfclk_mhz = dcn3_0_soc .clock_limits [0 ].dcfclk_mhz ;
2416
+ if (!max_dispclk_mhz )
2417
+ max_dispclk_mhz = dcn3_0_soc .clock_limits [0 ].dispclk_mhz ;
2418
+ if (!max_dppclk_mhz )
2419
+ max_dppclk_mhz = dcn3_0_soc .clock_limits [0 ].dppclk_mhz ;
2420
+ if (!max_phyclk_mhz )
2421
+ max_phyclk_mhz = dcn3_0_soc .clock_limits [0 ].phyclk_mhz ;
2401
2422
2402
- if (bw_params -> clk_table . entries [ 1 ]. dcfclk_mhz > dcfclk_sta_targets [num_dcfclk_sta_targets - 1 ]) {
2423
+ if (max_dcfclk_mhz > dcfclk_sta_targets [num_dcfclk_sta_targets - 1 ]) {
2403
2424
// If max DCFCLK is greater than the max DCFCLK STA target, insert into the DCFCLK STA target array
2404
- dcfclk_sta_targets [num_dcfclk_sta_targets ] = bw_params -> clk_table . entries [ 1 ]. dcfclk_mhz ;
2425
+ dcfclk_sta_targets [num_dcfclk_sta_targets ] = max_dcfclk_mhz ;
2405
2426
num_dcfclk_sta_targets ++ ;
2406
- } else if (bw_params -> clk_table . entries [ 1 ]. dcfclk_mhz < dcfclk_sta_targets [num_dcfclk_sta_targets - 1 ]) {
2427
+ } else if (max_dcfclk_mhz < dcfclk_sta_targets [num_dcfclk_sta_targets - 1 ]) {
2407
2428
// If max DCFCLK is less than the max DCFCLK STA target, cap values and remove duplicates
2408
2429
for (i = 0 ; i < num_dcfclk_sta_targets ; i ++ ) {
2409
- if (dcfclk_sta_targets [i ] > bw_params -> clk_table . entries [ 1 ]. dcfclk_mhz ) {
2410
- dcfclk_sta_targets [i ] = bw_params -> clk_table . entries [ 1 ]. dcfclk_mhz ;
2430
+ if (dcfclk_sta_targets [i ] > max_dcfclk_mhz ) {
2431
+ dcfclk_sta_targets [i ] = max_dcfclk_mhz ;
2411
2432
break ;
2412
2433
}
2413
2434
}
@@ -2447,7 +2468,7 @@ void dcn30_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params
2447
2468
dcfclk_mhz [num_states ] = dcfclk_sta_targets [i ];
2448
2469
dram_speed_mts [num_states ++ ] = optimal_uclk_for_dcfclk_sta_targets [i ++ ];
2449
2470
} else {
2450
- if (j < num_uclk_states && optimal_dcfclk_for_uclk [j ] <= bw_params -> clk_table . entries [ 1 ]. dcfclk_mhz ) {
2471
+ if (j < num_uclk_states && optimal_dcfclk_for_uclk [j ] <= max_dcfclk_mhz ) {
2451
2472
dcfclk_mhz [num_states ] = optimal_dcfclk_for_uclk [j ];
2452
2473
dram_speed_mts [num_states ++ ] = bw_params -> clk_table .entries [j ++ ].memclk_mhz * 16 ;
2453
2474
} else {
@@ -2462,7 +2483,7 @@ void dcn30_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params
2462
2483
}
2463
2484
2464
2485
while (j < num_uclk_states && num_states < DC__VOLTAGE_STATES &&
2465
- optimal_dcfclk_for_uclk [j ] <= bw_params -> clk_table . entries [ 1 ]. dcfclk_mhz ) {
2486
+ optimal_dcfclk_for_uclk [j ] <= max_dcfclk_mhz ) {
2466
2487
dcfclk_mhz [num_states ] = optimal_dcfclk_for_uclk [j ];
2467
2488
dram_speed_mts [num_states ++ ] = bw_params -> clk_table .entries [j ++ ].memclk_mhz * 16 ;
2468
2489
}
@@ -2475,9 +2496,9 @@ void dcn30_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params
2475
2496
dcn3_0_soc .clock_limits [i ].dram_speed_mts = dram_speed_mts [i ];
2476
2497
2477
2498
/* Fill all states with max values of all other clocks */
2478
- dcn3_0_soc .clock_limits [i ].dispclk_mhz = bw_params -> clk_table . entries [ 1 ]. dispclk_mhz ;
2479
- dcn3_0_soc .clock_limits [i ].dppclk_mhz = bw_params -> clk_table . entries [ 1 ]. dppclk_mhz ;
2480
- dcn3_0_soc .clock_limits [i ].phyclk_mhz = bw_params -> clk_table . entries [ 1 ]. phyclk_mhz ;
2499
+ dcn3_0_soc .clock_limits [i ].dispclk_mhz = max_dispclk_mhz ;
2500
+ dcn3_0_soc .clock_limits [i ].dppclk_mhz = max_dppclk_mhz ;
2501
+ dcn3_0_soc .clock_limits [i ].phyclk_mhz = max_phyclk_mhz ;
2481
2502
dcn3_0_soc .clock_limits [i ].dtbclk_mhz = dcn3_0_soc .clock_limits [0 ].dtbclk_mhz ;
2482
2503
/* These clocks cannot come from bw_params, always fill from dcn3_0_soc[1] */
2483
2504
/* FCLK, PHYCLK_D18, SOCCLK, DSCCLK */
0 commit comments