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> 11abdd2437Shisping #include <optee_include/OpteeClientMem.h> 12abdd2437Shisping #include <optee_include/OpteeClientRPC.h> 13abdd2437Shisping #include <optee_include/teesmc.h> 14*1f25ada2SHisping Lin #include <optee_include/teesmc_v2.h> 15abdd2437Shisping #include <optee_include/teesmc_optee.h> 16abdd2437Shisping #include <optee_include/tee_rpc_types.h> 17abdd2437Shisping #include <optee_include/tee_rpc.h> 18abdd2437Shisping #include <optee_include/258be795-f9ca-40e6-a8699ce6886c5d5d.h> 19*1f25ada2SHisping Lin #include <optee_include/OpteeClientRkFs.h> 20abdd2437Shisping 21abdd2437Shisping /* 22abdd2437Shisping * Memory allocation. 23abdd2437Shisping * Currently treated the same for both arguments & payloads. 24abdd2437Shisping */ 25abdd2437Shisping TEEC_Result OpteeRpcAlloc(uint32_t Size, uint32_t *Address) 26abdd2437Shisping { 27abdd2437Shisping TEEC_Result TeecResult = TEEC_SUCCESS; 28*1f25ada2SHisping Lin size_t AllocAddress; 29abdd2437Shisping 30abdd2437Shisping *Address = 0; 31abdd2437Shisping 32abdd2437Shisping if (Size != 0) { 33*1f25ada2SHisping Lin AllocAddress = (size_t) OpteeClientMemAlloc(Size); 34abdd2437Shisping 35abdd2437Shisping if (AllocAddress == 0) 36abdd2437Shisping TeecResult = TEEC_ERROR_OUT_OF_MEMORY; 37abdd2437Shisping else 38abdd2437Shisping *Address = AllocAddress; 39abdd2437Shisping } 40abdd2437Shisping return TeecResult; 41abdd2437Shisping } 42abdd2437Shisping 43abdd2437Shisping /* 44abdd2437Shisping * Memory free. 45abdd2437Shisping * Currently treated the same for both arguments & payloads. 46abdd2437Shisping */ 47abdd2437Shisping TEEC_Result OpteeRpcFree(uint32_t Address) 48abdd2437Shisping { 49*1f25ada2SHisping Lin OpteeClientMemFree((void *)(size_t)Address); 50abdd2437Shisping return TEEC_SUCCESS; 51abdd2437Shisping } 52abdd2437Shisping 53abdd2437Shisping /* 54abdd2437Shisping * Load a TA from storage into memory and provide it back to OpTEE. 55abdd2437Shisping * Param[0] = IN: struct tee_rpc_load_ta_cmd 56abdd2437Shisping * Param[1] = IN: all-zero OUT: TA Image allocated 57abdd2437Shisping */ 58abdd2437Shisping TEEC_Result OpteeRpcCmdLoadTa(t_teesmc32_arg *TeeSmc32Arg) 59abdd2437Shisping { 60abdd2437Shisping TEEC_Result TeecResult = TEEC_SUCCESS; 61abdd2437Shisping t_teesmc32_param *TeeSmc32Param = NULL; 62abdd2437Shisping struct tee_rpc_load_ta_cmd *TeeLoadTaCmd = NULL; 63abdd2437Shisping uint32_t TeeLoadTaCmdSize = 0; 64abdd2437Shisping 65abdd2437Shisping if (TeeSmc32Arg->num_params != 2) { 66abdd2437Shisping TeecResult = TEEC_ERROR_BAD_PARAMETERS; 67abdd2437Shisping goto Exit; 68abdd2437Shisping } 69abdd2437Shisping 70abdd2437Shisping TeeSmc32Param = TEESMC32_GET_PARAMS(TeeSmc32Arg); 71abdd2437Shisping TeeLoadTaCmd = (struct tee_rpc_load_ta_cmd *) 72*1f25ada2SHisping Lin (size_t)TeeSmc32Param[0].u.memref.buf_ptr; 73abdd2437Shisping TeeLoadTaCmdSize = TeeSmc32Param[0].u.memref.size; 74abdd2437Shisping 75abdd2437Shisping if ((TeeLoadTaCmd == NULL) || 76abdd2437Shisping (TeeLoadTaCmdSize != sizeof(*TeeLoadTaCmd))) { 77abdd2437Shisping TeecResult = TEEC_ERROR_BAD_PARAMETERS; 78abdd2437Shisping goto Exit; 79abdd2437Shisping } 80abdd2437Shisping 81abdd2437Shisping TEEC_Result Status = 0; 82abdd2437Shisping void *ImageData = NULL; 83abdd2437Shisping uint32_t ImageSize = 0; 84*1f25ada2SHisping Lin size_t AllocAddress = 0; 85abdd2437Shisping 86abdd2437Shisping ImageData = (void *)keymaster_data; 87abdd2437Shisping ImageSize = keymaster_size; 88abdd2437Shisping 89abdd2437Shisping if (Status != 0) { 90abdd2437Shisping TeecResult = TEEC_ERROR_ITEM_NOT_FOUND; 91abdd2437Shisping goto Exit; 92abdd2437Shisping } 93abdd2437Shisping 94*1f25ada2SHisping Lin AllocAddress = (size_t) OpteeClientMemAlloc(ImageSize); 95abdd2437Shisping 96abdd2437Shisping if (AllocAddress == 0) { 97abdd2437Shisping TeecResult = TEEC_ERROR_OUT_OF_MEMORY; 98abdd2437Shisping goto Exit; 99abdd2437Shisping } 100abdd2437Shisping 101abdd2437Shisping memcpy((void *)AllocAddress, ImageData, ImageSize); 102abdd2437Shisping 103*1f25ada2SHisping Lin debug("...TA loaded at 0x%zu of size 0x%X bytes\n", 104abdd2437Shisping AllocAddress, ImageSize); 105abdd2437Shisping debug("...AllocAddress[0] 0x%X ; AllocAddress[1] 0x%X bytes\n", 106abdd2437Shisping *(char *)AllocAddress, *(char *)(AllocAddress+1)); 107abdd2437Shisping 108*1f25ada2SHisping Lin TeeLoadTaCmd->va = AllocAddress; 109abdd2437Shisping 110abdd2437Shisping TeeSmc32Param[1].u.memref.buf_ptr = AllocAddress; 111abdd2437Shisping TeeSmc32Param[1].u.memref.size = ImageSize; 112abdd2437Shisping 113abdd2437Shisping Exit: 114abdd2437Shisping TeeSmc32Arg->ret = TeecResult; 115abdd2437Shisping TeeSmc32Arg->ret_origin = TEEC_ORIGIN_API; 116abdd2437Shisping 117abdd2437Shisping debug("OpteeRpcCmdLoadTa Exit : TeecResult=0x%X\n", TeecResult); 118abdd2437Shisping 119abdd2437Shisping return TeecResult; 120abdd2437Shisping } 121abdd2437Shisping 122*1f25ada2SHisping Lin #ifdef CONFIG_OPTEE_V2 123*1f25ada2SHisping Lin TEEC_Result OpteeRpcCmdLoadV2Ta(t_teesmc32_arg *TeeSmc32Arg) 124*1f25ada2SHisping Lin { 125*1f25ada2SHisping Lin TEEC_Result TeecResult = TEEC_SUCCESS; 126*1f25ada2SHisping Lin t_teesmc32_param *TeeSmc32Param = NULL; 127*1f25ada2SHisping Lin uint8_t uuid[16]; 128*1f25ada2SHisping Lin int i; 129*1f25ada2SHisping Lin 130*1f25ada2SHisping Lin if (TeeSmc32Arg->num_params != 2) { 131*1f25ada2SHisping Lin TeecResult = TEEC_ERROR_BAD_PARAMETERS; 132*1f25ada2SHisping Lin goto Exit; 133*1f25ada2SHisping Lin } 134*1f25ada2SHisping Lin 135*1f25ada2SHisping Lin TeeSmc32Param = TEESMC32_GET_PARAMS(TeeSmc32Arg); 136*1f25ada2SHisping Lin 137*1f25ada2SHisping Lin memcpy(uuid, (void *)&TeeSmc32Param[0].u.value, 16); 138*1f25ada2SHisping Lin for (i = 0; i < 16; i++) 139*1f25ada2SHisping Lin printf("uuid 0x%x", uuid[i]); 140*1f25ada2SHisping Lin 141*1f25ada2SHisping Lin if (TeeSmc32Param[1].u.memref.buf_ptr == 0) { 142*1f25ada2SHisping Lin printf("return size of TA, keymaster_size = 0x%x", keymaster_size); 143*1f25ada2SHisping Lin TeeSmc32Param[1].u.memref.size = keymaster_size; 144*1f25ada2SHisping Lin } else { 145*1f25ada2SHisping Lin memcpy((void *)TeeSmc32Param[1].u.memref.buf_ptr, 146*1f25ada2SHisping Lin (void *)keymaster_data, TeeSmc32Param[1].u.memref.size); 147*1f25ada2SHisping Lin printf("memref.buf_ptr = 0x%llx; memref.size = 0x%llx", 148*1f25ada2SHisping Lin TeeSmc32Param[1].u.memref.buf_ptr, 149*1f25ada2SHisping Lin TeeSmc32Param[1].u.memref.size); 150*1f25ada2SHisping Lin } 151*1f25ada2SHisping Lin 152*1f25ada2SHisping Lin Exit: 153*1f25ada2SHisping Lin TeeSmc32Arg->ret = TeecResult; 154*1f25ada2SHisping Lin TeeSmc32Arg->ret_origin = TEEC_ORIGIN_API; 155*1f25ada2SHisping Lin 156*1f25ada2SHisping Lin debug("OpteeRpcCmdLoadTa Exit : TeecResult=0x%X\n", TeecResult); 157*1f25ada2SHisping Lin 158*1f25ada2SHisping Lin return TeecResult; 159*1f25ada2SHisping Lin } 160*1f25ada2SHisping Lin #endif 161*1f25ada2SHisping Lin 162abdd2437Shisping /* 163abdd2437Shisping * Free a previously loaded TA and release the memory 164abdd2437Shisping * Param[0] = IN: TA Image to free 165abdd2437Shisping * 166abdd2437Shisping * Um, why is OpTEE holding on to this memory? The OS code suggests that OpTEE 167abdd2437Shisping * is using the binary in place out of shared memory but I don't understand how 168abdd2437Shisping * runtime modifications of the binary are being prevented if that's the case? 169abdd2437Shisping */ 170abdd2437Shisping TEEC_Result OpteeRpcCmdFreeTa(t_teesmc32_arg *TeeSmc32Arg) 171abdd2437Shisping { 172abdd2437Shisping TEEC_Result TeecResult = TEEC_SUCCESS; 173abdd2437Shisping t_teesmc32_param *TeeSmc32Param = NULL; 174abdd2437Shisping uint32_t ImageSize = 0; 175*1f25ada2SHisping Lin size_t AllocAddress = 0; 176abdd2437Shisping 177abdd2437Shisping if (TeeSmc32Arg->num_params != 1) { 178abdd2437Shisping TeecResult = TEEC_ERROR_BAD_PARAMETERS; 179abdd2437Shisping goto Exit; 180abdd2437Shisping } 181abdd2437Shisping 182abdd2437Shisping TeeSmc32Param = TEESMC32_GET_PARAMS(TeeSmc32Arg); 183abdd2437Shisping 184abdd2437Shisping AllocAddress = TeeSmc32Param[0].u.memref.buf_ptr; 185abdd2437Shisping ImageSize = TeeSmc32Param[0].u.memref.size; 186abdd2437Shisping 187abdd2437Shisping debug("OpteeRpcCmdFreeTa Enter: AllocAddress=0x%X, ImageSize=0x%X\n", 188abdd2437Shisping (uint32_t) AllocAddress, (uint32_t) ImageSize); 189abdd2437Shisping 190abdd2437Shisping if (AllocAddress == 0) { 191abdd2437Shisping TeecResult = TEEC_ERROR_BAD_PARAMETERS; 192abdd2437Shisping goto Exit; 193abdd2437Shisping } 194abdd2437Shisping 195abdd2437Shisping OpteeClientMemFree((void *)AllocAddress); 196abdd2437Shisping 197abdd2437Shisping Exit: 198abdd2437Shisping TeeSmc32Arg->ret = TeecResult; 199abdd2437Shisping TeeSmc32Arg->ret_origin = TEEC_ORIGIN_API; 200abdd2437Shisping 201abdd2437Shisping debug("OpteeRpcCmdFreeTa Exit : TeecResult=0x%X\n", TeecResult); 202abdd2437Shisping 203abdd2437Shisping return TeecResult; 204abdd2437Shisping } 205abdd2437Shisping 206abdd2437Shisping /* 207abdd2437Shisping * Execute an RPMB storage operation. 208abdd2437Shisping */ 209*1f25ada2SHisping Lin 210abdd2437Shisping uint16_t global_block_count; 211abdd2437Shisping TEEC_Result OpteeRpcCmdRpmb(t_teesmc32_arg *TeeSmc32Arg) 212abdd2437Shisping { 213abdd2437Shisping struct tee_rpc_rpmb_dev_info *DevInfo; 214abdd2437Shisping TEEC_Result EfiStatus; 215abdd2437Shisping uint16_t RequestMsgType, i; 216abdd2437Shisping EFI_RK_RPMB_DATA_PACKET *RequestPackets; 217abdd2437Shisping EFI_RK_RPMB_DATA_PACKET *ResponsePackets; 218abdd2437Shisping EFI_RK_RPMB_DATA_PACKET *tempPackets; 219abdd2437Shisping EFI_RK_RPMB_DATA_PACKET_BACK *RequestPackets_back; 220abdd2437Shisping EFI_RK_RPMB_DATA_PACKET_BACK *tempPackets_back; 221abdd2437Shisping struct tee_rpc_rpmb_cmd *RpmbRequest; 222abdd2437Shisping TEEC_Result TeecResult = TEEC_SUCCESS; 223abdd2437Shisping t_teesmc32_param *TeeSmc32Param; 224abdd2437Shisping struct mmc *mmc; 225abdd2437Shisping 226abdd2437Shisping debug("Entered RPMB RPC\n"); 227abdd2437Shisping 228abdd2437Shisping if (TeeSmc32Arg->num_params != 2) { 229abdd2437Shisping TeecResult = TEEC_ERROR_BAD_PARAMETERS; 230abdd2437Shisping goto Exit; 231abdd2437Shisping } 232abdd2437Shisping 233abdd2437Shisping TeeSmc32Param = TEESMC32_GET_PARAMS(TeeSmc32Arg); 234*1f25ada2SHisping Lin RpmbRequest = (struct tee_rpc_rpmb_cmd *)(size_t) 235abdd2437Shisping TeeSmc32Param[0].u.memref.buf_ptr; 236abdd2437Shisping switch (RpmbRequest->cmd) { 237abdd2437Shisping case TEE_RPC_RPMB_CMD_DATA_REQ: { 238abdd2437Shisping RequestPackets = (EFI_RK_RPMB_DATA_PACKET *)(RpmbRequest + 1); 239*1f25ada2SHisping Lin ResponsePackets = (EFI_RK_RPMB_DATA_PACKET *)(size_t) 240abdd2437Shisping TeeSmc32Param[1].u.memref.buf_ptr; 241abdd2437Shisping 242abdd2437Shisping global_block_count = 243abdd2437Shisping (RpmbRequest->block_count == 0 ? 244abdd2437Shisping 1 : RpmbRequest->block_count); 245abdd2437Shisping RequestPackets_back = 246abdd2437Shisping malloc(sizeof(EFI_RK_RPMB_DATA_PACKET_BACK) 247abdd2437Shisping * global_block_count); 248abdd2437Shisping memcpy(RequestPackets_back->stuff, 249abdd2437Shisping RequestPackets->stuff_bytes, 250abdd2437Shisping RPMB_STUFF_DATA_SIZE); 251abdd2437Shisping memcpy(RequestPackets_back->mac, 252abdd2437Shisping RequestPackets->key_mac, 253abdd2437Shisping RPMB_KEY_MAC_SIZE); 254abdd2437Shisping memcpy(RequestPackets_back->data, 255abdd2437Shisping RequestPackets->data, 256abdd2437Shisping RPMB_DATA_SIZE); 257abdd2437Shisping memcpy(RequestPackets_back->nonce, 258abdd2437Shisping RequestPackets->nonce, 259abdd2437Shisping RPMB_NONCE_SIZE); 260abdd2437Shisping RequestPackets_back->write_counter = 261abdd2437Shisping ((RequestPackets->write_counter[3]) << 24) + 262abdd2437Shisping ((RequestPackets->write_counter[2]) << 16) + 263abdd2437Shisping ((RequestPackets->write_counter[1]) << 8) + 264abdd2437Shisping (RequestPackets->write_counter[0]); 265abdd2437Shisping RequestPackets_back->address = 266abdd2437Shisping ((RequestPackets->address[1]) << 8) + 267abdd2437Shisping (RequestPackets->address[0]); 268abdd2437Shisping RequestPackets_back->block_count = 269abdd2437Shisping ((RequestPackets->block_count[1]) << 8) + 270abdd2437Shisping (RequestPackets->block_count[0]); 271abdd2437Shisping RequestPackets_back->result = 272abdd2437Shisping ((RequestPackets->op_result[1]) << 8) + 273abdd2437Shisping (RequestPackets->op_result[0]); 274abdd2437Shisping RequestPackets_back->request = 275abdd2437Shisping ((RequestPackets->msg_type[1]) << 8) + 276abdd2437Shisping (RequestPackets->msg_type[0]); 277abdd2437Shisping 278abdd2437Shisping RequestMsgType = RPMB_PACKET_DATA_TO_UINT16( 279abdd2437Shisping RequestPackets->msg_type); 280abdd2437Shisping 281abdd2437Shisping debug("RPMB Data request %d\n", RequestMsgType); 282abdd2437Shisping 283abdd2437Shisping switch (RequestMsgType) { 284abdd2437Shisping case TEE_RPC_RPMB_MSG_TYPE_REQ_AUTH_KEY_PROGRAM: { 285abdd2437Shisping EfiStatus = init_rpmb(); 286abdd2437Shisping if (EfiStatus != 0) { 287abdd2437Shisping TeecResult = TEEC_ERROR_GENERIC; 288abdd2437Shisping break; 289abdd2437Shisping } 290abdd2437Shisping 291abdd2437Shisping EfiStatus = do_programkey((struct s_rpmb *) 292abdd2437Shisping RequestPackets_back); 293abdd2437Shisping 294abdd2437Shisping if (EfiStatus != 0) { 295abdd2437Shisping TeecResult = TEEC_ERROR_GENERIC; 296abdd2437Shisping break; 297abdd2437Shisping } 298abdd2437Shisping 299abdd2437Shisping EfiStatus = finish_rpmb(); 300abdd2437Shisping if (EfiStatus != 0) { 301abdd2437Shisping TeecResult = TEEC_ERROR_GENERIC; 302abdd2437Shisping break; 303abdd2437Shisping } 304abdd2437Shisping 305abdd2437Shisping break; 306abdd2437Shisping } 307abdd2437Shisping 308abdd2437Shisping case TEE_RPC_RPMB_MSG_TYPE_REQ_WRITE_COUNTER_VAL_READ: { 309abdd2437Shisping EfiStatus = init_rpmb(); 310abdd2437Shisping if (EfiStatus != 0) { 311abdd2437Shisping TeecResult = TEEC_ERROR_GENERIC; 312abdd2437Shisping break; 313abdd2437Shisping } 314abdd2437Shisping 315abdd2437Shisping EfiStatus = do_readcounter((struct s_rpmb *) 316abdd2437Shisping RequestPackets_back); 317abdd2437Shisping if (EfiStatus != 0) { 318abdd2437Shisping TeecResult = TEEC_ERROR_GENERIC; 319abdd2437Shisping break; 320abdd2437Shisping } 321abdd2437Shisping 322abdd2437Shisping EfiStatus = finish_rpmb(); 323abdd2437Shisping if (EfiStatus != 0) { 324abdd2437Shisping TeecResult = TEEC_ERROR_GENERIC; 325abdd2437Shisping break; 326abdd2437Shisping } 327abdd2437Shisping 328abdd2437Shisping break; 329abdd2437Shisping } 330abdd2437Shisping 331abdd2437Shisping case TEE_RPC_RPMB_MSG_TYPE_REQ_AUTH_DATA_WRITE: { 332abdd2437Shisping EfiStatus = init_rpmb(); 333abdd2437Shisping if (EfiStatus != 0) { 334abdd2437Shisping TeecResult = TEEC_ERROR_GENERIC; 335abdd2437Shisping break; 336abdd2437Shisping } 337abdd2437Shisping 338abdd2437Shisping EfiStatus = do_authenticatedwrite((struct s_rpmb *) 339abdd2437Shisping RequestPackets_back); 340abdd2437Shisping if (EfiStatus != 0) { 341abdd2437Shisping TeecResult = TEEC_ERROR_GENERIC; 342abdd2437Shisping break; 343abdd2437Shisping } 344abdd2437Shisping 345abdd2437Shisping EfiStatus = finish_rpmb(); 346abdd2437Shisping 347abdd2437Shisping if (EfiStatus != 0) { 348abdd2437Shisping TeecResult = TEEC_ERROR_GENERIC; 349abdd2437Shisping break; 350abdd2437Shisping } 351abdd2437Shisping 352abdd2437Shisping break; 353abdd2437Shisping } 354abdd2437Shisping 355abdd2437Shisping case TEE_RPC_RPMB_MSG_TYPE_REQ_AUTH_DATA_READ: { 356abdd2437Shisping EfiStatus = init_rpmb(); 357abdd2437Shisping if (EfiStatus != 0) { 358abdd2437Shisping TeecResult = TEEC_ERROR_GENERIC; 359abdd2437Shisping break; 360abdd2437Shisping } 361abdd2437Shisping 362abdd2437Shisping EfiStatus = do_authenticatedread((struct s_rpmb *) 363abdd2437Shisping RequestPackets_back, global_block_count); 364abdd2437Shisping if (EfiStatus != 0) { 365abdd2437Shisping TeecResult = TEEC_ERROR_GENERIC; 366abdd2437Shisping break; 367abdd2437Shisping } 368abdd2437Shisping 369abdd2437Shisping EfiStatus = finish_rpmb(); 370abdd2437Shisping 371abdd2437Shisping if (EfiStatus != 0) { 372abdd2437Shisping TeecResult = TEEC_ERROR_GENERIC; 373abdd2437Shisping break; 374abdd2437Shisping } 375abdd2437Shisping 376abdd2437Shisping break; 377abdd2437Shisping } 378abdd2437Shisping 379abdd2437Shisping default: 380abdd2437Shisping TeecResult = TEEC_ERROR_BAD_PARAMETERS; 381abdd2437Shisping break; 382abdd2437Shisping } 383abdd2437Shisping debug("RPMB TeecResult %d\n", TeecResult); 384abdd2437Shisping break; 385abdd2437Shisping } 386abdd2437Shisping 387abdd2437Shisping case TEE_RPC_RPMB_CMD_GET_DEV_INFO: { 388abdd2437Shisping mmc = do_returnmmc(); 389abdd2437Shisping 390*1f25ada2SHisping Lin DevInfo = (struct tee_rpc_rpmb_dev_info *)(size_t) 391abdd2437Shisping TeeSmc32Param[1].u.memref.buf_ptr; 392abdd2437Shisping 393abdd2437Shisping DevInfo->cid[0] = (mmc->cid[0]) >> 24 & 0xff; 394abdd2437Shisping DevInfo->cid[1] = (mmc->cid[0]) >> 16 & 0xff; 395abdd2437Shisping DevInfo->cid[2] = (mmc->cid[0]) >> 8 & 0xff; 396abdd2437Shisping DevInfo->cid[3] = (mmc->cid[0]) & 0xff; 397abdd2437Shisping DevInfo->cid[4] = (mmc->cid[1]) >> 24 & 0xff; 398abdd2437Shisping DevInfo->cid[5] = (mmc->cid[1]) >> 16 & 0xff; 399abdd2437Shisping DevInfo->cid[6] = (mmc->cid[1]) >> 8 & 0xff; 400abdd2437Shisping DevInfo->cid[7] = (mmc->cid[1]) & 0xff; 401abdd2437Shisping DevInfo->cid[8] = (mmc->cid[2]) >> 24 & 0xff; 402abdd2437Shisping DevInfo->cid[9] = (mmc->cid[2]) >> 16 & 0xff; 403abdd2437Shisping DevInfo->cid[10] = (mmc->cid[2]) >> 8 & 0xff; 404abdd2437Shisping DevInfo->cid[11] = (mmc->cid[2]) & 0xff; 405abdd2437Shisping DevInfo->cid[12] = (mmc->cid[3]) >> 24 & 0xff; 406abdd2437Shisping DevInfo->cid[13] = (mmc->cid[3]) >> 16 & 0xff; 407abdd2437Shisping DevInfo->cid[14] = (mmc->cid[3]) >> 8 & 0xff; 408abdd2437Shisping DevInfo->cid[15] = (mmc->cid[3]) & 0xff; 409abdd2437Shisping DevInfo->rel_wr_sec_c = 1; 410abdd2437Shisping DevInfo->rpmb_size_mult = 411abdd2437Shisping (uint8_t)(mmc->capacity_rpmb / (128 * 1024)); 412abdd2437Shisping DevInfo->ret_code = 0; 413abdd2437Shisping 414abdd2437Shisping goto Exit; 415abdd2437Shisping } 416abdd2437Shisping 417abdd2437Shisping default: 418abdd2437Shisping TeecResult = TEEC_ERROR_BAD_PARAMETERS; 419abdd2437Shisping 420abdd2437Shisping goto Exit; 421abdd2437Shisping } 422abdd2437Shisping 423abdd2437Shisping tempPackets = ResponsePackets; 424abdd2437Shisping tempPackets_back = RequestPackets_back; 425abdd2437Shisping 426abdd2437Shisping for (i = 0; i < global_block_count; i++) { 427abdd2437Shisping memcpy(tempPackets->stuff_bytes, 428abdd2437Shisping tempPackets_back->stuff, 429abdd2437Shisping RPMB_STUFF_DATA_SIZE); 430abdd2437Shisping memcpy(tempPackets->key_mac, 431abdd2437Shisping tempPackets_back->mac, 432abdd2437Shisping RPMB_KEY_MAC_SIZE); 433abdd2437Shisping memcpy(tempPackets->data, 434abdd2437Shisping tempPackets_back->data, 435abdd2437Shisping RPMB_DATA_SIZE); 436abdd2437Shisping memcpy(tempPackets->nonce, 437abdd2437Shisping tempPackets_back->nonce, 438abdd2437Shisping RPMB_NONCE_SIZE); 439abdd2437Shisping tempPackets->write_counter[3] = 440abdd2437Shisping ((tempPackets_back->write_counter) >> 24) & 0xFF; 441abdd2437Shisping tempPackets->write_counter[2] = 442abdd2437Shisping ((tempPackets_back->write_counter) >> 16) & 0xFF; 443abdd2437Shisping tempPackets->write_counter[1] = 444abdd2437Shisping ((tempPackets_back->write_counter) >> 8) & 0xFF; 445abdd2437Shisping tempPackets->write_counter[0] = 446abdd2437Shisping (tempPackets_back->write_counter) & 0xFF; 447abdd2437Shisping tempPackets->address[1] = 448abdd2437Shisping ((tempPackets_back->address) >> 8) & 0xFF; 449abdd2437Shisping tempPackets->address[0] = 450abdd2437Shisping (tempPackets_back->address) & 0xFF; 451abdd2437Shisping tempPackets->block_count[1] = 452abdd2437Shisping ((tempPackets_back->block_count) >> 8) & 0xFF; 453abdd2437Shisping tempPackets->block_count[0] = 454abdd2437Shisping (tempPackets_back->block_count) & 0xFF; 455abdd2437Shisping tempPackets->op_result[1] = 456abdd2437Shisping ((tempPackets_back->result) >> 8) & 0xFF; 457abdd2437Shisping tempPackets->op_result[0] = 458abdd2437Shisping (tempPackets_back->result) & 0xFF; 459abdd2437Shisping tempPackets->msg_type[1] = 460abdd2437Shisping ((tempPackets_back->request) >> 8) & 0xFF; 461abdd2437Shisping tempPackets->msg_type[0] = 462abdd2437Shisping (tempPackets_back->request) & 0xFF; 463abdd2437Shisping tempPackets++; 464abdd2437Shisping tempPackets_back++; 465abdd2437Shisping } 466abdd2437Shisping 467abdd2437Shisping free(RequestPackets_back); 468abdd2437Shisping 469abdd2437Shisping Exit: 470abdd2437Shisping TeeSmc32Arg->ret = TeecResult; 471abdd2437Shisping TeeSmc32Arg->ret_origin = TEEC_ORIGIN_API; 472abdd2437Shisping 473abdd2437Shisping return TeecResult; 474abdd2437Shisping } 475abdd2437Shisping 476abdd2437Shisping /* 477abdd2437Shisping * Execute a normal world local file system operation. 478abdd2437Shisping */ 479abdd2437Shisping TEEC_Result OpteeRpcCmdFs(t_teesmc32_arg *TeeSmc32Arg) 480abdd2437Shisping { 481*1f25ada2SHisping Lin TEEC_Result TeecResult = TEEC_SUCCESS; 482*1f25ada2SHisping Lin t_teesmc32_param *TeeSmc32Param; 483abdd2437Shisping 484*1f25ada2SHisping Lin TeeSmc32Param = TEESMC32_GET_PARAMS(TeeSmc32Arg); 485*1f25ada2SHisping Lin TeecResult = tee_supp_rk_fs_process((void *)(size_t)TeeSmc32Param[0].u.memref.buf_ptr, 486*1f25ada2SHisping Lin TeeSmc32Param[0].u.memref.size); 487*1f25ada2SHisping Lin 488*1f25ada2SHisping Lin return TeecResult; 489*1f25ada2SHisping Lin } 490abdd2437Shisping 491abdd2437Shisping /* 492abdd2437Shisping * TBD. 493abdd2437Shisping */ 494abdd2437Shisping TEEC_Result OpteeRpcCmdGetTime(t_teesmc32_arg *TeeSmc32Arg) 495abdd2437Shisping { 496abdd2437Shisping return TEEC_ERROR_NOT_IMPLEMENTED; 497abdd2437Shisping } 498abdd2437Shisping 499abdd2437Shisping /* 500abdd2437Shisping * TBD. 501abdd2437Shisping */ 502abdd2437Shisping TEEC_Result OpteeRpcCmdWaitMutex(t_teesmc32_arg *TeeSmc32Arg) 503abdd2437Shisping { 504abdd2437Shisping return TEEC_ERROR_NOT_IMPLEMENTED; 505abdd2437Shisping } 506abdd2437Shisping 507abdd2437Shisping /* 508abdd2437Shisping * Handle the callback from secure world. 509abdd2437Shisping */ 510abdd2437Shisping TEEC_Result OpteeRpcCallback(ARM_SMC_ARGS *ArmSmcArgs) 511abdd2437Shisping { 512abdd2437Shisping TEEC_Result TeecResult = TEEC_SUCCESS; 513abdd2437Shisping 514*1f25ada2SHisping Lin //printf("OpteeRpcCallback Enter: Arg0=0x%X, Arg1=0x%X, Arg2=0x%X\n", 515*1f25ada2SHisping Lin //ArmSmcArgs->Arg0, ArmSmcArgs->Arg1, ArmSmcArgs->Arg2); 516abdd2437Shisping 517abdd2437Shisping switch (TEESMC_RETURN_GET_RPC_FUNC(ArmSmcArgs->Arg0)) { 518abdd2437Shisping case TEESMC_RPC_FUNC_ALLOC_ARG: { 519*1f25ada2SHisping Lin #ifdef CONFIG_OPTEE_V1 520abdd2437Shisping TeecResult = OpteeRpcAlloc(ArmSmcArgs->Arg1, &ArmSmcArgs->Arg1); 521*1f25ada2SHisping Lin #endif 522*1f25ada2SHisping Lin #ifdef CONFIG_OPTEE_V2 523*1f25ada2SHisping Lin printf("ArmSmcArgs->Arg1 = 0x%x", ArmSmcArgs->Arg1); 524*1f25ada2SHisping Lin TeecResult = OpteeRpcAlloc(ArmSmcArgs->Arg1, &ArmSmcArgs->Arg2); 525*1f25ada2SHisping Lin ArmSmcArgs->Arg5 = ArmSmcArgs->Arg2; 526*1f25ada2SHisping Lin ArmSmcArgs->Arg1 = 0; 527*1f25ada2SHisping Lin ArmSmcArgs->Arg4 = 0; 528*1f25ada2SHisping Lin #endif 529abdd2437Shisping break; 530abdd2437Shisping } 531abdd2437Shisping 532abdd2437Shisping case TEESMC_RPC_FUNC_ALLOC_PAYLOAD: { 533abdd2437Shisping TeecResult = OpteeRpcAlloc(ArmSmcArgs->Arg1, &ArmSmcArgs->Arg1); 534abdd2437Shisping break; 535abdd2437Shisping } 536abdd2437Shisping 537abdd2437Shisping case TEESMC_RPC_FUNC_FREE_ARG: { 538*1f25ada2SHisping Lin #ifdef CONFIG_OPTEE_V1 539abdd2437Shisping TeecResult = OpteeRpcFree(ArmSmcArgs->Arg1); 540*1f25ada2SHisping Lin #endif 541*1f25ada2SHisping Lin #ifdef CONFIG_OPTEE_V2 542*1f25ada2SHisping Lin TeecResult = OpteeRpcFree(ArmSmcArgs->Arg2); 543*1f25ada2SHisping Lin #endif 544abdd2437Shisping break; 545abdd2437Shisping } 546abdd2437Shisping 547abdd2437Shisping case TEESMC_RPC_FUNC_FREE_PAYLOAD: { 548abdd2437Shisping TeecResult = OpteeRpcFree(ArmSmcArgs->Arg1); 549abdd2437Shisping break; 550abdd2437Shisping } 551abdd2437Shisping 552abdd2437Shisping case TEESMC_RPC_FUNC_IRQ: { 553abdd2437Shisping break; 554abdd2437Shisping } 555abdd2437Shisping 556abdd2437Shisping case TEESMC_RPC_FUNC_CMD: { 557*1f25ada2SHisping Lin #ifdef CONFIG_OPTEE_V1 558abdd2437Shisping t_teesmc32_arg *TeeSmc32Arg = 559*1f25ada2SHisping Lin (t_teesmc32_arg *)(size_t)ArmSmcArgs->Arg1; 560*1f25ada2SHisping Lin #endif 561*1f25ada2SHisping Lin #ifdef CONFIG_OPTEE_V2 562*1f25ada2SHisping Lin t_teesmc32_arg *TeeSmc32Arg = 563*1f25ada2SHisping Lin (t_teesmc32_arg *)((size_t)ArmSmcArgs->Arg1 << 32 | ArmSmcArgs->Arg2); 564*1f25ada2SHisping Lin printf("TeeSmc32Arg->cmd = 0x%x", TeeSmc32Arg->cmd); 565*1f25ada2SHisping Lin #endif 566abdd2437Shisping switch (TeeSmc32Arg->cmd) { 567*1f25ada2SHisping Lin #ifdef CONFIG_OPTEE_V1 568abdd2437Shisping case TEE_RPC_LOAD_TA: { 569abdd2437Shisping TeecResult = OpteeRpcCmdLoadTa(TeeSmc32Arg); 570abdd2437Shisping break; 571abdd2437Shisping } 572abdd2437Shisping 573abdd2437Shisping case TEE_RPC_FREE_TA: { 574abdd2437Shisping TeecResult = OpteeRpcCmdFreeTa(TeeSmc32Arg); 575abdd2437Shisping break; 576abdd2437Shisping } 577abdd2437Shisping 578abdd2437Shisping case TEE_RPC_RPMB_CMD: { 579abdd2437Shisping TeecResult = OpteeRpcCmdRpmb(TeeSmc32Arg); 580abdd2437Shisping break; 581abdd2437Shisping } 582abdd2437Shisping 583abdd2437Shisping case TEE_RPC_FS: { 584abdd2437Shisping TeecResult = OpteeRpcCmdFs(TeeSmc32Arg); 585*1f25ada2SHisping Lin TeeSmc32Arg->ret = TEEC_SUCCESS; 586abdd2437Shisping break; 587abdd2437Shisping } 588abdd2437Shisping 589abdd2437Shisping case TEE_RPC_GET_TIME: { 590abdd2437Shisping TeecResult = OpteeRpcCmdGetTime(TeeSmc32Arg); 591abdd2437Shisping break; 592abdd2437Shisping } 593abdd2437Shisping 594abdd2437Shisping case TEE_RPC_WAIT_MUTEX: { 595abdd2437Shisping TeecResult = OpteeRpcCmdWaitMutex(TeeSmc32Arg); 596abdd2437Shisping break; 597abdd2437Shisping } 598*1f25ada2SHisping Lin #endif 599*1f25ada2SHisping Lin #ifdef CONFIG_OPTEE_V2 600*1f25ada2SHisping Lin case OPTEE_MSG_RPC_CMD_SHM_ALLOC_V2: { 601*1f25ada2SHisping Lin uint32_t tempaddr; 602*1f25ada2SHisping Lin uint32_t allocsize = TeeSmc32Arg->params[0].u.value.b; 603*1f25ada2SHisping Lin TeecResult = OpteeRpcAlloc(allocsize, &tempaddr); 604*1f25ada2SHisping Lin printf("allocsize = 0x%x tempaddr = 0x%x", allocsize, tempaddr); 605*1f25ada2SHisping Lin TeeSmc32Arg->params[0].attr = OPTEE_MSG_ATTR_TYPE_TMEM_OUTPUT_V2; 606*1f25ada2SHisping Lin TeeSmc32Arg->params[0].u.memref.buf_ptr = tempaddr; 607*1f25ada2SHisping Lin TeeSmc32Arg->params[0].u.memref.size = allocsize; 608*1f25ada2SHisping Lin TeeSmc32Arg->params[0].u.memref.shm_ref = tempaddr; 609*1f25ada2SHisping Lin TeeSmc32Arg->ret = TEE_SUCCESS; 610*1f25ada2SHisping Lin break; 611*1f25ada2SHisping Lin } 612*1f25ada2SHisping Lin case OPTEE_MSG_RPC_CMD_SHM_FREE_V2: { 613*1f25ada2SHisping Lin uint32_t tempaddr = TeeSmc32Arg->params[0].u.value.b; 614*1f25ada2SHisping Lin TeecResult = OpteeRpcFree(tempaddr); 615*1f25ada2SHisping Lin break; 616*1f25ada2SHisping Lin 617*1f25ada2SHisping Lin } 618*1f25ada2SHisping Lin case OPTEE_MSG_RPC_CMD_RPMB_V2: { 619*1f25ada2SHisping Lin TeecResult = OpteeRpcCmdRpmb(TeeSmc32Arg); 620*1f25ada2SHisping Lin break; 621*1f25ada2SHisping Lin } 622*1f25ada2SHisping Lin case OPTEE_MSG_RPC_CMD_LOAD_TA_V2: { 623*1f25ada2SHisping Lin TeecResult = OpteeRpcCmdLoadV2Ta(TeeSmc32Arg); 624*1f25ada2SHisping Lin break; 625*1f25ada2SHisping Lin } 626*1f25ada2SHisping Lin #endif 627abdd2437Shisping 628abdd2437Shisping default: { 629abdd2437Shisping printf("...unsupported RPC CMD: cmd=0x%X\n", 630abdd2437Shisping TeeSmc32Arg->cmd); 631abdd2437Shisping TeecResult = TEEC_ERROR_NOT_IMPLEMENTED; 632abdd2437Shisping break; 633abdd2437Shisping } 634abdd2437Shisping } 635abdd2437Shisping 636abdd2437Shisping break; 637abdd2437Shisping } 638abdd2437Shisping 639abdd2437Shisping case TEESMC_OPTEE_RPC_FUNC_ALLOC_PAYLOAD: { 640abdd2437Shisping TeecResult = OpteeRpcAlloc(ArmSmcArgs->Arg1, &ArmSmcArgs->Arg1); 641abdd2437Shisping ArmSmcArgs->Arg2 = ArmSmcArgs->Arg1; 642abdd2437Shisping break; 643abdd2437Shisping } 644abdd2437Shisping 645abdd2437Shisping case TEESMC_OPTEE_RPC_FUNC_FREE_PAYLOAD: { 646abdd2437Shisping TeecResult = OpteeRpcFree(ArmSmcArgs->Arg1); 647abdd2437Shisping break; 648abdd2437Shisping } 649abdd2437Shisping 650abdd2437Shisping default: { 651abdd2437Shisping printf("...unsupported RPC : Arg0=0x%X\n", ArmSmcArgs->Arg0); 652abdd2437Shisping TeecResult = TEEC_ERROR_NOT_IMPLEMENTED; 653abdd2437Shisping break; 654abdd2437Shisping } 655abdd2437Shisping } 656abdd2437Shisping 657abdd2437Shisping ArmSmcArgs->Arg0 = TEESMC32_CALL_RETURN_FROM_RPC; 658abdd2437Shisping debug("OpteeRpcCallback Exit : TeecResult=0x%X\n", TeecResult); 659abdd2437Shisping 660abdd2437Shisping return TeecResult; 661abdd2437Shisping } 662