xref: /rk3399_ARM-atf/plat/mediatek/mt8195/drivers/spm/mt_spm.c (revision 7fa35d068ff9eabbf252414fd778cc4de7a4b141)
1*859e346bSEdward-JW Yang /*
2*859e346bSEdward-JW Yang  * Copyright (c) 2021, MediaTek Inc. All rights reserved.
3*859e346bSEdward-JW Yang  *
4*859e346bSEdward-JW Yang  * SPDX-License-Identifier: BSD-3-Clause
5*859e346bSEdward-JW Yang  */
6*859e346bSEdward-JW Yang 
7*859e346bSEdward-JW Yang #include <stddef.h>
8*859e346bSEdward-JW Yang #include <string.h>
9*859e346bSEdward-JW Yang #include <common/debug.h>
10*859e346bSEdward-JW Yang #include <lib/bakery_lock.h>
11*859e346bSEdward-JW Yang #include <lib/mmio.h>
12*859e346bSEdward-JW Yang #include <mt_lp_rm.h>
13*859e346bSEdward-JW Yang #include <mt_spm.h>
14*859e346bSEdward-JW Yang #include <mt_spm_cond.h>
15*859e346bSEdward-JW Yang #include <mt_spm_conservation.h>
16*859e346bSEdward-JW Yang #include <mt_spm_constraint.h>
17*859e346bSEdward-JW Yang #include <mt_spm_idle.h>
18*859e346bSEdward-JW Yang #include <mt_spm_internal.h>
19*859e346bSEdward-JW Yang #include <mt_spm_pmic_wrap.h>
20*859e346bSEdward-JW Yang #include <mt_spm_rc_internal.h>
21*859e346bSEdward-JW Yang #include <mt_spm_reg.h>
22*859e346bSEdward-JW Yang #include <mt_spm_resource_req.h>
23*859e346bSEdward-JW Yang #include <mt_spm_suspend.h>
24*859e346bSEdward-JW Yang #include <mtk_plat_common.h>
25*859e346bSEdward-JW Yang #include <plat_mtk_lpm.h>
26*859e346bSEdward-JW Yang #include <plat_pm.h>
27*859e346bSEdward-JW Yang #include <platform_def.h>
28*859e346bSEdward-JW Yang #include <sleep_def.h>
29*859e346bSEdward-JW Yang 
30*859e346bSEdward-JW Yang #ifdef MT_SPM_USING_BAKERY_LOCK
31*859e346bSEdward-JW Yang DEFINE_BAKERY_LOCK(spm_lock);
32*859e346bSEdward-JW Yang #define plat_spm_lock_init() bakery_lock_init(&spm_lock)
33*859e346bSEdward-JW Yang #else
34*859e346bSEdward-JW Yang spinlock_t spm_lock;
35*859e346bSEdward-JW Yang #define plat_spm_lock_init()
36*859e346bSEdward-JW Yang #endif
37*859e346bSEdward-JW Yang 
38*859e346bSEdward-JW Yang /* CLK_SCP_CFG_0 */
39*859e346bSEdward-JW Yang #define CLK_SCP_CFG_0		(TOPCKGEN_BASE + 0x264)
40*859e346bSEdward-JW Yang #define SPM_CK_CONTROL_EN	0x7FF
41*859e346bSEdward-JW Yang 
42*859e346bSEdward-JW Yang struct mt_resource_constraint plat_constraint_bus26m = {
43*859e346bSEdward-JW Yang 	.is_valid = spm_is_valid_rc_bus26m,
44*859e346bSEdward-JW Yang 	.update = spm_update_rc_bus26m,
45*859e346bSEdward-JW Yang 	.allow = spm_allow_rc_bus26m,
46*859e346bSEdward-JW Yang 	.run = spm_run_rc_bus26m,
47*859e346bSEdward-JW Yang 	.reset = spm_reset_rc_bus26m,
48*859e346bSEdward-JW Yang };
49*859e346bSEdward-JW Yang 
50*859e346bSEdward-JW Yang struct mt_resource_constraint plat_constraint_syspll = {
51*859e346bSEdward-JW Yang 	.is_valid = spm_is_valid_rc_syspll,
52*859e346bSEdward-JW Yang 	.update = spm_update_rc_syspll,
53*859e346bSEdward-JW Yang 	.allow = spm_allow_rc_syspll,
54*859e346bSEdward-JW Yang 	.run = spm_run_rc_syspll,
55*859e346bSEdward-JW Yang 	.reset = spm_reset_rc_syspll,
56*859e346bSEdward-JW Yang };
57*859e346bSEdward-JW Yang 
58*859e346bSEdward-JW Yang struct mt_resource_constraint plat_constraint_dram = {
59*859e346bSEdward-JW Yang 	.is_valid = spm_is_valid_rc_dram,
60*859e346bSEdward-JW Yang 	.update = spm_update_rc_dram,
61*859e346bSEdward-JW Yang 	.allow = spm_allow_rc_dram,
62*859e346bSEdward-JW Yang 	.run = spm_run_rc_dram,
63*859e346bSEdward-JW Yang 	.reset = spm_reset_rc_dram,
64*859e346bSEdward-JW Yang };
65*859e346bSEdward-JW Yang 
66*859e346bSEdward-JW Yang struct mt_resource_constraint plat_constraint_cpu = {
67*859e346bSEdward-JW Yang 	.is_valid = spm_is_valid_rc_cpu_buck_ldo,
68*859e346bSEdward-JW Yang 	.update = NULL,
69*859e346bSEdward-JW Yang 	.allow = spm_allow_rc_cpu_buck_ldo,
70*859e346bSEdward-JW Yang 	.run = spm_run_rc_cpu_buck_ldo,
71*859e346bSEdward-JW Yang 	.reset = spm_reset_rc_cpu_buck_ldo,
72*859e346bSEdward-JW Yang };
73*859e346bSEdward-JW Yang 
74*859e346bSEdward-JW Yang struct mt_resource_constraint *plat_constraints[] = {
75*859e346bSEdward-JW Yang 	&plat_constraint_bus26m,
76*859e346bSEdward-JW Yang 	&plat_constraint_syspll,
77*859e346bSEdward-JW Yang 	&plat_constraint_dram,
78*859e346bSEdward-JW Yang 	&plat_constraint_cpu,
79*859e346bSEdward-JW Yang 	NULL,
80*859e346bSEdward-JW Yang };
81*859e346bSEdward-JW Yang 
82*859e346bSEdward-JW Yang struct mt_resource_manager plat_mt8195_rm = {
83*859e346bSEdward-JW Yang 	.update = mt_spm_cond_update,
84*859e346bSEdward-JW Yang 	.consts = plat_constraints,
85*859e346bSEdward-JW Yang };
86*859e346bSEdward-JW Yang 
spm_boot_init(void)87*859e346bSEdward-JW Yang void spm_boot_init(void)
88*859e346bSEdward-JW Yang {
89*859e346bSEdward-JW Yang 	NOTICE("MT8195 %s\n", __func__);
90*859e346bSEdward-JW Yang 	/* switch ck_off/axi_26m control to SPM */
91*859e346bSEdward-JW Yang 	mmio_setbits_32(CLK_SCP_CFG_0, SPM_CK_CONTROL_EN);
92*859e346bSEdward-JW Yang 
93*859e346bSEdward-JW Yang 	plat_spm_lock_init();
94*859e346bSEdward-JW Yang 	mt_spm_pmic_wrap_set_phase(PMIC_WRAP_PHASE_ALLINONE);
95*859e346bSEdward-JW Yang 	mt_lp_rm_register(&plat_mt8195_rm);
96*859e346bSEdward-JW Yang 	mt_spm_idle_generic_init();
97*859e346bSEdward-JW Yang 	mt_spm_suspend_init();
98*859e346bSEdward-JW Yang }
99