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