xref: /arm-trusted-firmware/plat/mediatek/mt8183/plat_dcm.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2019, MediaTek Inc. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #include <arch.h>
8*91f16700Schasinglulu #include <lib/bakery_lock.h>
9*91f16700Schasinglulu #include <drivers/console.h>
10*91f16700Schasinglulu #include <common/debug.h>
11*91f16700Schasinglulu #include <lib/mmio.h>
12*91f16700Schasinglulu #include <plat_dcm.h>
13*91f16700Schasinglulu #include <plat_private.h>
14*91f16700Schasinglulu #include <plat_dcm.h>
15*91f16700Schasinglulu #include <plat/common/platform.h>
16*91f16700Schasinglulu #include <platform_def.h>
17*91f16700Schasinglulu #include <mtk_plat_common.h>
18*91f16700Schasinglulu 
19*91f16700Schasinglulu #define PWR_STATUS                     (SPM_BASE + 0x180)
20*91f16700Schasinglulu 
21*91f16700Schasinglulu uint64_t plat_dcm_mcsi_a_addr;
22*91f16700Schasinglulu uint32_t plat_dcm_mcsi_a_val;
23*91f16700Schasinglulu static int plat_dcm_init_type;
24*91f16700Schasinglulu static unsigned int dcm_big_core_cnt;
25*91f16700Schasinglulu int plat_dcm_initiated;
26*91f16700Schasinglulu 
27*91f16700Schasinglulu #define PWR_STA_BIG_MP_MASK	(0x1 << 15)
28*91f16700Schasinglulu 
29*91f16700Schasinglulu DEFINE_BAKERY_LOCK(dcm_lock);
30*91f16700Schasinglulu 
31*91f16700Schasinglulu void dcm_lock_init(void)
32*91f16700Schasinglulu {
33*91f16700Schasinglulu 	bakery_lock_init(&dcm_lock);
34*91f16700Schasinglulu }
35*91f16700Schasinglulu 
36*91f16700Schasinglulu void dcm_lock_get(void)
37*91f16700Schasinglulu {
38*91f16700Schasinglulu 	bakery_lock_get(&dcm_lock);
39*91f16700Schasinglulu }
40*91f16700Schasinglulu 
41*91f16700Schasinglulu void dcm_lock_release(void)
42*91f16700Schasinglulu {
43*91f16700Schasinglulu 	bakery_lock_release(&dcm_lock);
44*91f16700Schasinglulu }
45*91f16700Schasinglulu 
46*91f16700Schasinglulu void plat_dcm_mcsi_a_backup(void)
47*91f16700Schasinglulu {
48*91f16700Schasinglulu }
49*91f16700Schasinglulu 
50*91f16700Schasinglulu void plat_dcm_mcsi_a_restore(void)
51*91f16700Schasinglulu {
52*91f16700Schasinglulu }
53*91f16700Schasinglulu 
54*91f16700Schasinglulu void plat_dcm_rgu_enable(void)
55*91f16700Schasinglulu {
56*91f16700Schasinglulu }
57*91f16700Schasinglulu 
58*91f16700Schasinglulu void plat_dcm_big_core_sync(short on)
59*91f16700Schasinglulu {
60*91f16700Schasinglulu 	/* Check if Big cluster power is existed */
61*91f16700Schasinglulu 	if (!(mmio_read_32(PWR_STATUS) & PWR_STA_BIG_MP_MASK))
62*91f16700Schasinglulu 		return;
63*91f16700Schasinglulu 
64*91f16700Schasinglulu 	if (on) {
65*91f16700Schasinglulu 		mmio_write_32(MP2_SYNC_DCM,
66*91f16700Schasinglulu 			      (mmio_read_32(MP2_SYNC_DCM) & ~MP2_SYNC_DCM_MASK)
67*91f16700Schasinglulu 			      | MP2_SYNC_DCM_ON);
68*91f16700Schasinglulu 		dcm_big_core_cnt++;
69*91f16700Schasinglulu 	} else
70*91f16700Schasinglulu 		mmio_write_32(MP2_SYNC_DCM,
71*91f16700Schasinglulu 			      (mmio_read_32(MP2_SYNC_DCM) & ~MP2_SYNC_DCM_MASK)
72*91f16700Schasinglulu 			      | MP2_SYNC_DCM_OFF);
73*91f16700Schasinglulu }
74*91f16700Schasinglulu 
75*91f16700Schasinglulu void plat_dcm_restore_cluster_on(unsigned long mpidr)
76*91f16700Schasinglulu {
77*91f16700Schasinglulu 	unsigned long cluster_id =
78*91f16700Schasinglulu 		(mpidr & MPIDR_CLUSTER_MASK) >> MPIDR_AFFINITY_BITS;
79*91f16700Schasinglulu 
80*91f16700Schasinglulu 	switch (cluster_id) {
81*91f16700Schasinglulu 	case 0x1:
82*91f16700Schasinglulu 		dcm_lock_get();
83*91f16700Schasinglulu 		if (plat_dcm_init_type & BIG_CORE_DCM_TYPE)
84*91f16700Schasinglulu 			plat_dcm_big_core_sync(1);
85*91f16700Schasinglulu 		else
86*91f16700Schasinglulu 			plat_dcm_big_core_sync(0);
87*91f16700Schasinglulu 		dcm_lock_release();
88*91f16700Schasinglulu 		break;
89*91f16700Schasinglulu 	default:
90*91f16700Schasinglulu 		break;
91*91f16700Schasinglulu 	}
92*91f16700Schasinglulu }
93*91f16700Schasinglulu 
94*91f16700Schasinglulu void plat_dcm_msg_handler(uint64_t x1)
95*91f16700Schasinglulu {
96*91f16700Schasinglulu 	plat_dcm_init_type = x1 & ALL_DCM_TYPE;
97*91f16700Schasinglulu }
98*91f16700Schasinglulu 
99*91f16700Schasinglulu unsigned long plat_dcm_get_enabled_cnt(uint64_t type)
100*91f16700Schasinglulu {
101*91f16700Schasinglulu 	switch (type) {
102*91f16700Schasinglulu 	case BIG_CORE_DCM_TYPE:
103*91f16700Schasinglulu 		return dcm_big_core_cnt;
104*91f16700Schasinglulu 	default:
105*91f16700Schasinglulu 		return 0;
106*91f16700Schasinglulu 	}
107*91f16700Schasinglulu }
108*91f16700Schasinglulu 
109*91f16700Schasinglulu void plat_dcm_init(void)
110*91f16700Schasinglulu {
111*91f16700Schasinglulu 	dcm_lock_init();
112*91f16700Schasinglulu }
113