Skip to content

Commit a7a9d11

Browse files
Jerry (Fangzhi) Zuoalexdeucher
authored andcommitted
drm/amd/display: Update bounding box states (v2)
[Why] Drop hardcoded dispclk, dppclk, phyclk [How] Read the corresponding values from clock table entries already populated. Bug: https://gitlab.freedesktop.org/drm/amd/-/issues/1403 Cc: [email protected] Signed-off-by: Jerry (Fangzhi) Zuo <[email protected]> Signed-off-by: Aurabindo Pillai <[email protected]> Acked-by: Alex Deucher <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent 0bbf06d commit a7a9d11

File tree

1 file changed

+31
-10
lines changed

1 file changed

+31
-10
lines changed

drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)