1 /*
2 * Copyright (c) 2023, Arm Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7 #include "../ts_rpc_abi.h"
8 #include <stdint.h>
9 #include <string.h>
10 #include <CppUTest/TestHarness.h>
11
TEST_GROUP(ts_rpc_abi)12 TEST_GROUP(ts_rpc_abi) {
13 TEST_SETUP() {
14 memset(regs, 0x00, sizeof(regs));
15 }
16
17 void set_regs(uint32_t a0, uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4)
18 {
19 regs[0] = a0;
20 regs[1] = a1;
21 regs[2] = a2;
22 regs[3] = a3;
23 regs[4] = a4;
24 }
25
26 void check_regs(uint32_t a0, uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4)
27 {
28 UNSIGNED_LONGS_EQUAL(a0, regs[0]);
29 UNSIGNED_LONGS_EQUAL(a1, regs[1]);
30 UNSIGNED_LONGS_EQUAL(a2, regs[2]);
31 UNSIGNED_LONGS_EQUAL(a3, regs[3]);
32 UNSIGNED_LONGS_EQUAL(a4, regs[4]);
33 }
34
35 uint32_t regs[5];
36 };
37
TEST(ts_rpc_abi,flags)38 TEST(ts_rpc_abi, flags)
39 {
40 const uint8_t flags = 0x3f;
41
42 ts_rpc_abi_set_flags(regs, flags);
43 check_regs(0x3f000000, 0, 0, 0, 0);
44
45 UNSIGNED_LONGS_EQUAL(flags, ts_rpc_abi_get_flags(regs));
46 }
47
TEST(ts_rpc_abi,interface_id)48 TEST(ts_rpc_abi, interface_id)
49 {
50 const uint8_t interface_id = 0xa5;
51
52 ts_rpc_abi_set_interface_id(regs, interface_id);
53 check_regs(0x00a50000, 0, 0, 0, 0);
54
55 UNSIGNED_LONGS_EQUAL(interface_id, ts_rpc_abi_get_interface_id(regs));
56 }
57
TEST(ts_rpc_abi,management_interface_id)58 TEST(ts_rpc_abi, management_interface_id)
59 {
60 CHECK_FALSE(ts_rpc_abi_is_management_interface_id(regs));
61
62 ts_rpc_abi_set_management_interface_id(regs);
63 check_regs(0x00ff0000, 0, 0, 0, 0);
64
65 CHECK_TRUE(ts_rpc_abi_is_management_interface_id(regs));
66 }
67
TEST(ts_rpc_abi,opcode)68 TEST(ts_rpc_abi, opcode)
69 {
70 const uint16_t opcode = 0x8765;
71
72 ts_rpc_abi_set_opcode(regs, 0x8765);
73 check_regs(0x00008765, 0, 0, 0, 0);
74
75 UNSIGNED_LONGS_EQUAL(0x8765, ts_rpc_abi_get_opcode(regs));
76 }
77
TEST(ts_rpc_abi,copy_control_reg)78 TEST(ts_rpc_abi, copy_control_reg)
79 {
80 uint32_t source_regs[5] = { 0xfedcba98, 0, 0, 0, 0 };
81
82 ts_rpc_abi_copy_control_reg(regs, source_regs);
83
84 check_regs(0xfedcba98, 0, 0, 0, 0);
85 }
86
TEST(ts_rpc_abi,version)87 TEST(ts_rpc_abi, version)
88 {
89 const uint32_t version = 0x98765432;
90
91 ts_rpc_abi_set_version(regs, version);
92 check_regs(0, version, 0, 0, 0);
93
94 UNSIGNED_LONGS_EQUAL(version, ts_rpc_abi_get_version(regs));
95
96 }
97
TEST(ts_rpc_abi,memory_handle)98 TEST(ts_rpc_abi, memory_handle)
99 {
100 const uint64_t handle = 0xfedcba9876543210;
101
102 ts_rpc_abi_set_memory_handle(regs, handle);
103 check_regs(0, 0x76543210, 0xfedcba98, 0, 0);
104
105 UNSIGNED_LONGLONGS_EQUAL(handle, ts_rpc_abi_get_memory_handle(regs));
106 }
107
TEST(ts_rpc_abi,memory_tag)108 TEST(ts_rpc_abi, memory_tag)
109 {
110 const uint64_t tag = 0xfedcba9876543210;
111
112 ts_rpc_abi_set_memory_tag(regs, tag);
113 check_regs(0, 0, 0, 0x76543210, 0xfedcba98);
114
115 UNSIGNED_LONGLONGS_EQUAL(tag, ts_rpc_abi_get_memory_tag(regs));
116 }
117
TEST(ts_rpc_abi,rpc_status)118 TEST(ts_rpc_abi, rpc_status)
119 {
120 const uint32_t rpc_status = 0x89abcdef;
121
122 ts_rpc_abi_set_rpc_status(regs, rpc_status);
123 check_regs(0, rpc_status, 0, 0, 0);
124
125 UNSIGNED_LONGS_EQUAL(rpc_status, ts_rpc_abi_get_rpc_status(regs));
126 }
127
TEST(ts_rpc_abi,service_status)128 TEST(ts_rpc_abi, service_status)
129 {
130 const uint32_t service_status = 0x89abcdef;
131
132 ts_rpc_abi_set_service_status(regs, service_status);
133 check_regs(0, 0, service_status, 0, 0);
134
135 UNSIGNED_LONGS_EQUAL(service_status, ts_rpc_abi_get_service_status(regs));
136 }
137
TEST(ts_rpc_abi,uuid)138 TEST(ts_rpc_abi, uuid)
139 {
140 const struct rpc_uuid expected = {
141 .uuid = { 0xf0, 0x33, 0xbe, 0x6d, 0x6c, 0xc4, 0x47, 0x38,
142 0x88, 0xfd, 0xdd, 0x44, 0xac, 0x56, 0x2b, 0x69}
143 };
144 struct rpc_uuid actual = { 0 };
145
146 ts_rpc_abi_set_uuid(regs, &expected);
147 check_regs(0, 0x6dbe33f0, 0x3847c46c, 0x44ddfd88, 0x692b56ac);
148
149 ts_rpc_abi_get_uuid(regs, &actual);
150 MEMCMP_EQUAL(expected.uuid, actual.uuid, sizeof(expected));
151 }
152
TEST(ts_rpc_abi,queried_interface_id)153 TEST(ts_rpc_abi, queried_interface_id)
154 {
155 const uint8_t interface_id = 0xa5;
156
157 ts_rpc_abi_set_queried_interface_id(regs, interface_id);
158 check_regs(0, 0, interface_id, 0, 0);
159
160 UNSIGNED_LONGS_EQUAL(interface_id, ts_rpc_abi_get_queried_interface_id(regs));
161 }
162
TEST(ts_rpc_abi,request_length)163 TEST(ts_rpc_abi, request_length)
164 {
165 const uint32_t length = 0x12345678;
166
167 ts_rpc_abi_set_request_length(regs, length);
168 check_regs(0, 0, 0, length, 0);
169
170 UNSIGNED_LONGS_EQUAL(length, ts_rpc_abi_get_request_length(regs));
171 }
172
TEST(ts_rpc_abi,client_id)173 TEST(ts_rpc_abi, client_id)
174 {
175 const uint32_t client_id = 0xabcdef01;
176
177 ts_rpc_abi_set_client_id(regs, client_id);
178 check_regs(0, 0, 0, 0, client_id);
179
180 UNSIGNED_LONGS_EQUAL(client_id, ts_rpc_abi_get_client_id(regs));
181 }
182
TEST(ts_rpc_abi,response_length)183 TEST(ts_rpc_abi, response_length)
184 {
185 const uint32_t length = 0x12345678;
186
187 ts_rpc_abi_set_response_length(regs, length);
188 check_regs(0, 0, 0, length, 0);
189
190 UNSIGNED_LONGS_EQUAL(length, ts_rpc_abi_get_response_length(regs));
191 }
192