Skip to content

Commit 2e72fdb

Browse files
Paul Hsiehalexdeucher
authored andcommitted
drm/amd/display: update dpp/disp clock from smu clock table
[Why] The reason some high-resolution monitors fail to display properly is that this platform does not support sufficiently high DPP and DISP clock frequencies [How] Update DISP and DPP clocks from the smu clock table then DML can filter these mode if not support. Reviewed-by: Nicholas Kazlauskas <[email protected]> Signed-off-by: Paul Hsieh <[email protected]> Signed-off-by: Roman Li <[email protected]> Tested-by: Daniel Wheeler <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent 6d31602 commit 2e72fdb

File tree

2 files changed

+33
-3
lines changed

2 files changed

+33
-3
lines changed

drivers/gpu/drm/amd/display/dc/clk_mgr/dcn301/vg_clk_mgr.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,7 @@ static void vg_clk_mgr_helper_populate_bw_params(
563563
{
564564
int i, j;
565565
struct clk_bw_params *bw_params = clk_mgr->base.bw_params;
566+
uint32_t max_dispclk = 0, max_dppclk = 0;
566567

567568
j = -1;
568569

@@ -584,18 +585,33 @@ static void vg_clk_mgr_helper_populate_bw_params(
584585
return;
585586
}
586587

588+
/* dispclk and dppclk can be max at any voltage, same number of levels for both */
589+
if (clock_table->NumDispClkLevelsEnabled <= VG_NUM_DISPCLK_DPM_LEVELS &&
590+
clock_table->NumDispClkLevelsEnabled <= VG_NUM_DPPCLK_DPM_LEVELS) {
591+
max_dispclk = find_max_clk_value(clock_table->DispClocks, clock_table->NumDispClkLevelsEnabled);
592+
max_dppclk = find_max_clk_value(clock_table->DppClocks, clock_table->NumDispClkLevelsEnabled);
593+
} else {
594+
ASSERT(0);
595+
}
596+
587597
bw_params->clk_table.num_entries = j + 1;
588598

589599
for (i = 0; i < bw_params->clk_table.num_entries - 1; i++, j--) {
590600
bw_params->clk_table.entries[i].fclk_mhz = clock_table->DfPstateTable[j].fclk;
591601
bw_params->clk_table.entries[i].memclk_mhz = clock_table->DfPstateTable[j].memclk;
592602
bw_params->clk_table.entries[i].voltage = clock_table->DfPstateTable[j].voltage;
593603
bw_params->clk_table.entries[i].dcfclk_mhz = find_dcfclk_for_voltage(clock_table, clock_table->DfPstateTable[j].voltage);
604+
605+
/* Now update clocks we do read */
606+
bw_params->clk_table.entries[i].dispclk_mhz = max_dispclk;
607+
bw_params->clk_table.entries[i].dppclk_mhz = max_dppclk;
594608
}
595609
bw_params->clk_table.entries[i].fclk_mhz = clock_table->DfPstateTable[j].fclk;
596610
bw_params->clk_table.entries[i].memclk_mhz = clock_table->DfPstateTable[j].memclk;
597611
bw_params->clk_table.entries[i].voltage = clock_table->DfPstateTable[j].voltage;
598612
bw_params->clk_table.entries[i].dcfclk_mhz = find_max_clk_value(clock_table->DcfClocks, VG_NUM_DCFCLK_DPM_LEVELS);
613+
bw_params->clk_table.entries[i].dispclk_mhz = find_max_clk_value(clock_table->DispClocks, VG_NUM_DISPCLK_DPM_LEVELS);
614+
bw_params->clk_table.entries[i].dppclk_mhz = find_max_clk_value(clock_table->DppClocks, VG_NUM_DPPCLK_DPM_LEVELS);
599615

600616
bw_params->vram_type = bios_info->memory_type;
601617
bw_params->num_channels = bios_info->ma_channel_number;

drivers/gpu/drm/amd/display/dc/dml/dcn301/dcn301_fpu.c

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ void dcn301_fpu_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_p
326326
struct dcn301_resource_pool *pool = TO_DCN301_RES_POOL(dc->res_pool);
327327
struct clk_limit_table *clk_table = &bw_params->clk_table;
328328
unsigned int i, closest_clk_lvl;
329-
int j;
329+
int j = 0, max_dispclk_mhz = 0, max_dppclk_mhz = 0;
330330

331331
dc_assert_fp_enabled();
332332

@@ -338,6 +338,15 @@ void dcn301_fpu_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_p
338338
dcn3_01_soc.num_chans = bw_params->num_channels;
339339

340340
ASSERT(clk_table->num_entries);
341+
342+
/* Prepass to find max clocks independent of voltage level. */
343+
for (i = 0; i < clk_table->num_entries; ++i) {
344+
if (clk_table->entries[i].dispclk_mhz > max_dispclk_mhz)
345+
max_dispclk_mhz = clk_table->entries[i].dispclk_mhz;
346+
if (clk_table->entries[i].dppclk_mhz > max_dppclk_mhz)
347+
max_dppclk_mhz = clk_table->entries[i].dppclk_mhz;
348+
}
349+
341350
for (i = 0; i < clk_table->num_entries; i++) {
342351
/* loop backwards*/
343352
for (closest_clk_lvl = 0, j = dcn3_01_soc.num_states - 1; j >= 0; j--) {
@@ -353,8 +362,13 @@ void dcn301_fpu_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_p
353362
s[i].socclk_mhz = clk_table->entries[i].socclk_mhz;
354363
s[i].dram_speed_mts = clk_table->entries[i].memclk_mhz * 2;
355364

356-
s[i].dispclk_mhz = dcn3_01_soc.clock_limits[closest_clk_lvl].dispclk_mhz;
357-
s[i].dppclk_mhz = dcn3_01_soc.clock_limits[closest_clk_lvl].dppclk_mhz;
365+
/* Clocks independent of voltage level. */
366+
s[i].dispclk_mhz = max_dispclk_mhz ? max_dispclk_mhz :
367+
dcn3_01_soc.clock_limits[closest_clk_lvl].dispclk_mhz;
368+
369+
s[i].dppclk_mhz = max_dppclk_mhz ? max_dppclk_mhz :
370+
dcn3_01_soc.clock_limits[closest_clk_lvl].dppclk_mhz;
371+
358372
s[i].dram_bw_per_chan_gbps =
359373
dcn3_01_soc.clock_limits[closest_clk_lvl].dram_bw_per_chan_gbps;
360374
s[i].dscclk_mhz = dcn3_01_soc.clock_limits[closest_clk_lvl].dscclk_mhz;

0 commit comments

Comments
 (0)