Skip to content

Commit ae88357

Browse files
Ilya Bakoulinalexdeucher
authored andcommitted
drm/amd/display: Revert "Fix clock table filling logic"
[Why] This change was found to break some high-refresh modes. Reverting to unblock mainline. Signed-off-by: Ilya Bakoulin <[email protected]> Reviewed-by: Sung Lee <[email protected]> Acked-by: Stylon Wang <[email protected]> Tested-by: Daniel Wheeler <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent 24cc4f8 commit ae88357

File tree

2 files changed

+39
-72
lines changed

2 files changed

+39
-72
lines changed

drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c

Lines changed: 27 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -835,66 +835,47 @@ static struct wm_table lpddr4_wm_table_rn = {
835835
}
836836
};
837837

838-
static unsigned int find_max_fclk_for_voltage(struct dpm_clocks *clock_table,
839-
unsigned int voltage)
838+
static unsigned int find_socclk_for_voltage(struct dpm_clocks *clock_table, unsigned int voltage)
840839
{
841840
int i;
842-
uint32_t max_clk = 0;
843841

844-
for (i = 0; i < PP_SMU_NUM_FCLK_DPM_LEVELS; i++) {
845-
if (clock_table->FClocks[i].Vol <= voltage) {
846-
max_clk = clock_table->FClocks[i].Freq > max_clk ?
847-
clock_table->FClocks[i].Freq : max_clk;
848-
}
849-
}
850-
851-
return max_clk;
852-
}
853-
854-
static unsigned int find_max_memclk_for_voltage(struct dpm_clocks *clock_table,
855-
unsigned int voltage)
856-
{
857-
int i;
858-
uint32_t max_clk = 0;
859-
860-
for (i = 0; i < PP_SMU_NUM_MEMCLK_DPM_LEVELS; i++) {
861-
if (clock_table->MemClocks[i].Vol <= voltage) {
862-
max_clk = clock_table->MemClocks[i].Freq > max_clk ?
863-
clock_table->MemClocks[i].Freq : max_clk;
864-
}
842+
for (i = 0; i < PP_SMU_NUM_SOCCLK_DPM_LEVELS; i++) {
843+
if (clock_table->SocClocks[i].Vol == voltage)
844+
return clock_table->SocClocks[i].Freq;
865845
}
866846

867-
return max_clk;
847+
ASSERT(0);
848+
return 0;
868849
}
869850

870-
static unsigned int find_max_socclk_for_voltage(struct dpm_clocks *clock_table,
871-
unsigned int voltage)
851+
static unsigned int find_dcfclk_for_voltage(struct dpm_clocks *clock_table, unsigned int voltage)
872852
{
873853
int i;
874-
uint32_t max_clk = 0;
875854

876-
for (i = 0; i < PP_SMU_NUM_SOCCLK_DPM_LEVELS; i++) {
877-
if (clock_table->SocClocks[i].Vol <= voltage) {
878-
max_clk = clock_table->SocClocks[i].Freq > max_clk ?
879-
clock_table->SocClocks[i].Freq : max_clk;
880-
}
855+
for (i = 0; i < PP_SMU_NUM_DCFCLK_DPM_LEVELS; i++) {
856+
if (clock_table->DcfClocks[i].Vol == voltage)
857+
return clock_table->DcfClocks[i].Freq;
881858
}
882859

883-
return max_clk;
860+
ASSERT(0);
861+
return 0;
884862
}
885863

886864
static void rn_clk_mgr_helper_populate_bw_params(struct clk_bw_params *bw_params, struct dpm_clocks *clock_table, struct integrated_info *bios_info)
887865
{
888866
int i, j = 0;
889-
unsigned int volt;
890867

891868
j = -1;
892869

893-
/* Find max DPM */
894-
for (i = 0; i < PP_SMU_NUM_DCFCLK_DPM_LEVELS; ++i) {
895-
if (clock_table->DcfClocks[i].Freq != 0 &&
896-
clock_table->DcfClocks[i].Vol != 0)
870+
ASSERT(PP_SMU_NUM_FCLK_DPM_LEVELS <= MAX_NUM_DPM_LVL);
871+
872+
/* Find lowest DPM, FCLK is filled in reverse order*/
873+
874+
for (i = PP_SMU_NUM_FCLK_DPM_LEVELS - 1; i >= 0; i--) {
875+
if (clock_table->FClocks[i].Freq != 0 && clock_table->FClocks[i].Vol != 0) {
897876
j = i;
877+
break;
878+
}
898879
}
899880

900881
if (j == -1) {
@@ -905,18 +886,13 @@ static void rn_clk_mgr_helper_populate_bw_params(struct clk_bw_params *bw_params
905886

906887
bw_params->clk_table.num_entries = j + 1;
907888

908-
for (i = 0; i < bw_params->clk_table.num_entries; i++) {
909-
volt = clock_table->DcfClocks[i].Vol;
910-
911-
bw_params->clk_table.entries[i].voltage = volt;
912-
bw_params->clk_table.entries[i].dcfclk_mhz =
913-
clock_table->DcfClocks[i].Freq;
914-
bw_params->clk_table.entries[i].fclk_mhz =
915-
find_max_fclk_for_voltage(clock_table, volt);
916-
bw_params->clk_table.entries[i].memclk_mhz =
917-
find_max_memclk_for_voltage(clock_table, volt);
918-
bw_params->clk_table.entries[i].socclk_mhz =
919-
find_max_socclk_for_voltage(clock_table, volt);
889+
for (i = 0; i < bw_params->clk_table.num_entries; i++, j--) {
890+
bw_params->clk_table.entries[i].fclk_mhz = clock_table->FClocks[j].Freq;
891+
bw_params->clk_table.entries[i].memclk_mhz = clock_table->MemClocks[j].Freq;
892+
bw_params->clk_table.entries[i].voltage = clock_table->FClocks[j].Vol;
893+
bw_params->clk_table.entries[i].dcfclk_mhz = find_dcfclk_for_voltage(clock_table, clock_table->FClocks[j].Vol);
894+
bw_params->clk_table.entries[i].socclk_mhz = find_socclk_for_voltage(clock_table,
895+
bw_params->clk_table.entries[i].voltage);
920896
}
921897

922898
bw_params->vram_type = bios_info->memory_type;

drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1575,12 +1575,10 @@ static struct _vcs_dpi_voltage_scaling_st construct_low_pstate_lvl(struct clk_li
15751575
low_pstate_lvl.phyclk_d18_mhz = dcn2_1_soc.clock_limits[high_voltage_lvl].phyclk_d18_mhz;
15761576
low_pstate_lvl.phyclk_mhz = dcn2_1_soc.clock_limits[high_voltage_lvl].phyclk_mhz;
15771577

1578-
if (clk_table->num_entries < MAX_NUM_DPM_LVL) {
1579-
for (i = clk_table->num_entries; i > 1; i--)
1580-
clk_table->entries[i] = clk_table->entries[i-1];
1581-
clk_table->entries[1] = clk_table->entries[0];
1582-
clk_table->num_entries++;
1583-
}
1578+
for (i = clk_table->num_entries; i > 1; i--)
1579+
clk_table->entries[i] = clk_table->entries[i-1];
1580+
clk_table->entries[1] = clk_table->entries[0];
1581+
clk_table->num_entries++;
15841582

15851583
return low_pstate_lvl;
15861584
}
@@ -1612,6 +1610,10 @@ static void update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_param
16121610
}
16131611
}
16141612

1613+
/* clk_table[1] is reserved for min DF PState. skip here to fill in later. */
1614+
if (i == 1)
1615+
k++;
1616+
16151617
clock_limits[k].state = k;
16161618
clock_limits[k].dcfclk_mhz = clk_table->entries[i].dcfclk_mhz;
16171619
clock_limits[k].fabricclk_mhz = clk_table->entries[i].fclk_mhz;
@@ -1628,25 +1630,14 @@ static void update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_param
16281630

16291631
k++;
16301632
}
1631-
1632-
if (clk_table->num_entries >= MAX_NUM_DPM_LVL) {
1633-
for (i = 0; i < clk_table->num_entries + 1; i++)
1634-
dcn2_1_soc.clock_limits[i] = clock_limits[i];
1635-
} else {
1636-
dcn2_1_soc.clock_limits[0] = clock_limits[0];
1637-
for (i = 2; i < clk_table->num_entries + 1; i++) {
1638-
dcn2_1_soc.clock_limits[i] = clock_limits[i - 1];
1639-
dcn2_1_soc.clock_limits[i].state = i;
1640-
}
1641-
}
1642-
1633+
for (i = 0; i < clk_table->num_entries + 1; i++)
1634+
dcn2_1_soc.clock_limits[i] = clock_limits[i];
16431635
if (clk_table->num_entries) {
1636+
dcn2_1_soc.num_states = clk_table->num_entries + 1;
16441637
/* fill in min DF PState */
16451638
dcn2_1_soc.clock_limits[1] = construct_low_pstate_lvl(clk_table, closest_clk_lvl);
1646-
dcn2_1_soc.num_states = clk_table->num_entries;
16471639
/* duplicate last level */
1648-
dcn2_1_soc.clock_limits[dcn2_1_soc.num_states] =
1649-
dcn2_1_soc.clock_limits[dcn2_1_soc.num_states - 1];
1640+
dcn2_1_soc.clock_limits[dcn2_1_soc.num_states] = dcn2_1_soc.clock_limits[dcn2_1_soc.num_states - 1];
16501641
dcn2_1_soc.clock_limits[dcn2_1_soc.num_states].state = dcn2_1_soc.num_states;
16511642
}
16521643

0 commit comments

Comments
 (0)