2424
2525#include "reg_helper.h"
2626#include "core_types.h"
27+ #include "resource.h"
2728#include "dcn35_dccg.h"
2829
2930#define TO_DCN_DCCG (dccg )\
@@ -136,7 +137,7 @@ static void dccg35_set_dsc_clk_rcg(struct dccg *dccg, int inst, bool enable)
136137{
137138 struct dcn_dccg * dccg_dcn = TO_DCN_DCCG (dccg );
138139
139- if (!dccg -> ctx -> dc -> debug .root_clock_optimization .bits .dsc )
140+ if (!dccg -> ctx -> dc -> debug .root_clock_optimization .bits .dsc && enable )
140141 return ;
141142
142143 switch (inst ) {
@@ -165,7 +166,7 @@ static void dccg35_set_symclk32_se_rcg(
165166{
166167 struct dcn_dccg * dccg_dcn = TO_DCN_DCCG (dccg );
167168
168- if (!dccg -> ctx -> dc -> debug .root_clock_optimization .bits .symclk32_se )
169+ if (!dccg -> ctx -> dc -> debug .root_clock_optimization .bits .symclk32_se && enable )
169170 return ;
170171
171172 /* SYMCLK32_ROOT_SE#_GATE_DISABLE will clock gate in DCCG */
@@ -204,7 +205,7 @@ static void dccg35_set_symclk32_le_rcg(
204205{
205206 struct dcn_dccg * dccg_dcn = TO_DCN_DCCG (dccg );
206207
207- if (!dccg -> ctx -> dc -> debug .root_clock_optimization .bits .symclk32_le )
208+ if (!dccg -> ctx -> dc -> debug .root_clock_optimization .bits .symclk32_le && enable )
208209 return ;
209210
210211 switch (inst ) {
@@ -231,7 +232,7 @@ static void dccg35_set_physymclk_rcg(
231232{
232233 struct dcn_dccg * dccg_dcn = TO_DCN_DCCG (dccg );
233234
234- if (!dccg -> ctx -> dc -> debug .root_clock_optimization .bits .physymclk )
235+ if (!dccg -> ctx -> dc -> debug .root_clock_optimization .bits .physymclk && enable )
235236 return ;
236237
237238 switch (inst ) {
@@ -262,35 +263,45 @@ static void dccg35_set_physymclk_rcg(
262263}
263264
264265static void dccg35_set_symclk_fe_rcg (
265- struct dccg * dccg ,
266- int inst ,
267- bool enable )
266+ struct dccg * dccg ,
267+ int inst ,
268+ bool enable )
268269{
269270 struct dcn_dccg * dccg_dcn = TO_DCN_DCCG (dccg );
270271
271- if (!dccg -> ctx -> dc -> debug .root_clock_optimization .bits .physymclk )
272+ if (!dccg -> ctx -> dc -> debug .root_clock_optimization .bits .symclk_fe && enable )
272273 return ;
273274
274275 switch (inst ) {
275276 case 0 :
277+ REG_UPDATE (DCCG_GATE_DISABLE_CNTL2 ,
278+ SYMCLKA_FE_GATE_DISABLE , enable ? 0 : 1 );
276279 REG_UPDATE (DCCG_GATE_DISABLE_CNTL5 ,
277- SYMCLKA_FE_ROOT_GATE_DISABLE , enable ? 0 : 1 );
280+ SYMCLKA_FE_ROOT_GATE_DISABLE , enable ? 0 : 1 );
278281 break ;
279282 case 1 :
283+ REG_UPDATE (DCCG_GATE_DISABLE_CNTL2 ,
284+ SYMCLKB_FE_GATE_DISABLE , enable ? 0 : 1 );
280285 REG_UPDATE (DCCG_GATE_DISABLE_CNTL5 ,
281- SYMCLKB_FE_ROOT_GATE_DISABLE , enable ? 0 : 1 );
286+ SYMCLKB_FE_ROOT_GATE_DISABLE , enable ? 0 : 1 );
282287 break ;
283288 case 2 :
289+ REG_UPDATE (DCCG_GATE_DISABLE_CNTL2 ,
290+ SYMCLKC_FE_GATE_DISABLE , enable ? 0 : 1 );
284291 REG_UPDATE (DCCG_GATE_DISABLE_CNTL5 ,
285- SYMCLKC_FE_ROOT_GATE_DISABLE , enable ? 0 : 1 );
292+ SYMCLKC_FE_ROOT_GATE_DISABLE , enable ? 0 : 1 );
286293 break ;
287294 case 3 :
295+ REG_UPDATE (DCCG_GATE_DISABLE_CNTL2 ,
296+ SYMCLKD_FE_GATE_DISABLE , enable ? 0 : 1 );
288297 REG_UPDATE (DCCG_GATE_DISABLE_CNTL5 ,
289- SYMCLKD_FE_ROOT_GATE_DISABLE , enable ? 0 : 1 );
298+ SYMCLKD_FE_ROOT_GATE_DISABLE , enable ? 0 : 1 );
290299 break ;
291300 case 4 :
301+ REG_UPDATE (DCCG_GATE_DISABLE_CNTL2 ,
302+ SYMCLKE_FE_GATE_DISABLE , enable ? 0 : 1 );
292303 REG_UPDATE (DCCG_GATE_DISABLE_CNTL5 ,
293- SYMCLKE_FE_ROOT_GATE_DISABLE , enable ? 0 : 1 );
304+ SYMCLKE_FE_ROOT_GATE_DISABLE , enable ? 0 : 1 );
294305 break ;
295306 default :
296307 BREAK_TO_DEBUGGER ();
@@ -307,27 +318,37 @@ static void dccg35_set_symclk_be_rcg(
307318 struct dcn_dccg * dccg_dcn = TO_DCN_DCCG (dccg );
308319
309320 /* TBD add symclk_be in rcg control bits */
310- if (!dccg -> ctx -> dc -> debug .root_clock_optimization .bits .physymclk )
321+ if (!dccg -> ctx -> dc -> debug .root_clock_optimization .bits .symclk_fe && enable )
311322 return ;
312323
313324 switch (inst ) {
314325 case 0 :
326+ REG_UPDATE (DCCG_GATE_DISABLE_CNTL2 ,
327+ SYMCLKA_GATE_DISABLE , enable ? 0 : 1 );
315328 REG_UPDATE (DCCG_GATE_DISABLE_CNTL5 ,
316329 SYMCLKA_ROOT_GATE_DISABLE , enable ? 0 : 1 );
317330 break ;
318331 case 1 :
332+ REG_UPDATE (DCCG_GATE_DISABLE_CNTL2 ,
333+ SYMCLKB_GATE_DISABLE , enable ? 0 : 1 );
319334 REG_UPDATE (DCCG_GATE_DISABLE_CNTL5 ,
320335 SYMCLKB_ROOT_GATE_DISABLE , enable ? 0 : 1 );
321336 break ;
322337 case 2 :
338+ REG_UPDATE (DCCG_GATE_DISABLE_CNTL2 ,
339+ SYMCLKC_GATE_DISABLE , enable ? 0 : 1 );
323340 REG_UPDATE (DCCG_GATE_DISABLE_CNTL5 ,
324341 SYMCLKC_ROOT_GATE_DISABLE , enable ? 0 : 1 );
325342 break ;
326343 case 3 :
344+ REG_UPDATE (DCCG_GATE_DISABLE_CNTL2 ,
345+ SYMCLKD_GATE_DISABLE , enable ? 0 : 1 );
327346 REG_UPDATE (DCCG_GATE_DISABLE_CNTL5 ,
328347 SYMCLKD_ROOT_GATE_DISABLE , enable ? 0 : 1 );
329348 break ;
330349 case 4 :
350+ REG_UPDATE (DCCG_GATE_DISABLE_CNTL2 ,
351+ SYMCLKE_GATE_DISABLE , enable ? 0 : 1 );
331352 REG_UPDATE (DCCG_GATE_DISABLE_CNTL5 ,
332353 SYMCLKE_ROOT_GATE_DISABLE , enable ? 0 : 1 );
333354 break ;
@@ -342,7 +363,7 @@ static void dccg35_set_dtbclk_p_rcg(struct dccg *dccg, int inst, bool enable)
342363
343364 struct dcn_dccg * dccg_dcn = TO_DCN_DCCG (dccg );
344365
345- if (!dccg -> ctx -> dc -> debug .root_clock_optimization .bits .dpp )
366+ if (!dccg -> ctx -> dc -> debug .root_clock_optimization .bits .dpp && enable )
346367 return ;
347368
348369 switch (inst ) {
@@ -370,7 +391,7 @@ static void dccg35_set_dppclk_rcg(struct dccg *dccg,
370391
371392 struct dcn_dccg * dccg_dcn = TO_DCN_DCCG (dccg );
372393
373- if (!dccg -> ctx -> dc -> debug .root_clock_optimization .bits .dpp )
394+ if (!dccg -> ctx -> dc -> debug .root_clock_optimization .bits .dpp && enable )
374395 return ;
375396
376397 switch (inst ) {
@@ -399,7 +420,7 @@ static void dccg35_set_dpstreamclk_rcg(
399420{
400421 struct dcn_dccg * dccg_dcn = TO_DCN_DCCG (dccg );
401422
402- if (!dccg -> ctx -> dc -> debug .root_clock_optimization .bits .dpstream )
423+ if (!dccg -> ctx -> dc -> debug .root_clock_optimization .bits .dpstream && enable )
403424 return ;
404425
405426 switch (inst ) {
@@ -436,7 +457,7 @@ static void dccg35_set_smclk32_se_rcg(
436457{
437458 struct dcn_dccg * dccg_dcn = TO_DCN_DCCG (dccg );
438459
439- if (!dccg -> ctx -> dc -> debug .root_clock_optimization .bits .symclk32_se )
460+ if (!dccg -> ctx -> dc -> debug .root_clock_optimization .bits .symclk32_se && enable )
440461 return ;
441462
442463 switch (inst ) {
@@ -1693,6 +1714,12 @@ static void dccg35_disable_symclk32_se(
16931714 }
16941715}
16951716
1717+ static void dccg35_init_cb (struct dccg * dccg )
1718+ {
1719+ (void )dccg ;
1720+ /* Any RCG should be done when driver enter low power mode*/
1721+ }
1722+
16961723void dccg35_init (struct dccg * dccg )
16971724{
16981725 int otg_inst ;
@@ -2043,8 +2070,6 @@ static void dccg35_set_dpstreamclk_cb(
20432070 enum dtbclk_source dtb_clk_src ;
20442071 enum dp_stream_clk_source dp_stream_clk_src ;
20452072
2046- ASSERT (otg_inst >= DP_STREAM_DTBCLK_P5 );
2047-
20482073 switch (src ) {
20492074 case REFCLK :
20502075 dtb_clk_src = DTBCLK_REFCLK ;
@@ -2099,6 +2124,13 @@ static void dccg35_update_dpp_dto_cb(struct dccg *dccg, int dpp_inst,
20992124{
21002125 struct dcn_dccg * dccg_dcn = TO_DCN_DCCG (dccg );
21012126
2127+ if (dccg -> dpp_clock_gated [dpp_inst ]) {
2128+ /*
2129+ * Do not update the DPPCLK DTO if the clock is stopped.
2130+ */
2131+ return ;
2132+ }
2133+
21022134 if (dccg -> ref_dppclk && req_dppclk ) {
21032135 int ref_dppclk = dccg -> ref_dppclk ;
21042136 int modulo , phase ;
@@ -2126,19 +2158,20 @@ static void dccg35_update_dpp_dto_cb(struct dccg *dccg, int dpp_inst,
21262158}
21272159
21282160static void dccg35_dpp_root_clock_control_cb (
2129- struct dccg * dccg ,
2130- unsigned int dpp_inst ,
2131- bool power_on )
2161+ struct dccg * dccg ,
2162+ unsigned int dpp_inst ,
2163+ bool power_on )
21322164{
2165+ if (dccg -> dpp_clock_gated [dpp_inst ] == power_on )
2166+ return ;
21332167 /* power_on set indicates we need to ungate
21342168 * Currently called from optimize_bandwidth and prepare_bandwidth calls
21352169 * Since clock source is not passed restore to refclock on ungate
21362170 * Redundant as gating when enabled is acheived through update_dpp_dto
21372171 */
2138- if (power_on )
2139- dccg35_enable_dpp_clk_new (dccg , dpp_inst , DPP_REFCLK );
2140- else
2141- dccg35_disable_dpp_clk_new (dccg , dpp_inst );
2172+ dccg35_set_dppclk_rcg (dccg , dpp_inst , !power_on );
2173+
2174+ dccg -> dpp_clock_gated [dpp_inst ] = !power_on ;
21422175}
21432176
21442177static void dccg35_enable_symclk32_se_cb (
@@ -2322,7 +2355,7 @@ static const struct dccg_funcs dccg35_funcs_new = {
23222355 .update_dpp_dto = dccg35_update_dpp_dto_cb ,
23232356 .dpp_root_clock_control = dccg35_dpp_root_clock_control_cb ,
23242357 .get_dccg_ref_freq = dccg31_get_dccg_ref_freq ,
2325- .dccg_init = dccg35_init ,
2358+ .dccg_init = dccg35_init_cb ,
23262359 .set_dpstreamclk = dccg35_set_dpstreamclk_cb ,
23272360 .set_dpstreamclk_root_clock_gating = dccg35_set_dpstreamclk_root_clock_gating_cb ,
23282361 .enable_symclk32_se = dccg35_enable_symclk32_se_cb ,
0 commit comments