1*aa5da461SJens Wiklander /* 2*aa5da461SJens Wiklander * Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved. 3*aa5da461SJens Wiklander * 4*aa5da461SJens Wiklander * Redistribution and use in source and binary forms, with or without 5*aa5da461SJens Wiklander * modification, are permitted provided that the following conditions are met: 6*aa5da461SJens Wiklander * 7*aa5da461SJens Wiklander * Redistributions of source code must retain the above copyright notice, this 8*aa5da461SJens Wiklander * list of conditions and the following disclaimer. 9*aa5da461SJens Wiklander * 10*aa5da461SJens Wiklander * Redistributions in binary form must reproduce the above copyright notice, 11*aa5da461SJens Wiklander * this list of conditions and the following disclaimer in the documentation 12*aa5da461SJens Wiklander * and/or other materials provided with the distribution. 13*aa5da461SJens Wiklander * 14*aa5da461SJens Wiklander * Neither the name of ARM nor the names of its contributors may be used 15*aa5da461SJens Wiklander * to endorse or promote products derived from this software without specific 16*aa5da461SJens Wiklander * prior written permission. 17*aa5da461SJens Wiklander * 18*aa5da461SJens Wiklander * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19*aa5da461SJens Wiklander * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20*aa5da461SJens Wiklander * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21*aa5da461SJens Wiklander * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 22*aa5da461SJens Wiklander * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23*aa5da461SJens Wiklander * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24*aa5da461SJens Wiklander * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25*aa5da461SJens Wiklander * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26*aa5da461SJens Wiklander * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27*aa5da461SJens Wiklander * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28*aa5da461SJens Wiklander * POSSIBILITY OF SUCH DAMAGE. 29*aa5da461SJens Wiklander */ 30*aa5da461SJens Wiklander 31*aa5da461SJens Wiklander #ifndef __OPTEED_PRIVATE_H__ 32*aa5da461SJens Wiklander #define __OPTEED_PRIVATE_H__ 33*aa5da461SJens Wiklander 34*aa5da461SJens Wiklander #include <arch.h> 35*aa5da461SJens Wiklander #include <context.h> 36*aa5da461SJens Wiklander #include <interrupt_mgmt.h> 37*aa5da461SJens Wiklander #include <platform_def.h> 38*aa5da461SJens Wiklander #include <psci.h> 39*aa5da461SJens Wiklander 40*aa5da461SJens Wiklander /******************************************************************************* 41*aa5da461SJens Wiklander * OPTEE PM state information e.g. OPTEE is suspended, uninitialised etc 42*aa5da461SJens Wiklander * and macros to access the state information in the per-cpu 'state' flags 43*aa5da461SJens Wiklander ******************************************************************************/ 44*aa5da461SJens Wiklander #define OPTEE_PSTATE_OFF 0 45*aa5da461SJens Wiklander #define OPTEE_PSTATE_ON 1 46*aa5da461SJens Wiklander #define OPTEE_PSTATE_SUSPEND 2 47*aa5da461SJens Wiklander #define OPTEE_PSTATE_SHIFT 0 48*aa5da461SJens Wiklander #define OPTEE_PSTATE_MASK 0x3 49*aa5da461SJens Wiklander #define get_optee_pstate(state) ((state >> OPTEE_PSTATE_SHIFT) & \ 50*aa5da461SJens Wiklander OPTEE_PSTATE_MASK) 51*aa5da461SJens Wiklander #define clr_optee_pstate(state) (state &= ~(OPTEE_PSTATE_MASK \ 52*aa5da461SJens Wiklander << OPTEE_PSTATE_SHIFT)) 53*aa5da461SJens Wiklander #define set_optee_pstate(st, pst) do { \ 54*aa5da461SJens Wiklander clr_optee_pstate(st); \ 55*aa5da461SJens Wiklander st |= (pst & OPTEE_PSTATE_MASK) << \ 56*aa5da461SJens Wiklander OPTEE_PSTATE_SHIFT; \ 57*aa5da461SJens Wiklander } while (0) 58*aa5da461SJens Wiklander 59*aa5da461SJens Wiklander 60*aa5da461SJens Wiklander /******************************************************************************* 61*aa5da461SJens Wiklander * OPTEE execution state information i.e. aarch32 or aarch64 62*aa5da461SJens Wiklander ******************************************************************************/ 63*aa5da461SJens Wiklander #define OPTEE_AARCH32 MODE_RW_32 64*aa5da461SJens Wiklander #define OPTEE_AARCH64 MODE_RW_64 65*aa5da461SJens Wiklander 66*aa5da461SJens Wiklander /******************************************************************************* 67*aa5da461SJens Wiklander * The OPTEED should know the type of OPTEE 68*aa5da461SJens Wiklander ******************************************************************************/ 69*aa5da461SJens Wiklander #define OPTEE_TYPE_UP PSCI_TOS_NOT_UP_MIG_CAP 70*aa5da461SJens Wiklander #define OPTEE_TYPE_UPM PSCI_TOS_UP_MIG_CAP 71*aa5da461SJens Wiklander #define OPTEE_TYPE_MP PSCI_TOS_NOT_PRESENT_MP 72*aa5da461SJens Wiklander 73*aa5da461SJens Wiklander /******************************************************************************* 74*aa5da461SJens Wiklander * OPTEE migrate type information as known to the OPTEED. We assume that 75*aa5da461SJens Wiklander * the OPTEED is dealing with an MP Secure Payload. 76*aa5da461SJens Wiklander ******************************************************************************/ 77*aa5da461SJens Wiklander #define OPTEE_MIGRATE_INFO OPTEE_TYPE_MP 78*aa5da461SJens Wiklander 79*aa5da461SJens Wiklander /******************************************************************************* 80*aa5da461SJens Wiklander * Number of cpus that the present on this platform. TODO: Rely on a topology 81*aa5da461SJens Wiklander * tree to determine this in the future to avoid assumptions about mpidr 82*aa5da461SJens Wiklander * allocation 83*aa5da461SJens Wiklander ******************************************************************************/ 84*aa5da461SJens Wiklander #define OPTEED_CORE_COUNT PLATFORM_CORE_COUNT 85*aa5da461SJens Wiklander 86*aa5da461SJens Wiklander /******************************************************************************* 87*aa5da461SJens Wiklander * Constants that allow assembler code to preserve callee-saved registers of the 88*aa5da461SJens Wiklander * C runtime context while performing a security state switch. 89*aa5da461SJens Wiklander ******************************************************************************/ 90*aa5da461SJens Wiklander #define OPTEED_C_RT_CTX_X19 0x0 91*aa5da461SJens Wiklander #define OPTEED_C_RT_CTX_X20 0x8 92*aa5da461SJens Wiklander #define OPTEED_C_RT_CTX_X21 0x10 93*aa5da461SJens Wiklander #define OPTEED_C_RT_CTX_X22 0x18 94*aa5da461SJens Wiklander #define OPTEED_C_RT_CTX_X23 0x20 95*aa5da461SJens Wiklander #define OPTEED_C_RT_CTX_X24 0x28 96*aa5da461SJens Wiklander #define OPTEED_C_RT_CTX_X25 0x30 97*aa5da461SJens Wiklander #define OPTEED_C_RT_CTX_X26 0x38 98*aa5da461SJens Wiklander #define OPTEED_C_RT_CTX_X27 0x40 99*aa5da461SJens Wiklander #define OPTEED_C_RT_CTX_X28 0x48 100*aa5da461SJens Wiklander #define OPTEED_C_RT_CTX_X29 0x50 101*aa5da461SJens Wiklander #define OPTEED_C_RT_CTX_X30 0x58 102*aa5da461SJens Wiklander #define OPTEED_C_RT_CTX_SIZE 0x60 103*aa5da461SJens Wiklander #define OPTEED_C_RT_CTX_ENTRIES (OPTEED_C_RT_CTX_SIZE >> DWORD_SHIFT) 104*aa5da461SJens Wiklander 105*aa5da461SJens Wiklander #ifndef __ASSEMBLY__ 106*aa5da461SJens Wiklander 107*aa5da461SJens Wiklander #include <cassert.h> 108*aa5da461SJens Wiklander #include <stdint.h> 109*aa5da461SJens Wiklander 110*aa5da461SJens Wiklander typedef uint32_t optee_vector_isn_t; 111*aa5da461SJens Wiklander 112*aa5da461SJens Wiklander typedef struct optee_vectors { 113*aa5da461SJens Wiklander optee_vector_isn_t std_smc_entry; 114*aa5da461SJens Wiklander optee_vector_isn_t fast_smc_entry; 115*aa5da461SJens Wiklander optee_vector_isn_t cpu_on_entry; 116*aa5da461SJens Wiklander optee_vector_isn_t cpu_off_entry; 117*aa5da461SJens Wiklander optee_vector_isn_t cpu_resume_entry; 118*aa5da461SJens Wiklander optee_vector_isn_t cpu_suspend_entry; 119*aa5da461SJens Wiklander optee_vector_isn_t fiq_entry; 120*aa5da461SJens Wiklander optee_vector_isn_t system_off_entry; 121*aa5da461SJens Wiklander optee_vector_isn_t system_reset_entry; 122*aa5da461SJens Wiklander } optee_vectors_t; 123*aa5da461SJens Wiklander 124*aa5da461SJens Wiklander /* 125*aa5da461SJens Wiklander * The number of arguments to save during a SMC call for OPTEE. 126*aa5da461SJens Wiklander * Currently only x1 and x2 are used by OPTEE. 127*aa5da461SJens Wiklander */ 128*aa5da461SJens Wiklander #define OPTEE_NUM_ARGS 0x2 129*aa5da461SJens Wiklander 130*aa5da461SJens Wiklander /* AArch64 callee saved general purpose register context structure. */ 131*aa5da461SJens Wiklander DEFINE_REG_STRUCT(c_rt_regs, OPTEED_C_RT_CTX_ENTRIES); 132*aa5da461SJens Wiklander 133*aa5da461SJens Wiklander /* 134*aa5da461SJens Wiklander * Compile time assertion to ensure that both the compiler and linker 135*aa5da461SJens Wiklander * have the same double word aligned view of the size of the C runtime 136*aa5da461SJens Wiklander * register context. 137*aa5da461SJens Wiklander */ 138*aa5da461SJens Wiklander CASSERT(OPTEED_C_RT_CTX_SIZE == sizeof(c_rt_regs_t), \ 139*aa5da461SJens Wiklander assert_spd_c_rt_regs_size_mismatch); 140*aa5da461SJens Wiklander 141*aa5da461SJens Wiklander /******************************************************************************* 142*aa5da461SJens Wiklander * Structure which helps the OPTEED to maintain the per-cpu state of OPTEE. 143*aa5da461SJens Wiklander * 'state' - collection of flags to track OPTEE state e.g. on/off 144*aa5da461SJens Wiklander * 'mpidr' - mpidr to associate a context with a cpu 145*aa5da461SJens Wiklander * 'c_rt_ctx' - stack address to restore C runtime context from after 146*aa5da461SJens Wiklander * returning from a synchronous entry into OPTEE. 147*aa5da461SJens Wiklander * 'cpu_ctx' - space to maintain OPTEE architectural state 148*aa5da461SJens Wiklander ******************************************************************************/ 149*aa5da461SJens Wiklander typedef struct optee_context { 150*aa5da461SJens Wiklander uint32_t state; 151*aa5da461SJens Wiklander uint64_t mpidr; 152*aa5da461SJens Wiklander uint64_t c_rt_ctx; 153*aa5da461SJens Wiklander cpu_context_t cpu_ctx; 154*aa5da461SJens Wiklander } optee_context_t; 155*aa5da461SJens Wiklander 156*aa5da461SJens Wiklander /* OPTEED power management handlers */ 157*aa5da461SJens Wiklander extern const spd_pm_ops_t opteed_pm; 158*aa5da461SJens Wiklander 159*aa5da461SJens Wiklander /******************************************************************************* 160*aa5da461SJens Wiklander * Forward declarations 161*aa5da461SJens Wiklander ******************************************************************************/ 162*aa5da461SJens Wiklander struct optee_vectors; 163*aa5da461SJens Wiklander 164*aa5da461SJens Wiklander /******************************************************************************* 165*aa5da461SJens Wiklander * Function & Data prototypes 166*aa5da461SJens Wiklander ******************************************************************************/ 167*aa5da461SJens Wiklander uint64_t opteed_enter_sp(uint64_t *c_rt_ctx); 168*aa5da461SJens Wiklander void __dead2 opteed_exit_sp(uint64_t c_rt_ctx, uint64_t ret); 169*aa5da461SJens Wiklander uint64_t opteed_synchronous_sp_entry(optee_context_t *optee_ctx); 170*aa5da461SJens Wiklander void __dead2 opteed_synchronous_sp_exit(optee_context_t *optee_ctx, uint64_t ret); 171*aa5da461SJens Wiklander void opteed_init_optee_ep_state(struct entry_point_info *optee_ep, 172*aa5da461SJens Wiklander uint32_t rw, 173*aa5da461SJens Wiklander uint64_t pc, 174*aa5da461SJens Wiklander optee_context_t *optee_ctx); 175*aa5da461SJens Wiklander 176*aa5da461SJens Wiklander extern optee_context_t opteed_sp_context[OPTEED_CORE_COUNT]; 177*aa5da461SJens Wiklander extern uint32_t opteed_rw; 178*aa5da461SJens Wiklander extern struct optee_vectors *optee_vectors; 179*aa5da461SJens Wiklander #endif /*__ASSEMBLY__*/ 180*aa5da461SJens Wiklander 181*aa5da461SJens Wiklander #endif /* __OPTEED_PRIVATE_H__ */ 182