1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright 2017, Rockchip Electronics Co., Ltd 3*4882a593Smuzhiyun * hisping lin, <hisping.lin@rock-chips.com> 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun #ifndef TEESMC_OPTEE_H 8*4882a593Smuzhiyun #define TEESMC_OPTEE_H 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #include <optee_include/tee_base_types.h> 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #define TEESMC_OPTEE_RETURN_NOTAVAIL 0x5700 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun /* 15*4882a593Smuzhiyun * Get Shared Memory Config 16*4882a593Smuzhiyun * 17*4882a593Smuzhiyun * Returns the Secure/Non-secure shared memory config. 18*4882a593Smuzhiyun * 19*4882a593Smuzhiyun * Call register usage: 20*4882a593Smuzhiyun * r0 SMC Function ID, TEESMC32_OPTEE_FASTCALL_GET_SHM_CONFIG 21*4882a593Smuzhiyun * r1-6 Not used 22*4882a593Smuzhiyun * r7 Hypervisor Client ID register 23*4882a593Smuzhiyun * 24*4882a593Smuzhiyun * Have config return register usage: 25*4882a593Smuzhiyun * r0 TEESMC_RETURN_OK 26*4882a593Smuzhiyun * r1 Physical address of start of SHM 27*4882a593Smuzhiyun * r2 Size of of SHM 28*4882a593Smuzhiyun * r3 1 if SHM is cached, 0 if uncached. 29*4882a593Smuzhiyun * r4-7 Preserved 30*4882a593Smuzhiyun * 31*4882a593Smuzhiyun * Not available register usage: 32*4882a593Smuzhiyun * r0 TEESMC_OPTEE_RETURN_NOTAVAIL 33*4882a593Smuzhiyun * r1-3 Not used 34*4882a593Smuzhiyun * r4-7 Preserved 35*4882a593Smuzhiyun */ 36*4882a593Smuzhiyun #define TEESMC_OPTEE_FUNCID_GET_SHM_CONFIG 0x5700 37*4882a593Smuzhiyun #define TEESMC32_OPTEE_FASTCALL_GET_SHM_CONFIG \ 38*4882a593Smuzhiyun TEESMC_CALL_VAL(TEESMC_32, TEESMC_FAST_CALL, TEESMC_OWNER_TRUSTED_OS, \ 39*4882a593Smuzhiyun TEESMC_OPTEE_FUNCID_GET_SHM_CONFIG) 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun /* 42*4882a593Smuzhiyun * Configures L2CC mutex 43*4882a593Smuzhiyun * 44*4882a593Smuzhiyun * Disables, enables usage of L2CC mutex. Returns or sets physical address 45*4882a593Smuzhiyun * of L2CC mutex. 46*4882a593Smuzhiyun * 47*4882a593Smuzhiyun * Call register usage: 48*4882a593Smuzhiyun * r0 SMC Function ID, TEESMC32_OPTEE_FASTCALL_L2CC_MUTEX 49*4882a593Smuzhiyun * r1 TEESMC_OPTEE_L2CC_MUTEX_GET_ADDR Get physical address of mutex 50*4882a593Smuzhiyun * TEESMC_OPTEE_L2CC_MUTEX_SET_ADDR Set physical address of mutex 51*4882a593Smuzhiyun * TEESMC_OPTEE_L2CC_MUTEX_ENABLE Enable usage of mutex 52*4882a593Smuzhiyun * TEESMC_OPTEE_L2CC_MUTEX_DISABLE Disable usage of mutex 53*4882a593Smuzhiyun * r2 if r1 == TEESMC_OPTEE_L2CC_MUTEX_SET_ADDR, physical address of mutex 54*4882a593Smuzhiyun * r3-6 Not used 55*4882a593Smuzhiyun * r7 Hypervisor Client ID register 56*4882a593Smuzhiyun * 57*4882a593Smuzhiyun * Have config return register usage: 58*4882a593Smuzhiyun * r0 TEESMC_RETURN_OK 59*4882a593Smuzhiyun * r1 Preserved 60*4882a593Smuzhiyun * r2 if r1 == 0, physical address of L2CC mutex 61*4882a593Smuzhiyun * r3-7 Preserved 62*4882a593Smuzhiyun * 63*4882a593Smuzhiyun * Error return register usage: 64*4882a593Smuzhiyun * r0 TEESMC_OPTEE_RETURN_NOTAVAIL Physical address not available 65*4882a593Smuzhiyun * TEESMC_RETURN_EBADADDR Bad supplied physical address 66*4882a593Smuzhiyun * TEESMC_RETURN_EBADCMD Unsupported value in r1 67*4882a593Smuzhiyun * r1-7 Preserved 68*4882a593Smuzhiyun */ 69*4882a593Smuzhiyun #define TEESMC_OPTEE_L2CC_MUTEX_GET_ADDR 0 70*4882a593Smuzhiyun #define TEESMC_OPTEE_L2CC_MUTEX_SET_ADDR 1 71*4882a593Smuzhiyun #define TEESMC_OPTEE_L2CC_MUTEX_ENABLE 2 72*4882a593Smuzhiyun #define TEESMC_OPTEE_L2CC_MUTEX_DISABLE 3 73*4882a593Smuzhiyun #define TEESMC_OPTEE_FUNCID_L2CC_MUTEX 0x5701 74*4882a593Smuzhiyun #define TEESMC32_OPTEE_FASTCALL_L2CC_MUTEX \ 75*4882a593Smuzhiyun TEESMC_CALL_VAL(TEESMC_32, TEESMC_FAST_CALL, TEESMC_OWNER_TRUSTED_OS, \ 76*4882a593Smuzhiyun TEESMC_OPTEE_FUNCID_L2CC_MUTEX) 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun /* 79*4882a593Smuzhiyun * Allocate payload memory for RPC parameter passing. 80*4882a593Smuzhiyun * 81*4882a593Smuzhiyun * "Call" register usage: 82*4882a593Smuzhiyun * r0/x0 This value, TEESMC_RETURN_OPTEE_RPC_ALLOC_PAYLOAD 83*4882a593Smuzhiyun * r1/x1 Size in bytes of required payload memory 84*4882a593Smuzhiyun * r2/x2 Not used 85*4882a593Smuzhiyun * r3-7/x3-7 Resume information, must be preserved 86*4882a593Smuzhiyun * 87*4882a593Smuzhiyun * "Return" register usage: 88*4882a593Smuzhiyun * r0/x0 SMC Function ID, TEESMC32_CALL_RETURN_FROM_RPC if it was an 89*4882a593Smuzhiyun * AArch32 SMC return or TEESMC64_CALL_RETURN_FROM_RPC for 90*4882a593Smuzhiyun * AArch64 SMC return 91*4882a593Smuzhiyun * r1/x1 Physical pointer to allocated payload memory, 0 if size 92*4882a593Smuzhiyun * was 0 or if memory can't be allocated 93*4882a593Smuzhiyun * r2/x2 Shared memory cookie used when freeing the memory 94*4882a593Smuzhiyun * r3-7/x3-7 Preserved 95*4882a593Smuzhiyun */ 96*4882a593Smuzhiyun #define TEESMC_OPTEE_RPC_FUNC_ALLOC_PAYLOAD 0x5700 97*4882a593Smuzhiyun #define TEESMC_RETURN_OPTEE_RPC_ALLOC_PAYLOAD \ 98*4882a593Smuzhiyun TEESMC_RPC_VAL(TEESMC_OPTEE_RPC_FUNC_ALLOC_PAYLOAD) 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun /* 102*4882a593Smuzhiyun * Free memory previously allocated by TEESMC_RETURN_OPTEE_RPC_ALLOC_PAYLOAD 103*4882a593Smuzhiyun * 104*4882a593Smuzhiyun * "Call" register usage: 105*4882a593Smuzhiyun * r0/x0 This value, TEESMC_RETURN_OPTEE_RPC_FREE_PAYLOAD 106*4882a593Smuzhiyun * r1/x1 Shared memory cookie belonging to this payload memory 107*4882a593Smuzhiyun * r2-7/x2-7 Resume information, must be preserved 108*4882a593Smuzhiyun * 109*4882a593Smuzhiyun * "Return" register usage: 110*4882a593Smuzhiyun * r0/x0 SMC Function ID, TEESMC32_CALL_RETURN_FROM_RPC if it was an 111*4882a593Smuzhiyun * AArch32 SMC return or TEESMC64_CALL_RETURN_FROM_RPC for 112*4882a593Smuzhiyun * AArch64 SMC return 113*4882a593Smuzhiyun * r2-7/x2-7 Preserved 114*4882a593Smuzhiyun */ 115*4882a593Smuzhiyun #define TEESMC_OPTEE_RPC_FUNC_FREE_PAYLOAD 0x5701 116*4882a593Smuzhiyun #define TEESMC_RETURN_OPTEE_RPC_FREE_PAYLOAD \ 117*4882a593Smuzhiyun TEESMC_RPC_VAL(TEESMC_OPTEE_RPC_FUNC_FREE_PAYLOAD) 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun /* 120*4882a593Smuzhiyun * Overriding default UID of the API since the it has OP-TEE extensions 121*4882a593Smuzhiyun * 384fb3e0-e7f8-11e3-af63-0002a5d5c51b : Only 32 bit calls are supported 122*4882a593Smuzhiyun * 384fb3e0-e7f8-11e3-af63-0002a5d5c51c : Both 32 and 64 bit calls are supported 123*4882a593Smuzhiyun */ 124*4882a593Smuzhiyun #define TEESMC_OPTEE_UID_R0 0x384fb3e0 125*4882a593Smuzhiyun #define TEESMC_OPTEE_UID_R1 0xe7f811e3 126*4882a593Smuzhiyun #define TEESMC_OPTEE_UID_R2 0xaf630002 127*4882a593Smuzhiyun #define TEESMC_OPTEE_UID32_R3 0xa5d5c51b 128*4882a593Smuzhiyun #define TEESMC_OPTEE_UID64_R3 0xa5d5c51c 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun #define TEESMC_OPTEE_REVISION_MAJOR 1 131*4882a593Smuzhiyun #define TEESMC_OPTEE_REVISION_MINOR 0 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun /* 134*4882a593Smuzhiyun * UUID for OP-TEE 135*4882a593Smuzhiyun * 486178e0-e7f8-11e3-bc5e-0002a5d5c51b 136*4882a593Smuzhiyun */ 137*4882a593Smuzhiyun #define TEESMC_OS_OPTEE_UUID_R0 0x486178e0 138*4882a593Smuzhiyun #define TEESMC_OS_OPTEE_UUID_R1 0xe7f811e3 139*4882a593Smuzhiyun #define TEESMC_OS_OPTEE_UUID_R2 0xbc5e0002 140*4882a593Smuzhiyun #define TEESMC_OS_OPTEE_UUID_R3 0xa5d5c51b 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun #define TEESMC_OS_OPTEE_REVISION_MAJOR 1 143*4882a593Smuzhiyun #define TEESMC_OS_OPTEE_REVISION_MINOR 0 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun #endif /*TEESMC_OPTEE_H*/ 146