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

1 // SPDX-License-Identifier: GPL-2.0-only
8 #include <linux/arm-smccc.h>
26 #define DRIVER_NAME "optee"
31 * optee_from_msg_param() - convert from OPTEE_MSG parameters to
49 u32 attr = mp->attr & OPTEE_MSG_ATTR_TYPE_MASK; in optee_from_msg_param()
53 p->attr = TEE_IOCTL_PARAM_ATTR_TYPE_NONE; in optee_from_msg_param()
54 memset(&p->u, 0, sizeof(p->u)); in optee_from_msg_param()
59 p->attr = TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_INPUT + in optee_from_msg_param()
60 attr - OPTEE_MSG_ATTR_TYPE_VALUE_INPUT; in optee_from_msg_param()
61 p->u.value.a = mp->u.value.a; in optee_from_msg_param()
62 p->u.value.b = mp->u.value.b; in optee_from_msg_param()
63 p->u.value.c = mp->u.value.c; in optee_from_msg_param()
68 p->attr = TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT + in optee_from_msg_param()
69 attr - OPTEE_MSG_ATTR_TYPE_TMEM_INPUT; in optee_from_msg_param()
70 p->u.memref.size = mp->u.tmem.size; in optee_from_msg_param()
72 mp->u.tmem.shm_ref; in optee_from_msg_param()
74 p->u.memref.shm_offs = 0; in optee_from_msg_param()
75 p->u.memref.shm = NULL; in optee_from_msg_param()
81 p->u.memref.shm_offs = mp->u.tmem.buf_ptr - pa; in optee_from_msg_param()
82 p->u.memref.shm = shm; in optee_from_msg_param()
87 p->attr = TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT + in optee_from_msg_param()
88 attr - OPTEE_MSG_ATTR_TYPE_RMEM_INPUT; in optee_from_msg_param()
89 p->u.memref.size = mp->u.rmem.size; in optee_from_msg_param()
91 mp->u.rmem.shm_ref; in optee_from_msg_param()
94 p->u.memref.shm_offs = 0; in optee_from_msg_param()
95 p->u.memref.shm = NULL; in optee_from_msg_param()
98 p->u.memref.shm_offs = mp->u.rmem.offs; in optee_from_msg_param()
99 p->u.memref.shm = shm; in optee_from_msg_param()
104 return -EINVAL; in optee_from_msg_param()
116 mp->attr = OPTEE_MSG_ATTR_TYPE_TMEM_INPUT + p->attr - in to_msg_param_tmp_mem()
119 mp->u.tmem.shm_ref = (unsigned long)p->u.memref.shm; in to_msg_param_tmp_mem()
120 mp->u.tmem.size = p->u.memref.size; in to_msg_param_tmp_mem()
122 if (!p->u.memref.shm) { in to_msg_param_tmp_mem()
123 mp->u.tmem.buf_ptr = 0; in to_msg_param_tmp_mem()
127 rc = tee_shm_get_pa(p->u.memref.shm, p->u.memref.shm_offs, &pa); in to_msg_param_tmp_mem()
131 mp->u.tmem.buf_ptr = pa; in to_msg_param_tmp_mem()
132 mp->attr |= OPTEE_MSG_ATTR_CACHE_PREDEFINED << in to_msg_param_tmp_mem()
141 mp->attr = OPTEE_MSG_ATTR_TYPE_RMEM_INPUT + p->attr - in to_msg_param_reg_mem()
144 mp->u.rmem.shm_ref = (unsigned long)p->u.memref.shm; in to_msg_param_reg_mem()
145 mp->u.rmem.size = p->u.memref.size; in to_msg_param_reg_mem()
146 mp->u.rmem.offs = p->u.memref.shm_offs; in to_msg_param_reg_mem()
151 * optee_to_msg_param() - convert from struct tee_params to OPTEE_MSG parameters
167 switch (p->attr) { in optee_to_msg_param()
169 mp->attr = TEE_IOCTL_PARAM_ATTR_TYPE_NONE; in optee_to_msg_param()
170 memset(&mp->u, 0, sizeof(mp->u)); in optee_to_msg_param()
175 mp->attr = OPTEE_MSG_ATTR_TYPE_VALUE_INPUT + p->attr - in optee_to_msg_param()
177 mp->u.value.a = p->u.value.a; in optee_to_msg_param()
178 mp->u.value.b = p->u.value.b; in optee_to_msg_param()
179 mp->u.value.c = p->u.value.c; in optee_to_msg_param()
184 if (tee_shm_is_registered(p->u.memref.shm)) in optee_to_msg_param()
192 return -EINVAL; in optee_to_msg_param()
206 struct optee *optee = tee_get_drvdata(teedev); in optee_get_version() local
208 if (optee->sec_caps & OPTEE_SMC_SEC_CAP_DYNAMIC_SHM) in optee_get_version()
210 if (optee->sec_caps & OPTEE_SMC_SEC_CAP_MEMREF_NULL) in optee_get_version()
223 struct tee_device *teedev = ctx->teedev; in optee_open()
224 struct optee *optee = tee_get_drvdata(teedev); in optee_open() local
228 return -ENOMEM; in optee_open()
230 if (teedev == optee->supp_teedev) { in optee_open()
233 mutex_lock(&optee->supp.mutex); in optee_open()
234 if (!optee->supp.ctx) { in optee_open()
236 optee->supp.ctx = ctx; in optee_open()
238 mutex_unlock(&optee->supp.mutex); in optee_open()
241 return -EBUSY; in optee_open()
244 if (!optee->scan_bus_done) { in optee_open()
245 INIT_WORK(&optee->scan_bus_work, optee_bus_scan); in optee_open()
246 optee->scan_bus_wq = create_workqueue("optee_bus_scan"); in optee_open()
247 if (!optee->scan_bus_wq) { in optee_open()
249 return -ECHILD; in optee_open()
251 queue_work(optee->scan_bus_wq, &optee->scan_bus_work); in optee_open()
252 optee->scan_bus_done = true; in optee_open()
255 mutex_init(&ctxdata->mutex); in optee_open()
256 INIT_LIST_HEAD(&ctxdata->sess_list); in optee_open()
258 if (optee->sec_caps & OPTEE_SMC_SEC_CAP_MEMREF_NULL) in optee_open()
259 ctx->cap_memref_null = true; in optee_open()
261 ctx->cap_memref_null = false; in optee_open()
263 ctx->data = ctxdata; in optee_open()
269 struct optee_context_data *ctxdata = ctx->data; in optee_release()
270 struct tee_device *teedev = ctx->teedev; in optee_release()
271 struct optee *optee = tee_get_drvdata(teedev); in optee_release() local
296 list_for_each_entry_safe(sess, sess_tmp, &ctxdata->sess_list, in optee_release()
298 list_del(&sess->list_node); in optee_release()
301 arg->cmd = OPTEE_MSG_CMD_CLOSE_SESSION; in optee_release()
302 arg->session = sess->session_id; in optee_release()
312 ctx->data = NULL; in optee_release()
314 if (teedev == optee->supp_teedev) { in optee_release()
315 if (optee->scan_bus_wq) { in optee_release()
316 destroy_workqueue(optee->scan_bus_wq); in optee_release()
317 optee->scan_bus_wq = NULL; in optee_release()
319 optee_supp_release(&optee->supp); in optee_release()
336 .name = DRIVER_NAME "-clnt",
352 .name = DRIVER_NAME "-supp",
481 return ERR_PTR(-ENOENT); in optee_config_shm_memremap()
486 return ERR_PTR(-EINVAL); in optee_config_shm_memremap()
492 size = end - begin; in optee_config_shm_memremap()
496 return ERR_PTR(-EINVAL); in optee_config_shm_memremap()
502 return ERR_PTR(-EINVAL); in optee_config_shm_memremap()
514 size -= sz; in optee_config_shm_memremap()
565 return ERR_PTR(-ENXIO); in get_invoke_func()
574 return ERR_PTR(-EINVAL); in get_invoke_func()
577 /* optee_remove - Device Removal Routine
586 struct optee *optee = platform_get_drvdata(pdev); in optee_remove() local
588 /* Unregister OP-TEE specific client devices on TEE bus */ in optee_remove()
592 * Ask OP-TEE to free all cached shared memory objects to decrease in optee_remove()
596 optee_disable_shm_cache(optee); in optee_remove()
602 tee_device_unregister(optee->supp_teedev); in optee_remove()
603 tee_device_unregister(optee->teedev); in optee_remove()
605 tee_shm_pool_free(optee->pool); in optee_remove()
606 if (optee->memremaped_shm) in optee_remove()
607 memunmap(optee->memremaped_shm); in optee_remove()
608 optee_wait_queue_exit(&optee->wait_queue); in optee_remove()
609 optee_supp_uninit(&optee->supp); in optee_remove()
610 mutex_destroy(&optee->call_queue.mutex); in optee_remove()
612 kfree(optee); in optee_remove()
617 /* optee_shutdown - Device Removal Routine
632 struct tee_shm_pool *pool = ERR_PTR(-EINVAL); in optee_probe()
633 struct optee *optee = NULL; in optee_probe() local
643 * Therefore, we cannot reliably initialize the OP-TEE driver in the in optee_probe()
647 return -ENODEV; in optee_probe()
649 invoke_fn = get_invoke_func(&pdev->dev); in optee_probe()
655 return -EINVAL; in optee_probe()
662 return -EINVAL; in optee_probe()
667 return -EINVAL; in optee_probe()
677 * If dynamic shared memory is not available or failed - try static one in optee_probe()
685 optee = kzalloc(sizeof(*optee), GFP_KERNEL); in optee_probe()
686 if (!optee) { in optee_probe()
687 rc = -ENOMEM; in optee_probe()
691 optee->invoke_fn = invoke_fn; in optee_probe()
692 optee->sec_caps = sec_caps; in optee_probe()
694 teedev = tee_device_alloc(&optee_desc, NULL, pool, optee); in optee_probe()
699 optee->teedev = teedev; in optee_probe()
701 teedev = tee_device_alloc(&optee_supp_desc, NULL, pool, optee); in optee_probe()
706 optee->supp_teedev = teedev; in optee_probe()
708 rc = tee_device_register(optee->teedev); in optee_probe()
712 rc = tee_device_register(optee->supp_teedev); in optee_probe()
716 mutex_init(&optee->call_queue.mutex); in optee_probe()
717 INIT_LIST_HEAD(&optee->call_queue.waiters); in optee_probe()
718 optee_wait_queue_init(&optee->wait_queue); in optee_probe()
719 optee_supp_init(&optee->supp); in optee_probe()
720 optee->memremaped_shm = memremaped_shm; in optee_probe()
721 optee->pool = pool; in optee_probe()
724 * Ensure that there are no pre-existing shm objects before enabling in optee_probe()
730 optee_disable_unmapped_shm_cache(optee); in optee_probe()
732 optee_enable_shm_cache(optee); in optee_probe()
734 if (optee->sec_caps & OPTEE_SMC_SEC_CAP_DYNAMIC_SHM) in optee_probe()
737 platform_set_drvdata(pdev, optee); in optee_probe()
748 if (optee) { in optee_probe()
754 tee_device_unregister(optee->supp_teedev); in optee_probe()
755 tee_device_unregister(optee->teedev); in optee_probe()
756 kfree(optee); in optee_probe()
766 { .compatible = "linaro,optee-tz" },
776 .name = "optee",
783 MODULE_DESCRIPTION("OP-TEE driver");
786 MODULE_ALIAS("platform:optee");