xref: /rk3399_ARM-atf/plat/mediatek/include/mtk_sip_svc.h (revision 35c54de1496ec7201c1b396e7740322e3daff4c9)
12f3f5939SLeon Chen /*
2621eaab5SBo-Chen Chen  * Copyright (c) 2022-2023, ARM Limited and Contributors. All rights reserved.
32f3f5939SLeon Chen  *
42f3f5939SLeon Chen  * SPDX-License-Identifier: BSD-3-Clause
52f3f5939SLeon Chen  */
62f3f5939SLeon Chen 
72f3f5939SLeon Chen #ifndef MTK_SIP_SVC_H
82f3f5939SLeon Chen #define MTK_SIP_SVC_H
92f3f5939SLeon Chen 
102f3f5939SLeon Chen #include <stdint.h>
112f3f5939SLeon Chen #include <lib/smccc.h>
122f3f5939SLeon Chen #include <mtk_sip_def.h>
132f3f5939SLeon Chen 
142f3f5939SLeon Chen /* SMC function IDs for SiP Service queries */
152f3f5939SLeon Chen #define SIP_SVC_CALL_COUNT		U(0x8200ff00)
162f3f5939SLeon Chen #define SIP_SVC_UID			U(0x8200ff01)
172f3f5939SLeon Chen /* 0x8200ff02 is reserved */
182f3f5939SLeon Chen #define SIP_SVC_VERSION			U(0x8200ff03)
192f3f5939SLeon Chen 
202f3f5939SLeon Chen /* MediaTek SiP Service Calls version numbers */
212f3f5939SLeon Chen #define MTK_SIP_SVC_VERSION_MAJOR	U(0x0)
222f3f5939SLeon Chen #define MTK_SIP_SVC_VERSION_MINOR	U(0x1)
232f3f5939SLeon Chen 
242f3f5939SLeon Chen /* Number of MediaTek SiP Calls implemented */
252f3f5939SLeon Chen #define MTK_COMMON_SIP_NUM_CALLS	U(4)
262f3f5939SLeon Chen 
272f3f5939SLeon Chen /* MediaTek SiP Service Calls function IDs */
282f3f5939SLeon Chen #define MTK_SIP_SET_AUTHORIZED_SECURE_REG	U(0x82000001)
292f3f5939SLeon Chen 
302f3f5939SLeon Chen #define SMC_ID_EXPAND_AS_ENUM(_smc_id, _smc_num) \
312f3f5939SLeon Chen 	_smc_id##_AARCH32 = ((SMC_TYPE_FAST << FUNCID_TYPE_SHIFT) | \
322f3f5939SLeon Chen 		 ((0) << FUNCID_CC_SHIFT) | \
332f3f5939SLeon Chen 		 (OEN_SIP_START << FUNCID_OEN_SHIFT) | \
342f3f5939SLeon Chen 		 ((_smc_num) << FUNCID_NUM_SHIFT)), \
352f3f5939SLeon Chen 	_smc_id##_AARCH64 = ((SMC_TYPE_FAST << FUNCID_TYPE_SHIFT) | \
362f3f5939SLeon Chen 		 ((1) << FUNCID_CC_SHIFT) | \
372f3f5939SLeon Chen 		 (OEN_SIP_START << FUNCID_OEN_SHIFT) | \
382f3f5939SLeon Chen 		 ((_smc_num) << FUNCID_NUM_SHIFT)),
392f3f5939SLeon Chen 
402f3f5939SLeon Chen #define SMC_ID_EXPAND_AS_EXTERN_SMC_INDEX(_smc_id, _smc_num) \
412f3f5939SLeon Chen 	extern short _smc_id##_descriptor_index;
422f3f5939SLeon Chen 
432f3f5939SLeon Chen /* Bind SMC handler with SMC ID */
442f3f5939SLeon Chen #define DECLARE_SMC_HANDLER(_smc_id, _smc_handler) \
452f3f5939SLeon Chen 	const struct smc_descriptor _smc_id##_descriptor \
462f3f5939SLeon Chen 		__used \
472f3f5939SLeon Chen 		__aligned(sizeof(void *)) \
482f3f5939SLeon Chen 		__section(".mtk_smc_descriptor_pool") = { \
492f3f5939SLeon Chen 			.smc_handler = _smc_handler, \
502f3f5939SLeon Chen 			.smc_name = #_smc_id, \
512f3f5939SLeon Chen 			.smc_id_aarch32 = _smc_id##_AARCH32, \
522f3f5939SLeon Chen 			.smc_id_aarch64 = _smc_id##_AARCH64, \
532f3f5939SLeon Chen 			.smc_descriptor_index = &_smc_id##_descriptor_index \
542f3f5939SLeon Chen 		}
552f3f5939SLeon Chen 
562f3f5939SLeon Chen MTK_SIP_SMC_FROM_BL33_TABLE(SMC_ID_EXPAND_AS_EXTERN_SMC_INDEX);
572f3f5939SLeon Chen MTK_SIP_SMC_FROM_NS_EL1_TABLE(SMC_ID_EXPAND_AS_EXTERN_SMC_INDEX);
58621eaab5SBo-Chen Chen MTK_SIP_SMC_FROM_S_EL1_TABLE(SMC_ID_EXPAND_AS_EXTERN_SMC_INDEX);
592f3f5939SLeon Chen 
602f3f5939SLeon Chen /* Expand SiP SMC ID table as enum */
612f3f5939SLeon Chen enum {
622f3f5939SLeon Chen 	MTK_SIP_SMC_FROM_BL33_TABLE(SMC_ID_EXPAND_AS_ENUM)
632f3f5939SLeon Chen 	MTK_SIP_SMC_FROM_NS_EL1_TABLE(SMC_ID_EXPAND_AS_ENUM)
64621eaab5SBo-Chen Chen 	MTK_SIP_SMC_FROM_S_EL1_TABLE(SMC_ID_EXPAND_AS_ENUM)
652f3f5939SLeon Chen 	MTK_SIP_SMC_MAX_NUMBER
662f3f5939SLeon Chen };
672f3f5939SLeon Chen 
682f3f5939SLeon Chen /* MediaTek SiP Calls error code */
692f3f5939SLeon Chen enum {
702f3f5939SLeon Chen 	MTK_SIP_E_SUCCESS = 0,
712f3f5939SLeon Chen 	MTK_SIP_E_INVALID_PARAM = -1,
722f3f5939SLeon Chen 	MTK_SIP_E_NOT_SUPPORTED = -2,
732f3f5939SLeon Chen 	MTK_SIP_E_INVALID_RANGE = -3,
742f3f5939SLeon Chen 	MTK_SIP_E_PERMISSION_DENY = -4,
752f3f5939SLeon Chen 	MTK_SIP_E_LOCK_FAIL = -5,
762f3f5939SLeon Chen };
772f3f5939SLeon Chen 
782f3f5939SLeon Chen struct smccc_res {
792f3f5939SLeon Chen 	uint64_t a1;
802f3f5939SLeon Chen 	uint64_t a2;
812f3f5939SLeon Chen 	uint64_t a3;
822f3f5939SLeon Chen };
832f3f5939SLeon Chen 
84*79d1c687SHsin-Hsiung Wang typedef u_register_t (*smc_handler_t)(u_register_t,
852f3f5939SLeon Chen 				      u_register_t,
862f3f5939SLeon Chen 				      u_register_t,
872f3f5939SLeon Chen 				      u_register_t,
882f3f5939SLeon Chen 				      void *,
892f3f5939SLeon Chen 				      struct smccc_res *);
902f3f5939SLeon Chen 
912f3f5939SLeon Chen struct smc_descriptor {
922f3f5939SLeon Chen 	smc_handler_t smc_handler;
932f3f5939SLeon Chen 	const uint32_t smc_id_aarch32;
942f3f5939SLeon Chen 	const uint32_t smc_id_aarch64;
952f3f5939SLeon Chen 	const char *smc_name;
962f3f5939SLeon Chen 	short *const smc_descriptor_index;
972f3f5939SLeon Chen };
982f3f5939SLeon Chen 
992f3f5939SLeon Chen /*
1001b491eeaSElyes Haouas  * This function should be implemented in MediaTek SOC directory. It fulfills
1012f3f5939SLeon Chen  * MTK_SIP_SET_AUTHORIZED_SECURE_REG SiP call by checking the sreg with the
1022f3f5939SLeon Chen  * predefined secure register list, if a match was found, set val to sreg.
1032f3f5939SLeon Chen  *
1042f3f5939SLeon Chen  * Return MTK_SIP_E_SUCCESS on success, and MTK_SIP_E_INVALID_PARAM on failure.
1052f3f5939SLeon Chen  */
1062f3f5939SLeon Chen uint64_t mt_sip_set_authorized_sreg(uint32_t sreg, uint32_t val);
1072f3f5939SLeon Chen 
1082f3f5939SLeon Chen #endif /* MTK_SIP_SVC_H */
109