4646#define TO_CLK_MGR_DCN315 (clk_mgr )\
4747 container_of(clk_mgr, struct clk_mgr_dcn315, base)
4848
49+ #define UNSUPPORTED_DCFCLK 10000000
50+ #define MIN_DPP_DISP_CLK 100000
51+
4952static int dcn315_get_active_display_cnt_wa (
5053 struct dc * dc ,
5154 struct dc_state * context )
@@ -79,7 +82,7 @@ static int dcn315_get_active_display_cnt_wa(
7982 return display_count ;
8083}
8184
82- static void dcn315_disable_otg_wa (struct clk_mgr * clk_mgr_base , bool disable )
85+ static void dcn315_disable_otg_wa (struct clk_mgr * clk_mgr_base , struct dc_state * context , bool disable )
8386{
8487 struct dc * dc = clk_mgr_base -> ctx -> dc ;
8588 int i ;
@@ -91,9 +94,10 @@ static void dcn315_disable_otg_wa(struct clk_mgr *clk_mgr_base, bool disable)
9194 continue ;
9295 if (pipe -> stream && (pipe -> stream -> dpms_off || pipe -> plane_state == NULL ||
9396 dc_is_virtual_signal (pipe -> stream -> signal ))) {
94- if (disable )
97+ if (disable ) {
9598 pipe -> stream_res .tg -> funcs -> immediate_disable_crtc (pipe -> stream_res .tg );
96- else
99+ reset_sync_context_for_pipe (dc , context , i );
100+ } else
97101 pipe -> stream_res .tg -> funcs -> enable_crtc (pipe -> stream_res .tg );
98102 }
99103 }
@@ -146,6 +150,9 @@ static void dcn315_update_clocks(struct clk_mgr *clk_mgr_base,
146150 }
147151 }
148152
153+ /* Lock pstate by requesting unsupported dcfclk if change is unsupported */
154+ if (!new_clocks -> p_state_change_support )
155+ new_clocks -> dcfclk_khz = UNSUPPORTED_DCFCLK ;
149156 if (should_set_clock (safe_to_lower , new_clocks -> dcfclk_khz , clk_mgr_base -> clks .dcfclk_khz )) {
150157 clk_mgr_base -> clks .dcfclk_khz = new_clocks -> dcfclk_khz ;
151158 dcn315_smu_set_hard_min_dcfclk (clk_mgr , clk_mgr_base -> clks .dcfclk_khz );
@@ -159,10 +166,10 @@ static void dcn315_update_clocks(struct clk_mgr *clk_mgr_base,
159166
160167 // workaround: Limit dppclk to 100Mhz to avoid lower eDP panel switch to plus 4K monitor underflow.
161168 if (!IS_DIAG_DC (dc -> ctx -> dce_environment )) {
162- if (new_clocks -> dppclk_khz < 100000 )
163- new_clocks -> dppclk_khz = 100000 ;
164- if (new_clocks -> dispclk_khz < 100000 )
165- new_clocks -> dispclk_khz = 100000 ;
169+ if (new_clocks -> dppclk_khz < MIN_DPP_DISP_CLK )
170+ new_clocks -> dppclk_khz = MIN_DPP_DISP_CLK ;
171+ if (new_clocks -> dispclk_khz < MIN_DPP_DISP_CLK )
172+ new_clocks -> dispclk_khz = MIN_DPP_DISP_CLK ;
166173 }
167174
168175 if (should_set_clock (safe_to_lower , new_clocks -> dppclk_khz , clk_mgr -> base .clks .dppclk_khz )) {
@@ -175,12 +182,12 @@ static void dcn315_update_clocks(struct clk_mgr *clk_mgr_base,
175182 if (should_set_clock (safe_to_lower , new_clocks -> dispclk_khz , clk_mgr_base -> clks .dispclk_khz )) {
176183 /* No need to apply the w/a if we haven't taken over from bios yet */
177184 if (clk_mgr_base -> clks .dispclk_khz )
178- dcn315_disable_otg_wa (clk_mgr_base , true);
185+ dcn315_disable_otg_wa (clk_mgr_base , context , true);
179186
180187 clk_mgr_base -> clks .dispclk_khz = new_clocks -> dispclk_khz ;
181188 dcn315_smu_set_dispclk (clk_mgr , clk_mgr_base -> clks .dispclk_khz );
182189 if (clk_mgr_base -> clks .dispclk_khz )
183- dcn315_disable_otg_wa (clk_mgr_base , false);
190+ dcn315_disable_otg_wa (clk_mgr_base , context , false);
184191
185192 update_dispclk = true;
186193 }
@@ -275,31 +282,31 @@ static struct wm_table ddr5_wm_table = {
275282 {
276283 .wm_inst = WM_A ,
277284 .wm_type = WM_TYPE_PSTATE_CHG ,
278- .pstate_latency_us = 64 .0 ,
285+ .pstate_latency_us = 129 .0 ,
279286 .sr_exit_time_us = 11.5 ,
280287 .sr_enter_plus_exit_time_us = 14.5 ,
281288 .valid = true,
282289 },
283290 {
284291 .wm_inst = WM_B ,
285292 .wm_type = WM_TYPE_PSTATE_CHG ,
286- .pstate_latency_us = 64 .0 ,
293+ .pstate_latency_us = 129 .0 ,
287294 .sr_exit_time_us = 11.5 ,
288295 .sr_enter_plus_exit_time_us = 14.5 ,
289296 .valid = true,
290297 },
291298 {
292299 .wm_inst = WM_C ,
293300 .wm_type = WM_TYPE_PSTATE_CHG ,
294- .pstate_latency_us = 64 .0 ,
301+ .pstate_latency_us = 129 .0 ,
295302 .sr_exit_time_us = 11.5 ,
296303 .sr_enter_plus_exit_time_us = 14.5 ,
297304 .valid = true,
298305 },
299306 {
300307 .wm_inst = WM_D ,
301308 .wm_type = WM_TYPE_PSTATE_CHG ,
302- .pstate_latency_us = 64 .0 ,
309+ .pstate_latency_us = 129 .0 ,
303310 .sr_exit_time_us = 11.5 ,
304311 .sr_enter_plus_exit_time_us = 14.5 ,
305312 .valid = true,
@@ -556,8 +563,7 @@ static void dcn315_clk_mgr_helper_populate_bw_params(
556563 ASSERT (bw_params -> clk_table .entries [i - 1 ].dcfclk_mhz );
557564 bw_params -> vram_type = bios_info -> memory_type ;
558565 bw_params -> num_channels = bios_info -> ma_channel_number ;
559- if (!bw_params -> num_channels )
560- bw_params -> num_channels = 2 ;
566+ bw_params -> dram_channel_width_bytes = bios_info -> memory_type == 0x22 ? 8 : 4 ;
561567
562568 for (i = 0 ; i < WM_SET_COUNT ; i ++ ) {
563569 bw_params -> wm_table .entries [i ].wm_inst = i ;
0 commit comments