xref: /rk3399_ARM-atf/plat/mediatek/drivers/spm/common/mt_spm_common.h (revision cf2df874cd09305ac7282fadb0fef6be597dfffb)
1*a24b53e0SWenzhen Yu /*
2*a24b53e0SWenzhen Yu  * Copyright (c) 2025, Mediatek Inc. All rights resrved.
3*a24b53e0SWenzhen Yu  *
4*a24b53e0SWenzhen Yu  * SPDX-License-Identifier: BSD-3-Clause
5*a24b53e0SWenzhen Yu  */
6*a24b53e0SWenzhen Yu 
7*a24b53e0SWenzhen Yu #ifndef MT_SPM_COMMON_H
8*a24b53e0SWenzhen Yu #define MT_SPM_COMMON_H
9*a24b53e0SWenzhen Yu 
10*a24b53e0SWenzhen Yu #include <lib/bakery_lock.h>
11*a24b53e0SWenzhen Yu #include <lib/spinlock.h>
12*a24b53e0SWenzhen Yu /*
13*a24b53e0SWenzhen Yu  * ARM v8.2, the cache will turn off automatically when cpu
14*a24b53e0SWenzhen Yu  * power down. So, there is no doubt to use the spin_lock here
15*a24b53e0SWenzhen Yu  */
16*a24b53e0SWenzhen Yu #if !HW_ASSISTED_COHERENCY
17*a24b53e0SWenzhen Yu #define MT_SPM_USING_BAKERY_LOCK
18*a24b53e0SWenzhen Yu #endif
19*a24b53e0SWenzhen Yu 
20*a24b53e0SWenzhen Yu #ifdef MT_SPM_USING_BAKERY_LOCK
21*a24b53e0SWenzhen Yu DECLARE_BAKERY_LOCK(spm_lock);
22*a24b53e0SWenzhen Yu #define plat_spm_lock() \
23*a24b53e0SWenzhen Yu 	bakery_lock_get(&spm_lock)
24*a24b53e0SWenzhen Yu 
25*a24b53e0SWenzhen Yu #define plat_spm_unlock() \
26*a24b53e0SWenzhen Yu 	bakery_lock_release(&spm_lock)
27*a24b53e0SWenzhen Yu #else
28*a24b53e0SWenzhen Yu extern spinlock_t spm_lock;
29*a24b53e0SWenzhen Yu #define plat_spm_lock() \
30*a24b53e0SWenzhen Yu 	spin_lock(&spm_lock)
31*a24b53e0SWenzhen Yu 
32*a24b53e0SWenzhen Yu #define plat_spm_unlock() \
33*a24b53e0SWenzhen Yu 	spin_unlock(&spm_lock)
34*a24b53e0SWenzhen Yu #endif
35*a24b53e0SWenzhen Yu 
36*a24b53e0SWenzhen Yu #define MT_SPM_ERR_NO_FW_LOAD		-1
37*a24b53e0SWenzhen Yu #define MT_SPM_ERR_KICKED		-2
38*a24b53e0SWenzhen Yu #define MT_SPM_ERR_RUNNING		-3
39*a24b53e0SWenzhen Yu #define MT_SPM_ERR_FW_NOT_FOUND		-4
40*a24b53e0SWenzhen Yu #define MT_SPM_ERR_INVALID		-5
41*a24b53e0SWenzhen Yu #define MT_SPM_ERR_OVERFLOW		-6
42*a24b53e0SWenzhen Yu 
spm_lock_get(void)43*a24b53e0SWenzhen Yu static inline void spm_lock_get(void)
44*a24b53e0SWenzhen Yu {
45*a24b53e0SWenzhen Yu 	plat_spm_lock();
46*a24b53e0SWenzhen Yu }
47*a24b53e0SWenzhen Yu 
spm_lock_release(void)48*a24b53e0SWenzhen Yu static inline void spm_lock_release(void)
49*a24b53e0SWenzhen Yu {
50*a24b53e0SWenzhen Yu 	plat_spm_unlock();
51*a24b53e0SWenzhen Yu }
52*a24b53e0SWenzhen Yu 
53*a24b53e0SWenzhen Yu #endif /* MT_SPM_COMMON_H */
54