@@ -2398,16 +2398,37 @@ void dcn30_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params
23982398 dc -> dml .soc .dispclk_dppclk_vco_speed_mhz = dc -> clk_mgr -> dentist_vco_freq_khz / 1000.0 ;
23992399
24002400 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 ;
24012422
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 ]) {
24032424 // 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 ;
24052426 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 ]) {
24072428 // If max DCFCLK is less than the max DCFCLK STA target, cap values and remove duplicates
24082429 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 ;
24112432 break ;
24122433 }
24132434 }
@@ -2447,7 +2468,7 @@ void dcn30_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params
24472468 dcfclk_mhz [num_states ] = dcfclk_sta_targets [i ];
24482469 dram_speed_mts [num_states ++ ] = optimal_uclk_for_dcfclk_sta_targets [i ++ ];
24492470 } 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 ) {
24512472 dcfclk_mhz [num_states ] = optimal_dcfclk_for_uclk [j ];
24522473 dram_speed_mts [num_states ++ ] = bw_params -> clk_table .entries [j ++ ].memclk_mhz * 16 ;
24532474 } else {
@@ -2462,7 +2483,7 @@ void dcn30_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params
24622483 }
24632484
24642485 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 ) {
24662487 dcfclk_mhz [num_states ] = optimal_dcfclk_for_uclk [j ];
24672488 dram_speed_mts [num_states ++ ] = bw_params -> clk_table .entries [j ++ ].memclk_mhz * 16 ;
24682489 }
@@ -2475,9 +2496,9 @@ void dcn30_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params
24752496 dcn3_0_soc .clock_limits [i ].dram_speed_mts = dram_speed_mts [i ];
24762497
24772498 /* 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 ;
24812502 dcn3_0_soc .clock_limits [i ].dtbclk_mhz = dcn3_0_soc .clock_limits [0 ].dtbclk_mhz ;
24822503 /* These clocks cannot come from bw_params, always fill from dcn3_0_soc[1] */
24832504 /* FCLK, PHYCLK_D18, SOCCLK, DSCCLK */
0 commit comments