]>
Commit | Line | Data |
---|---|---|
db681eaf TBS |
1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* | |
3 | * Kunit tests for ChromeOS Embedded Controller protocol. | |
4 | */ | |
5 | ||
6 | #include <kunit/test.h> | |
7 | ||
5f60d5f6 | 8 | #include <linux/unaligned.h> |
aaab5af4 | 9 | |
db681eaf TBS |
10 | #include <linux/platform_data/cros_ec_commands.h> |
11 | #include <linux/platform_data/cros_ec_proto.h> | |
12 | ||
13 | #include "cros_ec.h" | |
466f70fb | 14 | #include "cros_ec_proto_test_util.h" |
db681eaf TBS |
15 | |
16 | #define BUFSIZE 512 | |
17 | ||
18 | struct cros_ec_proto_test_priv { | |
19 | struct cros_ec_device ec_dev; | |
20 | u8 dout[BUFSIZE]; | |
21 | u8 din[BUFSIZE]; | |
22 | struct cros_ec_command *msg; | |
23 | u8 _msg[BUFSIZE]; | |
24 | }; | |
25 | ||
26 | static void cros_ec_proto_test_prepare_tx_legacy_normal(struct kunit *test) | |
27 | { | |
28 | struct cros_ec_proto_test_priv *priv = test->priv; | |
29 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
30 | struct cros_ec_command *msg = priv->msg; | |
31 | int ret, i; | |
32 | u8 csum; | |
33 | ||
34 | ec_dev->proto_version = 2; | |
35 | ||
36 | msg->command = EC_CMD_HELLO; | |
37 | msg->outsize = EC_PROTO2_MAX_PARAM_SIZE; | |
38 | msg->data[0] = 0xde; | |
39 | msg->data[1] = 0xad; | |
40 | msg->data[2] = 0xbe; | |
41 | msg->data[3] = 0xef; | |
42 | ||
43 | ret = cros_ec_prepare_tx(ec_dev, msg); | |
44 | ||
45 | KUNIT_EXPECT_EQ(test, ret, EC_MSG_TX_PROTO_BYTES + EC_PROTO2_MAX_PARAM_SIZE); | |
46 | KUNIT_EXPECT_EQ(test, ec_dev->dout[0], EC_CMD_VERSION0); | |
47 | KUNIT_EXPECT_EQ(test, ec_dev->dout[1], EC_CMD_HELLO); | |
48 | KUNIT_EXPECT_EQ(test, ec_dev->dout[2], EC_PROTO2_MAX_PARAM_SIZE); | |
49 | KUNIT_EXPECT_EQ(test, EC_MSG_TX_HEADER_BYTES, 3); | |
50 | KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + 0], 0xde); | |
51 | KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + 1], 0xad); | |
52 | KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + 2], 0xbe); | |
53 | KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + 3], 0xef); | |
54 | for (i = 4; i < EC_PROTO2_MAX_PARAM_SIZE; ++i) | |
55 | KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + i], 0); | |
56 | ||
57 | csum = EC_CMD_VERSION0; | |
58 | csum += EC_CMD_HELLO; | |
59 | csum += EC_PROTO2_MAX_PARAM_SIZE; | |
60 | csum += 0xde; | |
61 | csum += 0xad; | |
62 | csum += 0xbe; | |
63 | csum += 0xef; | |
64 | KUNIT_EXPECT_EQ(test, | |
65 | ec_dev->dout[EC_MSG_TX_HEADER_BYTES + EC_PROTO2_MAX_PARAM_SIZE], | |
66 | csum); | |
67 | } | |
68 | ||
69 | static void cros_ec_proto_test_prepare_tx_legacy_bad_msg_outsize(struct kunit *test) | |
70 | { | |
71 | struct cros_ec_proto_test_priv *priv = test->priv; | |
72 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
73 | struct cros_ec_command *msg = priv->msg; | |
74 | int ret; | |
75 | ||
76 | ec_dev->proto_version = 2; | |
77 | ||
78 | msg->outsize = EC_PROTO2_MAX_PARAM_SIZE + 1; | |
79 | ||
80 | ret = cros_ec_prepare_tx(ec_dev, msg); | |
81 | KUNIT_EXPECT_EQ(test, ret, -EINVAL); | |
82 | } | |
83 | ||
84 | static void cros_ec_proto_test_prepare_tx_normal(struct kunit *test) | |
85 | { | |
86 | struct cros_ec_proto_test_priv *priv = test->priv; | |
87 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
88 | struct cros_ec_command *msg = priv->msg; | |
89 | struct ec_host_request *request = (struct ec_host_request *)ec_dev->dout; | |
90 | int ret, i; | |
91 | u8 csum; | |
92 | ||
93 | msg->command = EC_CMD_HELLO; | |
94 | msg->outsize = 0x88; | |
95 | msg->data[0] = 0xde; | |
96 | msg->data[1] = 0xad; | |
97 | msg->data[2] = 0xbe; | |
98 | msg->data[3] = 0xef; | |
99 | ||
100 | ret = cros_ec_prepare_tx(ec_dev, msg); | |
101 | ||
102 | KUNIT_EXPECT_EQ(test, ret, sizeof(*request) + 0x88); | |
103 | ||
104 | KUNIT_EXPECT_EQ(test, request->struct_version, EC_HOST_REQUEST_VERSION); | |
105 | KUNIT_EXPECT_EQ(test, request->command, EC_CMD_HELLO); | |
106 | KUNIT_EXPECT_EQ(test, request->command_version, 0); | |
107 | KUNIT_EXPECT_EQ(test, request->data_len, 0x88); | |
108 | KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + 0], 0xde); | |
109 | KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + 1], 0xad); | |
110 | KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + 2], 0xbe); | |
111 | KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + 3], 0xef); | |
112 | for (i = 4; i < 0x88; ++i) | |
113 | KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + i], 0); | |
114 | ||
115 | csum = EC_HOST_REQUEST_VERSION; | |
116 | csum += EC_CMD_HELLO; | |
117 | csum += 0x88; | |
118 | csum += 0xde; | |
119 | csum += 0xad; | |
120 | csum += 0xbe; | |
121 | csum += 0xef; | |
122 | KUNIT_EXPECT_EQ(test, request->checksum, (u8)-csum); | |
123 | } | |
124 | ||
125 | static void cros_ec_proto_test_prepare_tx_bad_msg_outsize(struct kunit *test) | |
126 | { | |
127 | struct cros_ec_proto_test_priv *priv = test->priv; | |
128 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
129 | struct cros_ec_command *msg = priv->msg; | |
130 | int ret; | |
131 | ||
132 | msg->outsize = ec_dev->dout_size - sizeof(struct ec_host_request) + 1; | |
133 | ||
134 | ret = cros_ec_prepare_tx(ec_dev, msg); | |
135 | KUNIT_EXPECT_EQ(test, ret, -EINVAL); | |
136 | } | |
137 | ||
4319cbd4 TBS |
138 | static void cros_ec_proto_test_check_result(struct kunit *test) |
139 | { | |
140 | struct cros_ec_proto_test_priv *priv = test->priv; | |
141 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
142 | struct cros_ec_command *msg = priv->msg; | |
143 | int ret, i; | |
144 | static enum ec_status status[] = { | |
145 | EC_RES_SUCCESS, | |
146 | EC_RES_INVALID_COMMAND, | |
147 | EC_RES_ERROR, | |
148 | EC_RES_INVALID_PARAM, | |
149 | EC_RES_ACCESS_DENIED, | |
150 | EC_RES_INVALID_RESPONSE, | |
151 | EC_RES_INVALID_VERSION, | |
152 | EC_RES_INVALID_CHECKSUM, | |
153 | EC_RES_UNAVAILABLE, | |
154 | EC_RES_TIMEOUT, | |
155 | EC_RES_OVERFLOW, | |
156 | EC_RES_INVALID_HEADER, | |
157 | EC_RES_REQUEST_TRUNCATED, | |
158 | EC_RES_RESPONSE_TOO_BIG, | |
159 | EC_RES_BUS_ERROR, | |
160 | EC_RES_BUSY, | |
161 | EC_RES_INVALID_HEADER_VERSION, | |
162 | EC_RES_INVALID_HEADER_CRC, | |
163 | EC_RES_INVALID_DATA_CRC, | |
164 | EC_RES_DUP_UNAVAILABLE, | |
165 | }; | |
166 | ||
167 | for (i = 0; i < ARRAY_SIZE(status); ++i) { | |
168 | msg->result = status[i]; | |
169 | ret = cros_ec_check_result(ec_dev, msg); | |
170 | KUNIT_EXPECT_EQ(test, ret, 0); | |
171 | } | |
172 | ||
173 | msg->result = EC_RES_IN_PROGRESS; | |
174 | ret = cros_ec_check_result(ec_dev, msg); | |
175 | KUNIT_EXPECT_EQ(test, ret, -EAGAIN); | |
176 | } | |
177 | ||
b99eb596 TBS |
178 | static void cros_ec_proto_test_query_all_pretest(struct kunit *test) |
179 | { | |
180 | struct cros_ec_proto_test_priv *priv = test->priv; | |
181 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
182 | ||
183 | /* | |
184 | * cros_ec_query_all() will free din and dout and allocate them again to fit the usage by | |
185 | * calling devm_kfree() and devm_kzalloc(). Set them to NULL as they aren't managed by | |
186 | * ec_dev->dev but allocated statically in struct cros_ec_proto_test_priv | |
187 | * (see cros_ec_proto_test_init()). | |
188 | */ | |
189 | ec_dev->din = NULL; | |
190 | ec_dev->dout = NULL; | |
191 | } | |
192 | ||
193 | static void cros_ec_proto_test_query_all_normal(struct kunit *test) | |
194 | { | |
195 | struct cros_ec_proto_test_priv *priv = test->priv; | |
196 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
197 | struct ec_xfer_mock *mock; | |
198 | int ret; | |
199 | ||
b4d0836e | 200 | /* For cros_ec_get_proto_info() without passthru. */ |
b99eb596 TBS |
201 | { |
202 | struct ec_response_get_protocol_info *data; | |
203 | ||
204 | mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); | |
205 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
206 | ||
207 | data = (struct ec_response_get_protocol_info *)mock->o_data; | |
208 | data->protocol_versions = BIT(3) | BIT(2); | |
209 | data->max_request_packet_size = 0xbe; | |
210 | data->max_response_packet_size = 0xef; | |
211 | } | |
212 | ||
b4d0836e | 213 | /* For cros_ec_get_proto_info() with passthru. */ |
b99eb596 TBS |
214 | { |
215 | struct ec_response_get_protocol_info *data; | |
216 | ||
217 | mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); | |
218 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
219 | ||
220 | data = (struct ec_response_get_protocol_info *)mock->o_data; | |
221 | data->max_request_packet_size = 0xbf; | |
222 | } | |
223 | ||
224 | /* For cros_ec_get_host_command_version_mask() for MKBP. */ | |
225 | { | |
226 | struct ec_response_get_cmd_versions *data; | |
227 | ||
228 | mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); | |
229 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
230 | ||
231 | data = (struct ec_response_get_cmd_versions *)mock->o_data; | |
232 | data->version_mask = BIT(6) | BIT(5); | |
233 | } | |
234 | ||
235 | /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ | |
236 | { | |
237 | struct ec_response_get_cmd_versions *data; | |
238 | ||
239 | mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); | |
240 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
241 | ||
242 | data = (struct ec_response_get_cmd_versions *)mock->o_data; | |
243 | data->version_mask = BIT(1); | |
244 | } | |
245 | ||
246 | /* For cros_ec_get_host_event_wake_mask(). */ | |
247 | { | |
248 | struct ec_response_host_event_mask *data; | |
249 | ||
250 | mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); | |
251 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
252 | ||
253 | data = (struct ec_response_host_event_mask *)mock->o_data; | |
254 | data->mask = 0xbeef; | |
255 | } | |
256 | ||
257 | cros_ec_proto_test_query_all_pretest(test); | |
258 | ret = cros_ec_query_all(ec_dev); | |
259 | KUNIT_EXPECT_EQ(test, ret, 0); | |
260 | ||
b4d0836e | 261 | /* For cros_ec_get_proto_info() without passthru. */ |
b99eb596 TBS |
262 | { |
263 | mock = cros_kunit_ec_xfer_mock_next(); | |
264 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
265 | ||
266 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
267 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); | |
268 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
269 | sizeof(struct ec_response_get_protocol_info)); | |
270 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
271 | ||
272 | KUNIT_EXPECT_EQ(test, ec_dev->max_request, 0xbe - sizeof(struct ec_host_request)); | |
273 | KUNIT_EXPECT_EQ(test, ec_dev->max_response, 0xef - sizeof(struct ec_host_response)); | |
274 | KUNIT_EXPECT_EQ(test, ec_dev->proto_version, 3); | |
275 | KUNIT_EXPECT_EQ(test, ec_dev->din_size, 0xef + EC_MAX_RESPONSE_OVERHEAD); | |
276 | KUNIT_EXPECT_EQ(test, ec_dev->dout_size, 0xbe + EC_MAX_REQUEST_OVERHEAD); | |
277 | } | |
278 | ||
b4d0836e | 279 | /* For cros_ec_get_proto_info() with passthru. */ |
b99eb596 TBS |
280 | { |
281 | mock = cros_kunit_ec_xfer_mock_next(); | |
282 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
283 | ||
284 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
285 | KUNIT_EXPECT_EQ(test, mock->msg.command, | |
3db0c9e5 TBS |
286 | EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | |
287 | EC_CMD_GET_PROTOCOL_INFO); | |
b99eb596 TBS |
288 | KUNIT_EXPECT_EQ(test, mock->msg.insize, |
289 | sizeof(struct ec_response_get_protocol_info)); | |
290 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
291 | ||
292 | KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0xbf - sizeof(struct ec_host_request)); | |
293 | } | |
294 | ||
295 | /* For cros_ec_get_host_command_version_mask() for MKBP. */ | |
296 | { | |
297 | struct ec_params_get_cmd_versions *data; | |
298 | ||
299 | mock = cros_kunit_ec_xfer_mock_next(); | |
300 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
301 | ||
302 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
303 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); | |
304 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
305 | sizeof(struct ec_response_get_cmd_versions)); | |
306 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data)); | |
307 | ||
308 | data = (struct ec_params_get_cmd_versions *)mock->i_data; | |
309 | KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_GET_NEXT_EVENT); | |
310 | ||
311 | KUNIT_EXPECT_EQ(test, ec_dev->mkbp_event_supported, 7); | |
312 | } | |
313 | ||
314 | /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ | |
315 | { | |
316 | struct ec_params_get_cmd_versions *data; | |
317 | ||
318 | mock = cros_kunit_ec_xfer_mock_next(); | |
319 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
320 | ||
321 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
322 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); | |
323 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
324 | sizeof(struct ec_response_get_cmd_versions)); | |
325 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data)); | |
326 | ||
327 | data = (struct ec_params_get_cmd_versions *)mock->i_data; | |
328 | KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_HOST_SLEEP_EVENT); | |
329 | ||
330 | KUNIT_EXPECT_TRUE(test, ec_dev->host_sleep_v1); | |
331 | } | |
332 | ||
333 | /* For cros_ec_get_host_event_wake_mask(). */ | |
334 | { | |
335 | mock = cros_kunit_ec_xfer_mock_next(); | |
336 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
337 | ||
338 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
339 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HOST_EVENT_GET_WAKE_MASK); | |
340 | KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_host_event_mask)); | |
341 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
342 | ||
343 | KUNIT_EXPECT_EQ(test, ec_dev->host_event_wake_mask, 0xbeef); | |
344 | } | |
345 | } | |
346 | ||
347 | static void cros_ec_proto_test_query_all_no_pd_return_error(struct kunit *test) | |
348 | { | |
349 | struct cros_ec_proto_test_priv *priv = test->priv; | |
350 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
351 | struct ec_xfer_mock *mock; | |
352 | int ret; | |
353 | ||
354 | /* Set some garbage bytes. */ | |
355 | ec_dev->max_passthru = 0xbf; | |
356 | ||
b4d0836e | 357 | /* For cros_ec_get_proto_info() without passthru. */ |
b99eb596 TBS |
358 | { |
359 | struct ec_response_get_protocol_info *data; | |
360 | ||
361 | mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); | |
362 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
363 | ||
364 | /* | |
365 | * Although it doesn't check the value, provides valid sizes so that | |
366 | * cros_ec_query_all() allocates din and dout correctly. | |
367 | */ | |
368 | data = (struct ec_response_get_protocol_info *)mock->o_data; | |
369 | data->max_request_packet_size = 0xbe; | |
370 | data->max_response_packet_size = 0xef; | |
371 | } | |
372 | ||
b4d0836e | 373 | /* For cros_ec_get_proto_info() with passthru. */ |
b99eb596 TBS |
374 | { |
375 | mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); | |
376 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
377 | } | |
378 | ||
379 | cros_ec_proto_test_query_all_pretest(test); | |
380 | ret = cros_ec_query_all(ec_dev); | |
381 | KUNIT_EXPECT_EQ(test, ret, 0); | |
382 | ||
b4d0836e | 383 | /* For cros_ec_get_proto_info() without passthru. */ |
b99eb596 TBS |
384 | { |
385 | mock = cros_kunit_ec_xfer_mock_next(); | |
386 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
387 | ||
388 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
389 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); | |
390 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
391 | sizeof(struct ec_response_get_protocol_info)); | |
392 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
393 | } | |
394 | ||
b4d0836e | 395 | /* For cros_ec_get_proto_info() with passthru. */ |
b99eb596 TBS |
396 | { |
397 | mock = cros_kunit_ec_xfer_mock_next(); | |
398 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
399 | ||
400 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
401 | KUNIT_EXPECT_EQ(test, mock->msg.command, | |
3db0c9e5 TBS |
402 | EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | |
403 | EC_CMD_GET_PROTOCOL_INFO); | |
b99eb596 TBS |
404 | KUNIT_EXPECT_EQ(test, mock->msg.insize, |
405 | sizeof(struct ec_response_get_protocol_info)); | |
406 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
407 | ||
408 | KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0); | |
409 | } | |
410 | } | |
411 | ||
3e97581e TBS |
412 | static void cros_ec_proto_test_query_all_no_pd_return0(struct kunit *test) |
413 | { | |
414 | struct cros_ec_proto_test_priv *priv = test->priv; | |
415 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
416 | struct ec_xfer_mock *mock; | |
417 | int ret; | |
418 | ||
419 | /* Set some garbage bytes. */ | |
420 | ec_dev->max_passthru = 0xbf; | |
421 | ||
422 | /* For cros_ec_get_proto_info() without passthru. */ | |
423 | { | |
424 | struct ec_response_get_protocol_info *data; | |
425 | ||
426 | mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); | |
427 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
428 | ||
429 | /* | |
430 | * Although it doesn't check the value, provides valid sizes so that | |
431 | * cros_ec_query_all() allocates din and dout correctly. | |
432 | */ | |
433 | data = (struct ec_response_get_protocol_info *)mock->o_data; | |
434 | data->max_request_packet_size = 0xbe; | |
435 | data->max_response_packet_size = 0xef; | |
436 | } | |
437 | ||
438 | /* For cros_ec_get_proto_info() with passthru. */ | |
439 | { | |
440 | mock = cros_kunit_ec_xfer_mock_add(test, 0); | |
441 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
442 | } | |
443 | ||
444 | cros_ec_proto_test_query_all_pretest(test); | |
445 | ret = cros_ec_query_all(ec_dev); | |
446 | KUNIT_EXPECT_EQ(test, ret, 0); | |
447 | ||
448 | /* For cros_ec_get_proto_info() without passthru. */ | |
449 | { | |
450 | mock = cros_kunit_ec_xfer_mock_next(); | |
451 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
452 | ||
453 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
454 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); | |
455 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
456 | sizeof(struct ec_response_get_protocol_info)); | |
457 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
458 | } | |
459 | ||
460 | /* For cros_ec_get_proto_info() with passthru. */ | |
461 | { | |
462 | mock = cros_kunit_ec_xfer_mock_next(); | |
463 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
464 | ||
465 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
466 | KUNIT_EXPECT_EQ(test, mock->msg.command, | |
467 | EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | | |
468 | EC_CMD_GET_PROTOCOL_INFO); | |
469 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
470 | sizeof(struct ec_response_get_protocol_info)); | |
471 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
472 | ||
473 | KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0); | |
474 | } | |
475 | } | |
476 | ||
b99eb596 TBS |
477 | static void cros_ec_proto_test_query_all_legacy_normal_v3_return_error(struct kunit *test) |
478 | { | |
479 | struct cros_ec_proto_test_priv *priv = test->priv; | |
480 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
481 | struct ec_xfer_mock *mock; | |
482 | int ret; | |
483 | ||
b4d0836e | 484 | /* For cros_ec_get_proto_info() without passthru. */ |
b99eb596 TBS |
485 | { |
486 | mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); | |
487 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
488 | } | |
489 | ||
a88f7966 | 490 | /* For cros_ec_get_proto_info_legacy(). */ |
b99eb596 TBS |
491 | { |
492 | struct ec_response_hello *data; | |
493 | ||
494 | mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); | |
495 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
496 | ||
497 | data = (struct ec_response_hello *)mock->o_data; | |
498 | data->out_data = 0xa1b2c3d4; | |
499 | } | |
500 | ||
501 | cros_ec_proto_test_query_all_pretest(test); | |
502 | ret = cros_ec_query_all(ec_dev); | |
503 | KUNIT_EXPECT_EQ(test, ret, 0); | |
504 | ||
b4d0836e | 505 | /* For cros_ec_get_proto_info() without passthru. */ |
b99eb596 TBS |
506 | { |
507 | mock = cros_kunit_ec_xfer_mock_next(); | |
508 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
509 | ||
510 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
511 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); | |
512 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
513 | sizeof(struct ec_response_get_protocol_info)); | |
514 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
515 | } | |
516 | ||
a88f7966 | 517 | /* For cros_ec_get_proto_info_legacy(). */ |
b99eb596 TBS |
518 | { |
519 | struct ec_params_hello *data; | |
520 | ||
521 | mock = cros_kunit_ec_xfer_mock_next(); | |
522 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
523 | ||
524 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
525 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO); | |
526 | KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello)); | |
527 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data)); | |
528 | ||
529 | data = (struct ec_params_hello *)mock->i_data; | |
530 | KUNIT_EXPECT_EQ(test, data->in_data, 0xa0b0c0d0); | |
531 | ||
532 | KUNIT_EXPECT_EQ(test, ec_dev->proto_version, 2); | |
533 | KUNIT_EXPECT_EQ(test, ec_dev->max_request, EC_PROTO2_MAX_PARAM_SIZE); | |
534 | KUNIT_EXPECT_EQ(test, ec_dev->max_response, EC_PROTO2_MAX_PARAM_SIZE); | |
535 | KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0); | |
536 | KUNIT_EXPECT_PTR_EQ(test, ec_dev->pkt_xfer, NULL); | |
537 | KUNIT_EXPECT_EQ(test, ec_dev->din_size, EC_PROTO2_MSG_BYTES); | |
538 | KUNIT_EXPECT_EQ(test, ec_dev->dout_size, EC_PROTO2_MSG_BYTES); | |
539 | } | |
540 | } | |
541 | ||
3e97581e TBS |
542 | static void cros_ec_proto_test_query_all_legacy_normal_v3_return0(struct kunit *test) |
543 | { | |
544 | struct cros_ec_proto_test_priv *priv = test->priv; | |
545 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
546 | struct ec_xfer_mock *mock; | |
547 | int ret; | |
548 | ||
549 | /* For cros_ec_get_proto_info() without passthru. */ | |
550 | { | |
551 | mock = cros_kunit_ec_xfer_mock_add(test, 0); | |
552 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
553 | } | |
554 | ||
a88f7966 | 555 | /* For cros_ec_get_proto_info_legacy(). */ |
3e97581e TBS |
556 | { |
557 | struct ec_response_hello *data; | |
558 | ||
559 | mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); | |
560 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
561 | ||
562 | data = (struct ec_response_hello *)mock->o_data; | |
563 | data->out_data = 0xa1b2c3d4; | |
564 | } | |
565 | ||
566 | cros_ec_proto_test_query_all_pretest(test); | |
567 | ret = cros_ec_query_all(ec_dev); | |
568 | KUNIT_EXPECT_EQ(test, ret, 0); | |
569 | ||
570 | /* For cros_ec_get_proto_info() without passthru. */ | |
571 | { | |
572 | mock = cros_kunit_ec_xfer_mock_next(); | |
573 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
574 | ||
575 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
576 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); | |
577 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
578 | sizeof(struct ec_response_get_protocol_info)); | |
579 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
580 | } | |
581 | ||
a88f7966 | 582 | /* For cros_ec_get_proto_info_legacy(). */ |
3e97581e TBS |
583 | { |
584 | struct ec_params_hello *data; | |
585 | ||
586 | mock = cros_kunit_ec_xfer_mock_next(); | |
587 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
588 | ||
589 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
590 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO); | |
591 | KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello)); | |
592 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data)); | |
593 | ||
594 | data = (struct ec_params_hello *)mock->i_data; | |
595 | KUNIT_EXPECT_EQ(test, data->in_data, 0xa0b0c0d0); | |
596 | ||
597 | KUNIT_EXPECT_EQ(test, ec_dev->proto_version, 2); | |
598 | KUNIT_EXPECT_EQ(test, ec_dev->max_request, EC_PROTO2_MAX_PARAM_SIZE); | |
599 | KUNIT_EXPECT_EQ(test, ec_dev->max_response, EC_PROTO2_MAX_PARAM_SIZE); | |
600 | KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0); | |
601 | KUNIT_EXPECT_PTR_EQ(test, ec_dev->pkt_xfer, NULL); | |
602 | KUNIT_EXPECT_EQ(test, ec_dev->din_size, EC_PROTO2_MSG_BYTES); | |
603 | KUNIT_EXPECT_EQ(test, ec_dev->dout_size, EC_PROTO2_MSG_BYTES); | |
604 | } | |
605 | } | |
606 | ||
b99eb596 TBS |
607 | static void cros_ec_proto_test_query_all_legacy_xfer_error(struct kunit *test) |
608 | { | |
609 | struct cros_ec_proto_test_priv *priv = test->priv; | |
610 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
611 | struct ec_xfer_mock *mock; | |
612 | int ret; | |
613 | ||
b4d0836e | 614 | /* For cros_ec_get_proto_info() without passthru. */ |
b99eb596 TBS |
615 | { |
616 | mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); | |
617 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
618 | } | |
619 | ||
a88f7966 | 620 | /* For cros_ec_get_proto_info_legacy(). */ |
b99eb596 TBS |
621 | { |
622 | mock = cros_kunit_ec_xfer_mock_addx(test, -EIO, EC_RES_SUCCESS, 0); | |
623 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
624 | } | |
625 | ||
626 | cros_ec_proto_test_query_all_pretest(test); | |
627 | ret = cros_ec_query_all(ec_dev); | |
628 | KUNIT_EXPECT_EQ(test, ret, -EIO); | |
629 | KUNIT_EXPECT_EQ(test, ec_dev->proto_version, EC_PROTO_VERSION_UNKNOWN); | |
630 | ||
b4d0836e | 631 | /* For cros_ec_get_proto_info() without passthru. */ |
b99eb596 TBS |
632 | { |
633 | mock = cros_kunit_ec_xfer_mock_next(); | |
634 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
635 | ||
636 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
637 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); | |
638 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
639 | sizeof(struct ec_response_get_protocol_info)); | |
640 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
641 | } | |
642 | ||
a88f7966 | 643 | /* For cros_ec_get_proto_info_legacy(). */ |
b99eb596 TBS |
644 | { |
645 | mock = cros_kunit_ec_xfer_mock_next(); | |
646 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
647 | ||
648 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
649 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO); | |
650 | KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello)); | |
651 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_hello)); | |
652 | } | |
653 | } | |
654 | ||
655 | static void cros_ec_proto_test_query_all_legacy_return_error(struct kunit *test) | |
656 | { | |
657 | struct cros_ec_proto_test_priv *priv = test->priv; | |
658 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
659 | struct ec_xfer_mock *mock; | |
660 | int ret; | |
661 | ||
b4d0836e | 662 | /* For cros_ec_get_proto_info() without passthru. */ |
b99eb596 TBS |
663 | { |
664 | mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); | |
665 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
666 | } | |
667 | ||
a88f7966 | 668 | /* For cros_ec_get_proto_info_legacy(). */ |
b99eb596 TBS |
669 | { |
670 | mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); | |
671 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
672 | } | |
673 | ||
674 | cros_ec_proto_test_query_all_pretest(test); | |
675 | ret = cros_ec_query_all(ec_dev); | |
a88f7966 | 676 | KUNIT_EXPECT_EQ(test, ret, -EOPNOTSUPP); |
b99eb596 TBS |
677 | KUNIT_EXPECT_EQ(test, ec_dev->proto_version, EC_PROTO_VERSION_UNKNOWN); |
678 | ||
b4d0836e | 679 | /* For cros_ec_get_proto_info() without passthru. */ |
b99eb596 TBS |
680 | { |
681 | mock = cros_kunit_ec_xfer_mock_next(); | |
682 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
683 | ||
684 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
685 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); | |
686 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
687 | sizeof(struct ec_response_get_protocol_info)); | |
688 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
689 | } | |
690 | ||
a88f7966 | 691 | /* For cros_ec_get_proto_info_legacy(). */ |
b99eb596 TBS |
692 | { |
693 | mock = cros_kunit_ec_xfer_mock_next(); | |
694 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
695 | ||
696 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
697 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO); | |
698 | KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello)); | |
699 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_hello)); | |
700 | } | |
701 | } | |
702 | ||
703 | static void cros_ec_proto_test_query_all_legacy_data_error(struct kunit *test) | |
704 | { | |
705 | struct cros_ec_proto_test_priv *priv = test->priv; | |
706 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
707 | struct ec_xfer_mock *mock; | |
708 | int ret; | |
709 | ||
b4d0836e | 710 | /* For cros_ec_get_proto_info() without passthru. */ |
b99eb596 TBS |
711 | { |
712 | mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); | |
713 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
714 | } | |
715 | ||
a88f7966 | 716 | /* For cros_ec_get_proto_info_legacy(). */ |
b99eb596 TBS |
717 | { |
718 | struct ec_response_hello *data; | |
719 | ||
720 | mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); | |
721 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
722 | ||
723 | data = (struct ec_response_hello *)mock->o_data; | |
724 | data->out_data = 0xbeefbfbf; | |
725 | } | |
726 | ||
727 | cros_ec_proto_test_query_all_pretest(test); | |
728 | ret = cros_ec_query_all(ec_dev); | |
729 | KUNIT_EXPECT_EQ(test, ret, -EBADMSG); | |
730 | KUNIT_EXPECT_EQ(test, ec_dev->proto_version, EC_PROTO_VERSION_UNKNOWN); | |
731 | ||
b4d0836e | 732 | /* For cros_ec_get_proto_info() without passthru. */ |
b99eb596 TBS |
733 | { |
734 | mock = cros_kunit_ec_xfer_mock_next(); | |
735 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
736 | ||
737 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
738 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); | |
739 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
740 | sizeof(struct ec_response_get_protocol_info)); | |
741 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
742 | } | |
743 | ||
a88f7966 | 744 | /* For cros_ec_get_proto_info_legacy(). */ |
b99eb596 TBS |
745 | { |
746 | mock = cros_kunit_ec_xfer_mock_next(); | |
747 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
748 | ||
749 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
750 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO); | |
751 | KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello)); | |
752 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_hello)); | |
753 | } | |
754 | } | |
755 | ||
cce5d551 TBS |
756 | static void cros_ec_proto_test_query_all_legacy_return0(struct kunit *test) |
757 | { | |
758 | struct cros_ec_proto_test_priv *priv = test->priv; | |
759 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
760 | struct ec_xfer_mock *mock; | |
761 | int ret; | |
762 | ||
763 | /* For cros_ec_get_proto_info() without passthru. */ | |
764 | { | |
765 | mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); | |
766 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
767 | } | |
768 | ||
769 | /* For cros_ec_get_proto_info_legacy(). */ | |
770 | { | |
771 | mock = cros_kunit_ec_xfer_mock_add(test, 0); | |
772 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
773 | } | |
774 | ||
775 | cros_ec_proto_test_query_all_pretest(test); | |
776 | ret = cros_ec_query_all(ec_dev); | |
777 | KUNIT_EXPECT_EQ(test, ret, -EPROTO); | |
778 | KUNIT_EXPECT_EQ(test, ec_dev->proto_version, EC_PROTO_VERSION_UNKNOWN); | |
779 | ||
780 | /* For cros_ec_get_proto_info() without passthru. */ | |
781 | { | |
782 | mock = cros_kunit_ec_xfer_mock_next(); | |
783 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
784 | ||
785 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
786 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); | |
787 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
788 | sizeof(struct ec_response_get_protocol_info)); | |
789 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
790 | } | |
791 | ||
792 | /* For cros_ec_get_proto_info_legacy(). */ | |
793 | { | |
794 | mock = cros_kunit_ec_xfer_mock_next(); | |
795 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
796 | ||
797 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
798 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO); | |
799 | KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello)); | |
800 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_hello)); | |
801 | } | |
802 | } | |
803 | ||
b99eb596 TBS |
804 | static void cros_ec_proto_test_query_all_no_mkbp(struct kunit *test) |
805 | { | |
806 | struct cros_ec_proto_test_priv *priv = test->priv; | |
807 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
808 | struct ec_xfer_mock *mock; | |
809 | int ret; | |
810 | ||
811 | /* Set some garbage bytes. */ | |
812 | ec_dev->mkbp_event_supported = 0xbf; | |
813 | ||
b4d0836e | 814 | /* For cros_ec_get_proto_info() without passthru. */ |
b99eb596 TBS |
815 | { |
816 | struct ec_response_get_protocol_info *data; | |
817 | ||
818 | mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); | |
819 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
820 | ||
821 | /* | |
822 | * Although it doesn't check the value, provides valid sizes so that | |
823 | * cros_ec_query_all() allocates din and dout correctly. | |
824 | */ | |
825 | data = (struct ec_response_get_protocol_info *)mock->o_data; | |
826 | data->max_request_packet_size = 0xbe; | |
827 | data->max_response_packet_size = 0xef; | |
828 | } | |
829 | ||
b4d0836e | 830 | /* For cros_ec_get_proto_info() with passthru. */ |
b99eb596 TBS |
831 | { |
832 | mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); | |
833 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
834 | } | |
835 | ||
836 | /* For cros_ec_get_host_command_version_mask() for MKBP. */ | |
837 | { | |
838 | struct ec_response_get_cmd_versions *data; | |
839 | ||
840 | mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); | |
841 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
842 | ||
843 | data = (struct ec_response_get_cmd_versions *)mock->o_data; | |
844 | data->version_mask = 0; | |
845 | } | |
846 | ||
847 | cros_ec_proto_test_query_all_pretest(test); | |
848 | ret = cros_ec_query_all(ec_dev); | |
849 | KUNIT_EXPECT_EQ(test, ret, 0); | |
850 | ||
b4d0836e | 851 | /* For cros_ec_get_proto_info() without passthru. */ |
b99eb596 TBS |
852 | { |
853 | mock = cros_kunit_ec_xfer_mock_next(); | |
854 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
855 | ||
856 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
857 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); | |
858 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
859 | sizeof(struct ec_response_get_protocol_info)); | |
860 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
861 | } | |
862 | ||
b4d0836e | 863 | /* For cros_ec_get_proto_info() with passthru. */ |
b99eb596 TBS |
864 | { |
865 | mock = cros_kunit_ec_xfer_mock_next(); | |
866 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
867 | ||
868 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
869 | KUNIT_EXPECT_EQ(test, mock->msg.command, | |
3db0c9e5 TBS |
870 | EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | |
871 | EC_CMD_GET_PROTOCOL_INFO); | |
b99eb596 TBS |
872 | KUNIT_EXPECT_EQ(test, mock->msg.insize, |
873 | sizeof(struct ec_response_get_protocol_info)); | |
874 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
875 | } | |
876 | ||
877 | /* For cros_ec_get_host_command_version_mask() for MKBP. */ | |
878 | { | |
879 | struct ec_params_get_cmd_versions *data; | |
880 | ||
881 | mock = cros_kunit_ec_xfer_mock_next(); | |
882 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
883 | ||
884 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
885 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); | |
886 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
887 | sizeof(struct ec_response_get_cmd_versions)); | |
888 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data)); | |
889 | ||
890 | data = (struct ec_params_get_cmd_versions *)mock->i_data; | |
891 | KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_GET_NEXT_EVENT); | |
892 | ||
893 | KUNIT_EXPECT_EQ(test, ec_dev->mkbp_event_supported, 0); | |
894 | } | |
895 | } | |
896 | ||
a8f77c63 TBS |
897 | static void cros_ec_proto_test_query_all_no_mkbp_return_error(struct kunit *test) |
898 | { | |
899 | struct cros_ec_proto_test_priv *priv = test->priv; | |
900 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
901 | struct ec_xfer_mock *mock; | |
902 | int ret; | |
903 | ||
904 | /* Set some garbage bytes. */ | |
905 | ec_dev->mkbp_event_supported = 0xbf; | |
906 | ||
907 | /* For cros_ec_get_proto_info() without passthru. */ | |
908 | { | |
909 | struct ec_response_get_protocol_info *data; | |
910 | ||
911 | mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); | |
912 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
913 | ||
914 | /* | |
915 | * Although it doesn't check the value, provides valid sizes so that | |
916 | * cros_ec_query_all() allocates din and dout correctly. | |
917 | */ | |
918 | data = (struct ec_response_get_protocol_info *)mock->o_data; | |
919 | data->max_request_packet_size = 0xbe; | |
920 | data->max_response_packet_size = 0xef; | |
921 | } | |
922 | ||
923 | /* For cros_ec_get_proto_info() with passthru. */ | |
924 | { | |
925 | mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); | |
926 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
927 | } | |
928 | ||
929 | /* For cros_ec_get_host_command_version_mask() for MKBP. */ | |
930 | { | |
931 | mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); | |
932 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
933 | } | |
934 | ||
935 | cros_ec_proto_test_query_all_pretest(test); | |
936 | ret = cros_ec_query_all(ec_dev); | |
937 | KUNIT_EXPECT_EQ(test, ret, 0); | |
938 | ||
939 | /* For cros_ec_get_proto_info() without passthru. */ | |
940 | { | |
941 | mock = cros_kunit_ec_xfer_mock_next(); | |
942 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
943 | ||
944 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
945 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); | |
946 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
947 | sizeof(struct ec_response_get_protocol_info)); | |
948 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
949 | } | |
950 | ||
951 | /* For cros_ec_get_proto_info() with passthru. */ | |
952 | { | |
953 | mock = cros_kunit_ec_xfer_mock_next(); | |
954 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
955 | ||
956 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
957 | KUNIT_EXPECT_EQ(test, mock->msg.command, | |
958 | EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | | |
959 | EC_CMD_GET_PROTOCOL_INFO); | |
960 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
961 | sizeof(struct ec_response_get_protocol_info)); | |
962 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
963 | } | |
964 | ||
965 | /* For cros_ec_get_host_command_version_mask() for MKBP. */ | |
966 | { | |
967 | struct ec_params_get_cmd_versions *data; | |
968 | ||
969 | mock = cros_kunit_ec_xfer_mock_next(); | |
970 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
971 | ||
972 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
973 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); | |
974 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
975 | sizeof(struct ec_response_get_cmd_versions)); | |
976 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data)); | |
977 | ||
978 | data = (struct ec_params_get_cmd_versions *)mock->i_data; | |
979 | KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_GET_NEXT_EVENT); | |
980 | ||
981 | KUNIT_EXPECT_EQ(test, ec_dev->mkbp_event_supported, 0); | |
982 | } | |
983 | } | |
984 | ||
8120feba TBS |
985 | static void cros_ec_proto_test_query_all_no_mkbp_return0(struct kunit *test) |
986 | { | |
987 | struct cros_ec_proto_test_priv *priv = test->priv; | |
988 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
989 | struct ec_xfer_mock *mock; | |
990 | int ret; | |
991 | ||
992 | /* Set some garbage bytes. */ | |
993 | ec_dev->mkbp_event_supported = 0xbf; | |
994 | ||
995 | /* For cros_ec_get_proto_info() without passthru. */ | |
996 | { | |
997 | struct ec_response_get_protocol_info *data; | |
998 | ||
999 | mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); | |
1000 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1001 | ||
1002 | /* | |
1003 | * Although it doesn't check the value, provides valid sizes so that | |
1004 | * cros_ec_query_all() allocates din and dout correctly. | |
1005 | */ | |
1006 | data = (struct ec_response_get_protocol_info *)mock->o_data; | |
1007 | data->max_request_packet_size = 0xbe; | |
1008 | data->max_response_packet_size = 0xef; | |
1009 | } | |
1010 | ||
1011 | /* For cros_ec_get_proto_info() with passthru. */ | |
1012 | { | |
1013 | mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); | |
1014 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1015 | } | |
1016 | ||
1017 | /* For cros_ec_get_host_command_version_mask() for MKBP. */ | |
1018 | { | |
1019 | mock = cros_kunit_ec_xfer_mock_add(test, 0); | |
1020 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1021 | } | |
1022 | ||
1023 | cros_ec_proto_test_query_all_pretest(test); | |
1024 | ret = cros_ec_query_all(ec_dev); | |
1025 | KUNIT_EXPECT_EQ(test, ret, 0); | |
1026 | ||
1027 | /* For cros_ec_get_proto_info() without passthru. */ | |
1028 | { | |
1029 | mock = cros_kunit_ec_xfer_mock_next(); | |
1030 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
1031 | ||
1032 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
1033 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); | |
1034 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
1035 | sizeof(struct ec_response_get_protocol_info)); | |
1036 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
1037 | } | |
1038 | ||
1039 | /* For cros_ec_get_proto_info() with passthru. */ | |
1040 | { | |
1041 | mock = cros_kunit_ec_xfer_mock_next(); | |
1042 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
1043 | ||
1044 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
1045 | KUNIT_EXPECT_EQ(test, mock->msg.command, | |
1046 | EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | | |
1047 | EC_CMD_GET_PROTOCOL_INFO); | |
1048 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
1049 | sizeof(struct ec_response_get_protocol_info)); | |
1050 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
1051 | } | |
1052 | ||
1053 | /* For cros_ec_get_host_command_version_mask() for MKBP. */ | |
1054 | { | |
1055 | struct ec_params_get_cmd_versions *data; | |
1056 | ||
1057 | mock = cros_kunit_ec_xfer_mock_next(); | |
1058 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
1059 | ||
1060 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
1061 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); | |
1062 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
1063 | sizeof(struct ec_response_get_cmd_versions)); | |
1064 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data)); | |
1065 | ||
1066 | data = (struct ec_params_get_cmd_versions *)mock->i_data; | |
1067 | KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_GET_NEXT_EVENT); | |
1068 | ||
1069 | KUNIT_EXPECT_EQ(test, ec_dev->mkbp_event_supported, 0); | |
1070 | } | |
1071 | } | |
1072 | ||
b99eb596 TBS |
1073 | static void cros_ec_proto_test_query_all_no_host_sleep(struct kunit *test) |
1074 | { | |
1075 | struct cros_ec_proto_test_priv *priv = test->priv; | |
1076 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
1077 | struct ec_xfer_mock *mock; | |
1078 | int ret; | |
1079 | ||
1080 | /* Set some garbage bytes. */ | |
1081 | ec_dev->host_sleep_v1 = true; | |
1082 | ||
b4d0836e | 1083 | /* For cros_ec_get_proto_info() without passthru. */ |
b99eb596 TBS |
1084 | { |
1085 | struct ec_response_get_protocol_info *data; | |
1086 | ||
1087 | mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); | |
1088 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1089 | ||
1090 | /* | |
1091 | * Although it doesn't check the value, provides valid sizes so that | |
1092 | * cros_ec_query_all() allocates din and dout correctly. | |
1093 | */ | |
1094 | data = (struct ec_response_get_protocol_info *)mock->o_data; | |
1095 | data->max_request_packet_size = 0xbe; | |
1096 | data->max_response_packet_size = 0xef; | |
1097 | } | |
1098 | ||
b4d0836e | 1099 | /* For cros_ec_get_proto_info() with passthru. */ |
b99eb596 TBS |
1100 | { |
1101 | mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); | |
1102 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1103 | } | |
1104 | ||
1105 | /* For cros_ec_get_host_command_version_mask() for MKBP. */ | |
1106 | { | |
1107 | mock = cros_kunit_ec_xfer_mock_add(test, 0); | |
1108 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1109 | } | |
1110 | ||
1111 | /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ | |
1112 | { | |
1113 | struct ec_response_get_cmd_versions *data; | |
1114 | ||
1115 | mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); | |
1116 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1117 | ||
1118 | data = (struct ec_response_get_cmd_versions *)mock->o_data; | |
1119 | data->version_mask = 0; | |
1120 | } | |
1121 | ||
1122 | cros_ec_proto_test_query_all_pretest(test); | |
1123 | ret = cros_ec_query_all(ec_dev); | |
1124 | KUNIT_EXPECT_EQ(test, ret, 0); | |
1125 | ||
b4d0836e | 1126 | /* For cros_ec_get_proto_info() without passthru. */ |
b99eb596 TBS |
1127 | { |
1128 | mock = cros_kunit_ec_xfer_mock_next(); | |
1129 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
1130 | ||
1131 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
1132 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); | |
1133 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
1134 | sizeof(struct ec_response_get_protocol_info)); | |
1135 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
1136 | } | |
1137 | ||
b4d0836e | 1138 | /* For cros_ec_get_proto_info() with passthru. */ |
b99eb596 TBS |
1139 | { |
1140 | mock = cros_kunit_ec_xfer_mock_next(); | |
1141 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
1142 | ||
1143 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
1144 | KUNIT_EXPECT_EQ(test, mock->msg.command, | |
3db0c9e5 TBS |
1145 | EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | |
1146 | EC_CMD_GET_PROTOCOL_INFO); | |
b99eb596 TBS |
1147 | KUNIT_EXPECT_EQ(test, mock->msg.insize, |
1148 | sizeof(struct ec_response_get_protocol_info)); | |
1149 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
1150 | } | |
1151 | ||
1152 | /* For cros_ec_get_host_command_version_mask() for MKBP. */ | |
1153 | { | |
1154 | mock = cros_kunit_ec_xfer_mock_next(); | |
1155 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
1156 | ||
1157 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
1158 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); | |
1159 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
1160 | sizeof(struct ec_response_get_cmd_versions)); | |
1161 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions)); | |
1162 | } | |
1163 | ||
1164 | /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ | |
1165 | { | |
1166 | mock = cros_kunit_ec_xfer_mock_next(); | |
1167 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
1168 | ||
1169 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
1170 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); | |
1171 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
1172 | sizeof(struct ec_response_get_cmd_versions)); | |
1173 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions)); | |
1174 | ||
1175 | KUNIT_EXPECT_FALSE(test, ec_dev->host_sleep_v1); | |
1176 | } | |
1177 | } | |
1178 | ||
8120feba TBS |
1179 | static void cros_ec_proto_test_query_all_no_host_sleep_return0(struct kunit *test) |
1180 | { | |
1181 | struct cros_ec_proto_test_priv *priv = test->priv; | |
1182 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
1183 | struct ec_xfer_mock *mock; | |
1184 | int ret; | |
1185 | ||
1186 | /* Set some garbage bytes. */ | |
1187 | ec_dev->host_sleep_v1 = true; | |
1188 | ||
1189 | /* For cros_ec_get_proto_info() without passthru. */ | |
1190 | { | |
1191 | struct ec_response_get_protocol_info *data; | |
1192 | ||
1193 | mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); | |
1194 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1195 | ||
1196 | /* | |
1197 | * Although it doesn't check the value, provides valid sizes so that | |
1198 | * cros_ec_query_all() allocates din and dout correctly. | |
1199 | */ | |
1200 | data = (struct ec_response_get_protocol_info *)mock->o_data; | |
1201 | data->max_request_packet_size = 0xbe; | |
1202 | data->max_response_packet_size = 0xef; | |
1203 | } | |
1204 | ||
1205 | /* For cros_ec_get_proto_info() with passthru. */ | |
1206 | { | |
1207 | mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); | |
1208 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1209 | } | |
1210 | ||
1211 | /* For cros_ec_get_host_command_version_mask() for MKBP. */ | |
1212 | { | |
1213 | struct ec_response_get_cmd_versions *data; | |
1214 | ||
1215 | mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); | |
1216 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1217 | ||
1218 | /* In order to pollute next cros_ec_get_host_command_version_mask(). */ | |
1219 | data = (struct ec_response_get_cmd_versions *)mock->o_data; | |
1220 | data->version_mask = 0xbeef; | |
1221 | } | |
1222 | ||
1223 | /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ | |
1224 | { | |
1225 | mock = cros_kunit_ec_xfer_mock_add(test, 0); | |
1226 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1227 | } | |
1228 | ||
1229 | cros_ec_proto_test_query_all_pretest(test); | |
1230 | ret = cros_ec_query_all(ec_dev); | |
1231 | KUNIT_EXPECT_EQ(test, ret, 0); | |
1232 | ||
1233 | /* For cros_ec_get_proto_info() without passthru. */ | |
1234 | { | |
1235 | mock = cros_kunit_ec_xfer_mock_next(); | |
1236 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
1237 | ||
1238 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
1239 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); | |
1240 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
1241 | sizeof(struct ec_response_get_protocol_info)); | |
1242 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
1243 | } | |
1244 | ||
1245 | /* For cros_ec_get_proto_info() with passthru. */ | |
1246 | { | |
1247 | mock = cros_kunit_ec_xfer_mock_next(); | |
1248 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
1249 | ||
1250 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
1251 | KUNIT_EXPECT_EQ(test, mock->msg.command, | |
1252 | EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | | |
1253 | EC_CMD_GET_PROTOCOL_INFO); | |
1254 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
1255 | sizeof(struct ec_response_get_protocol_info)); | |
1256 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
1257 | } | |
1258 | ||
1259 | /* For cros_ec_get_host_command_version_mask() for MKBP. */ | |
1260 | { | |
1261 | mock = cros_kunit_ec_xfer_mock_next(); | |
1262 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
1263 | ||
1264 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
1265 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); | |
1266 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
1267 | sizeof(struct ec_response_get_cmd_versions)); | |
1268 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions)); | |
1269 | } | |
1270 | ||
1271 | /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ | |
1272 | { | |
1273 | mock = cros_kunit_ec_xfer_mock_next(); | |
1274 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
1275 | ||
1276 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
1277 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); | |
1278 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
1279 | sizeof(struct ec_response_get_cmd_versions)); | |
1280 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions)); | |
1281 | ||
1282 | KUNIT_EXPECT_FALSE(test, ec_dev->host_sleep_v1); | |
1283 | } | |
1284 | } | |
1285 | ||
b99eb596 TBS |
1286 | static void cros_ec_proto_test_query_all_default_wake_mask_return_error(struct kunit *test) |
1287 | { | |
1288 | struct cros_ec_proto_test_priv *priv = test->priv; | |
1289 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
1290 | struct ec_xfer_mock *mock; | |
1291 | int ret; | |
1292 | ||
1293 | /* Set some garbage bytes. */ | |
1294 | ec_dev->host_event_wake_mask = U32_MAX; | |
1295 | ||
b4d0836e | 1296 | /* For cros_ec_get_proto_info() without passthru. */ |
b99eb596 TBS |
1297 | { |
1298 | struct ec_response_get_protocol_info *data; | |
1299 | ||
1300 | mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); | |
1301 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1302 | ||
1303 | /* | |
1304 | * Although it doesn't check the value, provides valid sizes so that | |
1305 | * cros_ec_query_all() allocates din and dout correctly. | |
1306 | */ | |
1307 | data = (struct ec_response_get_protocol_info *)mock->o_data; | |
1308 | data->max_request_packet_size = 0xbe; | |
1309 | data->max_response_packet_size = 0xef; | |
1310 | } | |
1311 | ||
b4d0836e | 1312 | /* For cros_ec_get_proto_info() with passthru. */ |
b99eb596 TBS |
1313 | { |
1314 | mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); | |
1315 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1316 | } | |
1317 | ||
1318 | /* For cros_ec_get_host_command_version_mask() for MKBP. */ | |
1319 | { | |
1320 | mock = cros_kunit_ec_xfer_mock_add(test, 0); | |
1321 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1322 | } | |
1323 | ||
1324 | /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ | |
1325 | { | |
1326 | mock = cros_kunit_ec_xfer_mock_add(test, 0); | |
1327 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1328 | } | |
1329 | ||
1330 | /* For cros_ec_get_host_event_wake_mask(). */ | |
1331 | { | |
1332 | mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); | |
1333 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1334 | } | |
1335 | ||
1336 | cros_ec_proto_test_query_all_pretest(test); | |
1337 | ret = cros_ec_query_all(ec_dev); | |
1338 | KUNIT_EXPECT_EQ(test, ret, 0); | |
1339 | ||
b4d0836e | 1340 | /* For cros_ec_get_proto_info() without passthru. */ |
b99eb596 TBS |
1341 | { |
1342 | mock = cros_kunit_ec_xfer_mock_next(); | |
1343 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
1344 | ||
1345 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
1346 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); | |
1347 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
1348 | sizeof(struct ec_response_get_protocol_info)); | |
1349 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
1350 | } | |
1351 | ||
b4d0836e | 1352 | /* For cros_ec_get_proto_info() with passthru. */ |
b99eb596 TBS |
1353 | { |
1354 | mock = cros_kunit_ec_xfer_mock_next(); | |
1355 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
1356 | ||
1357 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
1358 | KUNIT_EXPECT_EQ(test, mock->msg.command, | |
3db0c9e5 TBS |
1359 | EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | |
1360 | EC_CMD_GET_PROTOCOL_INFO); | |
b99eb596 TBS |
1361 | KUNIT_EXPECT_EQ(test, mock->msg.insize, |
1362 | sizeof(struct ec_response_get_protocol_info)); | |
1363 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
1364 | } | |
1365 | ||
1366 | /* For cros_ec_get_host_command_version_mask() for MKBP. */ | |
1367 | { | |
1368 | mock = cros_kunit_ec_xfer_mock_next(); | |
1369 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
1370 | ||
1371 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
1372 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); | |
1373 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
1374 | sizeof(struct ec_response_get_cmd_versions)); | |
1375 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions)); | |
1376 | } | |
1377 | ||
1378 | /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ | |
1379 | { | |
1380 | mock = cros_kunit_ec_xfer_mock_next(); | |
1381 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
1382 | ||
1383 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
1384 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); | |
1385 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
1386 | sizeof(struct ec_response_get_cmd_versions)); | |
1387 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions)); | |
1388 | } | |
1389 | ||
1390 | /* For cros_ec_get_host_event_wake_mask(). */ | |
1391 | { | |
1392 | u32 mask; | |
1393 | ||
1394 | mock = cros_kunit_ec_xfer_mock_next(); | |
1395 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
1396 | ||
1397 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
1398 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HOST_EVENT_GET_WAKE_MASK); | |
1399 | KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_host_event_mask)); | |
1400 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
1401 | ||
1402 | mask = ec_dev->host_event_wake_mask; | |
1403 | KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_LID_CLOSED), 0); | |
1404 | KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_AC_DISCONNECTED), 0); | |
1405 | KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_LOW), 0); | |
1406 | KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_CRITICAL), 0); | |
1407 | KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY), 0); | |
1408 | KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_PD_MCU), 0); | |
1409 | KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_STATUS), 0); | |
1410 | } | |
1411 | } | |
1412 | ||
e4377229 TBS |
1413 | static void cros_ec_proto_test_query_all_default_wake_mask_return0(struct kunit *test) |
1414 | { | |
1415 | struct cros_ec_proto_test_priv *priv = test->priv; | |
1416 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
1417 | struct ec_xfer_mock *mock; | |
1418 | int ret; | |
1419 | ||
1420 | /* Set some garbage bytes. */ | |
1421 | ec_dev->host_event_wake_mask = U32_MAX; | |
1422 | ||
1423 | /* For cros_ec_get_proto_info() without passthru. */ | |
1424 | { | |
1425 | struct ec_response_get_protocol_info *data; | |
1426 | ||
1427 | mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); | |
1428 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1429 | ||
1430 | /* | |
1431 | * Although it doesn't check the value, provides valid sizes so that | |
1432 | * cros_ec_query_all() allocates din and dout correctly. | |
1433 | */ | |
1434 | data = (struct ec_response_get_protocol_info *)mock->o_data; | |
1435 | data->max_request_packet_size = 0xbe; | |
1436 | data->max_response_packet_size = 0xef; | |
1437 | } | |
1438 | ||
1439 | /* For cros_ec_get_proto_info() with passthru. */ | |
1440 | { | |
1441 | mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); | |
1442 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1443 | } | |
1444 | ||
1445 | /* For cros_ec_get_host_command_version_mask() for MKBP. */ | |
1446 | { | |
1447 | mock = cros_kunit_ec_xfer_mock_add(test, 0); | |
1448 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1449 | } | |
1450 | ||
1451 | /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ | |
1452 | { | |
1453 | mock = cros_kunit_ec_xfer_mock_add(test, 0); | |
1454 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1455 | } | |
1456 | ||
1457 | /* For get_host_event_wake_mask(). */ | |
1458 | { | |
1459 | mock = cros_kunit_ec_xfer_mock_add(test, 0); | |
1460 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1461 | } | |
1462 | ||
1463 | cros_ec_proto_test_query_all_pretest(test); | |
1464 | ret = cros_ec_query_all(ec_dev); | |
1465 | KUNIT_EXPECT_EQ(test, ret, 0); | |
1466 | ||
1467 | /* For cros_ec_get_proto_info() without passthru. */ | |
1468 | { | |
1469 | mock = cros_kunit_ec_xfer_mock_next(); | |
1470 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
1471 | ||
1472 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
1473 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); | |
1474 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
1475 | sizeof(struct ec_response_get_protocol_info)); | |
1476 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
1477 | } | |
1478 | ||
1479 | /* For cros_ec_get_proto_info() with passthru. */ | |
1480 | { | |
1481 | mock = cros_kunit_ec_xfer_mock_next(); | |
1482 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
1483 | ||
1484 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
1485 | KUNIT_EXPECT_EQ(test, mock->msg.command, | |
1486 | EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | | |
1487 | EC_CMD_GET_PROTOCOL_INFO); | |
1488 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
1489 | sizeof(struct ec_response_get_protocol_info)); | |
1490 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
1491 | } | |
1492 | ||
1493 | /* For cros_ec_get_host_command_version_mask() for MKBP. */ | |
1494 | { | |
1495 | mock = cros_kunit_ec_xfer_mock_next(); | |
1496 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
1497 | ||
1498 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
1499 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); | |
1500 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
1501 | sizeof(struct ec_response_get_cmd_versions)); | |
1502 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions)); | |
1503 | } | |
1504 | ||
1505 | /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ | |
1506 | { | |
1507 | mock = cros_kunit_ec_xfer_mock_next(); | |
1508 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
1509 | ||
1510 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
1511 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); | |
1512 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
1513 | sizeof(struct ec_response_get_cmd_versions)); | |
1514 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions)); | |
1515 | } | |
1516 | ||
1517 | /* For get_host_event_wake_mask(). */ | |
1518 | { | |
1519 | u32 mask; | |
1520 | ||
1521 | mock = cros_kunit_ec_xfer_mock_next(); | |
1522 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
1523 | ||
1524 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
1525 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HOST_EVENT_GET_WAKE_MASK); | |
1526 | KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_host_event_mask)); | |
1527 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
1528 | ||
1529 | mask = ec_dev->host_event_wake_mask; | |
1530 | KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_LID_CLOSED), 0); | |
1531 | KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_AC_DISCONNECTED), 0); | |
1532 | KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_LOW), 0); | |
1533 | KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_CRITICAL), 0); | |
1534 | KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY), 0); | |
1535 | KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_PD_MCU), 0); | |
1536 | KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_STATUS), 0); | |
1537 | } | |
1538 | } | |
1539 | ||
82f4def2 TBS |
1540 | static void cros_ec_proto_test_cmd_xfer_normal(struct kunit *test) |
1541 | { | |
1542 | struct cros_ec_proto_test_priv *priv = test->priv; | |
1543 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
1544 | struct ec_xfer_mock *mock; | |
1545 | int ret; | |
41f4bc61 | 1546 | DEFINE_RAW_FLEX(struct cros_ec_command, buf, data, 0x100); |
82f4def2 TBS |
1547 | |
1548 | ec_dev->max_request = 0xff; | |
1549 | ec_dev->max_response = 0xee; | |
1550 | ec_dev->max_passthru = 0xdd; | |
1551 | ||
41f4bc61 GS |
1552 | buf->version = 0; |
1553 | buf->command = EC_CMD_HELLO; | |
1554 | buf->insize = 4; | |
1555 | buf->outsize = 2; | |
1556 | buf->data[0] = 0x55; | |
1557 | buf->data[1] = 0xaa; | |
82f4def2 TBS |
1558 | |
1559 | { | |
1560 | u8 *data; | |
1561 | ||
1562 | mock = cros_kunit_ec_xfer_mock_add(test, 4); | |
1563 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1564 | ||
1565 | data = (u8 *)mock->o_data; | |
1566 | data[0] = 0xaa; | |
1567 | data[1] = 0x55; | |
1568 | data[2] = 0xcc; | |
1569 | data[3] = 0x33; | |
1570 | } | |
1571 | ||
41f4bc61 | 1572 | ret = cros_ec_cmd_xfer(ec_dev, buf); |
82f4def2 TBS |
1573 | KUNIT_EXPECT_EQ(test, ret, 4); |
1574 | ||
1575 | { | |
1576 | u8 *data; | |
1577 | ||
1578 | mock = cros_kunit_ec_xfer_mock_next(); | |
1579 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
1580 | ||
1581 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
1582 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO); | |
1583 | KUNIT_EXPECT_EQ(test, mock->msg.insize, 4); | |
1584 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 2); | |
1585 | ||
1586 | data = (u8 *)mock->i_data; | |
1587 | KUNIT_EXPECT_EQ(test, data[0], 0x55); | |
1588 | KUNIT_EXPECT_EQ(test, data[1], 0xaa); | |
1589 | ||
41f4bc61 GS |
1590 | KUNIT_EXPECT_EQ(test, buf->data[0], 0xaa); |
1591 | KUNIT_EXPECT_EQ(test, buf->data[1], 0x55); | |
1592 | KUNIT_EXPECT_EQ(test, buf->data[2], 0xcc); | |
1593 | KUNIT_EXPECT_EQ(test, buf->data[3], 0x33); | |
82f4def2 TBS |
1594 | } |
1595 | } | |
1596 | ||
1597 | static void cros_ec_proto_test_cmd_xfer_excess_msg_insize(struct kunit *test) | |
1598 | { | |
1599 | struct cros_ec_proto_test_priv *priv = test->priv; | |
1600 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
1601 | struct ec_xfer_mock *mock; | |
1602 | int ret; | |
41f4bc61 | 1603 | DEFINE_RAW_FLEX(struct cros_ec_command, buf, data, 0x100); |
82f4def2 TBS |
1604 | |
1605 | ec_dev->max_request = 0xff; | |
1606 | ec_dev->max_response = 0xee; | |
1607 | ec_dev->max_passthru = 0xdd; | |
1608 | ||
41f4bc61 GS |
1609 | buf->version = 0; |
1610 | buf->command = EC_CMD_HELLO; | |
1611 | buf->insize = 0xee + 1; | |
1612 | buf->outsize = 2; | |
82f4def2 TBS |
1613 | |
1614 | { | |
1615 | mock = cros_kunit_ec_xfer_mock_add(test, 0xcc); | |
1616 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1617 | } | |
1618 | ||
41f4bc61 | 1619 | ret = cros_ec_cmd_xfer(ec_dev, buf); |
82f4def2 TBS |
1620 | KUNIT_EXPECT_EQ(test, ret, 0xcc); |
1621 | ||
1622 | { | |
1623 | mock = cros_kunit_ec_xfer_mock_next(); | |
1624 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
1625 | ||
1626 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
1627 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO); | |
1628 | KUNIT_EXPECT_EQ(test, mock->msg.insize, 0xee); | |
1629 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 2); | |
1630 | } | |
1631 | } | |
1632 | ||
1633 | static void cros_ec_proto_test_cmd_xfer_excess_msg_outsize_without_passthru(struct kunit *test) | |
1634 | { | |
1635 | struct cros_ec_proto_test_priv *priv = test->priv; | |
1636 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
1637 | int ret; | |
41f4bc61 | 1638 | DEFINE_RAW_FLEX(struct cros_ec_command, buf, data, 0x100); |
82f4def2 TBS |
1639 | |
1640 | ec_dev->max_request = 0xff; | |
1641 | ec_dev->max_response = 0xee; | |
1642 | ec_dev->max_passthru = 0xdd; | |
1643 | ||
41f4bc61 GS |
1644 | buf->version = 0; |
1645 | buf->command = EC_CMD_HELLO; | |
1646 | buf->insize = 4; | |
1647 | buf->outsize = 0xff + 1; | |
82f4def2 | 1648 | |
41f4bc61 | 1649 | ret = cros_ec_cmd_xfer(ec_dev, buf); |
82f4def2 TBS |
1650 | KUNIT_EXPECT_EQ(test, ret, -EMSGSIZE); |
1651 | } | |
1652 | ||
1653 | static void cros_ec_proto_test_cmd_xfer_excess_msg_outsize_with_passthru(struct kunit *test) | |
1654 | { | |
1655 | struct cros_ec_proto_test_priv *priv = test->priv; | |
1656 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
1657 | int ret; | |
41f4bc61 | 1658 | DEFINE_RAW_FLEX(struct cros_ec_command, buf, data, 0x100); |
82f4def2 TBS |
1659 | |
1660 | ec_dev->max_request = 0xff; | |
1661 | ec_dev->max_response = 0xee; | |
1662 | ec_dev->max_passthru = 0xdd; | |
1663 | ||
41f4bc61 GS |
1664 | buf->version = 0; |
1665 | buf->command = EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) + EC_CMD_HELLO; | |
1666 | buf->insize = 4; | |
1667 | buf->outsize = 0xdd + 1; | |
82f4def2 | 1668 | |
41f4bc61 | 1669 | ret = cros_ec_cmd_xfer(ec_dev, buf); |
82f4def2 TBS |
1670 | KUNIT_EXPECT_EQ(test, ret, -EMSGSIZE); |
1671 | } | |
1672 | ||
da95f691 TBS |
1673 | static void cros_ec_proto_test_cmd_xfer_protocol_v3_normal(struct kunit *test) |
1674 | { | |
1675 | struct cros_ec_proto_test_priv *priv = test->priv; | |
1676 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
1677 | int ret; | |
1678 | struct cros_ec_command msg; | |
1679 | ||
1680 | memset(&msg, 0, sizeof(msg)); | |
1681 | ||
1682 | ec_dev->proto_version = 3; | |
1683 | ec_dev->cmd_xfer = cros_kunit_ec_cmd_xfer_mock; | |
1684 | ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock; | |
1685 | ||
1686 | ret = cros_ec_cmd_xfer(ec_dev, &msg); | |
1687 | KUNIT_EXPECT_EQ(test, ret, 0); | |
1688 | ||
1689 | KUNIT_EXPECT_EQ(test, cros_kunit_ec_cmd_xfer_mock_called, 0); | |
1690 | KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 1); | |
1691 | } | |
1692 | ||
1693 | static void cros_ec_proto_test_cmd_xfer_protocol_v3_no_op(struct kunit *test) | |
1694 | { | |
1695 | struct cros_ec_proto_test_priv *priv = test->priv; | |
1696 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
1697 | int ret; | |
1698 | struct cros_ec_command msg; | |
1699 | ||
1700 | memset(&msg, 0, sizeof(msg)); | |
1701 | ||
1702 | ec_dev->proto_version = 3; | |
1703 | ec_dev->cmd_xfer = cros_kunit_ec_cmd_xfer_mock; | |
1704 | ec_dev->pkt_xfer = NULL; | |
1705 | ||
1706 | ret = cros_ec_cmd_xfer(ec_dev, &msg); | |
1707 | KUNIT_EXPECT_EQ(test, ret, -EIO); | |
1708 | } | |
1709 | ||
1710 | static void cros_ec_proto_test_cmd_xfer_protocol_v2_normal(struct kunit *test) | |
1711 | { | |
1712 | struct cros_ec_proto_test_priv *priv = test->priv; | |
1713 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
1714 | int ret; | |
1715 | struct cros_ec_command msg; | |
1716 | ||
1717 | memset(&msg, 0, sizeof(msg)); | |
1718 | ||
1719 | ec_dev->proto_version = 2; | |
1720 | ec_dev->cmd_xfer = cros_kunit_ec_cmd_xfer_mock; | |
1721 | ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock; | |
1722 | ||
1723 | ret = cros_ec_cmd_xfer(ec_dev, &msg); | |
1724 | KUNIT_EXPECT_EQ(test, ret, 0); | |
1725 | ||
1726 | KUNIT_EXPECT_EQ(test, cros_kunit_ec_cmd_xfer_mock_called, 1); | |
1727 | KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 0); | |
1728 | } | |
1729 | ||
1730 | static void cros_ec_proto_test_cmd_xfer_protocol_v2_no_op(struct kunit *test) | |
1731 | { | |
1732 | struct cros_ec_proto_test_priv *priv = test->priv; | |
1733 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
1734 | int ret; | |
1735 | struct cros_ec_command msg; | |
1736 | ||
1737 | memset(&msg, 0, sizeof(msg)); | |
1738 | ||
1739 | ec_dev->proto_version = 2; | |
1740 | ec_dev->cmd_xfer = NULL; | |
1741 | ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock; | |
1742 | ||
1743 | ret = cros_ec_cmd_xfer(ec_dev, &msg); | |
1744 | KUNIT_EXPECT_EQ(test, ret, -EIO); | |
1745 | } | |
1746 | ||
1747 | static void cros_ec_proto_test_cmd_xfer_in_progress_normal(struct kunit *test) | |
1748 | { | |
1749 | struct cros_ec_proto_test_priv *priv = test->priv; | |
1750 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
1751 | struct ec_xfer_mock *mock; | |
1752 | int ret; | |
1753 | struct cros_ec_command msg; | |
1754 | ||
1755 | memset(&msg, 0, sizeof(msg)); | |
1756 | ||
1757 | ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock; | |
1758 | ||
1759 | /* For the first host command to return EC_RES_IN_PROGRESS. */ | |
1760 | { | |
1761 | mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0); | |
1762 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1763 | } | |
1764 | ||
1765 | /* For EC_CMD_GET_COMMS_STATUS. */ | |
1766 | { | |
1767 | struct ec_response_get_comms_status *data; | |
1768 | ||
1769 | mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); | |
1770 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1771 | ||
1772 | data = (struct ec_response_get_comms_status *)mock->o_data; | |
1773 | data->flags = 0; | |
1774 | } | |
1775 | ||
1776 | ret = cros_ec_cmd_xfer(ec_dev, &msg); | |
1777 | KUNIT_EXPECT_EQ(test, ret, sizeof(struct ec_response_get_comms_status)); | |
1778 | ||
1779 | KUNIT_EXPECT_EQ(test, msg.result, EC_RES_SUCCESS); | |
1780 | ||
1781 | /* For the first host command to return EC_RES_IN_PROGRESS. */ | |
1782 | { | |
1783 | mock = cros_kunit_ec_xfer_mock_next(); | |
1784 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
1785 | } | |
1786 | ||
1787 | /* For EC_CMD_GET_COMMS_STATUS. */ | |
1788 | { | |
1789 | mock = cros_kunit_ec_xfer_mock_next(); | |
1790 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
1791 | ||
1792 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
1793 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_COMMS_STATUS); | |
1794 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
1795 | sizeof(struct ec_response_get_comms_status)); | |
1796 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
1797 | } | |
1798 | ||
1799 | KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 2); | |
1800 | } | |
1801 | ||
1802 | static void cros_ec_proto_test_cmd_xfer_in_progress_retries_eagain(struct kunit *test) | |
1803 | { | |
1804 | struct cros_ec_proto_test_priv *priv = test->priv; | |
1805 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
1806 | struct ec_xfer_mock *mock; | |
1807 | int ret; | |
1808 | struct cros_ec_command msg; | |
1809 | ||
1810 | memset(&msg, 0, sizeof(msg)); | |
1811 | ||
1812 | ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock; | |
1813 | ||
1814 | /* For the first host command to return EC_RES_IN_PROGRESS. */ | |
1815 | { | |
1816 | mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0); | |
1817 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1818 | } | |
1819 | ||
1820 | /* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */ | |
1821 | cros_kunit_ec_xfer_mock_default_ret = -EAGAIN; | |
1822 | ||
1823 | ret = cros_ec_cmd_xfer(ec_dev, &msg); | |
1824 | KUNIT_EXPECT_EQ(test, ret, -EAGAIN); | |
1825 | ||
1826 | /* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */ | |
1827 | KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 51); | |
1828 | } | |
1829 | ||
1830 | static void cros_ec_proto_test_cmd_xfer_in_progress_retries_status_processing(struct kunit *test) | |
1831 | { | |
1832 | struct cros_ec_proto_test_priv *priv = test->priv; | |
1833 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
1834 | struct ec_xfer_mock *mock; | |
1835 | int ret; | |
1836 | struct cros_ec_command msg; | |
1837 | ||
1838 | memset(&msg, 0, sizeof(msg)); | |
1839 | ||
1840 | ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock; | |
1841 | ||
1842 | /* For the first host command to return EC_RES_IN_PROGRESS. */ | |
1843 | { | |
1844 | mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0); | |
1845 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1846 | } | |
1847 | ||
1848 | /* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */ | |
1849 | { | |
1850 | struct ec_response_get_comms_status *data; | |
1851 | int i; | |
1852 | ||
1853 | for (i = 0; i < 50; ++i) { | |
1854 | mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); | |
1855 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1856 | ||
1857 | data = (struct ec_response_get_comms_status *)mock->o_data; | |
1858 | data->flags |= EC_COMMS_STATUS_PROCESSING; | |
1859 | } | |
1860 | } | |
1861 | ||
1862 | ret = cros_ec_cmd_xfer(ec_dev, &msg); | |
00eb36d5 | 1863 | KUNIT_EXPECT_EQ(test, ret, -EAGAIN); |
da95f691 TBS |
1864 | |
1865 | /* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */ | |
1866 | KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 51); | |
1867 | } | |
1868 | ||
1869 | static void cros_ec_proto_test_cmd_xfer_in_progress_xfer_error(struct kunit *test) | |
1870 | { | |
1871 | struct cros_ec_proto_test_priv *priv = test->priv; | |
1872 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
1873 | struct ec_xfer_mock *mock; | |
1874 | int ret; | |
1875 | struct cros_ec_command msg; | |
1876 | ||
1877 | memset(&msg, 0, sizeof(msg)); | |
1878 | ||
1879 | /* For the first host command to return EC_RES_IN_PROGRESS. */ | |
1880 | { | |
1881 | mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0); | |
1882 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1883 | } | |
1884 | ||
1885 | /* For EC_CMD_GET_COMMS_STATUS. */ | |
1886 | { | |
1887 | mock = cros_kunit_ec_xfer_mock_addx(test, -EIO, EC_RES_SUCCESS, 0); | |
1888 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1889 | } | |
1890 | ||
1891 | ret = cros_ec_cmd_xfer(ec_dev, &msg); | |
1892 | KUNIT_EXPECT_EQ(test, ret, -EIO); | |
1893 | } | |
1894 | ||
1895 | static void cros_ec_proto_test_cmd_xfer_in_progress_return_error(struct kunit *test) | |
1896 | { | |
1897 | struct cros_ec_proto_test_priv *priv = test->priv; | |
1898 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
1899 | struct ec_xfer_mock *mock; | |
1900 | int ret; | |
1901 | struct cros_ec_command msg; | |
1902 | ||
1903 | memset(&msg, 0, sizeof(msg)); | |
1904 | ||
1905 | ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock; | |
1906 | ||
1907 | /* For the first host command to return EC_RES_IN_PROGRESS. */ | |
1908 | { | |
1909 | mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0); | |
1910 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1911 | } | |
1912 | ||
1913 | /* For EC_CMD_GET_COMMS_STATUS. */ | |
1914 | { | |
1915 | mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); | |
1916 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1917 | } | |
1918 | ||
1919 | ret = cros_ec_cmd_xfer(ec_dev, &msg); | |
1920 | KUNIT_EXPECT_EQ(test, ret, 0); | |
1921 | ||
1922 | KUNIT_EXPECT_EQ(test, msg.result, EC_RES_INVALID_COMMAND); | |
1923 | ||
1924 | KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 2); | |
1925 | } | |
1926 | ||
82c9b7ed TBS |
1927 | static void cros_ec_proto_test_cmd_xfer_in_progress_return0(struct kunit *test) |
1928 | { | |
1929 | struct cros_ec_proto_test_priv *priv = test->priv; | |
1930 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
1931 | struct ec_xfer_mock *mock; | |
1932 | int ret; | |
1933 | struct cros_ec_command msg; | |
1934 | ||
1935 | memset(&msg, 0, sizeof(msg)); | |
1936 | ||
1937 | ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock; | |
1938 | ||
1939 | /* For the first host command to return EC_RES_IN_PROGRESS. */ | |
1940 | { | |
1941 | mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0); | |
1942 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1943 | } | |
1944 | ||
1945 | /* For EC_CMD_GET_COMMS_STATUS. */ | |
1946 | { | |
1947 | mock = cros_kunit_ec_xfer_mock_add(test, 0); | |
1948 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1949 | } | |
1950 | ||
1951 | ret = cros_ec_cmd_xfer(ec_dev, &msg); | |
1952 | KUNIT_EXPECT_EQ(test, ret, -EPROTO); | |
1953 | ||
1954 | KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 2); | |
1955 | } | |
1956 | ||
74bed42f TBS |
1957 | static void cros_ec_proto_test_cmd_xfer_status_normal(struct kunit *test) |
1958 | { | |
1959 | struct cros_ec_proto_test_priv *priv = test->priv; | |
1960 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
1961 | struct ec_xfer_mock *mock; | |
1962 | int ret; | |
1963 | struct cros_ec_command msg; | |
1964 | ||
1965 | memset(&msg, 0, sizeof(msg)); | |
1966 | ||
1967 | /* For cros_ec_cmd_xfer(). */ | |
1968 | { | |
1969 | mock = cros_kunit_ec_xfer_mock_add(test, 0); | |
1970 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1971 | } | |
1972 | ||
1973 | ret = cros_ec_cmd_xfer_status(ec_dev, &msg); | |
1974 | KUNIT_EXPECT_EQ(test, ret, 0); | |
1975 | } | |
1976 | ||
1977 | static void cros_ec_proto_test_cmd_xfer_status_xfer_error(struct kunit *test) | |
1978 | { | |
1979 | struct cros_ec_proto_test_priv *priv = test->priv; | |
1980 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
1981 | struct ec_xfer_mock *mock; | |
1982 | int ret; | |
1983 | struct cros_ec_command msg; | |
1984 | ||
1985 | memset(&msg, 0, sizeof(msg)); | |
1986 | ||
1987 | /* For cros_ec_cmd_xfer(). */ | |
1988 | { | |
1989 | mock = cros_kunit_ec_xfer_mock_addx(test, -EPROTO, EC_RES_SUCCESS, 0); | |
1990 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
1991 | } | |
1992 | ||
1993 | ret = cros_ec_cmd_xfer_status(ec_dev, &msg); | |
1994 | KUNIT_EXPECT_EQ(test, ret, -EPROTO); | |
1995 | } | |
1996 | ||
1242688f TBS |
1997 | static void cros_ec_proto_test_cmd_xfer_status_return_error(struct kunit *test) |
1998 | { | |
1999 | struct cros_ec_proto_test_priv *priv = test->priv; | |
2000 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
2001 | struct ec_xfer_mock *mock; | |
2002 | int ret, i; | |
2003 | struct cros_ec_command msg; | |
2004 | static const int map[] = { | |
2005 | [EC_RES_SUCCESS] = 0, | |
2006 | [EC_RES_INVALID_COMMAND] = -EOPNOTSUPP, | |
2007 | [EC_RES_ERROR] = -EIO, | |
2008 | [EC_RES_INVALID_PARAM] = -EINVAL, | |
2009 | [EC_RES_ACCESS_DENIED] = -EACCES, | |
2010 | [EC_RES_INVALID_RESPONSE] = -EPROTO, | |
2011 | [EC_RES_INVALID_VERSION] = -ENOPROTOOPT, | |
2012 | [EC_RES_INVALID_CHECKSUM] = -EBADMSG, | |
2013 | /* | |
2014 | * EC_RES_IN_PROGRESS is special because cros_ec_send_command() has extra logic to | |
2015 | * handle it. Note that default cros_kunit_ec_xfer_mock_default_ret == 0 thus | |
2016 | * cros_ec_xfer_command() in cros_ec_wait_until_complete() returns 0. As a result, | |
2017 | * it returns -EPROTO without calling cros_ec_map_error(). | |
2018 | */ | |
2019 | [EC_RES_IN_PROGRESS] = -EPROTO, | |
2020 | [EC_RES_UNAVAILABLE] = -ENODATA, | |
2021 | [EC_RES_TIMEOUT] = -ETIMEDOUT, | |
2022 | [EC_RES_OVERFLOW] = -EOVERFLOW, | |
2023 | [EC_RES_INVALID_HEADER] = -EBADR, | |
2024 | [EC_RES_REQUEST_TRUNCATED] = -EBADR, | |
2025 | [EC_RES_RESPONSE_TOO_BIG] = -EFBIG, | |
2026 | [EC_RES_BUS_ERROR] = -EFAULT, | |
2027 | [EC_RES_BUSY] = -EBUSY, | |
2028 | [EC_RES_INVALID_HEADER_VERSION] = -EBADMSG, | |
2029 | [EC_RES_INVALID_HEADER_CRC] = -EBADMSG, | |
2030 | [EC_RES_INVALID_DATA_CRC] = -EBADMSG, | |
2031 | [EC_RES_DUP_UNAVAILABLE] = -ENODATA, | |
2032 | }; | |
2033 | ||
2034 | memset(&msg, 0, sizeof(msg)); | |
2035 | ||
2036 | for (i = 0; i < ARRAY_SIZE(map); ++i) { | |
2037 | mock = cros_kunit_ec_xfer_mock_addx(test, 0, i, 0); | |
2038 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
2039 | ||
2040 | ret = cros_ec_cmd_xfer_status(ec_dev, &msg); | |
2041 | KUNIT_EXPECT_EQ(test, ret, map[i]); | |
2042 | } | |
2043 | } | |
2044 | ||
2b7ed927 TBS |
2045 | static void cros_ec_proto_test_get_next_event_no_mkbp_event(struct kunit *test) |
2046 | { | |
2047 | struct cros_ec_proto_test_priv *priv = test->priv; | |
2048 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
2049 | struct ec_xfer_mock *mock; | |
2050 | int ret; | |
2051 | bool wake_event, more_events; | |
2052 | ||
2053 | ec_dev->max_request = 0xff; | |
2054 | ec_dev->max_response = 0xee; | |
2055 | ec_dev->mkbp_event_supported = 0; | |
2056 | ||
2057 | /* Set some garbage bytes. */ | |
2058 | wake_event = false; | |
2059 | more_events = true; | |
2060 | ||
2061 | /* For get_keyboard_state_event(). */ | |
2062 | { | |
41f1242f | 2063 | union ec_response_get_next_data_v3 *data; |
2b7ed927 TBS |
2064 | |
2065 | mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); | |
2066 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
2067 | ||
41f1242f | 2068 | data = (union ec_response_get_next_data_v3 *)mock->o_data; |
2b7ed927 TBS |
2069 | data->host_event = 0xbeef; |
2070 | } | |
2071 | ||
2072 | ret = cros_ec_get_next_event(ec_dev, &wake_event, &more_events); | |
41f1242f | 2073 | KUNIT_EXPECT_EQ(test, ret, sizeof(union ec_response_get_next_data_v3)); |
2b7ed927 TBS |
2074 | |
2075 | KUNIT_EXPECT_EQ(test, ec_dev->event_data.event_type, EC_MKBP_EVENT_KEY_MATRIX); | |
2076 | KUNIT_EXPECT_EQ(test, ec_dev->event_data.data.host_event, 0xbeef); | |
2077 | ||
2078 | KUNIT_EXPECT_TRUE(test, wake_event); | |
2079 | KUNIT_EXPECT_FALSE(test, more_events); | |
2080 | ||
2081 | /* For get_keyboard_state_event(). */ | |
2082 | { | |
2083 | mock = cros_kunit_ec_xfer_mock_next(); | |
2084 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
2085 | ||
2086 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
2087 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_MKBP_STATE); | |
41f1242f | 2088 | KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(union ec_response_get_next_data_v3)); |
2b7ed927 TBS |
2089 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); |
2090 | } | |
2091 | } | |
2092 | ||
2093 | static void cros_ec_proto_test_get_next_event_mkbp_event_ec_suspended(struct kunit *test) | |
2094 | { | |
2095 | struct cros_ec_proto_test_priv *priv = test->priv; | |
2096 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
2097 | int ret; | |
2098 | ||
2099 | ec_dev->mkbp_event_supported = 1; | |
2100 | ec_dev->suspended = true; | |
2101 | ||
2102 | ret = cros_ec_get_next_event(ec_dev, NULL, NULL); | |
2103 | KUNIT_EXPECT_EQ(test, ret, -EHOSTDOWN); | |
2104 | } | |
2105 | ||
2106 | static void cros_ec_proto_test_get_next_event_mkbp_event_version0(struct kunit *test) | |
2107 | { | |
2108 | struct cros_ec_proto_test_priv *priv = test->priv; | |
2109 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
2110 | struct ec_xfer_mock *mock; | |
2111 | int ret; | |
2112 | bool wake_event, more_events; | |
2113 | ||
2114 | ec_dev->max_request = 0xff; | |
2115 | ec_dev->max_response = 0xee; | |
2116 | ec_dev->mkbp_event_supported = 1; | |
2117 | ||
2118 | /* Set some garbage bytes. */ | |
2119 | wake_event = true; | |
2120 | more_events = false; | |
2121 | ||
2122 | /* For get_next_event_xfer(). */ | |
2123 | { | |
2124 | struct ec_response_get_next_event *data; | |
2125 | ||
2126 | mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); | |
2127 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
2128 | ||
2129 | data = (struct ec_response_get_next_event *)mock->o_data; | |
2130 | data->event_type = EC_MKBP_EVENT_SENSOR_FIFO | EC_MKBP_HAS_MORE_EVENTS; | |
2131 | data->data.sysrq = 0xbeef; | |
2132 | } | |
2133 | ||
2134 | ret = cros_ec_get_next_event(ec_dev, &wake_event, &more_events); | |
2135 | KUNIT_EXPECT_EQ(test, ret, sizeof(struct ec_response_get_next_event)); | |
2136 | ||
2137 | KUNIT_EXPECT_EQ(test, ec_dev->event_data.event_type, EC_MKBP_EVENT_SENSOR_FIFO); | |
2138 | KUNIT_EXPECT_EQ(test, ec_dev->event_data.data.sysrq, 0xbeef); | |
2139 | ||
2140 | KUNIT_EXPECT_FALSE(test, wake_event); | |
2141 | KUNIT_EXPECT_TRUE(test, more_events); | |
2142 | ||
2143 | /* For get_next_event_xfer(). */ | |
2144 | { | |
2145 | mock = cros_kunit_ec_xfer_mock_next(); | |
2146 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
2147 | ||
2148 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
2149 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_NEXT_EVENT); | |
2150 | KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_get_next_event)); | |
2151 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
2152 | } | |
2153 | } | |
2154 | ||
2155 | static void cros_ec_proto_test_get_next_event_mkbp_event_version2(struct kunit *test) | |
2156 | { | |
2157 | struct cros_ec_proto_test_priv *priv = test->priv; | |
2158 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
2159 | struct ec_xfer_mock *mock; | |
2160 | int ret; | |
2161 | bool wake_event, more_events; | |
2162 | ||
2163 | ec_dev->max_request = 0xff; | |
2164 | ec_dev->max_response = 0xee; | |
2165 | ec_dev->mkbp_event_supported = 3; | |
2166 | ||
2167 | /* Set some garbage bytes. */ | |
2168 | wake_event = false; | |
2169 | more_events = true; | |
2170 | ||
2171 | /* For get_next_event_xfer(). */ | |
2172 | { | |
2173 | struct ec_response_get_next_event_v1 *data; | |
2174 | ||
2175 | mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); | |
2176 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
2177 | ||
2178 | data = (struct ec_response_get_next_event_v1 *)mock->o_data; | |
2179 | data->event_type = EC_MKBP_EVENT_FINGERPRINT; | |
2180 | data->data.sysrq = 0xbeef; | |
2181 | } | |
2182 | ||
2183 | ret = cros_ec_get_next_event(ec_dev, &wake_event, &more_events); | |
2184 | KUNIT_EXPECT_EQ(test, ret, sizeof(struct ec_response_get_next_event_v1)); | |
2185 | ||
2186 | KUNIT_EXPECT_EQ(test, ec_dev->event_data.event_type, EC_MKBP_EVENT_FINGERPRINT); | |
2187 | KUNIT_EXPECT_EQ(test, ec_dev->event_data.data.sysrq, 0xbeef); | |
2188 | ||
2189 | KUNIT_EXPECT_TRUE(test, wake_event); | |
2190 | KUNIT_EXPECT_FALSE(test, more_events); | |
2191 | ||
2192 | /* For get_next_event_xfer(). */ | |
2193 | { | |
2194 | mock = cros_kunit_ec_xfer_mock_next(); | |
2195 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
2196 | ||
2197 | KUNIT_EXPECT_EQ(test, mock->msg.version, 2); | |
2198 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_NEXT_EVENT); | |
2199 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
2200 | sizeof(struct ec_response_get_next_event_v1)); | |
2201 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
2202 | } | |
2203 | } | |
2204 | ||
2205 | static void cros_ec_proto_test_get_next_event_mkbp_event_host_event_rtc(struct kunit *test) | |
2206 | { | |
2207 | struct cros_ec_proto_test_priv *priv = test->priv; | |
2208 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
2209 | struct ec_xfer_mock *mock; | |
2210 | int ret; | |
2211 | bool wake_event; | |
2212 | struct ec_response_get_next_event_v1 *data; | |
2213 | ||
2214 | ec_dev->max_request = 0xff; | |
2215 | ec_dev->max_response = 0xee; | |
2216 | ec_dev->mkbp_event_supported = 3; | |
2217 | ec_dev->host_event_wake_mask = U32_MAX; | |
2218 | ||
2219 | /* Set some garbage bytes. */ | |
2220 | wake_event = true; | |
2221 | ||
2222 | /* For get_next_event_xfer(). */ | |
2223 | { | |
2224 | mock = cros_kunit_ec_xfer_mock_add(test, | |
2225 | sizeof(data->event_type) + | |
2226 | sizeof(data->data.host_event)); | |
2227 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
2228 | ||
2229 | data = (struct ec_response_get_next_event_v1 *)mock->o_data; | |
2230 | data->event_type = EC_MKBP_EVENT_HOST_EVENT; | |
2231 | put_unaligned_le32(EC_HOST_EVENT_MASK(EC_HOST_EVENT_RTC), &data->data.host_event); | |
2232 | } | |
2233 | ||
2234 | ret = cros_ec_get_next_event(ec_dev, &wake_event, NULL); | |
2235 | KUNIT_EXPECT_EQ(test, ret, sizeof(data->event_type) + sizeof(data->data.host_event)); | |
2236 | ||
2237 | KUNIT_EXPECT_EQ(test, ec_dev->event_data.event_type, EC_MKBP_EVENT_HOST_EVENT); | |
2238 | ||
2239 | KUNIT_EXPECT_FALSE(test, wake_event); | |
2240 | ||
2241 | /* For get_next_event_xfer(). */ | |
2242 | { | |
2243 | mock = cros_kunit_ec_xfer_mock_next(); | |
2244 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
2245 | ||
2246 | KUNIT_EXPECT_EQ(test, mock->msg.version, 2); | |
2247 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_NEXT_EVENT); | |
2248 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
2249 | sizeof(struct ec_response_get_next_event_v1)); | |
2250 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
2251 | } | |
2252 | } | |
2253 | ||
2254 | static void cros_ec_proto_test_get_next_event_mkbp_event_host_event_masked(struct kunit *test) | |
2255 | { | |
2256 | struct cros_ec_proto_test_priv *priv = test->priv; | |
2257 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
2258 | struct ec_xfer_mock *mock; | |
2259 | int ret; | |
2260 | bool wake_event; | |
2261 | struct ec_response_get_next_event_v1 *data; | |
2262 | ||
2263 | ec_dev->max_request = 0xff; | |
2264 | ec_dev->max_response = 0xee; | |
2265 | ec_dev->mkbp_event_supported = 3; | |
2266 | ec_dev->host_event_wake_mask = U32_MAX & ~EC_HOST_EVENT_MASK(EC_HOST_EVENT_AC_DISCONNECTED); | |
2267 | ||
2268 | /* Set some garbage bytes. */ | |
2269 | wake_event = true; | |
2270 | ||
2271 | /* For get_next_event_xfer(). */ | |
2272 | { | |
2273 | mock = cros_kunit_ec_xfer_mock_add(test, | |
2274 | sizeof(data->event_type) + | |
2275 | sizeof(data->data.host_event)); | |
2276 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
2277 | ||
2278 | data = (struct ec_response_get_next_event_v1 *)mock->o_data; | |
2279 | data->event_type = EC_MKBP_EVENT_HOST_EVENT; | |
2280 | put_unaligned_le32(EC_HOST_EVENT_MASK(EC_HOST_EVENT_AC_DISCONNECTED), | |
2281 | &data->data.host_event); | |
2282 | } | |
2283 | ||
2284 | ret = cros_ec_get_next_event(ec_dev, &wake_event, NULL); | |
2285 | KUNIT_EXPECT_EQ(test, ret, sizeof(data->event_type) + sizeof(data->data.host_event)); | |
2286 | ||
2287 | KUNIT_EXPECT_EQ(test, ec_dev->event_data.event_type, EC_MKBP_EVENT_HOST_EVENT); | |
2288 | ||
2289 | KUNIT_EXPECT_FALSE(test, wake_event); | |
2290 | ||
2291 | /* For get_next_event_xfer(). */ | |
2292 | { | |
2293 | mock = cros_kunit_ec_xfer_mock_next(); | |
2294 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
2295 | ||
2296 | KUNIT_EXPECT_EQ(test, mock->msg.version, 2); | |
2297 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_NEXT_EVENT); | |
2298 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
2299 | sizeof(struct ec_response_get_next_event_v1)); | |
2300 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
2301 | } | |
2302 | } | |
2303 | ||
7cb1eb82 TBS |
2304 | static void cros_ec_proto_test_get_host_event_no_mkbp_event(struct kunit *test) |
2305 | { | |
2306 | struct cros_ec_proto_test_priv *priv = test->priv; | |
2307 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
2308 | int ret; | |
2309 | ||
2310 | ec_dev->mkbp_event_supported = 0; | |
2311 | ||
2312 | ret = cros_ec_get_host_event(ec_dev); | |
2313 | KUNIT_EXPECT_EQ(test, ret, 0); | |
2314 | } | |
2315 | ||
2316 | static void cros_ec_proto_test_get_host_event_not_host_event(struct kunit *test) | |
2317 | { | |
2318 | struct cros_ec_proto_test_priv *priv = test->priv; | |
2319 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
2320 | int ret; | |
2321 | ||
2322 | ec_dev->mkbp_event_supported = 1; | |
2323 | ec_dev->event_data.event_type = EC_MKBP_EVENT_FINGERPRINT; | |
2324 | ||
2325 | ret = cros_ec_get_host_event(ec_dev); | |
2326 | KUNIT_EXPECT_EQ(test, ret, 0); | |
2327 | } | |
2328 | ||
2329 | static void cros_ec_proto_test_get_host_event_wrong_event_size(struct kunit *test) | |
2330 | { | |
2331 | struct cros_ec_proto_test_priv *priv = test->priv; | |
2332 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
2333 | int ret; | |
2334 | ||
2335 | ec_dev->mkbp_event_supported = 1; | |
2336 | ec_dev->event_data.event_type = EC_MKBP_EVENT_HOST_EVENT; | |
2337 | ec_dev->event_size = 0xff; | |
2338 | ||
2339 | ret = cros_ec_get_host_event(ec_dev); | |
2340 | KUNIT_EXPECT_EQ(test, ret, 0); | |
2341 | } | |
2342 | ||
2343 | static void cros_ec_proto_test_get_host_event_normal(struct kunit *test) | |
2344 | { | |
2345 | struct cros_ec_proto_test_priv *priv = test->priv; | |
2346 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
2347 | int ret; | |
2348 | ||
2349 | ec_dev->mkbp_event_supported = 1; | |
2350 | ec_dev->event_data.event_type = EC_MKBP_EVENT_HOST_EVENT; | |
2351 | ec_dev->event_size = sizeof(ec_dev->event_data.data.host_event); | |
2352 | put_unaligned_le32(EC_HOST_EVENT_MASK(EC_HOST_EVENT_RTC), | |
2353 | &ec_dev->event_data.data.host_event); | |
2354 | ||
2355 | ret = cros_ec_get_host_event(ec_dev); | |
2356 | KUNIT_EXPECT_EQ(test, ret, EC_HOST_EVENT_MASK(EC_HOST_EVENT_RTC)); | |
2357 | } | |
2358 | ||
00238864 TBS |
2359 | static void cros_ec_proto_test_check_features_cached(struct kunit *test) |
2360 | { | |
2361 | int ret, i; | |
6514bac4 | 2362 | static struct cros_ec_dev ec; |
00238864 TBS |
2363 | |
2364 | ec.features.flags[0] = EC_FEATURE_MASK_0(EC_FEATURE_FINGERPRINT); | |
2365 | ec.features.flags[1] = EC_FEATURE_MASK_0(EC_FEATURE_SCP); | |
2366 | ||
2367 | for (i = 0; i < EC_FEATURE_TYPEC_MUX_REQUIRE_AP_ACK; ++i) { | |
2368 | ret = cros_ec_check_features(&ec, i); | |
2369 | switch (i) { | |
2370 | case EC_FEATURE_FINGERPRINT: | |
2371 | case EC_FEATURE_SCP: | |
2372 | KUNIT_EXPECT_TRUE(test, ret); | |
2373 | break; | |
2374 | default: | |
2375 | KUNIT_EXPECT_FALSE(test, ret); | |
2376 | break; | |
2377 | } | |
2378 | } | |
2379 | } | |
2380 | ||
2381 | static void cros_ec_proto_test_check_features_not_cached(struct kunit *test) | |
2382 | { | |
2383 | struct cros_ec_proto_test_priv *priv = test->priv; | |
2384 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
2385 | struct ec_xfer_mock *mock; | |
2386 | int ret, i; | |
6514bac4 | 2387 | static struct cros_ec_dev ec; |
00238864 TBS |
2388 | |
2389 | ec_dev->max_request = 0xff; | |
2390 | ec_dev->max_response = 0xee; | |
2391 | ec.ec_dev = ec_dev; | |
2392 | ec.dev = ec_dev->dev; | |
2393 | ec.cmd_offset = 0; | |
2394 | ec.features.flags[0] = -1; | |
2395 | ec.features.flags[1] = -1; | |
2396 | ||
2397 | /* For EC_CMD_GET_FEATURES. */ | |
2398 | { | |
2399 | struct ec_response_get_features *data; | |
2400 | ||
2401 | mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); | |
2402 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
2403 | ||
2404 | data = (struct ec_response_get_features *)mock->o_data; | |
2405 | data->flags[0] = EC_FEATURE_MASK_0(EC_FEATURE_FINGERPRINT); | |
2406 | data->flags[1] = EC_FEATURE_MASK_0(EC_FEATURE_SCP); | |
2407 | } | |
2408 | ||
2409 | for (i = 0; i < EC_FEATURE_TYPEC_MUX_REQUIRE_AP_ACK; ++i) { | |
2410 | ret = cros_ec_check_features(&ec, i); | |
2411 | switch (i) { | |
2412 | case EC_FEATURE_FINGERPRINT: | |
2413 | case EC_FEATURE_SCP: | |
2414 | KUNIT_EXPECT_TRUE(test, ret); | |
2415 | break; | |
2416 | default: | |
2417 | KUNIT_EXPECT_FALSE(test, ret); | |
2418 | break; | |
2419 | } | |
2420 | } | |
2421 | ||
2422 | /* For EC_CMD_GET_FEATURES. */ | |
2423 | { | |
2424 | mock = cros_kunit_ec_xfer_mock_next(); | |
2425 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
2426 | ||
2427 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0); | |
2428 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_FEATURES); | |
2429 | KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_get_features)); | |
2430 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); | |
2431 | } | |
2432 | } | |
2433 | ||
33f0fdba TBS |
2434 | static void cros_ec_proto_test_get_sensor_count_normal(struct kunit *test) |
2435 | { | |
2436 | struct cros_ec_proto_test_priv *priv = test->priv; | |
2437 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
2438 | struct ec_xfer_mock *mock; | |
2439 | int ret; | |
6514bac4 | 2440 | static struct cros_ec_dev ec; |
33f0fdba TBS |
2441 | |
2442 | ec_dev->max_request = 0xff; | |
2443 | ec_dev->max_response = 0xee; | |
2444 | ec.ec_dev = ec_dev; | |
2445 | ec.dev = ec_dev->dev; | |
2446 | ec.cmd_offset = 0; | |
2447 | ||
2448 | /* For EC_CMD_MOTION_SENSE_CMD. */ | |
2449 | { | |
2450 | struct ec_response_motion_sense *data; | |
2451 | ||
2452 | mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); | |
2453 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
2454 | ||
2455 | data = (struct ec_response_motion_sense *)mock->o_data; | |
2456 | data->dump.sensor_count = 0xbf; | |
2457 | } | |
2458 | ||
2459 | ret = cros_ec_get_sensor_count(&ec); | |
2460 | KUNIT_EXPECT_EQ(test, ret, 0xbf); | |
2461 | ||
2462 | /* For EC_CMD_MOTION_SENSE_CMD. */ | |
2463 | { | |
2464 | struct ec_params_motion_sense *data; | |
2465 | ||
2466 | mock = cros_kunit_ec_xfer_mock_next(); | |
2467 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
2468 | ||
2469 | KUNIT_EXPECT_EQ(test, mock->msg.version, 1); | |
2470 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_MOTION_SENSE_CMD); | |
2471 | KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_motion_sense)); | |
2472 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data)); | |
2473 | ||
2474 | data = (struct ec_params_motion_sense *)mock->i_data; | |
2475 | KUNIT_EXPECT_EQ(test, data->cmd, MOTIONSENSE_CMD_DUMP); | |
2476 | } | |
2477 | } | |
2478 | ||
2479 | static void cros_ec_proto_test_get_sensor_count_xfer_error(struct kunit *test) | |
2480 | { | |
2481 | struct cros_ec_proto_test_priv *priv = test->priv; | |
2482 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
2483 | struct ec_xfer_mock *mock; | |
2484 | int ret; | |
6514bac4 | 2485 | static struct cros_ec_dev ec; |
33f0fdba TBS |
2486 | |
2487 | ec_dev->max_request = 0xff; | |
2488 | ec_dev->max_response = 0xee; | |
2489 | ec.ec_dev = ec_dev; | |
2490 | ec.dev = ec_dev->dev; | |
2491 | ec.cmd_offset = 0; | |
2492 | ||
2493 | /* For EC_CMD_MOTION_SENSE_CMD. */ | |
2494 | { | |
2495 | mock = cros_kunit_ec_xfer_mock_addx(test, -EPROTO, EC_RES_SUCCESS, 0); | |
2496 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
2497 | } | |
2498 | ||
2499 | ret = cros_ec_get_sensor_count(&ec); | |
2500 | KUNIT_EXPECT_EQ(test, ret, -EPROTO); | |
2501 | ||
2502 | /* For EC_CMD_MOTION_SENSE_CMD. */ | |
2503 | { | |
2504 | struct ec_params_motion_sense *data; | |
2505 | ||
2506 | mock = cros_kunit_ec_xfer_mock_next(); | |
2507 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
2508 | ||
2509 | KUNIT_EXPECT_EQ(test, mock->msg.version, 1); | |
2510 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_MOTION_SENSE_CMD); | |
2511 | KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_motion_sense)); | |
2512 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data)); | |
2513 | ||
2514 | data = (struct ec_params_motion_sense *)mock->i_data; | |
2515 | KUNIT_EXPECT_EQ(test, data->cmd, MOTIONSENSE_CMD_DUMP); | |
2516 | } | |
2517 | } | |
2518 | ||
2519 | static void cros_ec_proto_test_get_sensor_count_legacy(struct kunit *test) | |
2520 | { | |
2521 | struct cros_ec_proto_test_priv *priv = test->priv; | |
2522 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
2523 | struct ec_xfer_mock *mock; | |
2524 | int ret, i; | |
6514bac4 | 2525 | static struct cros_ec_dev ec; |
33f0fdba TBS |
2526 | struct { |
2527 | u8 readmem_data; | |
2528 | int expected_result; | |
2529 | } test_data[] = { | |
2530 | { 0, 0 }, | |
2531 | { EC_MEMMAP_ACC_STATUS_PRESENCE_BIT, 2 }, | |
2532 | }; | |
2533 | ||
2534 | ec_dev->max_request = 0xff; | |
2535 | ec_dev->max_response = 0xee; | |
2536 | ec_dev->cmd_readmem = cros_kunit_readmem_mock; | |
2537 | ec.ec_dev = ec_dev; | |
2538 | ec.dev = ec_dev->dev; | |
2539 | ec.cmd_offset = 0; | |
2540 | ||
2541 | for (i = 0; i < ARRAY_SIZE(test_data); ++i) { | |
2542 | /* For EC_CMD_MOTION_SENSE_CMD. */ | |
2543 | { | |
2544 | mock = cros_kunit_ec_xfer_mock_addx(test, -EPROTO, EC_RES_SUCCESS, 0); | |
2545 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
2546 | } | |
2547 | ||
2548 | /* For readmem. */ | |
2549 | { | |
2550 | cros_kunit_readmem_mock_data = kunit_kzalloc(test, 1, GFP_KERNEL); | |
2551 | KUNIT_ASSERT_PTR_NE(test, cros_kunit_readmem_mock_data, NULL); | |
2552 | cros_kunit_readmem_mock_data[0] = test_data[i].readmem_data; | |
2553 | ||
2554 | cros_kunit_ec_xfer_mock_default_ret = 1; | |
2555 | } | |
2556 | ||
2557 | ret = cros_ec_get_sensor_count(&ec); | |
2558 | KUNIT_EXPECT_EQ(test, ret, test_data[i].expected_result); | |
2559 | ||
2560 | /* For EC_CMD_MOTION_SENSE_CMD. */ | |
2561 | { | |
2562 | struct ec_params_motion_sense *data; | |
2563 | ||
2564 | mock = cros_kunit_ec_xfer_mock_next(); | |
2565 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
2566 | ||
2567 | KUNIT_EXPECT_EQ(test, mock->msg.version, 1); | |
2568 | KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_MOTION_SENSE_CMD); | |
2569 | KUNIT_EXPECT_EQ(test, mock->msg.insize, | |
2570 | sizeof(struct ec_response_motion_sense)); | |
2571 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data)); | |
2572 | ||
2573 | data = (struct ec_params_motion_sense *)mock->i_data; | |
2574 | KUNIT_EXPECT_EQ(test, data->cmd, MOTIONSENSE_CMD_DUMP); | |
2575 | } | |
2576 | ||
2577 | /* For readmem. */ | |
2578 | { | |
2579 | KUNIT_EXPECT_EQ(test, cros_kunit_readmem_mock_offset, EC_MEMMAP_ACC_STATUS); | |
2580 | } | |
2581 | } | |
2582 | } | |
2583 | ||
9399b2cb TBS |
2584 | static void cros_ec_proto_test_ec_cmd(struct kunit *test) |
2585 | { | |
2586 | struct cros_ec_proto_test_priv *priv = test->priv; | |
2587 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
2588 | struct ec_xfer_mock *mock; | |
2589 | int ret; | |
2590 | u8 out[3], in[2]; | |
2591 | ||
2592 | ec_dev->max_request = 0xff; | |
2593 | ec_dev->max_response = 0xee; | |
2594 | ||
2595 | out[0] = 0xdd; | |
2596 | out[1] = 0xcc; | |
2597 | out[2] = 0xbb; | |
2598 | ||
2599 | { | |
2600 | u8 *data; | |
2601 | ||
2602 | mock = cros_kunit_ec_xfer_mock_add(test, 2); | |
2603 | KUNIT_ASSERT_PTR_NE(test, mock, NULL); | |
2604 | ||
2605 | data = (u8 *)mock->o_data; | |
2606 | data[0] = 0xaa; | |
2607 | data[1] = 0x99; | |
2608 | } | |
2609 | ||
2610 | ret = cros_ec_cmd(ec_dev, 0x88, 0x77, out, ARRAY_SIZE(out), in, ARRAY_SIZE(in)); | |
2611 | KUNIT_EXPECT_EQ(test, ret, 2); | |
2612 | ||
2613 | { | |
2614 | u8 *data; | |
2615 | ||
2616 | mock = cros_kunit_ec_xfer_mock_next(); | |
2617 | KUNIT_EXPECT_PTR_NE(test, mock, NULL); | |
2618 | ||
2619 | KUNIT_EXPECT_EQ(test, mock->msg.version, 0x88); | |
2620 | KUNIT_EXPECT_EQ(test, mock->msg.command, 0x77); | |
2621 | KUNIT_EXPECT_EQ(test, mock->msg.insize, ARRAY_SIZE(in)); | |
2622 | KUNIT_EXPECT_EQ(test, mock->msg.outsize, ARRAY_SIZE(out)); | |
2623 | ||
2624 | data = (u8 *)mock->i_data; | |
2625 | KUNIT_EXPECT_EQ(test, data[0], 0xdd); | |
2626 | KUNIT_EXPECT_EQ(test, data[1], 0xcc); | |
2627 | KUNIT_EXPECT_EQ(test, data[2], 0xbb); | |
2628 | } | |
2629 | } | |
2630 | ||
b99eb596 TBS |
2631 | static void cros_ec_proto_test_release(struct device *dev) |
2632 | { | |
2633 | } | |
2634 | ||
db681eaf TBS |
2635 | static int cros_ec_proto_test_init(struct kunit *test) |
2636 | { | |
2637 | struct cros_ec_proto_test_priv *priv; | |
2638 | struct cros_ec_device *ec_dev; | |
2639 | ||
2640 | priv = kunit_kzalloc(test, sizeof(*priv), GFP_KERNEL); | |
2641 | if (!priv) | |
2642 | return -ENOMEM; | |
2643 | test->priv = priv; | |
2644 | ||
2645 | ec_dev = &priv->ec_dev; | |
2646 | ec_dev->dout = (u8 *)priv->dout; | |
2647 | ec_dev->dout_size = ARRAY_SIZE(priv->dout); | |
2648 | ec_dev->din = (u8 *)priv->din; | |
2649 | ec_dev->din_size = ARRAY_SIZE(priv->din); | |
2650 | ec_dev->proto_version = EC_HOST_REQUEST_VERSION; | |
b99eb596 TBS |
2651 | ec_dev->dev = kunit_kzalloc(test, sizeof(*ec_dev->dev), GFP_KERNEL); |
2652 | if (!ec_dev->dev) | |
2653 | return -ENOMEM; | |
2654 | device_initialize(ec_dev->dev); | |
2655 | dev_set_name(ec_dev->dev, "cros_ec_proto_test"); | |
2656 | ec_dev->dev->release = cros_ec_proto_test_release; | |
2657 | ec_dev->cmd_xfer = cros_kunit_ec_xfer_mock; | |
2658 | ec_dev->pkt_xfer = cros_kunit_ec_xfer_mock; | |
e410b4ad | 2659 | mutex_init(&ec_dev->lock); |
db681eaf TBS |
2660 | |
2661 | priv->msg = (struct cros_ec_command *)priv->_msg; | |
2662 | ||
b99eb596 TBS |
2663 | cros_kunit_mock_reset(); |
2664 | ||
db681eaf TBS |
2665 | return 0; |
2666 | } | |
2667 | ||
b99eb596 TBS |
2668 | static void cros_ec_proto_test_exit(struct kunit *test) |
2669 | { | |
2670 | struct cros_ec_proto_test_priv *priv = test->priv; | |
2671 | struct cros_ec_device *ec_dev = &priv->ec_dev; | |
2672 | ||
2673 | put_device(ec_dev->dev); | |
2674 | } | |
2675 | ||
db681eaf TBS |
2676 | static struct kunit_case cros_ec_proto_test_cases[] = { |
2677 | KUNIT_CASE(cros_ec_proto_test_prepare_tx_legacy_normal), | |
2678 | KUNIT_CASE(cros_ec_proto_test_prepare_tx_legacy_bad_msg_outsize), | |
2679 | KUNIT_CASE(cros_ec_proto_test_prepare_tx_normal), | |
2680 | KUNIT_CASE(cros_ec_proto_test_prepare_tx_bad_msg_outsize), | |
4319cbd4 | 2681 | KUNIT_CASE(cros_ec_proto_test_check_result), |
b99eb596 TBS |
2682 | KUNIT_CASE(cros_ec_proto_test_query_all_normal), |
2683 | KUNIT_CASE(cros_ec_proto_test_query_all_no_pd_return_error), | |
3e97581e | 2684 | KUNIT_CASE(cros_ec_proto_test_query_all_no_pd_return0), |
b99eb596 | 2685 | KUNIT_CASE(cros_ec_proto_test_query_all_legacy_normal_v3_return_error), |
3e97581e | 2686 | KUNIT_CASE(cros_ec_proto_test_query_all_legacy_normal_v3_return0), |
b99eb596 TBS |
2687 | KUNIT_CASE(cros_ec_proto_test_query_all_legacy_xfer_error), |
2688 | KUNIT_CASE(cros_ec_proto_test_query_all_legacy_return_error), | |
2689 | KUNIT_CASE(cros_ec_proto_test_query_all_legacy_data_error), | |
cce5d551 | 2690 | KUNIT_CASE(cros_ec_proto_test_query_all_legacy_return0), |
b99eb596 | 2691 | KUNIT_CASE(cros_ec_proto_test_query_all_no_mkbp), |
a8f77c63 | 2692 | KUNIT_CASE(cros_ec_proto_test_query_all_no_mkbp_return_error), |
8120feba | 2693 | KUNIT_CASE(cros_ec_proto_test_query_all_no_mkbp_return0), |
b99eb596 | 2694 | KUNIT_CASE(cros_ec_proto_test_query_all_no_host_sleep), |
8120feba | 2695 | KUNIT_CASE(cros_ec_proto_test_query_all_no_host_sleep_return0), |
b99eb596 | 2696 | KUNIT_CASE(cros_ec_proto_test_query_all_default_wake_mask_return_error), |
e4377229 | 2697 | KUNIT_CASE(cros_ec_proto_test_query_all_default_wake_mask_return0), |
82f4def2 TBS |
2698 | KUNIT_CASE(cros_ec_proto_test_cmd_xfer_normal), |
2699 | KUNIT_CASE(cros_ec_proto_test_cmd_xfer_excess_msg_insize), | |
2700 | KUNIT_CASE(cros_ec_proto_test_cmd_xfer_excess_msg_outsize_without_passthru), | |
2701 | KUNIT_CASE(cros_ec_proto_test_cmd_xfer_excess_msg_outsize_with_passthru), | |
da95f691 TBS |
2702 | KUNIT_CASE(cros_ec_proto_test_cmd_xfer_protocol_v3_normal), |
2703 | KUNIT_CASE(cros_ec_proto_test_cmd_xfer_protocol_v3_no_op), | |
2704 | KUNIT_CASE(cros_ec_proto_test_cmd_xfer_protocol_v2_normal), | |
2705 | KUNIT_CASE(cros_ec_proto_test_cmd_xfer_protocol_v2_no_op), | |
2706 | KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_normal), | |
2707 | KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_retries_eagain), | |
2708 | KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_retries_status_processing), | |
2709 | KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_xfer_error), | |
2710 | KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_return_error), | |
82c9b7ed | 2711 | KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_return0), |
74bed42f TBS |
2712 | KUNIT_CASE(cros_ec_proto_test_cmd_xfer_status_normal), |
2713 | KUNIT_CASE(cros_ec_proto_test_cmd_xfer_status_xfer_error), | |
1242688f | 2714 | KUNIT_CASE(cros_ec_proto_test_cmd_xfer_status_return_error), |
2b7ed927 TBS |
2715 | KUNIT_CASE(cros_ec_proto_test_get_next_event_no_mkbp_event), |
2716 | KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_ec_suspended), | |
2717 | KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_version0), | |
2718 | KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_version2), | |
2719 | KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_host_event_rtc), | |
2720 | KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_host_event_masked), | |
7cb1eb82 TBS |
2721 | KUNIT_CASE(cros_ec_proto_test_get_host_event_no_mkbp_event), |
2722 | KUNIT_CASE(cros_ec_proto_test_get_host_event_not_host_event), | |
2723 | KUNIT_CASE(cros_ec_proto_test_get_host_event_wrong_event_size), | |
2724 | KUNIT_CASE(cros_ec_proto_test_get_host_event_normal), | |
00238864 TBS |
2725 | KUNIT_CASE(cros_ec_proto_test_check_features_cached), |
2726 | KUNIT_CASE(cros_ec_proto_test_check_features_not_cached), | |
33f0fdba TBS |
2727 | KUNIT_CASE(cros_ec_proto_test_get_sensor_count_normal), |
2728 | KUNIT_CASE(cros_ec_proto_test_get_sensor_count_xfer_error), | |
2729 | KUNIT_CASE(cros_ec_proto_test_get_sensor_count_legacy), | |
9399b2cb | 2730 | KUNIT_CASE(cros_ec_proto_test_ec_cmd), |
db681eaf TBS |
2731 | {} |
2732 | }; | |
2733 | ||
2734 | static struct kunit_suite cros_ec_proto_test_suite = { | |
2735 | .name = "cros_ec_proto_test", | |
2736 | .init = cros_ec_proto_test_init, | |
b99eb596 | 2737 | .exit = cros_ec_proto_test_exit, |
db681eaf TBS |
2738 | .test_cases = cros_ec_proto_test_cases, |
2739 | }; | |
2740 | ||
2741 | kunit_test_suite(cros_ec_proto_test_suite); | |
2742 | ||
d11c0029 | 2743 | MODULE_DESCRIPTION("Kunit tests for ChromeOS Embedded Controller protocol"); |
db681eaf | 2744 | MODULE_LICENSE("GPL"); |