Skip to content

Commit 02316e9

Browse files
Nicholas Kazlauskasalexdeucher
authored andcommitted
drm/amd/display: Force uclk to max for every state
Workaround for now to avoid underflow. The uclk switch time should really be bumped up to 404, but doing so would expose p-state hang issues for higher bandwidth display configurations. Signed-off-by: Nicholas Kazlauskas <[email protected]> Signed-off-by: Leo Li <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent 6a5d487 commit 02316e9

File tree

2 files changed

+13
-3
lines changed

2 files changed

+13
-3
lines changed

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -911,11 +911,11 @@ void dm_pp_get_funcs(
911911
/* todo set_pme_wa_enable cause 4k@6ohz display not light up */
912912
funcs->nv_funcs.set_pme_wa_enable = NULL;
913913
/* todo debug waring message */
914-
funcs->nv_funcs.set_hard_min_uclk_by_freq = NULL;
914+
funcs->nv_funcs.set_hard_min_uclk_by_freq = pp_nv_set_hard_min_uclk_by_freq;
915915
/* todo compare data with window driver*/
916-
funcs->nv_funcs.get_maximum_sustainable_clocks = NULL;
916+
funcs->nv_funcs.get_maximum_sustainable_clocks = pp_nv_get_maximum_sustainable_clocks;
917917
/*todo compare data with window driver */
918-
funcs->nv_funcs.get_uclk_dpm_states = NULL;
918+
funcs->nv_funcs.get_uclk_dpm_states = pp_nv_get_uclk_dpm_states;
919919
break;
920920
#endif
921921
default:

drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2576,6 +2576,9 @@ static void cap_soc_clocks(
25762576
&& max_clocks.uClockInKhz != 0)
25772577
bb->clock_limits[i].dram_speed_mts = (max_clocks.uClockInKhz / 1000) * 16;
25782578

2579+
// HACK: Force every uclk to max for now to "disable" uclk switching.
2580+
bb->clock_limits[i].dram_speed_mts = (max_clocks.uClockInKhz / 1000) * 16;
2581+
25792582
if ((bb->clock_limits[i].fabricclk_mhz > (max_clocks.fabricClockInKhz / 1000))
25802583
&& max_clocks.fabricClockInKhz != 0)
25812584
bb->clock_limits[i].fabricclk_mhz = (max_clocks.fabricClockInKhz / 1000);
@@ -2783,6 +2786,8 @@ static bool init_soc_bounding_box(struct dc *dc,
27832786
le32_to_cpu(bb->vmm_page_size_bytes);
27842787
dcn2_0_soc.dram_clock_change_latency_us =
27852788
fixed16_to_double_to_cpu(bb->dram_clock_change_latency_us);
2789+
// HACK!! Lower uclock latency switch time so we don't switch
2790+
dcn2_0_soc.dram_clock_change_latency_us = 10;
27862791
dcn2_0_soc.writeback_dram_clock_change_latency_us =
27872792
fixed16_to_double_to_cpu(bb->writeback_dram_clock_change_latency_us);
27882793
dcn2_0_soc.return_bus_width_bytes =
@@ -2824,6 +2829,7 @@ static bool init_soc_bounding_box(struct dc *dc,
28242829
struct pp_smu_nv_clock_table max_clocks = {0};
28252830
unsigned int uclk_states[8] = {0};
28262831
unsigned int num_states = 0;
2832+
int i;
28272833
enum pp_smu_status status;
28282834
bool clock_limits_available = false;
28292835
bool uclk_states_available = false;
@@ -2845,6 +2851,10 @@ static bool init_soc_bounding_box(struct dc *dc,
28452851
clock_limits_available = (status == PP_SMU_RESULT_OK);
28462852
}
28472853

2854+
// HACK: Use the max uclk_states value for all elements.
2855+
for (i = 0; i < num_states; i++)
2856+
uclk_states[i] = uclk_states[num_states - 1];
2857+
28482858
if (clock_limits_available && uclk_states_available && num_states)
28492859
update_bounding_box(dc, &dcn2_0_soc, &max_clocks, uclk_states, num_states);
28502860
else if (clock_limits_available)

0 commit comments

Comments
 (0)