xref: /openbmc/u-boot/test/dm/tee.c (revision c091dc7dad8cd64c7e185d8af267ed2ef40af8dc)
1a6ab4245SJens Wiklander // SPDX-License-Identifier: GPL-2.0+
2a6ab4245SJens Wiklander /*
3a6ab4245SJens Wiklander  * Copyright (C) 2018 Linaro Limited
4a6ab4245SJens Wiklander  */
5a6ab4245SJens Wiklander 
6a6ab4245SJens Wiklander #include <common.h>
7a6ab4245SJens Wiklander #include <dm.h>
8a6ab4245SJens Wiklander #include <dm/test.h>
9a6ab4245SJens Wiklander #include <sandboxtee.h>
10a6ab4245SJens Wiklander #include <tee.h>
11a6ab4245SJens Wiklander #include <test/ut.h>
12a6ab4245SJens Wiklander #include <tee/optee_ta_avb.h>
13a6ab4245SJens Wiklander 
open_session(struct udevice * dev,u32 * session)14a6ab4245SJens Wiklander static int open_session(struct udevice *dev, u32 *session)
15a6ab4245SJens Wiklander {
16a6ab4245SJens Wiklander 	struct tee_open_session_arg arg;
17a6ab4245SJens Wiklander 	const struct tee_optee_ta_uuid uuid = TA_AVB_UUID;
18a6ab4245SJens Wiklander 	int rc;
19a6ab4245SJens Wiklander 
20a6ab4245SJens Wiklander 	memset(&arg, 0, sizeof(arg));
21a6ab4245SJens Wiklander 	tee_optee_ta_uuid_to_octets(arg.uuid, &uuid);
22a6ab4245SJens Wiklander 	rc = tee_open_session(dev, &arg, 0, NULL);
23a6ab4245SJens Wiklander 	if (rc)
24a6ab4245SJens Wiklander 		return rc;
25a6ab4245SJens Wiklander 	if (arg.ret)
26a6ab4245SJens Wiklander 		return -EIO;
27a6ab4245SJens Wiklander 	*session = arg.session;
28a6ab4245SJens Wiklander 
29a6ab4245SJens Wiklander 	return 0;
30a6ab4245SJens Wiklander }
31a6ab4245SJens Wiklander 
invoke_func(struct udevice * dev,u32 session)32a6ab4245SJens Wiklander static int invoke_func(struct udevice *dev, u32 session)
33a6ab4245SJens Wiklander {
34a6ab4245SJens Wiklander 	struct tee_param param = { .attr = TEE_PARAM_ATTR_TYPE_VALUE_OUTPUT };
35a6ab4245SJens Wiklander 	struct tee_invoke_arg arg;
36a6ab4245SJens Wiklander 
37a6ab4245SJens Wiklander 	memset(&arg, 0, sizeof(arg));
38a6ab4245SJens Wiklander 	arg.session = session;
39a6ab4245SJens Wiklander 	arg.func = TA_AVB_CMD_READ_LOCK_STATE;
40a6ab4245SJens Wiklander 
41a6ab4245SJens Wiklander 	if (tee_invoke_func(dev, &arg, 1, &param) || arg.ret)
42a6ab4245SJens Wiklander 		return -1;
43a6ab4245SJens Wiklander 
44a6ab4245SJens Wiklander 	return 0;
45a6ab4245SJens Wiklander }
46a6ab4245SJens Wiklander 
match(struct tee_version_data * vers,const void * data)47a6ab4245SJens Wiklander static int match(struct tee_version_data *vers, const void *data)
48a6ab4245SJens Wiklander {
49a6ab4245SJens Wiklander 	return vers->gen_caps & TEE_GEN_CAP_GP;
50a6ab4245SJens Wiklander }
51a6ab4245SJens Wiklander 
52*c091dc7dSJens Wiklander struct test_tee_vars {
53*c091dc7dSJens Wiklander 	struct tee_shm *reg_shm;
54*c091dc7dSJens Wiklander 	struct tee_shm *alloc_shm;
55*c091dc7dSJens Wiklander };
56*c091dc7dSJens Wiklander 
test_tee(struct unit_test_state * uts,struct test_tee_vars * vars)57*c091dc7dSJens Wiklander static int test_tee(struct unit_test_state *uts, struct test_tee_vars *vars)
58a6ab4245SJens Wiklander {
59a6ab4245SJens Wiklander 	struct tee_version_data vers;
60a6ab4245SJens Wiklander 	struct udevice *dev;
61a6ab4245SJens Wiklander 	struct sandbox_tee_state *state;
62a6ab4245SJens Wiklander 	u32 session = 0;
63a6ab4245SJens Wiklander 	int rc;
64a6ab4245SJens Wiklander 	u8 data[128];
65a6ab4245SJens Wiklander 
66a6ab4245SJens Wiklander 	dev = tee_find_device(NULL, match, NULL, &vers);
67a6ab4245SJens Wiklander 	ut_assert(dev);
68a6ab4245SJens Wiklander 	state = dev_get_priv(dev);
69a6ab4245SJens Wiklander 	ut_assert(!state->session);
70a6ab4245SJens Wiklander 
71a6ab4245SJens Wiklander 	rc = open_session(dev, &session);
72a6ab4245SJens Wiklander 	ut_assert(!rc);
73a6ab4245SJens Wiklander 	ut_assert(session == state->session);
74a6ab4245SJens Wiklander 
75a6ab4245SJens Wiklander 	rc = invoke_func(dev, session);
76a6ab4245SJens Wiklander 	ut_assert(!rc);
77a6ab4245SJens Wiklander 
78a6ab4245SJens Wiklander 	rc = tee_close_session(dev, session);
79a6ab4245SJens Wiklander 	ut_assert(!rc);
80a6ab4245SJens Wiklander 	ut_assert(!state->session);
81a6ab4245SJens Wiklander 
82a6ab4245SJens Wiklander 	ut_assert(!state->num_shms);
83*c091dc7dSJens Wiklander 	rc = tee_shm_register(dev, data, sizeof(data), 0, &vars->reg_shm);
84a6ab4245SJens Wiklander 	ut_assert(!rc);
85a6ab4245SJens Wiklander 	ut_assert(state->num_shms == 1);
86a6ab4245SJens Wiklander 
87*c091dc7dSJens Wiklander 	rc = tee_shm_alloc(dev, 256, 0, &vars->alloc_shm);
88a6ab4245SJens Wiklander 	ut_assert(!rc);
89a6ab4245SJens Wiklander 	ut_assert(state->num_shms == 2);
90a6ab4245SJens Wiklander 
91*c091dc7dSJens Wiklander 	ut_assert(tee_shm_is_registered(vars->reg_shm, dev));
92*c091dc7dSJens Wiklander 	ut_assert(tee_shm_is_registered(vars->alloc_shm, dev));
93a6ab4245SJens Wiklander 
94*c091dc7dSJens Wiklander 	tee_shm_free(vars->reg_shm);
95*c091dc7dSJens Wiklander 	vars->reg_shm = NULL;
96*c091dc7dSJens Wiklander 	tee_shm_free(vars->alloc_shm);
97*c091dc7dSJens Wiklander 	vars->alloc_shm = NULL;
98a6ab4245SJens Wiklander 	ut_assert(!state->num_shms);
99a6ab4245SJens Wiklander 
100a6ab4245SJens Wiklander 	return 0;
101a6ab4245SJens Wiklander }
102a6ab4245SJens Wiklander 
dm_test_tee(struct unit_test_state * uts)103*c091dc7dSJens Wiklander static int dm_test_tee(struct unit_test_state *uts)
104*c091dc7dSJens Wiklander {
105*c091dc7dSJens Wiklander 	struct test_tee_vars vars = { NULL, NULL };
106*c091dc7dSJens Wiklander 	int rc = test_tee(uts, &vars);
107*c091dc7dSJens Wiklander 
108*c091dc7dSJens Wiklander 	/* In case test_tee() asserts these may still remain allocated */
109*c091dc7dSJens Wiklander 	tee_shm_free(vars.reg_shm);
110*c091dc7dSJens Wiklander 	tee_shm_free(vars.alloc_shm);
111*c091dc7dSJens Wiklander 
112*c091dc7dSJens Wiklander 	return rc;
113*c091dc7dSJens Wiklander }
114*c091dc7dSJens Wiklander 
115a6ab4245SJens Wiklander DM_TEST(dm_test_tee, DM_TESTF_SCAN_FDT);
116