@@ -401,6 +401,7 @@ void dcn35_update_clocks(struct clk_mgr *clk_mgr_base,
401
401
if (clk_mgr_base -> clks .dtbclk_en && !new_clocks -> dtbclk_en ) {
402
402
if (clk_mgr -> base .ctx -> dc -> config .allow_0_dtb_clk )
403
403
dcn35_smu_set_dtbclk (clk_mgr , false);
404
+
404
405
clk_mgr_base -> clks .dtbclk_en = new_clocks -> dtbclk_en ;
405
406
}
406
407
/* check that we're not already in lower */
@@ -418,11 +419,17 @@ void dcn35_update_clocks(struct clk_mgr *clk_mgr_base,
418
419
}
419
420
420
421
if (!clk_mgr_base -> clks .dtbclk_en && new_clocks -> dtbclk_en ) {
421
- dcn35_smu_set_dtbclk (clk_mgr , true);
422
- clk_mgr_base -> clks .dtbclk_en = new_clocks -> dtbclk_en ;
422
+ int actual_dtbclk = 0 ;
423
423
424
424
dcn35_update_clocks_update_dtb_dto (clk_mgr , context , new_clocks -> ref_dtbclk_khz );
425
- clk_mgr_base -> clks .ref_dtbclk_khz = new_clocks -> ref_dtbclk_khz ;
425
+ dcn35_smu_set_dtbclk (clk_mgr , true);
426
+
427
+ actual_dtbclk = REG_READ (CLK1_CLK4_CURRENT_CNT );
428
+
429
+ if (actual_dtbclk ) {
430
+ clk_mgr_base -> clks .ref_dtbclk_khz = new_clocks -> ref_dtbclk_khz ;
431
+ clk_mgr_base -> clks .dtbclk_en = new_clocks -> dtbclk_en ;
432
+ }
426
433
}
427
434
428
435
/* check that we're not already in D0 */
@@ -584,12 +591,10 @@ static bool dcn35_is_spll_ssc_enabled(struct clk_mgr *clk_mgr_base)
584
591
585
592
static void init_clk_states (struct clk_mgr * clk_mgr )
586
593
{
587
- struct clk_mgr_internal * clk_mgr_int = TO_CLK_MGR_INTERNAL (clk_mgr );
588
594
uint32_t ref_dtbclk = clk_mgr -> clks .ref_dtbclk_khz ;
595
+
589
596
memset (& (clk_mgr -> clks ), 0 , sizeof (struct dc_clocks ));
590
597
591
- if (clk_mgr_int -> smu_ver >= SMU_VER_THRESHOLD )
592
- clk_mgr -> clks .dtbclk_en = true; // request DTBCLK disable on first commit
593
598
clk_mgr -> clks .ref_dtbclk_khz = ref_dtbclk ; // restore ref_dtbclk
594
599
clk_mgr -> clks .p_state_change_support = true;
595
600
clk_mgr -> clks .prev_p_state_change_support = true;
@@ -600,6 +605,7 @@ static void init_clk_states(struct clk_mgr *clk_mgr)
600
605
void dcn35_init_clocks (struct clk_mgr * clk_mgr )
601
606
{
602
607
struct clk_mgr_internal * clk_mgr_int = TO_CLK_MGR_INTERNAL (clk_mgr );
608
+
603
609
init_clk_states (clk_mgr );
604
610
605
611
// to adjust dp_dto reference clock if ssc is enable otherwise to apply dprefclk
0 commit comments