1 // SPDX-License-Identifier: BSD-2-Clause
3 * Copyright (c) 2018, Linaro Limited
9 #include <linux/types.h>
11 #include "optee_msg.h"
12 #include "optee_msg_supplicant.h"
13 #include "optee_private.h"
14 #include "optee_smc.h"
16 static void cmd_shm_alloc(struct udevice *dev, struct optee_msg_arg *arg,
24 arg->ret_origin = TEE_ORIGIN_COMMS;
26 if (arg->num_params != 1 ||
27 arg->params[0].attr != OPTEE_MSG_ATTR_TYPE_VALUE_INPUT) {
28 arg->ret = TEE_ERROR_BAD_PARAMETERS;
32 rc = __tee_shm_add(dev, 0, NULL, arg->params[0].u.value.b,
33 TEE_SHM_REGISTER | TEE_SHM_ALLOC, &shm);
36 arg->ret = TEE_ERROR_OUT_OF_MEMORY;
38 arg->ret = TEE_ERROR_GENERIC;
42 pl = optee_alloc_and_init_page_list(shm->addr, shm->size, &ph_ptr);
44 arg->ret = TEE_ERROR_OUT_OF_MEMORY;
50 arg->params[0].attr = OPTEE_MSG_ATTR_TYPE_TMEM_OUTPUT |
51 OPTEE_MSG_ATTR_NONCONTIG;
52 arg->params[0].u.tmem.buf_ptr = ph_ptr;
53 arg->params[0].u.tmem.size = shm->size;
54 arg->params[0].u.tmem.shm_ref = (ulong)shm;
55 arg->ret = TEE_SUCCESS;
58 static void cmd_shm_free(struct optee_msg_arg *arg)
60 arg->ret_origin = TEE_ORIGIN_COMMS;
62 if (arg->num_params != 1 ||
63 arg->params[0].attr != OPTEE_MSG_ATTR_TYPE_VALUE_INPUT) {
64 arg->ret = TEE_ERROR_BAD_PARAMETERS;
68 tee_shm_free((struct tee_shm *)(ulong)arg->params[0].u.value.b);
69 arg->ret = TEE_SUCCESS;
72 void optee_suppl_cmd(struct udevice *dev, struct tee_shm *shm_arg,
75 struct optee_msg_arg *arg = shm_arg->addr;
78 case OPTEE_MSG_RPC_CMD_SHM_ALLOC:
79 cmd_shm_alloc(dev, arg, page_list);
81 case OPTEE_MSG_RPC_CMD_SHM_FREE:
84 case OPTEE_MSG_RPC_CMD_FS:
85 debug("OPTEE_MSG_RPC_CMD_FS not implemented\n");
86 arg->ret = TEE_ERROR_NOT_IMPLEMENTED;
88 case OPTEE_MSG_RPC_CMD_RPMB:
89 optee_suppl_cmd_rpmb(dev, arg);
92 arg->ret = TEE_ERROR_NOT_IMPLEMENTED;
95 arg->ret_origin = TEE_ORIGIN_COMMS;