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