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, ¶m) || 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