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