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