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

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2015-2016, Linaro Limited
25 mutex_init(&priv->mu); in optee_wait_queue_init()
26 INIT_LIST_HEAD(&priv->db); in optee_wait_queue_init()
31 mutex_destroy(&priv->mu); in optee_wait_queue_exit()
38 if (arg->num_params != 1) in handle_rpc_func_cmd_get_time()
40 if ((arg->params[0].attr & OPTEE_MSG_ATTR_TYPE_MASK) != in handle_rpc_func_cmd_get_time()
45 arg->params[0].u.value.a = ts.tv_sec; in handle_rpc_func_cmd_get_time()
46 arg->params[0].u.value.b = ts.tv_nsec; in handle_rpc_func_cmd_get_time()
48 arg->ret = TEEC_SUCCESS; in handle_rpc_func_cmd_get_time()
51 arg->ret = TEEC_ERROR_BAD_PARAMETERS; in handle_rpc_func_cmd_get_time()
62 int ret = -EOPNOTSUPP; in handle_rpc_func_cmd_i2c_transfer()
70 if (arg->num_params != ARRAY_SIZE(attr)) { in handle_rpc_func_cmd_i2c_transfer()
71 arg->ret = TEEC_ERROR_BAD_PARAMETERS; in handle_rpc_func_cmd_i2c_transfer()
75 params = kmalloc_array(arg->num_params, sizeof(struct tee_param), in handle_rpc_func_cmd_i2c_transfer()
78 arg->ret = TEEC_ERROR_OUT_OF_MEMORY; in handle_rpc_func_cmd_i2c_transfer()
82 if (optee_from_msg_param(params, arg->num_params, arg->params)) in handle_rpc_func_cmd_i2c_transfer()
85 for (i = 0; i < arg->num_params; i++) { in handle_rpc_func_cmd_i2c_transfer()
105 msg.buf = params[2].u.memref.shm->kaddr; in handle_rpc_func_cmd_i2c_transfer()
122 arg->ret = TEEC_ERROR_COMMUNICATION; in handle_rpc_func_cmd_i2c_transfer()
125 if (optee_to_msg_param(arg->params, arg->num_params, params)) in handle_rpc_func_cmd_i2c_transfer()
126 arg->ret = TEEC_ERROR_BAD_PARAMETERS; in handle_rpc_func_cmd_i2c_transfer()
128 arg->ret = TEEC_SUCCESS; in handle_rpc_func_cmd_i2c_transfer()
136 arg->ret = TEEC_ERROR_BAD_PARAMETERS; in handle_rpc_func_cmd_i2c_transfer()
142 arg->ret = TEEC_ERROR_NOT_SUPPORTED; in handle_rpc_func_cmd_i2c_transfer()
150 mutex_lock(&wq->mu); in wq_entry_get()
152 list_for_each_entry(w, &wq->db, link) in wq_entry_get()
153 if (w->key == key) in wq_entry_get()
158 init_completion(&w->c); in wq_entry_get()
159 w->key = key; in wq_entry_get()
160 list_add_tail(&w->link, &wq->db); in wq_entry_get()
163 mutex_unlock(&wq->mu); in wq_entry_get()
172 wait_for_completion(&w->c); in wq_sleep()
173 mutex_lock(&wq->mu); in wq_sleep()
174 list_del(&w->link); in wq_sleep()
175 mutex_unlock(&wq->mu); in wq_sleep()
185 complete(&w->c); in wq_wakeup()
191 if (arg->num_params != 1) in handle_rpc_func_cmd_wq()
194 if ((arg->params[0].attr & OPTEE_MSG_ATTR_TYPE_MASK) != in handle_rpc_func_cmd_wq()
198 switch (arg->params[0].u.value.a) { in handle_rpc_func_cmd_wq()
200 wq_sleep(&optee->wait_queue, arg->params[0].u.value.b); in handle_rpc_func_cmd_wq()
203 wq_wakeup(&optee->wait_queue, arg->params[0].u.value.b); in handle_rpc_func_cmd_wq()
209 arg->ret = TEEC_SUCCESS; in handle_rpc_func_cmd_wq()
212 arg->ret = TEEC_ERROR_BAD_PARAMETERS; in handle_rpc_func_cmd_wq()
219 if (arg->num_params != 1) in handle_rpc_func_cmd_wait()
222 if ((arg->params[0].attr & OPTEE_MSG_ATTR_TYPE_MASK) != in handle_rpc_func_cmd_wait()
226 msec_to_wait = arg->params[0].u.value.a; in handle_rpc_func_cmd_wait()
231 arg->ret = TEEC_SUCCESS; in handle_rpc_func_cmd_wait()
234 arg->ret = TEEC_ERROR_BAD_PARAMETERS; in handle_rpc_func_cmd_wait()
242 arg->ret_origin = TEEC_ORIGIN_COMMS; in handle_rpc_supp_cmd()
244 params = kmalloc_array(arg->num_params, sizeof(struct tee_param), in handle_rpc_supp_cmd()
247 arg->ret = TEEC_ERROR_OUT_OF_MEMORY; in handle_rpc_supp_cmd()
251 if (optee_from_msg_param(params, arg->num_params, arg->params)) { in handle_rpc_supp_cmd()
252 arg->ret = TEEC_ERROR_BAD_PARAMETERS; in handle_rpc_supp_cmd()
256 arg->ret = optee_supp_thrd_req(ctx, arg->cmd, arg->num_params, params); in handle_rpc_supp_cmd()
258 if (optee_to_msg_param(arg->params, arg->num_params, params)) in handle_rpc_supp_cmd()
259 arg->ret = TEEC_ERROR_BAD_PARAMETERS; in handle_rpc_supp_cmd()
268 struct optee *optee = tee_get_drvdata(ctx->teedev); in cmd_alloc_suppl()
278 return ERR_PTR(-ENOMEM); in cmd_alloc_suppl()
280 mutex_lock(&optee->supp.mutex); in cmd_alloc_suppl()
282 shm = tee_shm_get_from_id(optee->supp.ctx, param.u.value.c); in cmd_alloc_suppl()
283 mutex_unlock(&optee->supp.mutex); in cmd_alloc_suppl()
296 arg->ret_origin = TEEC_ORIGIN_COMMS; in handle_rpc_func_cmd_shm_alloc()
298 if (!arg->num_params || in handle_rpc_func_cmd_shm_alloc()
299 arg->params[0].attr != OPTEE_MSG_ATTR_TYPE_VALUE_INPUT) { in handle_rpc_func_cmd_shm_alloc()
300 arg->ret = TEEC_ERROR_BAD_PARAMETERS; in handle_rpc_func_cmd_shm_alloc()
304 for (n = 1; n < arg->num_params; n++) { in handle_rpc_func_cmd_shm_alloc()
305 if (arg->params[n].attr != OPTEE_MSG_ATTR_TYPE_NONE) { in handle_rpc_func_cmd_shm_alloc()
306 arg->ret = TEEC_ERROR_BAD_PARAMETERS; in handle_rpc_func_cmd_shm_alloc()
311 sz = arg->params[0].u.value.b; in handle_rpc_func_cmd_shm_alloc()
312 switch (arg->params[0].u.value.a) { in handle_rpc_func_cmd_shm_alloc()
320 arg->ret = TEEC_ERROR_BAD_PARAMETERS; in handle_rpc_func_cmd_shm_alloc()
325 arg->ret = TEEC_ERROR_OUT_OF_MEMORY; in handle_rpc_func_cmd_shm_alloc()
330 arg->ret = TEEC_ERROR_BAD_PARAMETERS; in handle_rpc_func_cmd_shm_alloc()
343 arg->ret = TEEC_ERROR_OUT_OF_MEMORY; in handle_rpc_func_cmd_shm_alloc()
349 arg->ret = TEEC_ERROR_OUT_OF_MEMORY; in handle_rpc_func_cmd_shm_alloc()
353 call_ctx->pages_list = pages_list; in handle_rpc_func_cmd_shm_alloc()
354 call_ctx->num_entries = page_num; in handle_rpc_func_cmd_shm_alloc()
356 arg->params[0].attr = OPTEE_MSG_ATTR_TYPE_TMEM_OUTPUT | in handle_rpc_func_cmd_shm_alloc()
360 * from 4k page, as described in OP-TEE ABI. in handle_rpc_func_cmd_shm_alloc()
362 arg->params[0].u.tmem.buf_ptr = virt_to_phys(pages_list) | in handle_rpc_func_cmd_shm_alloc()
364 (OPTEE_MSG_NONCONTIG_PAGE_SIZE - 1)); in handle_rpc_func_cmd_shm_alloc()
365 arg->params[0].u.tmem.size = tee_shm_get_size(shm); in handle_rpc_func_cmd_shm_alloc()
366 arg->params[0].u.tmem.shm_ref = (unsigned long)shm; in handle_rpc_func_cmd_shm_alloc()
371 arg->params[0].attr = OPTEE_MSG_ATTR_TYPE_TMEM_OUTPUT; in handle_rpc_func_cmd_shm_alloc()
372 arg->params[0].u.tmem.buf_ptr = pa; in handle_rpc_func_cmd_shm_alloc()
373 arg->params[0].u.tmem.size = sz; in handle_rpc_func_cmd_shm_alloc()
374 arg->params[0].u.tmem.shm_ref = (unsigned long)shm; in handle_rpc_func_cmd_shm_alloc()
377 arg->ret = TEEC_SUCCESS; in handle_rpc_func_cmd_shm_alloc()
413 arg->ret_origin = TEEC_ORIGIN_COMMS; in handle_rpc_func_cmd_shm_free()
415 if (arg->num_params != 1 || in handle_rpc_func_cmd_shm_free()
416 arg->params[0].attr != OPTEE_MSG_ATTR_TYPE_VALUE_INPUT) { in handle_rpc_func_cmd_shm_free()
417 arg->ret = TEEC_ERROR_BAD_PARAMETERS; in handle_rpc_func_cmd_shm_free()
421 shm = (struct tee_shm *)(unsigned long)arg->params[0].u.value.b; in handle_rpc_func_cmd_shm_free()
422 switch (arg->params[0].u.value.a) { in handle_rpc_func_cmd_shm_free()
430 arg->ret = TEEC_ERROR_BAD_PARAMETERS; in handle_rpc_func_cmd_shm_free()
432 arg->ret = TEEC_SUCCESS; in handle_rpc_func_cmd_shm_free()
437 if (call_ctx->pages_list) { in free_pages_list()
438 optee_free_pages_list(call_ctx->pages_list, in free_pages_list()
439 call_ctx->num_entries); in free_pages_list()
440 call_ctx->pages_list = NULL; in free_pages_list()
441 call_ctx->num_entries = 0; in free_pages_list()
462 switch (arg->cmd) { in handle_rpc_func_cmd()
488 * optee_handle_rpc() - handle RPC from secure world
491 * @call_ctx: call context. Preserved during one OP-TEE invocation
498 struct tee_device *teedev = ctx->teedev; in optee_handle_rpc()
503 switch (OPTEE_SMC_RETURN_GET_RPC_FUNC(param->a0)) { in optee_handle_rpc()
505 shm = tee_shm_alloc(ctx, param->a1, in optee_handle_rpc()
508 reg_pair_from_64(&param->a1, &param->a2, pa); in optee_handle_rpc()
509 reg_pair_from_64(&param->a4, &param->a5, in optee_handle_rpc()
512 param->a1 = 0; in optee_handle_rpc()
513 param->a2 = 0; in optee_handle_rpc()
514 param->a4 = 0; in optee_handle_rpc()
515 param->a5 = 0; in optee_handle_rpc()
519 shm = reg_pair_to_ptr(param->a1, param->a2); in optee_handle_rpc()
531 shm = reg_pair_to_ptr(param->a1, param->a2); in optee_handle_rpc()
536 (u32)OPTEE_SMC_RETURN_GET_RPC_FUNC(param->a0)); in optee_handle_rpc()
540 param->a0 = OPTEE_SMC_CALL_RETURN_FROM_RPC; in optee_handle_rpc()