1abdd2437Shisping /* 2abdd2437Shisping * Copyright 2017, Rockchip Electronics Co., Ltd 3abdd2437Shisping * hisping lin, <hisping.lin@rock-chips.com> 4abdd2437Shisping * 5abdd2437Shisping * SPDX-License-Identifier: GPL-2.0+ 6abdd2437Shisping */ 7abdd2437Shisping #include <common.h> 8abdd2437Shisping #include <stdlib.h> 9abdd2437Shisping #include <command.h> 10abdd2437Shisping #include <mmc.h> 11*b122ee17SHisping Lin #include <optee_include/OpteeClientLoadTa.h> 12abdd2437Shisping #include <optee_include/OpteeClientMem.h> 13abdd2437Shisping #include <optee_include/OpteeClientRPC.h> 14abdd2437Shisping #include <optee_include/teesmc.h> 151f25ada2SHisping Lin #include <optee_include/teesmc_v2.h> 16abdd2437Shisping #include <optee_include/teesmc_optee.h> 17abdd2437Shisping #include <optee_include/tee_rpc_types.h> 18abdd2437Shisping #include <optee_include/tee_rpc.h> 193251364cSHisping Lin #ifdef CONFIG_OPTEE_V1 201f25ada2SHisping Lin #include <optee_include/OpteeClientRkFs.h> 213251364cSHisping Lin #endif 223251364cSHisping Lin #ifdef CONFIG_OPTEE_V2 23df538e29SHisping Lin #include <optee_include/OpteeClientRkNewFs.h> 243251364cSHisping Lin #endif 25abdd2437Shisping 26abdd2437Shisping /* 27abdd2437Shisping * Memory allocation. 28abdd2437Shisping * Currently treated the same for both arguments & payloads. 29abdd2437Shisping */ 30abdd2437Shisping TEEC_Result OpteeRpcAlloc(uint32_t Size, uint32_t *Address) 31abdd2437Shisping { 32abdd2437Shisping TEEC_Result TeecResult = TEEC_SUCCESS; 331f25ada2SHisping Lin size_t AllocAddress; 34abdd2437Shisping 35abdd2437Shisping *Address = 0; 36abdd2437Shisping 37abdd2437Shisping if (Size != 0) { 381f25ada2SHisping Lin AllocAddress = (size_t) OpteeClientMemAlloc(Size); 39abdd2437Shisping 40abdd2437Shisping if (AllocAddress == 0) 41abdd2437Shisping TeecResult = TEEC_ERROR_OUT_OF_MEMORY; 42abdd2437Shisping else 43abdd2437Shisping *Address = AllocAddress; 44abdd2437Shisping } 45abdd2437Shisping return TeecResult; 46abdd2437Shisping } 47abdd2437Shisping 48abdd2437Shisping /* 49abdd2437Shisping * Memory free. 50abdd2437Shisping * Currently treated the same for both arguments & payloads. 51abdd2437Shisping */ 52abdd2437Shisping TEEC_Result OpteeRpcFree(uint32_t Address) 53abdd2437Shisping { 541f25ada2SHisping Lin OpteeClientMemFree((void *)(size_t)Address); 55abdd2437Shisping return TEEC_SUCCESS; 56abdd2437Shisping } 57abdd2437Shisping 581f25ada2SHisping Lin TEEC_Result OpteeRpcCmdLoadV2Ta(t_teesmc32_arg *TeeSmc32Arg) 591f25ada2SHisping Lin { 601f25ada2SHisping Lin TEEC_Result TeecResult = TEEC_SUCCESS; 611f25ada2SHisping Lin t_teesmc32_param *TeeSmc32Param = NULL; 62*b122ee17SHisping Lin int ta_found = 0; 63*b122ee17SHisping Lin size_t size = 0; 641f25ada2SHisping Lin 651f25ada2SHisping Lin if (TeeSmc32Arg->num_params != 2) { 661f25ada2SHisping Lin TeecResult = TEEC_ERROR_BAD_PARAMETERS; 671f25ada2SHisping Lin goto Exit; 681f25ada2SHisping Lin } 691f25ada2SHisping Lin 701f25ada2SHisping Lin TeeSmc32Param = TEESMC32_GET_PARAMS(TeeSmc32Arg); 711f25ada2SHisping Lin 72*b122ee17SHisping Lin size = TeeSmc32Param[1].u.memref.size; 73*b122ee17SHisping Lin ta_found = search_ta((void *)(size_t)&TeeSmc32Param[0].u.value, 74*b122ee17SHisping Lin (void *)(size_t)TeeSmc32Param[1].u.memref.buf_ptr, &size); 75*b122ee17SHisping Lin if (ta_found == TA_BINARY_FOUND) { 76*b122ee17SHisping Lin TeeSmc32Param[1].u.memref.size = size; 77*b122ee17SHisping Lin TeecResult = TEEC_SUCCESS; 781f25ada2SHisping Lin } else { 79*b122ee17SHisping Lin printf(" TA not found \n"); 80*b122ee17SHisping Lin TeecResult = TEEC_ERROR_ITEM_NOT_FOUND; 811f25ada2SHisping Lin } 821f25ada2SHisping Lin 831f25ada2SHisping Lin Exit: 841f25ada2SHisping Lin TeeSmc32Arg->ret = TeecResult; 851f25ada2SHisping Lin TeeSmc32Arg->ret_origin = TEEC_ORIGIN_API; 861f25ada2SHisping Lin 87*b122ee17SHisping Lin debug("TEEC: OpteeRpcCmdLoadV2Ta Exit : TeecResult=0x%X\n", TeecResult); 88abdd2437Shisping 89abdd2437Shisping return TeecResult; 90abdd2437Shisping } 91abdd2437Shisping 92abdd2437Shisping /* 93abdd2437Shisping * Execute an RPMB storage operation. 94abdd2437Shisping */ 951f25ada2SHisping Lin 96abdd2437Shisping uint16_t global_block_count; 97fd9c6bd7SJason Zhu #ifdef CONFIG_SUPPORT_EMMC_RPMB 98abdd2437Shisping TEEC_Result OpteeRpcCmdRpmb(t_teesmc32_arg *TeeSmc32Arg) 99abdd2437Shisping { 100abdd2437Shisping struct tee_rpc_rpmb_dev_info *DevInfo; 101abdd2437Shisping TEEC_Result EfiStatus; 102abdd2437Shisping uint16_t RequestMsgType, i; 103abdd2437Shisping EFI_RK_RPMB_DATA_PACKET *RequestPackets; 104abdd2437Shisping EFI_RK_RPMB_DATA_PACKET *ResponsePackets; 105abdd2437Shisping EFI_RK_RPMB_DATA_PACKET *tempPackets; 106abdd2437Shisping EFI_RK_RPMB_DATA_PACKET_BACK *RequestPackets_back; 107abdd2437Shisping EFI_RK_RPMB_DATA_PACKET_BACK *tempPackets_back; 108abdd2437Shisping struct tee_rpc_rpmb_cmd *RpmbRequest; 109abdd2437Shisping TEEC_Result TeecResult = TEEC_SUCCESS; 110abdd2437Shisping t_teesmc32_param *TeeSmc32Param; 111abdd2437Shisping struct mmc *mmc; 112abdd2437Shisping 113efb93541SHisping Lin debug("TEEC: Entered RPMB RPC\n"); 114abdd2437Shisping 115abdd2437Shisping if (TeeSmc32Arg->num_params != 2) { 116abdd2437Shisping TeecResult = TEEC_ERROR_BAD_PARAMETERS; 117abdd2437Shisping goto Exit; 118abdd2437Shisping } 119abdd2437Shisping 120abdd2437Shisping TeeSmc32Param = TEESMC32_GET_PARAMS(TeeSmc32Arg); 1211f25ada2SHisping Lin RpmbRequest = (struct tee_rpc_rpmb_cmd *)(size_t) 122abdd2437Shisping TeeSmc32Param[0].u.memref.buf_ptr; 123abdd2437Shisping switch (RpmbRequest->cmd) { 124abdd2437Shisping case TEE_RPC_RPMB_CMD_DATA_REQ: { 125abdd2437Shisping RequestPackets = (EFI_RK_RPMB_DATA_PACKET *)(RpmbRequest + 1); 1261f25ada2SHisping Lin ResponsePackets = (EFI_RK_RPMB_DATA_PACKET *)(size_t) 127abdd2437Shisping TeeSmc32Param[1].u.memref.buf_ptr; 128abdd2437Shisping 129abdd2437Shisping global_block_count = 130abdd2437Shisping (RpmbRequest->block_count == 0 ? 131abdd2437Shisping 1 : RpmbRequest->block_count); 132abdd2437Shisping RequestPackets_back = 13317b5c290SHisping Lin memalign(CONFIG_SYS_CACHELINE_SIZE, 13417b5c290SHisping Lin sizeof(EFI_RK_RPMB_DATA_PACKET_BACK) * global_block_count); 135abdd2437Shisping memcpy(RequestPackets_back->stuff, 136abdd2437Shisping RequestPackets->stuff_bytes, 137abdd2437Shisping RPMB_STUFF_DATA_SIZE); 138abdd2437Shisping memcpy(RequestPackets_back->mac, 139abdd2437Shisping RequestPackets->key_mac, 140abdd2437Shisping RPMB_KEY_MAC_SIZE); 141abdd2437Shisping memcpy(RequestPackets_back->data, 142abdd2437Shisping RequestPackets->data, 143abdd2437Shisping RPMB_DATA_SIZE); 144abdd2437Shisping memcpy(RequestPackets_back->nonce, 145abdd2437Shisping RequestPackets->nonce, 146abdd2437Shisping RPMB_NONCE_SIZE); 147abdd2437Shisping RequestPackets_back->write_counter = 148abdd2437Shisping ((RequestPackets->write_counter[3]) << 24) + 149abdd2437Shisping ((RequestPackets->write_counter[2]) << 16) + 150abdd2437Shisping ((RequestPackets->write_counter[1]) << 8) + 151abdd2437Shisping (RequestPackets->write_counter[0]); 152abdd2437Shisping RequestPackets_back->address = 153abdd2437Shisping ((RequestPackets->address[1]) << 8) + 154abdd2437Shisping (RequestPackets->address[0]); 155abdd2437Shisping RequestPackets_back->block_count = 156abdd2437Shisping ((RequestPackets->block_count[1]) << 8) + 157abdd2437Shisping (RequestPackets->block_count[0]); 158abdd2437Shisping RequestPackets_back->result = 159abdd2437Shisping ((RequestPackets->op_result[1]) << 8) + 160abdd2437Shisping (RequestPackets->op_result[0]); 161abdd2437Shisping RequestPackets_back->request = 162abdd2437Shisping ((RequestPackets->msg_type[1]) << 8) + 163abdd2437Shisping (RequestPackets->msg_type[0]); 164abdd2437Shisping 165abdd2437Shisping RequestMsgType = RPMB_PACKET_DATA_TO_UINT16( 166abdd2437Shisping RequestPackets->msg_type); 167abdd2437Shisping 168efb93541SHisping Lin debug("TEEC: RPMB Data request %d\n", RequestMsgType); 169abdd2437Shisping 170abdd2437Shisping switch (RequestMsgType) { 171abdd2437Shisping case TEE_RPC_RPMB_MSG_TYPE_REQ_AUTH_KEY_PROGRAM: { 17268ba9373SHisping Lin if (init_rpmb() != 0) { 173abdd2437Shisping TeecResult = TEEC_ERROR_GENERIC; 174abdd2437Shisping break; 175abdd2437Shisping } 176abdd2437Shisping 177abdd2437Shisping EfiStatus = do_programkey((struct s_rpmb *) 178abdd2437Shisping RequestPackets_back); 179abdd2437Shisping 18068ba9373SHisping Lin if (finish_rpmb() != 0) { 181abdd2437Shisping TeecResult = TEEC_ERROR_GENERIC; 182abdd2437Shisping break; 183abdd2437Shisping } 184abdd2437Shisping 185abdd2437Shisping if (EfiStatus != 0) { 186abdd2437Shisping TeecResult = TEEC_ERROR_GENERIC; 187abdd2437Shisping break; 188abdd2437Shisping } 189abdd2437Shisping 190abdd2437Shisping break; 191abdd2437Shisping } 192abdd2437Shisping 193abdd2437Shisping case TEE_RPC_RPMB_MSG_TYPE_REQ_WRITE_COUNTER_VAL_READ: { 19468ba9373SHisping Lin if (init_rpmb() != 0) { 195abdd2437Shisping TeecResult = TEEC_ERROR_GENERIC; 196abdd2437Shisping break; 197abdd2437Shisping } 198abdd2437Shisping 199abdd2437Shisping EfiStatus = do_readcounter((struct s_rpmb *) 200abdd2437Shisping RequestPackets_back); 20168ba9373SHisping Lin 20268ba9373SHisping Lin if (finish_rpmb() != 0) { 203abdd2437Shisping TeecResult = TEEC_ERROR_GENERIC; 204abdd2437Shisping break; 205abdd2437Shisping } 206abdd2437Shisping 207a0d56fd8SHisping Lin TeecResult = TEEC_SUCCESS; 208abdd2437Shisping break; 209abdd2437Shisping } 210abdd2437Shisping 211abdd2437Shisping case TEE_RPC_RPMB_MSG_TYPE_REQ_AUTH_DATA_WRITE: { 21268ba9373SHisping Lin if (init_rpmb() != 0) { 213abdd2437Shisping TeecResult = TEEC_ERROR_GENERIC; 214abdd2437Shisping break; 215abdd2437Shisping } 216abdd2437Shisping 217abdd2437Shisping EfiStatus = do_authenticatedwrite((struct s_rpmb *) 218abdd2437Shisping RequestPackets_back); 21968ba9373SHisping Lin 22068ba9373SHisping Lin if (finish_rpmb() != 0) { 221abdd2437Shisping TeecResult = TEEC_ERROR_GENERIC; 222abdd2437Shisping break; 223abdd2437Shisping } 224abdd2437Shisping 225abdd2437Shisping if (EfiStatus != 0) { 226abdd2437Shisping TeecResult = TEEC_ERROR_GENERIC; 227abdd2437Shisping break; 228abdd2437Shisping } 229abdd2437Shisping 230abdd2437Shisping break; 231abdd2437Shisping } 232abdd2437Shisping 233abdd2437Shisping case TEE_RPC_RPMB_MSG_TYPE_REQ_AUTH_DATA_READ: { 23468ba9373SHisping Lin if (init_rpmb() != 0) { 235abdd2437Shisping TeecResult = TEEC_ERROR_GENERIC; 236abdd2437Shisping break; 237abdd2437Shisping } 238abdd2437Shisping 239abdd2437Shisping EfiStatus = do_authenticatedread((struct s_rpmb *) 240abdd2437Shisping RequestPackets_back, global_block_count); 24168ba9373SHisping Lin 24268ba9373SHisping Lin if (finish_rpmb() != 0) { 243abdd2437Shisping TeecResult = TEEC_ERROR_GENERIC; 244abdd2437Shisping break; 245abdd2437Shisping } 246abdd2437Shisping 247abdd2437Shisping if (EfiStatus != 0) { 248abdd2437Shisping TeecResult = TEEC_ERROR_GENERIC; 249abdd2437Shisping break; 250abdd2437Shisping } 251abdd2437Shisping 252abdd2437Shisping break; 253abdd2437Shisping } 254abdd2437Shisping 255abdd2437Shisping default: 256abdd2437Shisping TeecResult = TEEC_ERROR_BAD_PARAMETERS; 257abdd2437Shisping break; 258abdd2437Shisping } 259efb93541SHisping Lin debug("TEEC: RPMB TeecResult %d\n", TeecResult); 260abdd2437Shisping break; 261abdd2437Shisping } 262abdd2437Shisping 263abdd2437Shisping case TEE_RPC_RPMB_CMD_GET_DEV_INFO: { 26426690680SHisping Lin if (init_rpmb()) { 26526690680SHisping Lin TeecResult = TEEC_ERROR_GENERIC; 26626690680SHisping Lin goto Exit; 26726690680SHisping Lin } 26826690680SHisping Lin 269abdd2437Shisping mmc = do_returnmmc(); 27026690680SHisping Lin if (finish_rpmb()) { 27126690680SHisping Lin TeecResult = TEEC_ERROR_GENERIC; 27226690680SHisping Lin goto Exit; 27326690680SHisping Lin } 27426690680SHisping Lin 27526690680SHisping Lin if (mmc == NULL) { 27626690680SHisping Lin TeecResult = TEEC_ERROR_GENERIC; 27726690680SHisping Lin goto Exit; 27826690680SHisping Lin } 279abdd2437Shisping 2801f25ada2SHisping Lin DevInfo = (struct tee_rpc_rpmb_dev_info *)(size_t) 281abdd2437Shisping TeeSmc32Param[1].u.memref.buf_ptr; 282abdd2437Shisping 283abdd2437Shisping DevInfo->cid[0] = (mmc->cid[0]) >> 24 & 0xff; 284abdd2437Shisping DevInfo->cid[1] = (mmc->cid[0]) >> 16 & 0xff; 285abdd2437Shisping DevInfo->cid[2] = (mmc->cid[0]) >> 8 & 0xff; 286abdd2437Shisping DevInfo->cid[3] = (mmc->cid[0]) & 0xff; 287abdd2437Shisping DevInfo->cid[4] = (mmc->cid[1]) >> 24 & 0xff; 288abdd2437Shisping DevInfo->cid[5] = (mmc->cid[1]) >> 16 & 0xff; 289abdd2437Shisping DevInfo->cid[6] = (mmc->cid[1]) >> 8 & 0xff; 290abdd2437Shisping DevInfo->cid[7] = (mmc->cid[1]) & 0xff; 291abdd2437Shisping DevInfo->cid[8] = (mmc->cid[2]) >> 24 & 0xff; 292abdd2437Shisping DevInfo->cid[9] = (mmc->cid[2]) >> 16 & 0xff; 293abdd2437Shisping DevInfo->cid[10] = (mmc->cid[2]) >> 8 & 0xff; 294abdd2437Shisping DevInfo->cid[11] = (mmc->cid[2]) & 0xff; 295abdd2437Shisping DevInfo->cid[12] = (mmc->cid[3]) >> 24 & 0xff; 296abdd2437Shisping DevInfo->cid[13] = (mmc->cid[3]) >> 16 & 0xff; 297abdd2437Shisping DevInfo->cid[14] = (mmc->cid[3]) >> 8 & 0xff; 298abdd2437Shisping DevInfo->cid[15] = (mmc->cid[3]) & 0xff; 299abdd2437Shisping DevInfo->rel_wr_sec_c = 1; 300abdd2437Shisping DevInfo->rpmb_size_mult = 301abdd2437Shisping (uint8_t)(mmc->capacity_rpmb / (128 * 1024)); 302abdd2437Shisping DevInfo->ret_code = 0; 303abdd2437Shisping 304abdd2437Shisping goto Exit; 305abdd2437Shisping } 306abdd2437Shisping 307abdd2437Shisping default: 308abdd2437Shisping TeecResult = TEEC_ERROR_BAD_PARAMETERS; 309abdd2437Shisping 310abdd2437Shisping goto Exit; 311abdd2437Shisping } 312abdd2437Shisping 313abdd2437Shisping tempPackets = ResponsePackets; 314abdd2437Shisping tempPackets_back = RequestPackets_back; 315abdd2437Shisping 316abdd2437Shisping for (i = 0; i < global_block_count; i++) { 317abdd2437Shisping memcpy(tempPackets->stuff_bytes, 318abdd2437Shisping tempPackets_back->stuff, 319abdd2437Shisping RPMB_STUFF_DATA_SIZE); 320abdd2437Shisping memcpy(tempPackets->key_mac, 321abdd2437Shisping tempPackets_back->mac, 322abdd2437Shisping RPMB_KEY_MAC_SIZE); 323abdd2437Shisping memcpy(tempPackets->data, 324abdd2437Shisping tempPackets_back->data, 325abdd2437Shisping RPMB_DATA_SIZE); 326abdd2437Shisping memcpy(tempPackets->nonce, 327abdd2437Shisping tempPackets_back->nonce, 328abdd2437Shisping RPMB_NONCE_SIZE); 329abdd2437Shisping tempPackets->write_counter[3] = 330abdd2437Shisping ((tempPackets_back->write_counter) >> 24) & 0xFF; 331abdd2437Shisping tempPackets->write_counter[2] = 332abdd2437Shisping ((tempPackets_back->write_counter) >> 16) & 0xFF; 333abdd2437Shisping tempPackets->write_counter[1] = 334abdd2437Shisping ((tempPackets_back->write_counter) >> 8) & 0xFF; 335abdd2437Shisping tempPackets->write_counter[0] = 336abdd2437Shisping (tempPackets_back->write_counter) & 0xFF; 337abdd2437Shisping tempPackets->address[1] = 338abdd2437Shisping ((tempPackets_back->address) >> 8) & 0xFF; 339abdd2437Shisping tempPackets->address[0] = 340abdd2437Shisping (tempPackets_back->address) & 0xFF; 341abdd2437Shisping tempPackets->block_count[1] = 342abdd2437Shisping ((tempPackets_back->block_count) >> 8) & 0xFF; 343abdd2437Shisping tempPackets->block_count[0] = 344abdd2437Shisping (tempPackets_back->block_count) & 0xFF; 345abdd2437Shisping tempPackets->op_result[1] = 346abdd2437Shisping ((tempPackets_back->result) >> 8) & 0xFF; 347abdd2437Shisping tempPackets->op_result[0] = 348abdd2437Shisping (tempPackets_back->result) & 0xFF; 349abdd2437Shisping tempPackets->msg_type[1] = 350abdd2437Shisping ((tempPackets_back->request) >> 8) & 0xFF; 351abdd2437Shisping tempPackets->msg_type[0] = 352abdd2437Shisping (tempPackets_back->request) & 0xFF; 353abdd2437Shisping tempPackets++; 354abdd2437Shisping tempPackets_back++; 355abdd2437Shisping } 356abdd2437Shisping 357abdd2437Shisping free(RequestPackets_back); 358abdd2437Shisping 359abdd2437Shisping Exit: 360abdd2437Shisping TeeSmc32Arg->ret = TeecResult; 361abdd2437Shisping TeeSmc32Arg->ret_origin = TEEC_ORIGIN_API; 362abdd2437Shisping 363abdd2437Shisping return TeecResult; 364abdd2437Shisping } 365fd9c6bd7SJason Zhu #endif 366abdd2437Shisping 367abdd2437Shisping /* 368abdd2437Shisping * Execute a normal world local file system operation. 369abdd2437Shisping */ 370abdd2437Shisping TEEC_Result OpteeRpcCmdFs(t_teesmc32_arg *TeeSmc32Arg) 371abdd2437Shisping { 3721f25ada2SHisping Lin TEEC_Result TeecResult = TEEC_SUCCESS; 3731f25ada2SHisping Lin t_teesmc32_param *TeeSmc32Param; 374abdd2437Shisping 3751f25ada2SHisping Lin TeeSmc32Param = TEESMC32_GET_PARAMS(TeeSmc32Arg); 3763251364cSHisping Lin #ifdef CONFIG_OPTEE_V1 377d079c1a5SHisping Lin TeecResult = OpteeClientRkFsProcess((void *)(size_t)TeeSmc32Param[0].u.memref.buf_ptr, 3781f25ada2SHisping Lin TeeSmc32Param[0].u.memref.size); 379a3cf1018SHisping Lin TeeSmc32Arg->ret = TEEC_SUCCESS; 3803251364cSHisping Lin #endif 3813251364cSHisping Lin #ifdef CONFIG_OPTEE_V2 382df538e29SHisping Lin TeecResult = OpteeClientRkFsProcess((size_t)TeeSmc32Arg->num_params, 3833251364cSHisping Lin (struct tee_ioctl_param *)TeeSmc32Param); 384a3cf1018SHisping Lin TeeSmc32Arg->ret = TeecResult; 3853251364cSHisping Lin #endif 3861f25ada2SHisping Lin return TeecResult; 3871f25ada2SHisping Lin } 388abdd2437Shisping 389abdd2437Shisping /* 390abdd2437Shisping * TBD. 391abdd2437Shisping */ 392abdd2437Shisping TEEC_Result OpteeRpcCmdGetTime(t_teesmc32_arg *TeeSmc32Arg) 393abdd2437Shisping { 394abdd2437Shisping return TEEC_ERROR_NOT_IMPLEMENTED; 395abdd2437Shisping } 396abdd2437Shisping 397abdd2437Shisping /* 398abdd2437Shisping * TBD. 399abdd2437Shisping */ 400abdd2437Shisping TEEC_Result OpteeRpcCmdWaitMutex(t_teesmc32_arg *TeeSmc32Arg) 401abdd2437Shisping { 402abdd2437Shisping return TEEC_ERROR_NOT_IMPLEMENTED; 403abdd2437Shisping } 404abdd2437Shisping 405abdd2437Shisping /* 406abdd2437Shisping * Handle the callback from secure world. 407abdd2437Shisping */ 408abdd2437Shisping TEEC_Result OpteeRpcCallback(ARM_SMC_ARGS *ArmSmcArgs) 409abdd2437Shisping { 410abdd2437Shisping TEEC_Result TeecResult = TEEC_SUCCESS; 411abdd2437Shisping 4121f25ada2SHisping Lin //printf("OpteeRpcCallback Enter: Arg0=0x%X, Arg1=0x%X, Arg2=0x%X\n", 4131f25ada2SHisping Lin //ArmSmcArgs->Arg0, ArmSmcArgs->Arg1, ArmSmcArgs->Arg2); 414abdd2437Shisping 415abdd2437Shisping switch (TEESMC_RETURN_GET_RPC_FUNC(ArmSmcArgs->Arg0)) { 416abdd2437Shisping case TEESMC_RPC_FUNC_ALLOC_ARG: { 417efb93541SHisping Lin debug("TEEC: ArmSmcArgs->Arg1 = 0x%x \n", ArmSmcArgs->Arg1); 4181f25ada2SHisping Lin TeecResult = OpteeRpcAlloc(ArmSmcArgs->Arg1, &ArmSmcArgs->Arg2); 4191f25ada2SHisping Lin ArmSmcArgs->Arg5 = ArmSmcArgs->Arg2; 4201f25ada2SHisping Lin ArmSmcArgs->Arg1 = 0; 4211f25ada2SHisping Lin ArmSmcArgs->Arg4 = 0; 422abdd2437Shisping break; 423abdd2437Shisping } 424abdd2437Shisping 425abdd2437Shisping case TEESMC_RPC_FUNC_ALLOC_PAYLOAD: { 426abdd2437Shisping TeecResult = OpteeRpcAlloc(ArmSmcArgs->Arg1, &ArmSmcArgs->Arg1); 427abdd2437Shisping break; 428abdd2437Shisping } 429abdd2437Shisping 430abdd2437Shisping case TEESMC_RPC_FUNC_FREE_ARG: { 4311f25ada2SHisping Lin TeecResult = OpteeRpcFree(ArmSmcArgs->Arg2); 432abdd2437Shisping break; 433abdd2437Shisping } 434abdd2437Shisping 435abdd2437Shisping case TEESMC_RPC_FUNC_FREE_PAYLOAD: { 436abdd2437Shisping TeecResult = OpteeRpcFree(ArmSmcArgs->Arg1); 437abdd2437Shisping break; 438abdd2437Shisping } 439abdd2437Shisping 440abdd2437Shisping case TEESMC_RPC_FUNC_IRQ: { 441abdd2437Shisping break; 442abdd2437Shisping } 443abdd2437Shisping 444abdd2437Shisping case TEESMC_RPC_FUNC_CMD: { 4451f25ada2SHisping Lin t_teesmc32_arg *TeeSmc32Arg = 446d156c9ffSHisping Lin (t_teesmc32_arg *)(size_t)((uint64_t)ArmSmcArgs->Arg1 << 32 | ArmSmcArgs->Arg2); 447efb93541SHisping Lin debug("TEEC: TeeSmc32Arg->cmd = 0x%x\n", TeeSmc32Arg->cmd); 448abdd2437Shisping switch (TeeSmc32Arg->cmd) { 4491f25ada2SHisping Lin case OPTEE_MSG_RPC_CMD_SHM_ALLOC_V2: { 4501f25ada2SHisping Lin uint32_t tempaddr; 4511f25ada2SHisping Lin uint32_t allocsize = TeeSmc32Arg->params[0].u.value.b; 4521f25ada2SHisping Lin TeecResult = OpteeRpcAlloc(allocsize, &tempaddr); 453efb93541SHisping Lin debug("TEEC: allocsize = 0x%x tempaddr = 0x%x\n", allocsize, tempaddr); 4541f25ada2SHisping Lin TeeSmc32Arg->params[0].attr = OPTEE_MSG_ATTR_TYPE_TMEM_OUTPUT_V2; 4551f25ada2SHisping Lin TeeSmc32Arg->params[0].u.memref.buf_ptr = tempaddr; 4561f25ada2SHisping Lin TeeSmc32Arg->params[0].u.memref.size = allocsize; 4571f25ada2SHisping Lin TeeSmc32Arg->params[0].u.memref.shm_ref = tempaddr; 4581f25ada2SHisping Lin TeeSmc32Arg->ret = TEE_SUCCESS; 4591f25ada2SHisping Lin break; 4601f25ada2SHisping Lin } 4611f25ada2SHisping Lin case OPTEE_MSG_RPC_CMD_SHM_FREE_V2: { 4621f25ada2SHisping Lin uint32_t tempaddr = TeeSmc32Arg->params[0].u.value.b; 4631f25ada2SHisping Lin TeecResult = OpteeRpcFree(tempaddr); 4641f25ada2SHisping Lin break; 4651f25ada2SHisping Lin 4661f25ada2SHisping Lin } 467fd9c6bd7SJason Zhu #ifdef CONFIG_SUPPORT_EMMC_RPMB 4681f25ada2SHisping Lin case OPTEE_MSG_RPC_CMD_RPMB_V2: { 4691f25ada2SHisping Lin TeecResult = OpteeRpcCmdRpmb(TeeSmc32Arg); 4701f25ada2SHisping Lin break; 4711f25ada2SHisping Lin } 472fd9c6bd7SJason Zhu #endif 4733251364cSHisping Lin case OPTEE_MSG_RPC_CMD_FS_V2: { 4743251364cSHisping Lin TeecResult = OpteeRpcCmdFs(TeeSmc32Arg); 4753251364cSHisping Lin break; 4763251364cSHisping Lin } 4771f25ada2SHisping Lin case OPTEE_MSG_RPC_CMD_LOAD_TA_V2: { 4781f25ada2SHisping Lin TeecResult = OpteeRpcCmdLoadV2Ta(TeeSmc32Arg); 4791f25ada2SHisping Lin break; 4801f25ada2SHisping Lin } 481abdd2437Shisping 482abdd2437Shisping default: { 483efb93541SHisping Lin printf("TEEC: ...unsupported RPC CMD: cmd=0x%X\n", 484abdd2437Shisping TeeSmc32Arg->cmd); 485abdd2437Shisping TeecResult = TEEC_ERROR_NOT_IMPLEMENTED; 486abdd2437Shisping break; 487abdd2437Shisping } 488abdd2437Shisping } 489abdd2437Shisping 490abdd2437Shisping break; 491abdd2437Shisping } 492abdd2437Shisping 493abdd2437Shisping case TEESMC_OPTEE_RPC_FUNC_ALLOC_PAYLOAD: { 494abdd2437Shisping TeecResult = OpteeRpcAlloc(ArmSmcArgs->Arg1, &ArmSmcArgs->Arg1); 495abdd2437Shisping ArmSmcArgs->Arg2 = ArmSmcArgs->Arg1; 496abdd2437Shisping break; 497abdd2437Shisping } 498abdd2437Shisping 499abdd2437Shisping case TEESMC_OPTEE_RPC_FUNC_FREE_PAYLOAD: { 500abdd2437Shisping TeecResult = OpteeRpcFree(ArmSmcArgs->Arg1); 501abdd2437Shisping break; 502abdd2437Shisping } 503abdd2437Shisping 504abdd2437Shisping default: { 505efb93541SHisping Lin printf("TEEC: ...unsupported RPC : Arg0=0x%X\n", ArmSmcArgs->Arg0); 506abdd2437Shisping TeecResult = TEEC_ERROR_NOT_IMPLEMENTED; 507abdd2437Shisping break; 508abdd2437Shisping } 509abdd2437Shisping } 510abdd2437Shisping 511abdd2437Shisping ArmSmcArgs->Arg0 = TEESMC32_CALL_RETURN_FROM_RPC; 512efb93541SHisping Lin debug("TEEC: OpteeRpcCallback Exit : TeecResult=0x%X\n", TeecResult); 513abdd2437Shisping 514abdd2437Shisping return TeecResult; 515abdd2437Shisping } 516