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