Lines Matching +full:optee +full:- +full:tz

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
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
132 * @optee: main service struct
138 static int optee_from_msg_param(struct optee *optee, struct tee_param *params, in optee_from_msg_param() argument
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
222 * @optee: main service struct
228 static int optee_to_msg_param(struct optee *optee, in optee_to_msg_param() argument
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
280 * @optee: main service struct
282 static void optee_enable_shm_cache(struct optee *optee) in optee_enable_shm_cache() argument
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
303 * @optee: main service struct
307 static void __optee_disable_shm_cache(struct optee *optee, bool is_mapped) in __optee_disable_shm_cache() argument
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
346 * @optee: main service struct
348 static void optee_disable_shm_cache(struct optee *optee) in optee_disable_shm_cache() argument
350 return __optee_disable_shm_cache(optee, true); in optee_disable_shm_cache()
354 * optee_disable_unmapped_shm_cache() - Disables caching of shared memory
355 * allocations in OP-TEE which are not
357 * @optee: main service struct
359 static void optee_disable_unmapped_shm_cache(struct optee *optee) in optee_disable_unmapped_shm_cache() argument
361 return __optee_disable_shm_cache(optee, false); in optee_disable_unmapped_shm_cache()
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() local
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() local
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()
677 struct optee *optee, in handle_rpc_func_cmd_shm_alloc() argument
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()
785 static void handle_rpc_func_cmd(struct tee_context *ctx, struct optee *optee, in handle_rpc_func_cmd() argument
790 switch (arg->cmd) { in handle_rpc_func_cmd()
793 handle_rpc_func_cmd_shm_alloc(ctx, optee, arg, call_ctx); in handle_rpc_func_cmd()
799 optee_rpc_cmd(ctx, optee, arg); 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()
818 struct optee *optee = tee_get_drvdata(teedev); in optee_handle_rpc() local
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()
863 handle_rpc_func_cmd(ctx, optee, arg, call_ctx); 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
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() local
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()
988 static irqreturn_t irq_handler(struct optee *optee) in irq_handler() argument
996 value = get_async_notif_value(optee->smc.invoke_fn, in irq_handler()
1004 optee_notif_send(optee, value); in irq_handler()
1014 struct optee *optee = dev_id; in notif_irq_handler() local
1016 return irq_handler(optee); in notif_irq_handler()
1021 struct optee *optee = dev_id; in notif_irq_thread_fn() local
1023 optee_do_bottom_half(optee->ctx); in notif_irq_thread_fn()
1028 static int init_irq(struct optee *optee, u_int irq) in init_irq() argument
1034 0, "optee_notification", optee); in init_irq()
1038 optee->smc.notif_irq = irq; in init_irq()
1046 struct optee *optee = pcpu->optee; in notif_pcpu_irq_handler() local
1048 if (irq_handler(optee) == IRQ_WAKE_THREAD) 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()
1059 struct optee *optee = container_of(optee_smc, struct optee, smc); in notif_pcpu_irq_work_fn() local
1061 optee_do_bottom_half(optee->ctx); in notif_pcpu_irq_work_fn()
1064 static int init_pcpu_irq(struct optee *optee, u_int irq) in init_pcpu_irq() argument
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()
1112 static int optee_smc_notif_init_irq(struct optee *optee, u_int irq) in optee_smc_notif_init_irq() argument
1115 return init_pcpu_irq(optee, irq); in optee_smc_notif_init_irq()
1117 return init_irq(optee, irq); in optee_smc_notif_init_irq()
1120 static void uninit_pcpu_irq(struct optee *optee) in uninit_pcpu_irq() argument
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()
1130 static void optee_smc_notif_uninit_irq(struct optee *optee) in optee_smc_notif_uninit_irq() argument
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()
1136 uninit_pcpu_irq(optee); 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()
1162 struct optee *optee = tee_get_drvdata(teedev); in optee_get_version() local
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() local
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()
1362 return ERR_PTR(-ENOENT); in optee_config_shm_memremap()
1367 return ERR_PTR(-EINVAL); in optee_config_shm_memremap()
1373 size = end - begin; in optee_config_shm_memremap()
1378 return ERR_PTR(-EINVAL); in optee_config_shm_memremap()
1419 return ERR_PTR(-ENXIO); in get_invoke_func()
1428 return ERR_PTR(-EINVAL); in get_invoke_func()
1431 /* optee_remove - Device Removal Routine
1439 struct optee *optee = platform_get_drvdata(pdev); in optee_smc_remove() local
1442 * Ask OP-TEE to free all cached shared memory objects to decrease in optee_smc_remove()
1446 if (!optee->rpc_param_count) in optee_smc_remove()
1447 optee_disable_shm_cache(optee); in optee_smc_remove()
1449 optee_smc_notif_uninit_irq(optee); in optee_smc_remove()
1451 optee_remove_common(optee); in optee_smc_remove()
1453 if (optee->smc.memremaped_shm) in optee_smc_remove()
1454 memunmap(optee->smc.memremaped_shm); in optee_smc_remove()
1456 kfree(optee); in optee_smc_remove()
1459 /* optee_shutdown - Device Removal Routine
1468 struct optee *optee = platform_get_drvdata(pdev); in optee_shutdown() local
1470 if (!optee->rpc_param_count) in optee_shutdown()
1471 optee_disable_shm_cache(optee); in optee_shutdown()
1476 #define OPTEE_FW_IMAGE "optee/tee.bin"
1483 * Invoking a call on a CPU will cause OP-TEE to perform the required in optee_cpuhp_probe()
1490 return -EINVAL; in optee_cpuhp_probe()
1509 rc = request_firmware(&fw, OPTEE_FW_IMAGE, &pdev->dev); in optee_load_fw()
1517 return -EPROBE_DEFER; in optee_load_fw()
1521 data_size = fw->size; in optee_load_fw()
1524 * 32-bit space since TF-A cannot map memory beyond the 32-bit boundary. in optee_load_fw()
1526 data_buf = kmemdup(fw->data, fw->size, GFP_KERNEL | GFP_DMA); in optee_load_fw()
1528 rc = -ENOMEM; in optee_load_fw()
1549 pr_warn("OP-TEE image loaded from kernel, this can be insecure"); in optee_load_fw()
1560 * We need to initialize OP-TEE on all other running cores as in optee_load_fw()
1563 * TF-A which are registered by the OP-TEE SPD. Due to that we in optee_load_fw()
1564 * can un-register the callback right after registering it. in optee_load_fw()
1567 hp_state = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "optee:probe", in optee_load_fw()
1570 pr_warn("Failed with CPU hotplug setup for OP-TEE"); in optee_load_fw()
1571 return -EINVAL; in optee_load_fw()
1590 struct tee_shm_pool *pool = ERR_PTR(-EINVAL); in optee_probe()
1591 struct optee *optee = NULL; in optee_probe() local
1602 invoke_fn = get_invoke_func(&pdev->dev); in optee_probe()
1612 return -EINVAL; in optee_probe()
1619 return -EINVAL; in optee_probe()
1627 return -EINVAL; in optee_probe()
1636 * optee_get_msg_arg() to pre-register (by having in optee_probe()
1640 * With the page is pre-registered we can use a non-zero in optee_probe()
1645 * OPTEE_SMC_CALL_WITH_REGD_ARG for pre-registered pages. in optee_probe()
1656 * If dynamic shared memory is not available or failed - try static one in optee_probe()
1660 * The static memory pool can use non-zero page offsets so in optee_probe()
1663 * optee_get_msg_arg() should not pre-register the in optee_probe()
1679 optee = kzalloc(sizeof(*optee), GFP_KERNEL); in optee_probe()
1680 if (!optee) { in optee_probe()
1681 rc = -ENOMEM; in optee_probe()
1685 optee->ops = &optee_ops; in optee_probe()
1686 optee->smc.invoke_fn = invoke_fn; in optee_probe()
1687 optee->smc.sec_caps = sec_caps; in optee_probe()
1688 optee->rpc_param_count = rpc_param_count; in optee_probe()
1692 optee->in_kernel_rpmb_routing = true; in optee_probe()
1694 teedev = tee_device_alloc(&optee_clnt_desc, NULL, pool, optee); in optee_probe()
1699 optee->teedev = teedev; in optee_probe()
1701 teedev = tee_device_alloc(&optee_supp_desc, NULL, pool, optee); in optee_probe()
1706 optee->supp_teedev = teedev; in optee_probe()
1708 optee_set_dev_group(optee); in optee_probe()
1710 rc = tee_device_register(optee->teedev); in optee_probe()
1714 rc = tee_device_register(optee->supp_teedev); in optee_probe()
1718 optee_cq_init(&optee->call_queue, thread_count); in optee_probe()
1719 optee_supp_init(&optee->supp); in optee_probe()
1720 optee->smc.memremaped_shm = memremaped_shm; in optee_probe()
1721 optee->pool = pool; in optee_probe()
1722 optee_shm_arg_cache_init(optee, arg_cache_flags); in optee_probe()
1723 mutex_init(&optee->rpmb_dev_mutex); in optee_probe()
1725 platform_set_drvdata(pdev, optee); in optee_probe()
1726 ctx = teedev_open(optee->teedev); in optee_probe()
1731 optee->ctx = ctx; in optee_probe()
1732 rc = optee_notif_init(optee, max_notif_value); in optee_probe()
1746 rc = optee_smc_notif_init_irq(optee, irq); in optee_probe()
1751 enable_async_notif(optee->smc.invoke_fn); in optee_probe()
1756 * Ensure that there are no pre-existing shm objects before enabling in optee_probe()
1762 optee_disable_unmapped_shm_cache(optee); in optee_probe()
1768 if (!optee->rpc_param_count) in optee_probe()
1769 optee_enable_shm_cache(optee); in optee_probe()
1771 if (optee->smc.sec_caps & OPTEE_SMC_SEC_CAP_DYNAMIC_SHM) in optee_probe()
1778 INIT_WORK(&optee->rpmb_scan_bus_work, optee_bus_scan_rpmb); in optee_probe()
1779 optee->rpmb_intf.notifier_call = optee_rpmb_intf_rdev; in optee_probe()
1781 &optee->rpmb_intf); in optee_probe()
1786 if (!optee->rpc_param_count) in optee_probe()
1787 optee_disable_shm_cache(optee); in optee_probe()
1788 optee_smc_notif_uninit_irq(optee); in optee_probe()
1791 optee_notif_uninit(optee); in optee_probe()
1795 rpmb_dev_put(optee->rpmb_dev); in optee_probe()
1796 mutex_destroy(&optee->rpmb_dev_mutex); in optee_probe()
1797 optee_shm_arg_cache_uninit(optee); in optee_probe()
1798 optee_supp_uninit(&optee->supp); in optee_probe()
1799 mutex_destroy(&optee->call_queue.mutex); in optee_probe()
1801 tee_device_unregister(optee->supp_teedev); in optee_probe()
1803 tee_device_unregister(optee->teedev); in optee_probe()
1805 kfree(optee); in optee_probe()
1814 { .compatible = "linaro,optee-tz" },
1824 .name = "optee",