xref: /rk3399_ARM-atf/plat/mediatek/mt8195/drivers/spm/mt_spm.h (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 #ifndef MT_SPM_H
8*859e346bSEdward-JW Yang #define MT_SPM_H
9*859e346bSEdward-JW Yang 
10*859e346bSEdward-JW Yang #include <lib/bakery_lock.h>
11*859e346bSEdward-JW Yang #include <lib/spinlock.h>
12*859e346bSEdward-JW Yang 
13*859e346bSEdward-JW Yang #include <plat_mtk_lpm.h>
14*859e346bSEdward-JW Yang 
15*859e346bSEdward-JW Yang /*
16*859e346bSEdward-JW Yang  * ARM v8.2, the cache will turn off automatically when cpu
17*859e346bSEdward-JW Yang  * power down. So, there is no doubt to use the spin_lock here
18*859e346bSEdward-JW Yang  */
19*859e346bSEdward-JW Yang #if !HW_ASSISTED_COHERENCY
20*859e346bSEdward-JW Yang #define MT_SPM_USING_BAKERY_LOCK
21*859e346bSEdward-JW Yang #endif
22*859e346bSEdward-JW Yang 
23*859e346bSEdward-JW Yang #ifdef MT_SPM_USING_BAKERY_LOCK
24*859e346bSEdward-JW Yang DECLARE_BAKERY_LOCK(spm_lock);
25*859e346bSEdward-JW Yang #define plat_spm_lock() bakery_lock_get(&spm_lock)
26*859e346bSEdward-JW Yang #define plat_spm_unlock() bakery_lock_release(&spm_lock)
27*859e346bSEdward-JW Yang #else
28*859e346bSEdward-JW Yang extern spinlock_t spm_lock;
29*859e346bSEdward-JW Yang #define plat_spm_lock() spin_lock(&spm_lock)
30*859e346bSEdward-JW Yang #define plat_spm_unlock() spin_unlock(&spm_lock)
31*859e346bSEdward-JW Yang #endif
32*859e346bSEdward-JW Yang 
33*859e346bSEdward-JW Yang #define MT_SPM_USING_SRCLKEN_RC
34*859e346bSEdward-JW Yang 
35*859e346bSEdward-JW Yang /* spm extern operand definition */
36*859e346bSEdward-JW Yang #define MT_SPM_EX_OP_CLR_26M_RECORD			(1U << 0)
37*859e346bSEdward-JW Yang #define MT_SPM_EX_OP_SET_WDT				(1U << 1)
38*859e346bSEdward-JW Yang #define MT_SPM_EX_OP_NON_GENERIC_RESOURCE_REQ		(1U << 2)
39*859e346bSEdward-JW Yang #define MT_SPM_EX_OP_SET_SUSPEND_MODE			(1U << 3)
40*859e346bSEdward-JW Yang #define MT_SPM_EX_OP_SET_IS_ADSP			(1U << 4)
41*859e346bSEdward-JW Yang #define MT_SPM_EX_OP_SRCLKEN_RC_BBLPM			(1U << 5)
42*859e346bSEdward-JW Yang #define MT_SPM_EX_OP_HW_S1_DETECT			(1U << 6)
43*859e346bSEdward-JW Yang 
44*859e346bSEdward-JW Yang typedef enum {
45*859e346bSEdward-JW Yang 	WR_NONE = 0,
46*859e346bSEdward-JW Yang 	WR_UART_BUSY = 1,
47*859e346bSEdward-JW Yang 	WR_ABORT = 2,
48*859e346bSEdward-JW Yang 	WR_PCM_TIMER = 3,
49*859e346bSEdward-JW Yang 	WR_WAKE_SRC = 4,
50*859e346bSEdward-JW Yang 	WR_DVFSRC = 5,
51*859e346bSEdward-JW Yang 	WR_TWAM = 6,
52*859e346bSEdward-JW Yang 	WR_PMSR = 7,
53*859e346bSEdward-JW Yang 	WR_SPM_ACK_CHK = 8,
54*859e346bSEdward-JW Yang 	WR_UNKNOWN = 9,
55*859e346bSEdward-JW Yang } wake_reason_t;
56*859e346bSEdward-JW Yang 
spm_lock_get(void)57*859e346bSEdward-JW Yang static inline void spm_lock_get(void)
58*859e346bSEdward-JW Yang {
59*859e346bSEdward-JW Yang 	plat_spm_lock();
60*859e346bSEdward-JW Yang }
61*859e346bSEdward-JW Yang 
spm_lock_release(void)62*859e346bSEdward-JW Yang static inline void spm_lock_release(void)
63*859e346bSEdward-JW Yang {
64*859e346bSEdward-JW Yang 	plat_spm_unlock();
65*859e346bSEdward-JW Yang }
66*859e346bSEdward-JW Yang 
67*859e346bSEdward-JW Yang extern void spm_boot_init(void);
68*859e346bSEdward-JW Yang #endif /* MT_SPM_H */
69