1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2023, MediaTek Inc. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #ifndef MT_LPM_SMC_H 8*91f16700Schasinglulu #define MT_LPM_SMC_H 9*91f16700Schasinglulu 10*91f16700Schasinglulu /* 11*91f16700Schasinglulu * MTK LPM smc user format: 12*91f16700Schasinglulu * bit[31:24]: magic number 13*91f16700Schasinglulu * bit[23:16]: user number 14*91f16700Schasinglulu * bit[15:00]: user id 15*91f16700Schasinglulu */ 16*91f16700Schasinglulu 17*91f16700Schasinglulu #define MT_LPM_SMC_MAGIC (0xDA000000) 18*91f16700Schasinglulu #define MT_LPM_SMC_MAGIC_MASK (0xFF000000) 19*91f16700Schasinglulu #define MT_LPM_SMC_USER_MASK (0xFF) 20*91f16700Schasinglulu #define MT_LPM_SMC_USER_SHIFT (16) 21*91f16700Schasinglulu 22*91f16700Schasinglulu #define MT_LPM_SMC_USER_ID_MASK (0x0000FFFF) 23*91f16700Schasinglulu 24*91f16700Schasinglulu /* 25*91f16700Schasinglulu * cpu_pm is used for MCDI to read/write CPC information 26*91f16700Schasinglulu * spm_dbg is used for spm related debug information 27*91f16700Schasinglulu * spm is used for spm related settings 28*91f16700Schasinglulu * cpu_pm_lp is used for MCDI setting irq_remain 29*91f16700Schasinglulu */ 30*91f16700Schasinglulu enum mt_lpm_smc_user_id { 31*91f16700Schasinglulu MT_LPM_SMC_USER_CPU_PM = 0, 32*91f16700Schasinglulu MT_LPM_SMC_USER_SPM_DBG, 33*91f16700Schasinglulu MT_LPM_SMC_USER_SPM, 34*91f16700Schasinglulu MT_LPM_SMC_USER_CPU_PM_LP, 35*91f16700Schasinglulu MT_LPM_SMC_USER_SECURE_CPU_PM, 36*91f16700Schasinglulu MT_LPM_SMC_USER_SECURE_SPM_DBG, 37*91f16700Schasinglulu MT_LPM_SMC_USER_SECURE_SPM, 38*91f16700Schasinglulu MT_LPM_SMC_USER_MAX, 39*91f16700Schasinglulu }; 40*91f16700Schasinglulu 41*91f16700Schasinglulu #define IS_MT_LPM_SMC(smcid) ((smcid & MT_LPM_SMC_MAGIC_MASK) == MT_LPM_SMC_MAGIC) 42*91f16700Schasinglulu 43*91f16700Schasinglulu /* get real user id */ 44*91f16700Schasinglulu #define MT_LPM_SMC_USER(id) ((id >> MT_LPM_SMC_USER_SHIFT) & MT_LPM_SMC_USER_MASK) 45*91f16700Schasinglulu #define MT_LPM_SMC_USER_ID(uid) (uid & MT_LPM_SMC_USER_ID_MASK) 46*91f16700Schasinglulu 47*91f16700Schasinglulu /* sink user id to smc's user id */ 48*91f16700Schasinglulu #define MT_LPM_SMC_USER_SINK(user, uid) (((uid & MT_LPM_SMC_USER_ID_MASK) |\ 49*91f16700Schasinglulu ((user & MT_LPM_SMC_USER_MASK) << MT_LPM_SMC_USER_SHIFT)) |\ 50*91f16700Schasinglulu MT_LPM_SMC_MAGIC) 51*91f16700Schasinglulu 52*91f16700Schasinglulu /* sink cpu pm's smc id */ 53*91f16700Schasinglulu #define MT_LPM_SMC_USER_ID_CPU_PM(uid) MT_LPM_SMC_USER_SINK(MT_LPM_SMC_USER_CPU_PM, uid) 54*91f16700Schasinglulu /* sink spm's smc id */ 55*91f16700Schasinglulu #define MT_LPM_SMC_USER_ID_SPM(uid) MT_LPM_SMC_USER_SINK(MT_LPM_SMC_USER_SPM, uid) 56*91f16700Schasinglulu 57*91f16700Schasinglulu /* sink cpu pm's user id */ 58*91f16700Schasinglulu #define MT_LPM_SMC_USER_CPU_PM(uid) MT_LPM_SMC_USER_ID_CPU_PM(uid) 59*91f16700Schasinglulu 60*91f16700Schasinglulu /* sink spm's user id */ 61*91f16700Schasinglulu #define MT_LPM_SMC_USER_SPM(uid) MT_LPM_SMC_USER_ID_SPM(uid) 62*91f16700Schasinglulu 63*91f16700Schasinglulu /* behavior */ 64*91f16700Schasinglulu #define MT_LPM_SMC_ACT_SET BIT(0) 65*91f16700Schasinglulu #define MT_LPM_SMC_ACT_CLR BIT(1) 66*91f16700Schasinglulu #define MT_LPM_SMC_ACT_GET BIT(2) 67*91f16700Schasinglulu #define MT_LPM_SMC_ACT_PUSH BIT(3) 68*91f16700Schasinglulu #define MT_LPM_SMC_ACT_POP BIT(4) 69*91f16700Schasinglulu #define MT_LPM_SMC_ACT_SUBMIT BIT(5) 70*91f16700Schasinglulu 71*91f16700Schasinglulu /* compatible action for legacy smc from lk */ 72*91f16700Schasinglulu #define MT_LPM_SMC_ACT_COMPAT BIT(31) 73*91f16700Schasinglulu 74*91f16700Schasinglulu enum mt_lpm_spmc_compat_id { 75*91f16700Schasinglulu MT_LPM_SPMC_COMPAT_LK_FW_INIT, 76*91f16700Schasinglulu MT_LPM_SPMC_COMPAT_LK_MCDI_WDT_DUMP, 77*91f16700Schasinglulu }; 78*91f16700Schasinglulu 79*91f16700Schasinglulu #endif /* MT_LPM_SMC_H */ 80