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 Yustatic 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 Yustatic 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