1*54fd6939SJiyong Park /* 2*54fd6939SJiyong Park * Copyright (c) 2013-2019, ARM Limited and Contributors. All rights reserved. 3*54fd6939SJiyong Park * 4*54fd6939SJiyong Park * SPDX-License-Identifier: BSD-3-Clause 5*54fd6939SJiyong Park */ 6*54fd6939SJiyong Park 7*54fd6939SJiyong Park #ifndef TSP_H 8*54fd6939SJiyong Park #define TSP_H 9*54fd6939SJiyong Park 10*54fd6939SJiyong Park /* 11*54fd6939SJiyong Park * SMC function IDs that TSP uses to signal various forms of completions 12*54fd6939SJiyong Park * to the secure payload dispatcher. 13*54fd6939SJiyong Park */ 14*54fd6939SJiyong Park #define TSP_ENTRY_DONE 0xf2000000 15*54fd6939SJiyong Park #define TSP_ON_DONE 0xf2000001 16*54fd6939SJiyong Park #define TSP_OFF_DONE 0xf2000002 17*54fd6939SJiyong Park #define TSP_SUSPEND_DONE 0xf2000003 18*54fd6939SJiyong Park #define TSP_RESUME_DONE 0xf2000004 19*54fd6939SJiyong Park #define TSP_PREEMPTED 0xf2000005 20*54fd6939SJiyong Park #define TSP_ABORT_DONE 0xf2000007 21*54fd6939SJiyong Park #define TSP_SYSTEM_OFF_DONE 0xf2000008 22*54fd6939SJiyong Park #define TSP_SYSTEM_RESET_DONE 0xf2000009 23*54fd6939SJiyong Park 24*54fd6939SJiyong Park /* 25*54fd6939SJiyong Park * Function identifiers to handle S-EL1 interrupt through the synchronous 26*54fd6939SJiyong Park * handling model. If the TSP was previously interrupted then control has to 27*54fd6939SJiyong Park * be returned to the TSPD after handling the interrupt else execution can 28*54fd6939SJiyong Park * remain in the TSP. 29*54fd6939SJiyong Park */ 30*54fd6939SJiyong Park #define TSP_HANDLED_S_EL1_INTR 0xf2000006 31*54fd6939SJiyong Park 32*54fd6939SJiyong Park /* SMC function ID that TSP uses to request service from secure monitor */ 33*54fd6939SJiyong Park #define TSP_GET_ARGS 0xf2001000 34*54fd6939SJiyong Park 35*54fd6939SJiyong Park /* 36*54fd6939SJiyong Park * Identifiers for various TSP services. Corresponding function IDs (whether 37*54fd6939SJiyong Park * fast or yielding) are generated by macros defined below 38*54fd6939SJiyong Park */ 39*54fd6939SJiyong Park #define TSP_ADD 0x2000 40*54fd6939SJiyong Park #define TSP_SUB 0x2001 41*54fd6939SJiyong Park #define TSP_MUL 0x2002 42*54fd6939SJiyong Park #define TSP_DIV 0x2003 43*54fd6939SJiyong Park #define TSP_HANDLE_SEL1_INTR_AND_RETURN 0x2004 44*54fd6939SJiyong Park 45*54fd6939SJiyong Park /* 46*54fd6939SJiyong Park * Identify a TSP service from function ID filtering the last 16 bits from the 47*54fd6939SJiyong Park * SMC function ID 48*54fd6939SJiyong Park */ 49*54fd6939SJiyong Park #define TSP_BARE_FID(fid) ((fid) & 0xffff) 50*54fd6939SJiyong Park 51*54fd6939SJiyong Park /* 52*54fd6939SJiyong Park * Generate function IDs for TSP services to be used in SMC calls, by 53*54fd6939SJiyong Park * appropriately setting bit 31 to differentiate yielding and fast SMC calls 54*54fd6939SJiyong Park */ 55*54fd6939SJiyong Park #define TSP_YIELD_FID(fid) ((TSP_BARE_FID(fid) | 0x72000000)) 56*54fd6939SJiyong Park #define TSP_FAST_FID(fid) ((TSP_BARE_FID(fid) | 0x72000000) | (1u << 31)) 57*54fd6939SJiyong Park 58*54fd6939SJiyong Park /* SMC function ID to request a previously preempted yielding smc */ 59*54fd6939SJiyong Park #define TSP_FID_RESUME TSP_YIELD_FID(0x3000) 60*54fd6939SJiyong Park /* 61*54fd6939SJiyong Park * SMC function ID to request abortion of a previously preempted yielding SMC. A 62*54fd6939SJiyong Park * fast SMC is used so that the TSP abort handler does not have to be 63*54fd6939SJiyong Park * reentrant. 64*54fd6939SJiyong Park */ 65*54fd6939SJiyong Park #define TSP_FID_ABORT TSP_FAST_FID(0x3001) 66*54fd6939SJiyong Park 67*54fd6939SJiyong Park /* 68*54fd6939SJiyong Park * Total number of function IDs implemented for services offered to NS clients. 69*54fd6939SJiyong Park * The function IDs are defined above 70*54fd6939SJiyong Park */ 71*54fd6939SJiyong Park #define TSP_NUM_FID 0x5 72*54fd6939SJiyong Park 73*54fd6939SJiyong Park /* TSP implementation version numbers */ 74*54fd6939SJiyong Park #define TSP_VERSION_MAJOR 0x0 /* Major version */ 75*54fd6939SJiyong Park #define TSP_VERSION_MINOR 0x1 /* Minor version */ 76*54fd6939SJiyong Park 77*54fd6939SJiyong Park /* 78*54fd6939SJiyong Park * Standard Trusted OS Function IDs that fall under Trusted OS call range 79*54fd6939SJiyong Park * according to SMC calling convention 80*54fd6939SJiyong Park */ 81*54fd6939SJiyong Park #define TOS_CALL_COUNT 0xbf00ff00 /* Number of calls implemented */ 82*54fd6939SJiyong Park #define TOS_UID 0xbf00ff01 /* Implementation UID */ 83*54fd6939SJiyong Park /* 0xbf00ff02 is reserved */ 84*54fd6939SJiyong Park #define TOS_CALL_VERSION 0xbf00ff03 /* Trusted OS Call Version */ 85*54fd6939SJiyong Park 86*54fd6939SJiyong Park 87*54fd6939SJiyong Park #ifndef __ASSEMBLER__ 88*54fd6939SJiyong Park 89*54fd6939SJiyong Park #include <stdint.h> 90*54fd6939SJiyong Park 91*54fd6939SJiyong Park 92*54fd6939SJiyong Park typedef uint32_t tsp_vector_isn_t; 93*54fd6939SJiyong Park 94*54fd6939SJiyong Park typedef struct tsp_vectors { 95*54fd6939SJiyong Park tsp_vector_isn_t yield_smc_entry; 96*54fd6939SJiyong Park tsp_vector_isn_t fast_smc_entry; 97*54fd6939SJiyong Park tsp_vector_isn_t cpu_on_entry; 98*54fd6939SJiyong Park tsp_vector_isn_t cpu_off_entry; 99*54fd6939SJiyong Park tsp_vector_isn_t cpu_resume_entry; 100*54fd6939SJiyong Park tsp_vector_isn_t cpu_suspend_entry; 101*54fd6939SJiyong Park tsp_vector_isn_t sel1_intr_entry; 102*54fd6939SJiyong Park tsp_vector_isn_t system_off_entry; 103*54fd6939SJiyong Park tsp_vector_isn_t system_reset_entry; 104*54fd6939SJiyong Park tsp_vector_isn_t abort_yield_smc_entry; 105*54fd6939SJiyong Park } tsp_vectors_t; 106*54fd6939SJiyong Park 107*54fd6939SJiyong Park void tsp_setup(void); 108*54fd6939SJiyong Park 109*54fd6939SJiyong Park #endif /* __ASSEMBLER__ */ 110*54fd6939SJiyong Park 111*54fd6939SJiyong Park #endif /* TSP_H */ 112