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