Lines Matching +full:op +full:- +full:tee

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2015-2021, 2023 Linaro Limited
9 #include <linux/arm-smccc.h>
39 * OP-TEE OS via raw SMCs.
50 * A typical OP-TEE private shm allocation is 224 bytes (argument struct
59 /* SMC ABI considers at most a single TEE firmware */
90 p->attr = TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT + in from_msg_param_tmp_mem()
91 attr - OPTEE_MSG_ATTR_TYPE_TMEM_INPUT; in from_msg_param_tmp_mem()
92 p->u.memref.size = mp->u.tmem.size; in from_msg_param_tmp_mem()
93 shm = (struct tee_shm *)(unsigned long)mp->u.tmem.shm_ref; in from_msg_param_tmp_mem()
95 p->u.memref.shm_offs = 0; in from_msg_param_tmp_mem()
96 p->u.memref.shm = NULL; in from_msg_param_tmp_mem()
104 p->u.memref.shm_offs = mp->u.tmem.buf_ptr - pa; in from_msg_param_tmp_mem()
105 p->u.memref.shm = shm; in from_msg_param_tmp_mem()
115 p->attr = TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT + in from_msg_param_reg_mem()
116 attr - OPTEE_MSG_ATTR_TYPE_RMEM_INPUT; in from_msg_param_reg_mem()
117 p->u.memref.size = mp->u.rmem.size; in from_msg_param_reg_mem()
118 shm = (struct tee_shm *)(unsigned long)mp->u.rmem.shm_ref; in from_msg_param_reg_mem()
121 p->u.memref.shm_offs = mp->u.rmem.offs; in from_msg_param_reg_mem()
122 p->u.memref.shm = shm; in from_msg_param_reg_mem()
124 p->u.memref.shm_offs = 0; in from_msg_param_reg_mem()
125 p->u.memref.shm = NULL; in from_msg_param_reg_mem()
130 * optee_from_msg_param() - convert from OPTEE_MSG parameters to
148 u32 attr = mp->attr & OPTEE_MSG_ATTR_TYPE_MASK; in optee_from_msg_param()
152 p->attr = TEE_IOCTL_PARAM_ATTR_TYPE_NONE; in optee_from_msg_param()
153 memset(&p->u, 0, sizeof(p->u)); in optee_from_msg_param()
174 return -EINVAL; in optee_from_msg_param()
186 mp->attr = OPTEE_MSG_ATTR_TYPE_TMEM_INPUT + p->attr - in to_msg_param_tmp_mem()
189 mp->u.tmem.shm_ref = (unsigned long)p->u.memref.shm; in to_msg_param_tmp_mem()
190 mp->u.tmem.size = p->u.memref.size; in to_msg_param_tmp_mem()
192 if (!p->u.memref.shm) { in to_msg_param_tmp_mem()
193 mp->u.tmem.buf_ptr = 0; in to_msg_param_tmp_mem()
197 rc = tee_shm_get_pa(p->u.memref.shm, p->u.memref.shm_offs, &pa); in to_msg_param_tmp_mem()
201 mp->u.tmem.buf_ptr = pa; in to_msg_param_tmp_mem()
202 mp->attr |= OPTEE_MSG_ATTR_CACHE_PREDEFINED << in to_msg_param_tmp_mem()
211 mp->attr = OPTEE_MSG_ATTR_TYPE_RMEM_INPUT + p->attr - in to_msg_param_reg_mem()
214 mp->u.rmem.shm_ref = (unsigned long)p->u.memref.shm; in to_msg_param_reg_mem()
215 mp->u.rmem.size = p->u.memref.size; in to_msg_param_reg_mem()
216 mp->u.rmem.offs = p->u.memref.shm_offs; in to_msg_param_reg_mem()
221 * optee_to_msg_param() - convert from struct tee_params to OPTEE_MSG parameters
239 switch (p->attr) { in optee_to_msg_param()
241 mp->attr = TEE_IOCTL_PARAM_ATTR_TYPE_NONE; in optee_to_msg_param()
242 memset(&mp->u, 0, sizeof(mp->u)); in optee_to_msg_param()
252 if (tee_shm_is_dynamic(p->u.memref.shm)) in optee_to_msg_param()
260 return -EINVAL; in optee_to_msg_param()
274 * clients and for tee-supplicant.
278 * optee_enable_shm_cache() - Enables caching of some shared memory allocation
279 * in OP-TEE
287 optee_cq_wait_init(&optee->call_queue, &w, false); in optee_enable_shm_cache()
291 optee->smc.invoke_fn(OPTEE_SMC_ENABLE_SHM_CACHE, in optee_enable_shm_cache()
295 optee_cq_wait_for_completion(&optee->call_queue, &w); in optee_enable_shm_cache()
297 optee_cq_wait_final(&optee->call_queue, &w); in optee_enable_shm_cache()
301 * __optee_disable_shm_cache() - Disables caching of some shared memory
302 * allocation in OP-TEE
312 optee_cq_wait_init(&optee->call_queue, &w, false); in __optee_disable_shm_cache()
319 optee->smc.invoke_fn(OPTEE_SMC_DISABLE_SHM_CACHE, in __optee_disable_shm_cache()
337 optee_cq_wait_for_completion(&optee->call_queue, &w); in __optee_disable_shm_cache()
340 optee_cq_wait_final(&optee->call_queue, &w); in __optee_disable_shm_cache()
344 * optee_disable_shm_cache() - Disables caching of mapped shared memory
345 * allocations in OP-TEE
354 * optee_disable_unmapped_shm_cache() - Disables caching of shared memory
355 * allocations in OP-TEE which are not
365 ((OPTEE_MSG_NONCONTIG_PAGE_SIZE / sizeof(u64)) - 1)
389 * optee_fill_pages_list() - write list of user pages to given shared
392 * @dst: page-aligned buffer where list of pages will be stored
415 * Currently OP-TEE uses 4k page size and it does not looks in optee_fill_pages_list()
428 * because they bear no value data for OP-TEE. in optee_fill_pages_list()
434 pages_data->pages_list[n++] = optee_page; in optee_fill_pages_list()
437 pages_data->next_page_data = in optee_fill_pages_list()
445 if (!--num_pages) in optee_fill_pages_list()
457 struct optee *optee = tee_get_drvdata(ctx->teedev); in optee_shm_register()
465 return -EINVAL; in optee_shm_register()
473 return -ENOMEM; in optee_shm_register()
477 * memory for this request or there's a catch-22. in optee_shm_register()
482 sz = optee_msg_arg_size(optee->rpc_param_count); in optee_shm_register()
498 msg_arg->num_params = 1; in optee_shm_register()
499 msg_arg->cmd = OPTEE_MSG_CMD_REGISTER_SHM; in optee_shm_register()
500 msg_arg->params->attr = OPTEE_MSG_ATTR_TYPE_TMEM_OUTPUT | in optee_shm_register()
502 msg_arg->params->u.tmem.shm_ref = (unsigned long)shm; in optee_shm_register()
503 msg_arg->params->u.tmem.size = tee_shm_get_size(shm); in optee_shm_register()
505 * In the least bits of msg_arg->params->u.tmem.buf_ptr we in optee_shm_register()
506 * store buffer offset from 4k page, as described in OP-TEE ABI. in optee_shm_register()
508 msg_arg->params->u.tmem.buf_ptr = virt_to_phys(pages_list) | in optee_shm_register()
509 (tee_shm_get_page_offset(shm) & (OPTEE_MSG_NONCONTIG_PAGE_SIZE - 1)); in optee_shm_register()
511 if (optee->ops->do_call_with_arg(ctx, shm_arg, 0, false) || in optee_shm_register()
512 msg_arg->ret != TEEC_SUCCESS) in optee_shm_register()
513 rc = -EINVAL; in optee_shm_register()
523 struct optee *optee = tee_get_drvdata(ctx->teedev); in optee_shm_unregister()
538 sz = optee_msg_arg_size(optee->rpc_param_count); in optee_shm_unregister()
549 msg_arg->num_params = 1; in optee_shm_unregister()
550 msg_arg->cmd = OPTEE_MSG_CMD_UNREGISTER_SHM; in optee_shm_unregister()
551 msg_arg->params[0].attr = OPTEE_MSG_ATTR_TYPE_RMEM_INPUT; in optee_shm_unregister()
552 msg_arg->params[0].u.rmem.shm_ref = (unsigned long)shm; in optee_shm_unregister()
554 if (optee->ops->do_call_with_arg(ctx, shm_arg, 0, false) || in optee_shm_unregister()
555 msg_arg->ret != TEEC_SUCCESS) in optee_shm_unregister()
556 rc = -EINVAL; in optee_shm_unregister()
567 * We don't want to register supplicant memory in OP-TEE. in optee_shm_register_supp()
582 * Implements an OP-TEE specific shared memory pool which is used
592 * Shared memory private to the OP-TEE driver doesn't need in pool_op_alloc()
593 * to be registered with OP-TEE. in pool_op_alloc()
595 if (shm->flags & TEE_SHM_PRIV) in pool_op_alloc()
604 if (!(shm->flags & TEE_SHM_PRIV)) in pool_op_free()
622 * optee_shm_pool_alloc_pages() - create page-based allocator pool
624 * This pool is used when OP-TEE supports dymanic SHM. In this case
632 return ERR_PTR(-ENOMEM); in optee_shm_pool_alloc_pages()
634 pool->ops = &pool_ops; in optee_shm_pool_alloc_pages()
645 * delivery of non-secure interrupts to for instance allow rescheduling of
654 arg->ret_origin = TEEC_ORIGIN_COMMS; in handle_rpc_func_cmd_shm_free()
656 if (arg->num_params != 1 || in handle_rpc_func_cmd_shm_free()
657 arg->params[0].attr != OPTEE_MSG_ATTR_TYPE_VALUE_INPUT) { in handle_rpc_func_cmd_shm_free()
658 arg->ret = TEEC_ERROR_BAD_PARAMETERS; in handle_rpc_func_cmd_shm_free()
662 shm = (struct tee_shm *)(unsigned long)arg->params[0].u.value.b; in handle_rpc_func_cmd_shm_free()
663 switch (arg->params[0].u.value.a) { in handle_rpc_func_cmd_shm_free()
671 arg->ret = TEEC_ERROR_BAD_PARAMETERS; in handle_rpc_func_cmd_shm_free()
673 arg->ret = TEEC_SUCCESS; in handle_rpc_func_cmd_shm_free()
687 arg->ret_origin = TEEC_ORIGIN_COMMS; in handle_rpc_func_cmd_shm_alloc()
689 if (!arg->num_params || in handle_rpc_func_cmd_shm_alloc()
690 arg->params[0].attr != OPTEE_MSG_ATTR_TYPE_VALUE_INPUT) { in handle_rpc_func_cmd_shm_alloc()
691 arg->ret = TEEC_ERROR_BAD_PARAMETERS; in handle_rpc_func_cmd_shm_alloc()
695 for (n = 1; n < arg->num_params; n++) { in handle_rpc_func_cmd_shm_alloc()
696 if (arg->params[n].attr != OPTEE_MSG_ATTR_TYPE_NONE) { in handle_rpc_func_cmd_shm_alloc()
697 arg->ret = TEEC_ERROR_BAD_PARAMETERS; in handle_rpc_func_cmd_shm_alloc()
702 sz = arg->params[0].u.value.b; in handle_rpc_func_cmd_shm_alloc()
703 switch (arg->params[0].u.value.a) { in handle_rpc_func_cmd_shm_alloc()
708 shm = tee_shm_alloc_priv_buf(optee->ctx, sz); in handle_rpc_func_cmd_shm_alloc()
711 arg->ret = TEEC_ERROR_BAD_PARAMETERS; in handle_rpc_func_cmd_shm_alloc()
716 arg->ret = TEEC_ERROR_OUT_OF_MEMORY; in handle_rpc_func_cmd_shm_alloc()
731 arg->ret = TEEC_ERROR_OUT_OF_MEMORY; in handle_rpc_func_cmd_shm_alloc()
735 call_ctx->pages_list = pages_list; in handle_rpc_func_cmd_shm_alloc()
736 call_ctx->num_entries = page_count; in handle_rpc_func_cmd_shm_alloc()
738 arg->params[0].attr = OPTEE_MSG_ATTR_TYPE_TMEM_OUTPUT | in handle_rpc_func_cmd_shm_alloc()
742 * from 4k page, as described in OP-TEE ABI. in handle_rpc_func_cmd_shm_alloc()
744 arg->params[0].u.tmem.buf_ptr = virt_to_phys(pages_list) | in handle_rpc_func_cmd_shm_alloc()
746 (OPTEE_MSG_NONCONTIG_PAGE_SIZE - 1)); in handle_rpc_func_cmd_shm_alloc()
754 arg->ret = TEEC_ERROR_BAD_PARAMETERS; in handle_rpc_func_cmd_shm_alloc()
758 arg->params[0].attr = OPTEE_MSG_ATTR_TYPE_TMEM_OUTPUT; in handle_rpc_func_cmd_shm_alloc()
759 arg->params[0].u.tmem.buf_ptr = pa; in handle_rpc_func_cmd_shm_alloc()
761 arg->params[0].u.tmem.size = tee_shm_get_size(shm); in handle_rpc_func_cmd_shm_alloc()
762 arg->params[0].u.tmem.shm_ref = (unsigned long)shm; in handle_rpc_func_cmd_shm_alloc()
764 arg->ret = TEEC_SUCCESS; in handle_rpc_func_cmd_shm_alloc()
772 if (call_ctx->pages_list) { in free_pages_list()
773 optee_free_pages_list(call_ctx->pages_list, in free_pages_list()
774 call_ctx->num_entries); in free_pages_list()
775 call_ctx->pages_list = NULL; in free_pages_list()
776 call_ctx->num_entries = 0; in free_pages_list()
790 switch (arg->cmd) { in handle_rpc_func_cmd()
804 * optee_handle_rpc() - handle RPC from secure world
808 * @call_ctx: call context. Preserved during one OP-TEE invocation
817 struct tee_device *teedev = ctx->teedev; in optee_handle_rpc()
823 switch (OPTEE_SMC_RETURN_GET_RPC_FUNC(param->a0)) { in optee_handle_rpc()
825 shm = tee_shm_alloc_priv_buf(optee->ctx, param->a1); in optee_handle_rpc()
827 reg_pair_from_64(&param->a1, &param->a2, pa); in optee_handle_rpc()
828 reg_pair_from_64(&param->a4, &param->a5, in optee_handle_rpc()
831 param->a1 = 0; in optee_handle_rpc()
832 param->a2 = 0; in optee_handle_rpc()
833 param->a4 = 0; in optee_handle_rpc()
834 param->a5 = 0; in optee_handle_rpc()
839 shm = reg_pair_to_ptr(param->a1, param->a2); in optee_handle_rpc()
854 shm = reg_pair_to_ptr(param->a1, param->a2); in optee_handle_rpc()
867 (u32)OPTEE_SMC_RETURN_GET_RPC_FUNC(param->a0)); in optee_handle_rpc()
871 param->a0 = OPTEE_SMC_CALL_RETURN_FROM_RPC; in optee_handle_rpc()
875 * optee_smc_do_call_with_arg() - Do an SMC to OP-TEE in secure world
879 * @system_thread: true if caller requests TEE system thread support
881 * Does and SMC to OP-TEE in secure world and handles eventual resulting
882 * Remote Procedure Calls (RPC) from OP-TEE.
890 struct optee *optee = tee_get_drvdata(ctx->teedev); in optee_smc_do_call_with_arg()
897 if (optee->rpc_param_count) { in optee_smc_do_call_with_arg()
905 rpc_arg_offs = OPTEE_MSG_GET_ARG_SIZE(arg->num_params); in optee_smc_do_call_with_arg()
929 optee_cq_wait_init(&optee->call_queue, &w, system_thread); in optee_smc_do_call_with_arg()
934 optee->smc.invoke_fn(param.a0, param.a1, param.a2, param.a3, in optee_smc_do_call_with_arg()
944 optee_cq_wait_for_completion(&optee->call_queue, &w); in optee_smc_do_call_with_arg()
963 optee_cq_wait_final(&optee->call_queue, &w); in optee_smc_do_call_with_arg()
996 value = get_async_notif_value(optee->smc.invoke_fn, in irq_handler()
1023 optee_do_bottom_half(optee->ctx); in notif_irq_thread_fn()
1038 optee->smc.notif_irq = irq; in init_irq()
1046 struct optee *optee = pcpu->optee; in notif_pcpu_irq_handler()
1049 queue_work(optee->smc.notif_pcpu_wq, in notif_pcpu_irq_handler()
1050 &optee->smc.notif_pcpu_work); in notif_pcpu_irq_handler()
1061 optee_do_bottom_half(optee->ctx); in notif_pcpu_irq_work_fn()
1071 return -ENOMEM; in init_pcpu_irq()
1074 per_cpu_ptr(optee_pcpu, cpu)->optee = optee; in init_pcpu_irq()
1081 INIT_WORK(&optee->smc.notif_pcpu_work, notif_pcpu_irq_work_fn); in init_pcpu_irq()
1082 optee->smc.notif_pcpu_wq = create_workqueue("optee_pcpu_notification"); in init_pcpu_irq()
1083 if (!optee->smc.notif_pcpu_wq) { in init_pcpu_irq()
1084 rc = -EINVAL; in init_pcpu_irq()
1088 optee->smc.optee_pcpu = optee_pcpu; in init_pcpu_irq()
1089 optee->smc.notif_irq = irq; in init_pcpu_irq()
1092 rc = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "optee/pcpu-notif:starting", in init_pcpu_irq()
1096 rc = -EINVAL; in init_pcpu_irq()
1100 optee->smc.notif_cpuhp_state = rc; in init_pcpu_irq()
1122 cpuhp_remove_state(optee->smc.notif_cpuhp_state); in uninit_pcpu_irq()
1124 destroy_workqueue(optee->smc.notif_pcpu_wq); in uninit_pcpu_irq()
1126 free_percpu_irq(optee->smc.notif_irq, optee->smc.optee_pcpu); in uninit_pcpu_irq()
1127 free_percpu(optee->smc.optee_pcpu); in uninit_pcpu_irq()
1132 if (optee->smc.sec_caps & OPTEE_SMC_SEC_CAP_ASYNC_NOTIF) { in optee_smc_notif_uninit_irq()
1133 optee_stop_async_notif(optee->ctx); in optee_smc_notif_uninit_irq()
1134 if (optee->smc.notif_irq) { in optee_smc_notif_uninit_irq()
1135 if (irq_is_percpu_devid(optee->smc.notif_irq)) in optee_smc_notif_uninit_irq()
1138 free_irq(optee->smc.notif_irq, optee); in optee_smc_notif_uninit_irq()
1140 irq_dispose_mapping(optee->smc.notif_irq); in optee_smc_notif_uninit_irq()
1164 if (optee->smc.sec_caps & OPTEE_SMC_SEC_CAP_DYNAMIC_SHM) in optee_get_version()
1166 if (optee->smc.sec_caps & OPTEE_SMC_SEC_CAP_MEMREF_NULL) in optee_get_version()
1173 struct optee *optee = tee_get_drvdata(ctx->teedev); in optee_smc_open()
1174 u32 sec_caps = optee->smc.sec_caps; in optee_smc_open()
1193 .name = DRIVER_NAME "-clnt",
1209 .name = DRIVER_NAME "-supp",
1228 return -EINVAL; in enable_async_notif()
1361 return ERR_PTR(-ENOENT); in optee_config_shm_memremap()
1366 return ERR_PTR(-EINVAL); in optee_config_shm_memremap()
1372 size = end - begin; in optee_config_shm_memremap()
1377 return ERR_PTR(-EINVAL); in optee_config_shm_memremap()
1418 return ERR_PTR(-ENXIO); in get_invoke_func()
1427 return ERR_PTR(-EINVAL); in get_invoke_func()
1430 /* optee_remove - Device Removal Routine
1441 * Ask OP-TEE to free all cached shared memory objects to decrease in optee_smc_remove()
1445 if (!optee->rpc_param_count) in optee_smc_remove()
1452 if (optee->smc.memremaped_shm) in optee_smc_remove()
1453 memunmap(optee->smc.memremaped_shm); in optee_smc_remove()
1458 /* optee_shutdown - Device Removal Routine
1469 if (!optee->rpc_param_count) in optee_shutdown()
1475 #define OPTEE_FW_IMAGE "optee/tee.bin"
1482 * Invoking a call on a CPU will cause OP-TEE to perform the required in optee_cpuhp_probe()
1489 return -EINVAL; in optee_cpuhp_probe()
1508 rc = request_firmware(&fw, OPTEE_FW_IMAGE, &pdev->dev); in optee_load_fw()
1516 return -EPROBE_DEFER; in optee_load_fw()
1520 data_size = fw->size; in optee_load_fw()
1523 * 32-bit space since TF-A cannot map memory beyond the 32-bit boundary. in optee_load_fw()
1525 data_buf = kmemdup(fw->data, fw->size, GFP_KERNEL | GFP_DMA); in optee_load_fw()
1527 rc = -ENOMEM; in optee_load_fw()
1548 pr_warn("OP-TEE image loaded from kernel, this can be insecure"); in optee_load_fw()
1559 * We need to initialize OP-TEE on all other running cores as in optee_load_fw()
1562 * TF-A which are registered by the OP-TEE SPD. Due to that we in optee_load_fw()
1563 * can un-register the callback right after registering it. in optee_load_fw()
1569 pr_warn("Failed with CPU hotplug setup for OP-TEE"); in optee_load_fw()
1570 return -EINVAL; in optee_load_fw()
1589 struct tee_shm_pool *pool = ERR_PTR(-EINVAL); in optee_probe()
1601 invoke_fn = get_invoke_func(&pdev->dev); in optee_probe()
1611 return -EINVAL; in optee_probe()
1618 return -EINVAL; in optee_probe()
1626 return -EINVAL; in optee_probe()
1635 * optee_get_msg_arg() to pre-register (by having in optee_probe()
1639 * With the page is pre-registered we can use a non-zero in optee_probe()
1644 * OPTEE_SMC_CALL_WITH_REGD_ARG for pre-registered pages. in optee_probe()
1655 * If dynamic shared memory is not available or failed - try static one in optee_probe()
1659 * The static memory pool can use non-zero page offsets so in optee_probe()
1662 * optee_get_msg_arg() should not pre-register the in optee_probe()
1680 rc = -ENOMEM; in optee_probe()
1684 optee->ops = &optee_ops; in optee_probe()
1685 optee->smc.invoke_fn = invoke_fn; in optee_probe()
1686 optee->smc.sec_caps = sec_caps; in optee_probe()
1687 optee->rpc_param_count = rpc_param_count; in optee_probe()
1691 optee->in_kernel_rpmb_routing = true; in optee_probe()
1698 optee->teedev = teedev; in optee_probe()
1705 optee->supp_teedev = teedev; in optee_probe()
1709 rc = tee_device_register(optee->teedev); in optee_probe()
1713 rc = tee_device_register(optee->supp_teedev); in optee_probe()
1717 optee_cq_init(&optee->call_queue, thread_count); in optee_probe()
1718 optee_supp_init(&optee->supp); in optee_probe()
1719 optee->smc.memremaped_shm = memremaped_shm; in optee_probe()
1720 optee->pool = pool; in optee_probe()
1722 mutex_init(&optee->rpmb_dev_mutex); in optee_probe()
1725 ctx = teedev_open(optee->teedev); in optee_probe()
1730 optee->ctx = ctx; in optee_probe()
1750 enable_async_notif(optee->smc.invoke_fn); in optee_probe()
1755 * Ensure that there are no pre-existing shm objects before enabling in optee_probe()
1767 if (!optee->rpc_param_count) in optee_probe()
1770 if (optee->smc.sec_caps & OPTEE_SMC_SEC_CAP_DYNAMIC_SHM) in optee_probe()
1777 INIT_WORK(&optee->rpmb_scan_bus_work, optee_bus_scan_rpmb); in optee_probe()
1778 optee->rpmb_intf.notifier_call = optee_rpmb_intf_rdev; in optee_probe()
1780 &optee->rpmb_intf); in optee_probe()
1785 if (!optee->rpc_param_count) in optee_probe()
1794 rpmb_dev_put(optee->rpmb_dev); in optee_probe()
1795 mutex_destroy(&optee->rpmb_dev_mutex); in optee_probe()
1797 optee_supp_uninit(&optee->supp); in optee_probe()
1798 mutex_destroy(&optee->call_queue.mutex); in optee_probe()
1800 tee_device_unregister(optee->supp_teedev); in optee_probe()
1802 tee_device_unregister(optee->teedev); in optee_probe()
1813 { .compatible = "linaro,optee-tz" },