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