Lines Matching +full:0 +full:- +full:dev
35 #define LOCAL_LOG 0
40 * Select RXTX map smc variant based on register size. Note that the FF-A spec
54 static int trusty_ffa_send_direct_msg(struct trusty_dev* dev, in trusty_ffa_send_direct_msg() argument
63 src_dst = FFA_PACK_SRC_DST(dev->ffa_local_id, dev->ffa_remote_id); in trusty_ffa_send_direct_msg()
66 smc_ret = smc8(SMC_FC_FFA_MSG_SEND_DIRECT_REQ, src_dst, 0, msg, a0, a1, a2, in trusty_ffa_send_direct_msg()
75 trusty_error("unexpected FFA_INTERRUPT(0x%x, 0x%x)\n", in trusty_ffa_send_direct_msg()
80 trusty_error("unexpected FFA_ERROR(0x%x, 0x%x)\n", (uint32_t)smc_ret.r1, in trusty_ffa_send_direct_msg()
88 trusty_error("unknown FF-A result: 0x%x\n", (uint32_t)smc_ret.r0); in trusty_ffa_send_direct_msg()
93 static int trusty_ffa_run(struct trusty_dev* dev) { in trusty_ffa_run() argument
97 dst_cpu = FFA_PACK_DST_CPU(dev->ffa_remote_id, in trusty_ffa_run()
100 smc_ret = smc8(SMC_FC_FFA_RUN, dst_cpu, 0, 0, 0, 0, 0, 0); in trusty_ffa_run()
108 trusty_error("unexpected FFA_INTERRUPT(0x%x, 0x%x)\n", in trusty_ffa_run()
113 trusty_error("unexpected FFA_ERROR(0x%x, 0x%x)\n", (uint32_t)smc_ret.r1, in trusty_ffa_run()
119 return trusty_ffa_send_direct_msg(dev, TRUSTY_FFA_MSG_IS_IDLE, 0, 0, 0, in trusty_ffa_run()
120 0); in trusty_ffa_run()
123 trusty_error("unknown FF-A result: 0x%x\n", (uint32_t)smc_ret.r0); in trusty_ffa_run()
128 static uint32_t trusty_ffa_call(struct trusty_dev* dev, in trusty_ffa_call() argument
136 return trusty_ffa_send_direct_msg(dev, TRUSTY_FFA_MSG_RUN_FASTCALL, fid, in trusty_ffa_call()
142 ret = trusty_ffa_send_direct_msg(dev, TRUSTY_FFA_MSG_RUN_NOPCALL, in trusty_ffa_call()
143 a0, a1, a2, 0); in trusty_ffa_call()
149 ret = trusty_ffa_run(dev); in trusty_ffa_call()
154 case 0: in trusty_ffa_call()
163 ret = trusty_ffa_send_direct_msg(dev, TRUSTY_FFA_MSG_QUEUE_STDCALL, fid, in trusty_ffa_call()
176 ret = trusty_ffa_run(dev); in trusty_ffa_call()
180 return trusty_ffa_send_direct_msg(dev, TRUSTY_FFA_MSG_GET_STDCALL_RET, in trusty_ffa_call()
181 0, 0, 0, 0); in trusty_ffa_call()
182 case 0: in trusty_ffa_call()
190 static int32_t trusty_call32(struct trusty_dev* dev, in trusty_call32() argument
195 trusty_assert(dev); in trusty_call32()
197 if (dev->ffa_supports_direct_recv) { in trusty_call32()
198 return trusty_ffa_call(dev, smcnr, a0, a1, a2); in trusty_call32()
204 int32_t trusty_fast_call32(struct trusty_dev* dev, in trusty_fast_call32() argument
209 trusty_assert(dev); in trusty_fast_call32()
212 return trusty_call32(dev, smcnr, a0, a1, a2); in trusty_fast_call32()
215 static unsigned long trusty_std_call_inner(struct trusty_dev* dev, in trusty_std_call_inner() argument
223 trusty_debug("%s(0x%lx 0x%lx 0x%lx 0x%lx)\n", __func__, smcnr, a0, a1, a2); in trusty_std_call_inner()
226 ret = trusty_call32(dev, smcnr, a0, a1, a2); in trusty_std_call_inner()
228 ret = trusty_call32(dev, SMC_SC_RESTART_FIQ, 0, 0, 0); in trusty_std_call_inner()
232 trusty_debug("%s(0x%lx 0x%lx 0x%lx 0x%lx) returned busy, retry\n", in trusty_std_call_inner()
235 retry--; in trusty_std_call_inner()
241 static unsigned long trusty_std_call_helper(struct trusty_dev* dev, in trusty_std_call_helper() argument
251 ret = trusty_std_call_inner(dev, smcnr, a0, a1, a2); in trusty_std_call_helper()
257 trusty_idle(dev, false); in trusty_std_call_helper()
263 static int32_t trusty_std_call32(struct trusty_dev* dev, in trusty_std_call32() argument
270 trusty_assert(dev); in trusty_std_call32()
274 trusty_lock(dev); in trusty_std_call32()
277 trusty_debug("%s(0x%x 0x%x 0x%x 0x%x) started\n", __func__, smcnr, a0, a1, in trusty_std_call32()
280 ret = trusty_std_call_helper(dev, smcnr, a0, a1, a2); in trusty_std_call32()
282 trusty_debug("%s(0x%x 0x%x 0x%x 0x%x) interrupted\n", __func__, smcnr, in trusty_std_call32()
285 trusty_idle(dev, false); in trusty_std_call32()
287 ret = trusty_std_call_helper(dev, SMC_SC_RESTART_LAST, 0, 0, 0); in trusty_std_call32()
290 trusty_debug("%s(0x%x 0x%x 0x%x 0x%x) returned 0x%x\n", __func__, smcnr, a0, in trusty_std_call32()
294 trusty_unlock(dev); in trusty_std_call32()
300 static int trusty_call32_mem_buf_id(struct trusty_dev* dev, in trusty_call32_mem_buf_id() argument
304 trusty_assert(dev); in trusty_call32_mem_buf_id()
307 return trusty_fast_call32(dev, smcnr, (uint32_t)buf_id, in trusty_call32_mem_buf_id()
310 return trusty_std_call32(dev, smcnr, (uint32_t)buf_id, in trusty_call32_mem_buf_id()
315 int trusty_dev_init_ipc(struct trusty_dev* dev, in trusty_dev_init_ipc() argument
318 return trusty_call32_mem_buf_id(dev, SMC_SC_TRUSTY_IPC_CREATE_QL_DEV, in trusty_dev_init_ipc()
322 int trusty_dev_exec_ipc(struct trusty_dev* dev, in trusty_dev_exec_ipc() argument
325 return trusty_call32_mem_buf_id(dev, SMC_SC_TRUSTY_IPC_HANDLE_QL_DEV_CMD, in trusty_dev_exec_ipc()
329 int trusty_dev_exec_fc_ipc(struct trusty_dev* dev, in trusty_dev_exec_fc_ipc() argument
332 return trusty_call32_mem_buf_id(dev, SMC_FC_HANDLE_QL_TIPC_DEV_CMD, buf_id, in trusty_dev_exec_fc_ipc()
336 int trusty_dev_shutdown_ipc(struct trusty_dev* dev, in trusty_dev_shutdown_ipc() argument
339 return trusty_call32_mem_buf_id(dev, SMC_SC_TRUSTY_IPC_SHUTDOWN_QL_DEV, in trusty_dev_shutdown_ipc()
343 static int trusty_init_api_version(struct trusty_dev* dev) { in trusty_init_api_version() argument
346 api_version = trusty_fast_call32(dev, SMC_FC_API_VERSION, in trusty_init_api_version()
347 TRUSTY_API_VERSION_CURRENT, 0, 0); in trusty_init_api_version()
349 api_version = 0; in trusty_init_api_version()
354 return -1; in trusty_init_api_version()
360 dev->api_version = api_version; in trusty_init_api_version()
362 return 0; in trusty_init_api_version()
366 * Trusty UUID: RFC-4122 compliant UUID version 4
367 * 40ee25f0-a2bc-304c-8c4ca173c57d8af1
370 static const uint32_t trusty_uuid0_4[4] = {0xf025ee40, 0x4c30bca2, 0x73a14c8c,
371 0xf18a7dc5};
373 static bool trusty_dev_ffa_init(struct trusty_dev* dev) { in trusty_dev_ffa_init() argument
378 trusty_assert(dev); in trusty_dev_ffa_init()
380 dev->ffa_tx = NULL; in trusty_dev_ffa_init()
381 dev->ffa_supports_direct_recv = false; in trusty_dev_ffa_init()
383 /* Get supported FF-A version and check if it is compatible */ in trusty_dev_ffa_init()
384 smc_ret = smc8(SMC_FC_FFA_VERSION, FFA_CURRENT_VERSION, 0, 0, 0, 0, 0, 0); in trusty_dev_ffa_init()
387 trusty_error("%s: unsupported FF-A version 0x%lx, expected 0x%x\n", in trusty_dev_ffa_init()
393 smc_ret = smc8(SMC_FC_FFA_FEATURES, SMC_FC_FFA_MEM_SHARE, 0, 0, 0, 0, 0, 0); in trusty_dev_ffa_init()
396 "%s: SMC_FC_FFA_FEATURES(SMC_FC_FFA_MEM_SHARE) failed 0x%lx 0x%lx 0x%lx\n", in trusty_dev_ffa_init()
402 * Set FF-A endpoint IDs. in trusty_dev_ffa_init()
404 smc_ret = smc8(SMC_FC_FFA_ID_GET, 0, 0, 0, 0, 0, 0, 0); in trusty_dev_ffa_init()
406 trusty_error("%s: SMC_FC_FFA_ID_GET failed 0x%lx 0x%lx 0x%lx\n", in trusty_dev_ffa_init()
410 dev->ffa_local_id = smc_ret.r2; in trusty_dev_ffa_init()
412 dev->ffa_tx = trusty_alloc_pages(TRUSTY_FFA_RXTX_PAGE_COUNT); in trusty_dev_ffa_init()
413 if (!dev->ffa_tx) { in trusty_dev_ffa_init()
416 dev->ffa_rx = trusty_alloc_pages(TRUSTY_FFA_RXTX_PAGE_COUNT); in trusty_dev_ffa_init()
417 if (!dev->ffa_rx) { in trusty_dev_ffa_init()
420 ret = trusty_encode_page_info(&tx_pinfo, dev->ffa_tx); in trusty_dev_ffa_init()
426 ret = trusty_encode_page_info(&rx_pinfo, dev->ffa_rx); in trusty_dev_ffa_init()
434 * TODO: check or pass memory attributes. The FF-A spec says the buffer has in trusty_dev_ffa_init()
439 TRUSTY_FFA_RXTX_PAGE_COUNT, 0, 0, 0, 0); in trusty_dev_ffa_init()
441 trusty_error("%s: FFA_RXTX_MAP failed 0x%lx 0x%lx 0x%lx\n", __func__, in trusty_dev_ffa_init()
447 * Set remote FF-A endpoint IDs. in trusty_dev_ffa_init()
451 smc_ret = smc8(SMC_FC_FFA_PARTITION_INFO_GET, trusty_uuid0_4[0], in trusty_dev_ffa_init()
452 trusty_uuid0_4[1], trusty_uuid0_4[2], trusty_uuid0_4[3], 0, in trusty_dev_ffa_init()
453 0, 0); in trusty_dev_ffa_init()
458 * use hard-coded values for backward compatibility in trusty_dev_ffa_init()
460 dev->ffa_remote_id = 0x8000; in trusty_dev_ffa_init()
461 dev->ffa_supports_direct_recv = false; in trusty_dev_ffa_init()
464 "%s: SMC_FC_FFA_PARTITION_INFO_GET failed 0x%lx 0x%lx 0x%lx\n", in trusty_dev_ffa_init()
468 struct ffa_partition_info* part_info = dev->ffa_rx; in trusty_dev_ffa_init()
470 dev->ffa_remote_id = part_info->id; in trusty_dev_ffa_init()
471 dev->ffa_supports_direct_recv = in trusty_dev_ffa_init()
472 !!(part_info->id & FFA_PARTITION_DIRECT_REQ_RECV); in trusty_dev_ffa_init()
475 smc_ret = smc8(SMC_FC_FFA_RX_RELEASE, 0, 0, 0, 0, 0, 0, 0); in trusty_dev_ffa_init()
477 trusty_error("%s: SMC_FC_FFA_RX_RELEASE failed 0x%lx 0x%lx 0x%lx\n", in trusty_dev_ffa_init()
483 if (dev->ffa_supports_direct_recv) { in trusty_dev_ffa_init()
485 smc_ret = smc8(SMC_FC_FFA_FEATURES, SMC_FC_FFA_MSG_SEND_DIRECT_REQ, 0, in trusty_dev_ffa_init()
486 0, 0, 0, 0, 0); in trusty_dev_ffa_init()
493 dev->ffa_supports_direct_recv = false; in trusty_dev_ffa_init()
497 "failed 0x%lx 0x%lx 0x%lx\n", in trusty_dev_ffa_init()
507 dev->ffa_supports_direct_recv = false; in trusty_dev_ffa_init()
508 dev->ffa_remote_id = 0; in trusty_dev_ffa_init()
510 smc(SMC_FC_FFA_RXTX_UNMAP, FFA_PACK_RXTX_UNMAP_ID(dev->ffa_local_id), 0, 0); in trusty_dev_ffa_init()
513 trusty_free_pages(dev->ffa_rx, TRUSTY_FFA_RXTX_PAGE_COUNT); in trusty_dev_ffa_init()
514 dev->ffa_rx = NULL; in trusty_dev_ffa_init()
516 trusty_free_pages(dev->ffa_tx, TRUSTY_FFA_RXTX_PAGE_COUNT); in trusty_dev_ffa_init()
517 dev->ffa_tx = NULL; in trusty_dev_ffa_init()
519 dev->ffa_local_id = 0; in trusty_dev_ffa_init()
526 int trusty_dev_init(struct trusty_dev* dev, void* priv_data) { in trusty_dev_init() argument
529 trusty_assert(dev); in trusty_dev_init()
531 dev->priv_data = priv_data; in trusty_dev_init()
532 found_ffa = trusty_dev_ffa_init(dev); in trusty_dev_init()
534 ret = trusty_init_api_version(dev); in trusty_dev_init()
538 if (dev->api_version >= TRUSTY_API_VERSION_MEM_OBJ && !found_ffa) { in trusty_dev_init()
539 trusty_fatal("%s: FF-A required but not found\n", __func__); in trusty_dev_init()
542 return 0; in trusty_dev_init()
545 int trusty_dev_shutdown(struct trusty_dev* dev) { in trusty_dev_shutdown() argument
546 trusty_assert(dev); in trusty_dev_shutdown()
548 if (dev->ffa_tx) { in trusty_dev_shutdown()
549 smc(SMC_FC_FFA_RXTX_UNMAP, FFA_PACK_RXTX_UNMAP_ID(dev->ffa_local_id), 0, in trusty_dev_shutdown()
550 0); in trusty_dev_shutdown()
552 trusty_free_pages(dev->ffa_rx, TRUSTY_FFA_RXTX_PAGE_COUNT); in trusty_dev_shutdown()
553 dev->ffa_rx = NULL; in trusty_dev_shutdown()
554 trusty_free_pages(dev->ffa_tx, TRUSTY_FFA_RXTX_PAGE_COUNT); in trusty_dev_shutdown()
555 dev->ffa_tx = NULL; in trusty_dev_shutdown()
556 dev->ffa_local_id = 0; in trusty_dev_shutdown()
557 dev->ffa_remote_id = 0; in trusty_dev_shutdown()
558 dev->ffa_supports_direct_recv = false; in trusty_dev_shutdown()
560 dev->priv_data = NULL; in trusty_dev_shutdown()
561 return 0; in trusty_dev_shutdown()
564 int trusty_dev_nop(struct trusty_dev* dev) { in trusty_dev_nop() argument
565 int ret = trusty_std_call32(dev, SMC_SC_NOP, 0, 0, 0); in trusty_dev_nop()
566 return ret == SM_ERR_NOP_DONE ? 0 : ret == SM_ERR_NOP_INTERRUPTED ? 1 : -1; in trusty_dev_nop()
569 int trusty_dev_share_memory(struct trusty_dev* dev, in trusty_dev_share_memory() argument
574 struct ffa_mtd* mtd = dev->ffa_tx; in trusty_dev_share_memory()
576 struct ffa_comp_mrd* comp_mrd = dev->ffa_tx + comp_mrd_offset; in trusty_dev_share_memory()
577 struct ffa_cons_mrd* cons_mrd = comp_mrd->address_range_array; in trusty_dev_share_memory()
578 size_t tx_size = ((void*)cons_mrd - dev->ffa_tx) + sizeof(*cons_mrd); in trusty_dev_share_memory()
580 if (!dev->ffa_tx) { in trusty_dev_share_memory()
585 *idp = pinfo->attr; in trusty_dev_share_memory()
586 return 0; in trusty_dev_share_memory()
589 trusty_memset(mtd, 0, tx_size); in trusty_dev_share_memory()
590 mtd->sender_id = dev->ffa_local_id; in trusty_dev_share_memory()
591 mtd->memory_region_attributes = pinfo->ffa_mem_attr; in trusty_dev_share_memory()
592 mtd->emad_count = 1; in trusty_dev_share_memory()
593 mtd->emad[0].mapd.endpoint_id = dev->ffa_remote_id; in trusty_dev_share_memory()
594 mtd->emad[0].mapd.memory_access_permissions = pinfo->ffa_mem_perm; in trusty_dev_share_memory()
595 mtd->emad[0].comp_mrd_offset = comp_mrd_offset; in trusty_dev_share_memory()
596 comp_mrd->total_page_count = page_count; in trusty_dev_share_memory()
597 comp_mrd->address_range_count = 1; in trusty_dev_share_memory()
598 cons_mrd->address = pinfo->paddr; in trusty_dev_share_memory()
599 cons_mrd->page_count = page_count; in trusty_dev_share_memory()
604 smc_ret = smc8(SMC_FC_FFA_MEM_SHARE, tx_size, tx_size, 0, 0, 0, 0, 0); in trusty_dev_share_memory()
606 trusty_error("%s: SMC_FC_FFA_MEM_SHARE failed 0x%lx 0x%lx 0x%lx\n", in trusty_dev_share_memory()
608 return -1; in trusty_dev_share_memory()
613 return 0; in trusty_dev_share_memory()
616 int trusty_dev_reclaim_memory(struct trusty_dev* dev, in trusty_dev_reclaim_memory() argument
620 if (!dev->ffa_tx) { in trusty_dev_reclaim_memory()
625 return 0; in trusty_dev_reclaim_memory()
633 smc8(SMC_FC_FFA_MEM_RECLAIM, (uint32_t)id, id >> 32, 0, 0, 0, 0, 0); in trusty_dev_reclaim_memory()
635 trusty_error("%s: SMC_FC_FFA_MEM_RECLAIM failed 0x%lx 0x%lx 0x%lx\n", in trusty_dev_reclaim_memory()
637 return -1; in trusty_dev_reclaim_memory()
640 return 0; in trusty_dev_reclaim_memory()