Lines Matching +full:op +full:- +full:tee
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2015-2021, Linaro Limited
37 shm->kaddr = alloc_pages_exact(nr_pages * PAGE_SIZE, in optee_pool_op_alloc_helper()
39 if (!shm->kaddr) in optee_pool_op_alloc_helper()
40 return -ENOMEM; in optee_pool_op_alloc_helper()
42 shm->paddr = virt_to_phys(shm->kaddr); in optee_pool_op_alloc_helper()
43 shm->size = nr_pages * PAGE_SIZE; in optee_pool_op_alloc_helper()
47 rc = -ENOMEM; in optee_pool_op_alloc_helper()
52 pages[i] = virt_to_page((u8 *)shm->kaddr + i * PAGE_SIZE); in optee_pool_op_alloc_helper()
54 shm->pages = pages; in optee_pool_op_alloc_helper()
55 shm->num_pages = nr_pages; in optee_pool_op_alloc_helper()
58 rc = shm_register(shm->ctx, shm, pages, nr_pages, in optee_pool_op_alloc_helper()
59 (unsigned long)shm->kaddr); in optee_pool_op_alloc_helper()
66 free_pages_exact(shm->kaddr, shm->size); in optee_pool_op_alloc_helper()
67 shm->kaddr = NULL; in optee_pool_op_alloc_helper()
76 shm_unregister(shm->ctx, shm); in optee_pool_op_free_helper()
77 free_pages_exact(shm->kaddr, shm->size); in optee_pool_op_free_helper()
78 shm->kaddr = NULL; in optee_pool_op_free_helper()
79 kfree(shm->pages); in optee_pool_op_free_helper()
80 shm->pages = NULL; in optee_pool_op_free_helper()
91 struct tee_device *teedev = ctx->teedev; in optee_open()
96 return -ENOMEM; in optee_open()
98 if (teedev == optee->supp_teedev) { in optee_open()
101 mutex_lock(&optee->supp.mutex); in optee_open()
102 if (!optee->supp.ctx) { in optee_open()
104 optee->supp.ctx = ctx; in optee_open()
106 mutex_unlock(&optee->supp.mutex); in optee_open()
109 return -EBUSY; in optee_open()
112 if (!optee->scan_bus_done) { in optee_open()
113 INIT_WORK(&optee->scan_bus_work, optee_bus_scan); in optee_open()
114 schedule_work(&optee->scan_bus_work); in optee_open()
115 optee->scan_bus_done = true; in optee_open()
118 mutex_init(&ctxdata->mutex); in optee_open()
119 INIT_LIST_HEAD(&ctxdata->sess_list); in optee_open()
121 ctx->cap_memref_null = cap_memref_null; in optee_open()
122 ctx->data = ctxdata; in optee_open()
131 struct optee_context_data *ctxdata = ctx->data; in optee_release_helper()
138 list_for_each_entry_safe(sess, sess_tmp, &ctxdata->sess_list, in optee_release_helper()
140 list_del(&sess->list_node); in optee_release_helper()
141 close_session(ctx, sess->session_id, sess->use_sys_thread); in optee_release_helper()
145 ctx->data = NULL; in optee_release_helper()
155 struct optee *optee = tee_get_drvdata(ctx->teedev); in optee_release_supp()
159 optee_supp_release(&optee->supp); in optee_release_supp()
164 /* Unregister OP-TEE specific client devices on TEE bus */ in optee_remove_common()
169 teedev_close_context(optee->ctx); in optee_remove_common()
174 tee_device_unregister(optee->supp_teedev); in optee_remove_common()
175 tee_device_unregister(optee->teedev); in optee_remove_common()
177 tee_shm_pool_free(optee->pool); in optee_remove_common()
178 optee_supp_uninit(&optee->supp); in optee_remove_common()
179 mutex_destroy(&optee->call_queue.mutex); in optee_remove_common()
191 * Therefore, we cannot reliably initialize the OP-TEE driver in the in optee_core_init()
195 return -ENODEV; in optee_core_init()
217 MODULE_DESCRIPTION("OP-TEE driver");