1 // SPDX-License-Identifier: BSD-2-Clause
3 * Copyright (c) 2018, Linaro Limited
10 #include <linux/types.h>
12 #include "optee_msg.h"
13 #include "optee_msg_supplicant.h"
14 #include "optee_private.h"
15 #include "optee_smc.h"
17 static void cmd_shm_alloc(struct udevice *dev, struct optee_msg_arg *arg,
25 arg->ret_origin = TEE_ORIGIN_COMMS;
27 if (arg->num_params != 1 ||
28 arg->params[0].attr != OPTEE_MSG_ATTR_TYPE_VALUE_INPUT) {
29 arg->ret = TEE_ERROR_BAD_PARAMETERS;
33 rc = __tee_shm_add(dev, 0, NULL, arg->params[0].u.value.b,
34 TEE_SHM_REGISTER | TEE_SHM_ALLOC, &shm);
37 arg->ret = TEE_ERROR_OUT_OF_MEMORY;
39 arg->ret = TEE_ERROR_GENERIC;
43 pl = optee_alloc_and_init_page_list(shm->addr, shm->size, &ph_ptr);
45 arg->ret = TEE_ERROR_OUT_OF_MEMORY;
51 arg->params[0].attr = OPTEE_MSG_ATTR_TYPE_TMEM_OUTPUT |
52 OPTEE_MSG_ATTR_NONCONTIG;
53 arg->params[0].u.tmem.buf_ptr = ph_ptr;
54 arg->params[0].u.tmem.size = shm->size;
55 arg->params[0].u.tmem.shm_ref = (ulong)shm;
56 arg->ret = TEE_SUCCESS;
59 static void cmd_shm_free(struct optee_msg_arg *arg)
61 arg->ret_origin = TEE_ORIGIN_COMMS;
63 if (arg->num_params != 1 ||
64 arg->params[0].attr != OPTEE_MSG_ATTR_TYPE_VALUE_INPUT) {
65 arg->ret = TEE_ERROR_BAD_PARAMETERS;
69 tee_shm_free((struct tee_shm *)(ulong)arg->params[0].u.value.b);
70 arg->ret = TEE_SUCCESS;
73 void optee_suppl_cmd(struct udevice *dev, struct tee_shm *shm_arg,
76 struct optee_msg_arg *arg = shm_arg->addr;
79 case OPTEE_MSG_RPC_CMD_SHM_ALLOC:
80 cmd_shm_alloc(dev, arg, page_list);
82 case OPTEE_MSG_RPC_CMD_SHM_FREE:
85 case OPTEE_MSG_RPC_CMD_FS:
86 debug("REE FS storage isn't available\n");
87 arg->ret = TEE_ERROR_STORAGE_NOT_AVAILABLE;
89 case OPTEE_MSG_RPC_CMD_RPMB:
90 optee_suppl_cmd_rpmb(dev, arg);
93 arg->ret = TEE_ERROR_NOT_IMPLEMENTED;
96 arg->ret_origin = TEE_ORIGIN_COMMS;