1 // SPDX-License-Identifier: GPL-2.0
3 * Kunit tests for ChromeOS Embedded Controller protocol.
6 #include <kunit/test.h>
8 #include <asm/unaligned.h>
10 #include <linux/platform_data/cros_ec_commands.h>
11 #include <linux/platform_data/cros_ec_proto.h>
14 #include "cros_kunit_util.h"
18 struct cros_ec_proto_test_priv {
19 struct cros_ec_device ec_dev;
22 struct cros_ec_command *msg;
26 static void cros_ec_proto_test_prepare_tx_legacy_normal(struct kunit *test)
28 struct cros_ec_proto_test_priv *priv = test->priv;
29 struct cros_ec_device *ec_dev = &priv->ec_dev;
30 struct cros_ec_command *msg = priv->msg;
34 ec_dev->proto_version = 2;
36 msg->command = EC_CMD_HELLO;
37 msg->outsize = EC_PROTO2_MAX_PARAM_SIZE;
43 ret = cros_ec_prepare_tx(ec_dev, msg);
45 KUNIT_EXPECT_EQ(test, ret, EC_MSG_TX_PROTO_BYTES + EC_PROTO2_MAX_PARAM_SIZE);
46 KUNIT_EXPECT_EQ(test, ec_dev->dout[0], EC_CMD_VERSION0);
47 KUNIT_EXPECT_EQ(test, ec_dev->dout[1], EC_CMD_HELLO);
48 KUNIT_EXPECT_EQ(test, ec_dev->dout[2], EC_PROTO2_MAX_PARAM_SIZE);
49 KUNIT_EXPECT_EQ(test, EC_MSG_TX_HEADER_BYTES, 3);
50 KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + 0], 0xde);
51 KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + 1], 0xad);
52 KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + 2], 0xbe);
53 KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + 3], 0xef);
54 for (i = 4; i < EC_PROTO2_MAX_PARAM_SIZE; ++i)
55 KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + i], 0);
57 csum = EC_CMD_VERSION0;
59 csum += EC_PROTO2_MAX_PARAM_SIZE;
65 ec_dev->dout[EC_MSG_TX_HEADER_BYTES + EC_PROTO2_MAX_PARAM_SIZE],
69 static void cros_ec_proto_test_prepare_tx_legacy_bad_msg_outsize(struct kunit *test)
71 struct cros_ec_proto_test_priv *priv = test->priv;
72 struct cros_ec_device *ec_dev = &priv->ec_dev;
73 struct cros_ec_command *msg = priv->msg;
76 ec_dev->proto_version = 2;
78 msg->outsize = EC_PROTO2_MAX_PARAM_SIZE + 1;
80 ret = cros_ec_prepare_tx(ec_dev, msg);
81 KUNIT_EXPECT_EQ(test, ret, -EINVAL);
84 static void cros_ec_proto_test_prepare_tx_normal(struct kunit *test)
86 struct cros_ec_proto_test_priv *priv = test->priv;
87 struct cros_ec_device *ec_dev = &priv->ec_dev;
88 struct cros_ec_command *msg = priv->msg;
89 struct ec_host_request *request = (struct ec_host_request *)ec_dev->dout;
93 msg->command = EC_CMD_HELLO;
100 ret = cros_ec_prepare_tx(ec_dev, msg);
102 KUNIT_EXPECT_EQ(test, ret, sizeof(*request) + 0x88);
104 KUNIT_EXPECT_EQ(test, request->struct_version, EC_HOST_REQUEST_VERSION);
105 KUNIT_EXPECT_EQ(test, request->command, EC_CMD_HELLO);
106 KUNIT_EXPECT_EQ(test, request->command_version, 0);
107 KUNIT_EXPECT_EQ(test, request->data_len, 0x88);
108 KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + 0], 0xde);
109 KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + 1], 0xad);
110 KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + 2], 0xbe);
111 KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + 3], 0xef);
112 for (i = 4; i < 0x88; ++i)
113 KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + i], 0);
115 csum = EC_HOST_REQUEST_VERSION;
116 csum += EC_CMD_HELLO;
122 KUNIT_EXPECT_EQ(test, request->checksum, (u8)-csum);
125 static void cros_ec_proto_test_prepare_tx_bad_msg_outsize(struct kunit *test)
127 struct cros_ec_proto_test_priv *priv = test->priv;
128 struct cros_ec_device *ec_dev = &priv->ec_dev;
129 struct cros_ec_command *msg = priv->msg;
132 msg->outsize = ec_dev->dout_size - sizeof(struct ec_host_request) + 1;
134 ret = cros_ec_prepare_tx(ec_dev, msg);
135 KUNIT_EXPECT_EQ(test, ret, -EINVAL);
138 static void cros_ec_proto_test_check_result(struct kunit *test)
140 struct cros_ec_proto_test_priv *priv = test->priv;
141 struct cros_ec_device *ec_dev = &priv->ec_dev;
142 struct cros_ec_command *msg = priv->msg;
144 static enum ec_status status[] = {
146 EC_RES_INVALID_COMMAND,
148 EC_RES_INVALID_PARAM,
149 EC_RES_ACCESS_DENIED,
150 EC_RES_INVALID_RESPONSE,
151 EC_RES_INVALID_VERSION,
152 EC_RES_INVALID_CHECKSUM,
156 EC_RES_INVALID_HEADER,
157 EC_RES_REQUEST_TRUNCATED,
158 EC_RES_RESPONSE_TOO_BIG,
161 EC_RES_INVALID_HEADER_VERSION,
162 EC_RES_INVALID_HEADER_CRC,
163 EC_RES_INVALID_DATA_CRC,
164 EC_RES_DUP_UNAVAILABLE,
167 for (i = 0; i < ARRAY_SIZE(status); ++i) {
168 msg->result = status[i];
169 ret = cros_ec_check_result(ec_dev, msg);
170 KUNIT_EXPECT_EQ(test, ret, 0);
173 msg->result = EC_RES_IN_PROGRESS;
174 ret = cros_ec_check_result(ec_dev, msg);
175 KUNIT_EXPECT_EQ(test, ret, -EAGAIN);
178 static void cros_ec_proto_test_query_all_pretest(struct kunit *test)
180 struct cros_ec_proto_test_priv *priv = test->priv;
181 struct cros_ec_device *ec_dev = &priv->ec_dev;
184 * cros_ec_query_all() will free din and dout and allocate them again to fit the usage by
185 * calling devm_kfree() and devm_kzalloc(). Set them to NULL as they aren't managed by
186 * ec_dev->dev but allocated statically in struct cros_ec_proto_test_priv
187 * (see cros_ec_proto_test_init()).
193 static void cros_ec_proto_test_query_all_normal(struct kunit *test)
195 struct cros_ec_proto_test_priv *priv = test->priv;
196 struct cros_ec_device *ec_dev = &priv->ec_dev;
197 struct ec_xfer_mock *mock;
200 /* For cros_ec_get_proto_info() without passthru. */
202 struct ec_response_get_protocol_info *data;
204 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
205 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
207 data = (struct ec_response_get_protocol_info *)mock->o_data;
208 data->protocol_versions = BIT(3) | BIT(2);
209 data->max_request_packet_size = 0xbe;
210 data->max_response_packet_size = 0xef;
213 /* For cros_ec_get_proto_info() with passthru. */
215 struct ec_response_get_protocol_info *data;
217 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
218 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
220 data = (struct ec_response_get_protocol_info *)mock->o_data;
221 data->max_request_packet_size = 0xbf;
224 /* For cros_ec_get_host_command_version_mask() for MKBP. */
226 struct ec_response_get_cmd_versions *data;
228 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
229 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
231 data = (struct ec_response_get_cmd_versions *)mock->o_data;
232 data->version_mask = BIT(6) | BIT(5);
235 /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
237 struct ec_response_get_cmd_versions *data;
239 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
240 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
242 data = (struct ec_response_get_cmd_versions *)mock->o_data;
243 data->version_mask = BIT(1);
246 /* For cros_ec_get_host_event_wake_mask(). */
248 struct ec_response_host_event_mask *data;
250 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
251 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
253 data = (struct ec_response_host_event_mask *)mock->o_data;
257 cros_ec_proto_test_query_all_pretest(test);
258 ret = cros_ec_query_all(ec_dev);
259 KUNIT_EXPECT_EQ(test, ret, 0);
261 /* For cros_ec_get_proto_info() without passthru. */
263 mock = cros_kunit_ec_xfer_mock_next();
264 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
266 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
267 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
268 KUNIT_EXPECT_EQ(test, mock->msg.insize,
269 sizeof(struct ec_response_get_protocol_info));
270 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
272 KUNIT_EXPECT_EQ(test, ec_dev->max_request, 0xbe - sizeof(struct ec_host_request));
273 KUNIT_EXPECT_EQ(test, ec_dev->max_response, 0xef - sizeof(struct ec_host_response));
274 KUNIT_EXPECT_EQ(test, ec_dev->proto_version, 3);
275 KUNIT_EXPECT_EQ(test, ec_dev->din_size, 0xef + EC_MAX_RESPONSE_OVERHEAD);
276 KUNIT_EXPECT_EQ(test, ec_dev->dout_size, 0xbe + EC_MAX_REQUEST_OVERHEAD);
279 /* For cros_ec_get_proto_info() with passthru. */
281 mock = cros_kunit_ec_xfer_mock_next();
282 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
284 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
285 KUNIT_EXPECT_EQ(test, mock->msg.command,
286 EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) |
287 EC_CMD_GET_PROTOCOL_INFO);
288 KUNIT_EXPECT_EQ(test, mock->msg.insize,
289 sizeof(struct ec_response_get_protocol_info));
290 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
292 KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0xbf - sizeof(struct ec_host_request));
295 /* For cros_ec_get_host_command_version_mask() for MKBP. */
297 struct ec_params_get_cmd_versions *data;
299 mock = cros_kunit_ec_xfer_mock_next();
300 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
302 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
303 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
304 KUNIT_EXPECT_EQ(test, mock->msg.insize,
305 sizeof(struct ec_response_get_cmd_versions));
306 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data));
308 data = (struct ec_params_get_cmd_versions *)mock->i_data;
309 KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_GET_NEXT_EVENT);
311 KUNIT_EXPECT_EQ(test, ec_dev->mkbp_event_supported, 7);
314 /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
316 struct ec_params_get_cmd_versions *data;
318 mock = cros_kunit_ec_xfer_mock_next();
319 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
321 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
322 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
323 KUNIT_EXPECT_EQ(test, mock->msg.insize,
324 sizeof(struct ec_response_get_cmd_versions));
325 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data));
327 data = (struct ec_params_get_cmd_versions *)mock->i_data;
328 KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_HOST_SLEEP_EVENT);
330 KUNIT_EXPECT_TRUE(test, ec_dev->host_sleep_v1);
333 /* For cros_ec_get_host_event_wake_mask(). */
335 mock = cros_kunit_ec_xfer_mock_next();
336 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
338 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
339 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HOST_EVENT_GET_WAKE_MASK);
340 KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_host_event_mask));
341 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
343 KUNIT_EXPECT_EQ(test, ec_dev->host_event_wake_mask, 0xbeef);
347 static void cros_ec_proto_test_query_all_no_pd_return_error(struct kunit *test)
349 struct cros_ec_proto_test_priv *priv = test->priv;
350 struct cros_ec_device *ec_dev = &priv->ec_dev;
351 struct ec_xfer_mock *mock;
354 /* Set some garbage bytes. */
355 ec_dev->max_passthru = 0xbf;
357 /* For cros_ec_get_proto_info() without passthru. */
359 struct ec_response_get_protocol_info *data;
361 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
362 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
365 * Although it doesn't check the value, provides valid sizes so that
366 * cros_ec_query_all() allocates din and dout correctly.
368 data = (struct ec_response_get_protocol_info *)mock->o_data;
369 data->max_request_packet_size = 0xbe;
370 data->max_response_packet_size = 0xef;
373 /* For cros_ec_get_proto_info() with passthru. */
375 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
376 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
379 cros_ec_proto_test_query_all_pretest(test);
380 ret = cros_ec_query_all(ec_dev);
381 KUNIT_EXPECT_EQ(test, ret, 0);
383 /* For cros_ec_get_proto_info() without passthru. */
385 mock = cros_kunit_ec_xfer_mock_next();
386 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
388 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
389 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
390 KUNIT_EXPECT_EQ(test, mock->msg.insize,
391 sizeof(struct ec_response_get_protocol_info));
392 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
395 /* For cros_ec_get_proto_info() with passthru. */
397 mock = cros_kunit_ec_xfer_mock_next();
398 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
400 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
401 KUNIT_EXPECT_EQ(test, mock->msg.command,
402 EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) |
403 EC_CMD_GET_PROTOCOL_INFO);
404 KUNIT_EXPECT_EQ(test, mock->msg.insize,
405 sizeof(struct ec_response_get_protocol_info));
406 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
408 KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0);
412 static void cros_ec_proto_test_query_all_no_pd_return0(struct kunit *test)
414 struct cros_ec_proto_test_priv *priv = test->priv;
415 struct cros_ec_device *ec_dev = &priv->ec_dev;
416 struct ec_xfer_mock *mock;
419 /* Set some garbage bytes. */
420 ec_dev->max_passthru = 0xbf;
422 /* For cros_ec_get_proto_info() without passthru. */
424 struct ec_response_get_protocol_info *data;
426 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
427 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
430 * Although it doesn't check the value, provides valid sizes so that
431 * cros_ec_query_all() allocates din and dout correctly.
433 data = (struct ec_response_get_protocol_info *)mock->o_data;
434 data->max_request_packet_size = 0xbe;
435 data->max_response_packet_size = 0xef;
438 /* For cros_ec_get_proto_info() with passthru. */
440 mock = cros_kunit_ec_xfer_mock_add(test, 0);
441 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
444 cros_ec_proto_test_query_all_pretest(test);
445 ret = cros_ec_query_all(ec_dev);
446 KUNIT_EXPECT_EQ(test, ret, 0);
448 /* For cros_ec_get_proto_info() without passthru. */
450 mock = cros_kunit_ec_xfer_mock_next();
451 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
453 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
454 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
455 KUNIT_EXPECT_EQ(test, mock->msg.insize,
456 sizeof(struct ec_response_get_protocol_info));
457 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
460 /* For cros_ec_get_proto_info() with passthru. */
462 mock = cros_kunit_ec_xfer_mock_next();
463 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
465 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
466 KUNIT_EXPECT_EQ(test, mock->msg.command,
467 EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) |
468 EC_CMD_GET_PROTOCOL_INFO);
469 KUNIT_EXPECT_EQ(test, mock->msg.insize,
470 sizeof(struct ec_response_get_protocol_info));
471 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
473 KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0);
477 static void cros_ec_proto_test_query_all_legacy_normal_v3_return_error(struct kunit *test)
479 struct cros_ec_proto_test_priv *priv = test->priv;
480 struct cros_ec_device *ec_dev = &priv->ec_dev;
481 struct ec_xfer_mock *mock;
484 /* For cros_ec_get_proto_info() without passthru. */
486 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
487 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
490 /* For cros_ec_get_proto_info_legacy(). */
492 struct ec_response_hello *data;
494 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
495 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
497 data = (struct ec_response_hello *)mock->o_data;
498 data->out_data = 0xa1b2c3d4;
501 cros_ec_proto_test_query_all_pretest(test);
502 ret = cros_ec_query_all(ec_dev);
503 KUNIT_EXPECT_EQ(test, ret, 0);
505 /* For cros_ec_get_proto_info() without passthru. */
507 mock = cros_kunit_ec_xfer_mock_next();
508 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
510 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
511 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
512 KUNIT_EXPECT_EQ(test, mock->msg.insize,
513 sizeof(struct ec_response_get_protocol_info));
514 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
517 /* For cros_ec_get_proto_info_legacy(). */
519 struct ec_params_hello *data;
521 mock = cros_kunit_ec_xfer_mock_next();
522 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
524 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
525 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO);
526 KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello));
527 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data));
529 data = (struct ec_params_hello *)mock->i_data;
530 KUNIT_EXPECT_EQ(test, data->in_data, 0xa0b0c0d0);
532 KUNIT_EXPECT_EQ(test, ec_dev->proto_version, 2);
533 KUNIT_EXPECT_EQ(test, ec_dev->max_request, EC_PROTO2_MAX_PARAM_SIZE);
534 KUNIT_EXPECT_EQ(test, ec_dev->max_response, EC_PROTO2_MAX_PARAM_SIZE);
535 KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0);
536 KUNIT_EXPECT_PTR_EQ(test, ec_dev->pkt_xfer, NULL);
537 KUNIT_EXPECT_EQ(test, ec_dev->din_size, EC_PROTO2_MSG_BYTES);
538 KUNIT_EXPECT_EQ(test, ec_dev->dout_size, EC_PROTO2_MSG_BYTES);
542 static void cros_ec_proto_test_query_all_legacy_normal_v3_return0(struct kunit *test)
544 struct cros_ec_proto_test_priv *priv = test->priv;
545 struct cros_ec_device *ec_dev = &priv->ec_dev;
546 struct ec_xfer_mock *mock;
549 /* For cros_ec_get_proto_info() without passthru. */
551 mock = cros_kunit_ec_xfer_mock_add(test, 0);
552 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
555 /* For cros_ec_get_proto_info_legacy(). */
557 struct ec_response_hello *data;
559 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
560 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
562 data = (struct ec_response_hello *)mock->o_data;
563 data->out_data = 0xa1b2c3d4;
566 cros_ec_proto_test_query_all_pretest(test);
567 ret = cros_ec_query_all(ec_dev);
568 KUNIT_EXPECT_EQ(test, ret, 0);
570 /* For cros_ec_get_proto_info() without passthru. */
572 mock = cros_kunit_ec_xfer_mock_next();
573 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
575 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
576 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
577 KUNIT_EXPECT_EQ(test, mock->msg.insize,
578 sizeof(struct ec_response_get_protocol_info));
579 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
582 /* For cros_ec_get_proto_info_legacy(). */
584 struct ec_params_hello *data;
586 mock = cros_kunit_ec_xfer_mock_next();
587 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
589 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
590 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO);
591 KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello));
592 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data));
594 data = (struct ec_params_hello *)mock->i_data;
595 KUNIT_EXPECT_EQ(test, data->in_data, 0xa0b0c0d0);
597 KUNIT_EXPECT_EQ(test, ec_dev->proto_version, 2);
598 KUNIT_EXPECT_EQ(test, ec_dev->max_request, EC_PROTO2_MAX_PARAM_SIZE);
599 KUNIT_EXPECT_EQ(test, ec_dev->max_response, EC_PROTO2_MAX_PARAM_SIZE);
600 KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0);
601 KUNIT_EXPECT_PTR_EQ(test, ec_dev->pkt_xfer, NULL);
602 KUNIT_EXPECT_EQ(test, ec_dev->din_size, EC_PROTO2_MSG_BYTES);
603 KUNIT_EXPECT_EQ(test, ec_dev->dout_size, EC_PROTO2_MSG_BYTES);
607 static void cros_ec_proto_test_query_all_legacy_xfer_error(struct kunit *test)
609 struct cros_ec_proto_test_priv *priv = test->priv;
610 struct cros_ec_device *ec_dev = &priv->ec_dev;
611 struct ec_xfer_mock *mock;
614 /* For cros_ec_get_proto_info() without passthru. */
616 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
617 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
620 /* For cros_ec_get_proto_info_legacy(). */
622 mock = cros_kunit_ec_xfer_mock_addx(test, -EIO, EC_RES_SUCCESS, 0);
623 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
626 cros_ec_proto_test_query_all_pretest(test);
627 ret = cros_ec_query_all(ec_dev);
628 KUNIT_EXPECT_EQ(test, ret, -EIO);
629 KUNIT_EXPECT_EQ(test, ec_dev->proto_version, EC_PROTO_VERSION_UNKNOWN);
631 /* For cros_ec_get_proto_info() without passthru. */
633 mock = cros_kunit_ec_xfer_mock_next();
634 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
636 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
637 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
638 KUNIT_EXPECT_EQ(test, mock->msg.insize,
639 sizeof(struct ec_response_get_protocol_info));
640 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
643 /* For cros_ec_get_proto_info_legacy(). */
645 mock = cros_kunit_ec_xfer_mock_next();
646 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
648 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
649 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO);
650 KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello));
651 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_hello));
655 static void cros_ec_proto_test_query_all_legacy_return_error(struct kunit *test)
657 struct cros_ec_proto_test_priv *priv = test->priv;
658 struct cros_ec_device *ec_dev = &priv->ec_dev;
659 struct ec_xfer_mock *mock;
662 /* For cros_ec_get_proto_info() without passthru. */
664 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
665 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
668 /* For cros_ec_get_proto_info_legacy(). */
670 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
671 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
674 cros_ec_proto_test_query_all_pretest(test);
675 ret = cros_ec_query_all(ec_dev);
676 KUNIT_EXPECT_EQ(test, ret, -EOPNOTSUPP);
677 KUNIT_EXPECT_EQ(test, ec_dev->proto_version, EC_PROTO_VERSION_UNKNOWN);
679 /* For cros_ec_get_proto_info() without passthru. */
681 mock = cros_kunit_ec_xfer_mock_next();
682 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
684 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
685 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
686 KUNIT_EXPECT_EQ(test, mock->msg.insize,
687 sizeof(struct ec_response_get_protocol_info));
688 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
691 /* For cros_ec_get_proto_info_legacy(). */
693 mock = cros_kunit_ec_xfer_mock_next();
694 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
696 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
697 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO);
698 KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello));
699 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_hello));
703 static void cros_ec_proto_test_query_all_legacy_data_error(struct kunit *test)
705 struct cros_ec_proto_test_priv *priv = test->priv;
706 struct cros_ec_device *ec_dev = &priv->ec_dev;
707 struct ec_xfer_mock *mock;
710 /* For cros_ec_get_proto_info() without passthru. */
712 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
713 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
716 /* For cros_ec_get_proto_info_legacy(). */
718 struct ec_response_hello *data;
720 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
721 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
723 data = (struct ec_response_hello *)mock->o_data;
724 data->out_data = 0xbeefbfbf;
727 cros_ec_proto_test_query_all_pretest(test);
728 ret = cros_ec_query_all(ec_dev);
729 KUNIT_EXPECT_EQ(test, ret, -EBADMSG);
730 KUNIT_EXPECT_EQ(test, ec_dev->proto_version, EC_PROTO_VERSION_UNKNOWN);
732 /* For cros_ec_get_proto_info() without passthru. */
734 mock = cros_kunit_ec_xfer_mock_next();
735 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
737 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
738 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
739 KUNIT_EXPECT_EQ(test, mock->msg.insize,
740 sizeof(struct ec_response_get_protocol_info));
741 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
744 /* For cros_ec_get_proto_info_legacy(). */
746 mock = cros_kunit_ec_xfer_mock_next();
747 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
749 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
750 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO);
751 KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello));
752 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_hello));
756 static void cros_ec_proto_test_query_all_legacy_return0(struct kunit *test)
758 struct cros_ec_proto_test_priv *priv = test->priv;
759 struct cros_ec_device *ec_dev = &priv->ec_dev;
760 struct ec_xfer_mock *mock;
763 /* For cros_ec_get_proto_info() without passthru. */
765 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
766 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
769 /* For cros_ec_get_proto_info_legacy(). */
771 mock = cros_kunit_ec_xfer_mock_add(test, 0);
772 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
775 cros_ec_proto_test_query_all_pretest(test);
776 ret = cros_ec_query_all(ec_dev);
777 KUNIT_EXPECT_EQ(test, ret, -EPROTO);
778 KUNIT_EXPECT_EQ(test, ec_dev->proto_version, EC_PROTO_VERSION_UNKNOWN);
780 /* For cros_ec_get_proto_info() without passthru. */
782 mock = cros_kunit_ec_xfer_mock_next();
783 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
785 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
786 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
787 KUNIT_EXPECT_EQ(test, mock->msg.insize,
788 sizeof(struct ec_response_get_protocol_info));
789 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
792 /* For cros_ec_get_proto_info_legacy(). */
794 mock = cros_kunit_ec_xfer_mock_next();
795 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
797 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
798 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO);
799 KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello));
800 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_hello));
804 static void cros_ec_proto_test_query_all_no_mkbp(struct kunit *test)
806 struct cros_ec_proto_test_priv *priv = test->priv;
807 struct cros_ec_device *ec_dev = &priv->ec_dev;
808 struct ec_xfer_mock *mock;
811 /* Set some garbage bytes. */
812 ec_dev->mkbp_event_supported = 0xbf;
814 /* For cros_ec_get_proto_info() without passthru. */
816 struct ec_response_get_protocol_info *data;
818 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
819 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
822 * Although it doesn't check the value, provides valid sizes so that
823 * cros_ec_query_all() allocates din and dout correctly.
825 data = (struct ec_response_get_protocol_info *)mock->o_data;
826 data->max_request_packet_size = 0xbe;
827 data->max_response_packet_size = 0xef;
830 /* For cros_ec_get_proto_info() with passthru. */
832 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
833 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
836 /* For cros_ec_get_host_command_version_mask() for MKBP. */
838 struct ec_response_get_cmd_versions *data;
840 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
841 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
843 data = (struct ec_response_get_cmd_versions *)mock->o_data;
844 data->version_mask = 0;
847 cros_ec_proto_test_query_all_pretest(test);
848 ret = cros_ec_query_all(ec_dev);
849 KUNIT_EXPECT_EQ(test, ret, 0);
851 /* For cros_ec_get_proto_info() without passthru. */
853 mock = cros_kunit_ec_xfer_mock_next();
854 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
856 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
857 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
858 KUNIT_EXPECT_EQ(test, mock->msg.insize,
859 sizeof(struct ec_response_get_protocol_info));
860 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
863 /* For cros_ec_get_proto_info() with passthru. */
865 mock = cros_kunit_ec_xfer_mock_next();
866 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
868 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
869 KUNIT_EXPECT_EQ(test, mock->msg.command,
870 EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) |
871 EC_CMD_GET_PROTOCOL_INFO);
872 KUNIT_EXPECT_EQ(test, mock->msg.insize,
873 sizeof(struct ec_response_get_protocol_info));
874 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
877 /* For cros_ec_get_host_command_version_mask() for MKBP. */
879 struct ec_params_get_cmd_versions *data;
881 mock = cros_kunit_ec_xfer_mock_next();
882 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
884 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
885 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
886 KUNIT_EXPECT_EQ(test, mock->msg.insize,
887 sizeof(struct ec_response_get_cmd_versions));
888 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data));
890 data = (struct ec_params_get_cmd_versions *)mock->i_data;
891 KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_GET_NEXT_EVENT);
893 KUNIT_EXPECT_EQ(test, ec_dev->mkbp_event_supported, 0);
897 static void cros_ec_proto_test_query_all_no_mkbp_return_error(struct kunit *test)
899 struct cros_ec_proto_test_priv *priv = test->priv;
900 struct cros_ec_device *ec_dev = &priv->ec_dev;
901 struct ec_xfer_mock *mock;
904 /* Set some garbage bytes. */
905 ec_dev->mkbp_event_supported = 0xbf;
907 /* For cros_ec_get_proto_info() without passthru. */
909 struct ec_response_get_protocol_info *data;
911 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
912 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
915 * Although it doesn't check the value, provides valid sizes so that
916 * cros_ec_query_all() allocates din and dout correctly.
918 data = (struct ec_response_get_protocol_info *)mock->o_data;
919 data->max_request_packet_size = 0xbe;
920 data->max_response_packet_size = 0xef;
923 /* For cros_ec_get_proto_info() with passthru. */
925 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
926 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
929 /* For cros_ec_get_host_command_version_mask() for MKBP. */
931 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
932 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
935 cros_ec_proto_test_query_all_pretest(test);
936 ret = cros_ec_query_all(ec_dev);
937 KUNIT_EXPECT_EQ(test, ret, 0);
939 /* For cros_ec_get_proto_info() without passthru. */
941 mock = cros_kunit_ec_xfer_mock_next();
942 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
944 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
945 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
946 KUNIT_EXPECT_EQ(test, mock->msg.insize,
947 sizeof(struct ec_response_get_protocol_info));
948 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
951 /* For cros_ec_get_proto_info() with passthru. */
953 mock = cros_kunit_ec_xfer_mock_next();
954 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
956 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
957 KUNIT_EXPECT_EQ(test, mock->msg.command,
958 EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) |
959 EC_CMD_GET_PROTOCOL_INFO);
960 KUNIT_EXPECT_EQ(test, mock->msg.insize,
961 sizeof(struct ec_response_get_protocol_info));
962 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
965 /* For cros_ec_get_host_command_version_mask() for MKBP. */
967 struct ec_params_get_cmd_versions *data;
969 mock = cros_kunit_ec_xfer_mock_next();
970 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
972 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
973 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
974 KUNIT_EXPECT_EQ(test, mock->msg.insize,
975 sizeof(struct ec_response_get_cmd_versions));
976 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data));
978 data = (struct ec_params_get_cmd_versions *)mock->i_data;
979 KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_GET_NEXT_EVENT);
981 KUNIT_EXPECT_EQ(test, ec_dev->mkbp_event_supported, 0);
985 static void cros_ec_proto_test_query_all_no_mkbp_return0(struct kunit *test)
987 struct cros_ec_proto_test_priv *priv = test->priv;
988 struct cros_ec_device *ec_dev = &priv->ec_dev;
989 struct ec_xfer_mock *mock;
992 /* Set some garbage bytes. */
993 ec_dev->mkbp_event_supported = 0xbf;
995 /* For cros_ec_get_proto_info() without passthru. */
997 struct ec_response_get_protocol_info *data;
999 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
1000 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1003 * Although it doesn't check the value, provides valid sizes so that
1004 * cros_ec_query_all() allocates din and dout correctly.
1006 data = (struct ec_response_get_protocol_info *)mock->o_data;
1007 data->max_request_packet_size = 0xbe;
1008 data->max_response_packet_size = 0xef;
1011 /* For cros_ec_get_proto_info() with passthru. */
1013 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
1014 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1017 /* For cros_ec_get_host_command_version_mask() for MKBP. */
1019 mock = cros_kunit_ec_xfer_mock_add(test, 0);
1020 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1023 cros_ec_proto_test_query_all_pretest(test);
1024 ret = cros_ec_query_all(ec_dev);
1025 KUNIT_EXPECT_EQ(test, ret, 0);
1027 /* For cros_ec_get_proto_info() without passthru. */
1029 mock = cros_kunit_ec_xfer_mock_next();
1030 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
1032 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
1033 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
1034 KUNIT_EXPECT_EQ(test, mock->msg.insize,
1035 sizeof(struct ec_response_get_protocol_info));
1036 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
1039 /* For cros_ec_get_proto_info() with passthru. */
1041 mock = cros_kunit_ec_xfer_mock_next();
1042 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
1044 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
1045 KUNIT_EXPECT_EQ(test, mock->msg.command,
1046 EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) |
1047 EC_CMD_GET_PROTOCOL_INFO);
1048 KUNIT_EXPECT_EQ(test, mock->msg.insize,
1049 sizeof(struct ec_response_get_protocol_info));
1050 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
1053 /* For cros_ec_get_host_command_version_mask() for MKBP. */
1055 struct ec_params_get_cmd_versions *data;
1057 mock = cros_kunit_ec_xfer_mock_next();
1058 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
1060 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
1061 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
1062 KUNIT_EXPECT_EQ(test, mock->msg.insize,
1063 sizeof(struct ec_response_get_cmd_versions));
1064 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data));
1066 data = (struct ec_params_get_cmd_versions *)mock->i_data;
1067 KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_GET_NEXT_EVENT);
1069 KUNIT_EXPECT_EQ(test, ec_dev->mkbp_event_supported, 0);
1073 static void cros_ec_proto_test_query_all_no_host_sleep(struct kunit *test)
1075 struct cros_ec_proto_test_priv *priv = test->priv;
1076 struct cros_ec_device *ec_dev = &priv->ec_dev;
1077 struct ec_xfer_mock *mock;
1080 /* Set some garbage bytes. */
1081 ec_dev->host_sleep_v1 = true;
1083 /* For cros_ec_get_proto_info() without passthru. */
1085 struct ec_response_get_protocol_info *data;
1087 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
1088 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1091 * Although it doesn't check the value, provides valid sizes so that
1092 * cros_ec_query_all() allocates din and dout correctly.
1094 data = (struct ec_response_get_protocol_info *)mock->o_data;
1095 data->max_request_packet_size = 0xbe;
1096 data->max_response_packet_size = 0xef;
1099 /* For cros_ec_get_proto_info() with passthru. */
1101 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
1102 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1105 /* For cros_ec_get_host_command_version_mask() for MKBP. */
1107 mock = cros_kunit_ec_xfer_mock_add(test, 0);
1108 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1111 /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
1113 struct ec_response_get_cmd_versions *data;
1115 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
1116 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1118 data = (struct ec_response_get_cmd_versions *)mock->o_data;
1119 data->version_mask = 0;
1122 cros_ec_proto_test_query_all_pretest(test);
1123 ret = cros_ec_query_all(ec_dev);
1124 KUNIT_EXPECT_EQ(test, ret, 0);
1126 /* For cros_ec_get_proto_info() without passthru. */
1128 mock = cros_kunit_ec_xfer_mock_next();
1129 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
1131 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
1132 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
1133 KUNIT_EXPECT_EQ(test, mock->msg.insize,
1134 sizeof(struct ec_response_get_protocol_info));
1135 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
1138 /* For cros_ec_get_proto_info() with passthru. */
1140 mock = cros_kunit_ec_xfer_mock_next();
1141 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
1143 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
1144 KUNIT_EXPECT_EQ(test, mock->msg.command,
1145 EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) |
1146 EC_CMD_GET_PROTOCOL_INFO);
1147 KUNIT_EXPECT_EQ(test, mock->msg.insize,
1148 sizeof(struct ec_response_get_protocol_info));
1149 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
1152 /* For cros_ec_get_host_command_version_mask() for MKBP. */
1154 mock = cros_kunit_ec_xfer_mock_next();
1155 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
1157 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
1158 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
1159 KUNIT_EXPECT_EQ(test, mock->msg.insize,
1160 sizeof(struct ec_response_get_cmd_versions));
1161 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions));
1164 /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
1166 mock = cros_kunit_ec_xfer_mock_next();
1167 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
1169 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
1170 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
1171 KUNIT_EXPECT_EQ(test, mock->msg.insize,
1172 sizeof(struct ec_response_get_cmd_versions));
1173 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions));
1175 KUNIT_EXPECT_FALSE(test, ec_dev->host_sleep_v1);
1179 static void cros_ec_proto_test_query_all_no_host_sleep_return0(struct kunit *test)
1181 struct cros_ec_proto_test_priv *priv = test->priv;
1182 struct cros_ec_device *ec_dev = &priv->ec_dev;
1183 struct ec_xfer_mock *mock;
1186 /* Set some garbage bytes. */
1187 ec_dev->host_sleep_v1 = true;
1189 /* For cros_ec_get_proto_info() without passthru. */
1191 struct ec_response_get_protocol_info *data;
1193 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
1194 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1197 * Although it doesn't check the value, provides valid sizes so that
1198 * cros_ec_query_all() allocates din and dout correctly.
1200 data = (struct ec_response_get_protocol_info *)mock->o_data;
1201 data->max_request_packet_size = 0xbe;
1202 data->max_response_packet_size = 0xef;
1205 /* For cros_ec_get_proto_info() with passthru. */
1207 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
1208 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1211 /* For cros_ec_get_host_command_version_mask() for MKBP. */
1213 struct ec_response_get_cmd_versions *data;
1215 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
1216 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1218 /* In order to pollute next cros_ec_get_host_command_version_mask(). */
1219 data = (struct ec_response_get_cmd_versions *)mock->o_data;
1220 data->version_mask = 0xbeef;
1223 /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
1225 mock = cros_kunit_ec_xfer_mock_add(test, 0);
1226 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1229 cros_ec_proto_test_query_all_pretest(test);
1230 ret = cros_ec_query_all(ec_dev);
1231 KUNIT_EXPECT_EQ(test, ret, 0);
1233 /* For cros_ec_get_proto_info() without passthru. */
1235 mock = cros_kunit_ec_xfer_mock_next();
1236 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
1238 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
1239 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
1240 KUNIT_EXPECT_EQ(test, mock->msg.insize,
1241 sizeof(struct ec_response_get_protocol_info));
1242 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
1245 /* For cros_ec_get_proto_info() with passthru. */
1247 mock = cros_kunit_ec_xfer_mock_next();
1248 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
1250 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
1251 KUNIT_EXPECT_EQ(test, mock->msg.command,
1252 EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) |
1253 EC_CMD_GET_PROTOCOL_INFO);
1254 KUNIT_EXPECT_EQ(test, mock->msg.insize,
1255 sizeof(struct ec_response_get_protocol_info));
1256 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
1259 /* For cros_ec_get_host_command_version_mask() for MKBP. */
1261 mock = cros_kunit_ec_xfer_mock_next();
1262 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
1264 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
1265 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
1266 KUNIT_EXPECT_EQ(test, mock->msg.insize,
1267 sizeof(struct ec_response_get_cmd_versions));
1268 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions));
1271 /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
1273 mock = cros_kunit_ec_xfer_mock_next();
1274 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
1276 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
1277 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
1278 KUNIT_EXPECT_EQ(test, mock->msg.insize,
1279 sizeof(struct ec_response_get_cmd_versions));
1280 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions));
1282 KUNIT_EXPECT_FALSE(test, ec_dev->host_sleep_v1);
1286 static void cros_ec_proto_test_query_all_default_wake_mask_return_error(struct kunit *test)
1288 struct cros_ec_proto_test_priv *priv = test->priv;
1289 struct cros_ec_device *ec_dev = &priv->ec_dev;
1290 struct ec_xfer_mock *mock;
1293 /* Set some garbage bytes. */
1294 ec_dev->host_event_wake_mask = U32_MAX;
1296 /* For cros_ec_get_proto_info() without passthru. */
1298 struct ec_response_get_protocol_info *data;
1300 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
1301 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1304 * Although it doesn't check the value, provides valid sizes so that
1305 * cros_ec_query_all() allocates din and dout correctly.
1307 data = (struct ec_response_get_protocol_info *)mock->o_data;
1308 data->max_request_packet_size = 0xbe;
1309 data->max_response_packet_size = 0xef;
1312 /* For cros_ec_get_proto_info() with passthru. */
1314 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
1315 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1318 /* For cros_ec_get_host_command_version_mask() for MKBP. */
1320 mock = cros_kunit_ec_xfer_mock_add(test, 0);
1321 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1324 /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
1326 mock = cros_kunit_ec_xfer_mock_add(test, 0);
1327 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1330 /* For cros_ec_get_host_event_wake_mask(). */
1332 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
1333 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1336 cros_ec_proto_test_query_all_pretest(test);
1337 ret = cros_ec_query_all(ec_dev);
1338 KUNIT_EXPECT_EQ(test, ret, 0);
1340 /* For cros_ec_get_proto_info() without passthru. */
1342 mock = cros_kunit_ec_xfer_mock_next();
1343 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
1345 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
1346 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
1347 KUNIT_EXPECT_EQ(test, mock->msg.insize,
1348 sizeof(struct ec_response_get_protocol_info));
1349 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
1352 /* For cros_ec_get_proto_info() with passthru. */
1354 mock = cros_kunit_ec_xfer_mock_next();
1355 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
1357 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
1358 KUNIT_EXPECT_EQ(test, mock->msg.command,
1359 EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) |
1360 EC_CMD_GET_PROTOCOL_INFO);
1361 KUNIT_EXPECT_EQ(test, mock->msg.insize,
1362 sizeof(struct ec_response_get_protocol_info));
1363 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
1366 /* For cros_ec_get_host_command_version_mask() for MKBP. */
1368 mock = cros_kunit_ec_xfer_mock_next();
1369 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
1371 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
1372 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
1373 KUNIT_EXPECT_EQ(test, mock->msg.insize,
1374 sizeof(struct ec_response_get_cmd_versions));
1375 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions));
1378 /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
1380 mock = cros_kunit_ec_xfer_mock_next();
1381 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
1383 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
1384 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
1385 KUNIT_EXPECT_EQ(test, mock->msg.insize,
1386 sizeof(struct ec_response_get_cmd_versions));
1387 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions));
1390 /* For cros_ec_get_host_event_wake_mask(). */
1394 mock = cros_kunit_ec_xfer_mock_next();
1395 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
1397 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
1398 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HOST_EVENT_GET_WAKE_MASK);
1399 KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_host_event_mask));
1400 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
1402 mask = ec_dev->host_event_wake_mask;
1403 KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_LID_CLOSED), 0);
1404 KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_AC_DISCONNECTED), 0);
1405 KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_LOW), 0);
1406 KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_CRITICAL), 0);
1407 KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY), 0);
1408 KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_PD_MCU), 0);
1409 KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_STATUS), 0);
1413 static void cros_ec_proto_test_query_all_default_wake_mask_return0(struct kunit *test)
1415 struct cros_ec_proto_test_priv *priv = test->priv;
1416 struct cros_ec_device *ec_dev = &priv->ec_dev;
1417 struct ec_xfer_mock *mock;
1420 /* Set some garbage bytes. */
1421 ec_dev->host_event_wake_mask = U32_MAX;
1423 /* For cros_ec_get_proto_info() without passthru. */
1425 struct ec_response_get_protocol_info *data;
1427 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
1428 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1431 * Although it doesn't check the value, provides valid sizes so that
1432 * cros_ec_query_all() allocates din and dout correctly.
1434 data = (struct ec_response_get_protocol_info *)mock->o_data;
1435 data->max_request_packet_size = 0xbe;
1436 data->max_response_packet_size = 0xef;
1439 /* For cros_ec_get_proto_info() with passthru. */
1441 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
1442 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1445 /* For cros_ec_get_host_command_version_mask() for MKBP. */
1447 mock = cros_kunit_ec_xfer_mock_add(test, 0);
1448 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1451 /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
1453 mock = cros_kunit_ec_xfer_mock_add(test, 0);
1454 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1457 /* For get_host_event_wake_mask(). */
1459 mock = cros_kunit_ec_xfer_mock_add(test, 0);
1460 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1463 cros_ec_proto_test_query_all_pretest(test);
1464 ret = cros_ec_query_all(ec_dev);
1465 KUNIT_EXPECT_EQ(test, ret, 0);
1467 /* For cros_ec_get_proto_info() without passthru. */
1469 mock = cros_kunit_ec_xfer_mock_next();
1470 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
1472 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
1473 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
1474 KUNIT_EXPECT_EQ(test, mock->msg.insize,
1475 sizeof(struct ec_response_get_protocol_info));
1476 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
1479 /* For cros_ec_get_proto_info() with passthru. */
1481 mock = cros_kunit_ec_xfer_mock_next();
1482 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
1484 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
1485 KUNIT_EXPECT_EQ(test, mock->msg.command,
1486 EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) |
1487 EC_CMD_GET_PROTOCOL_INFO);
1488 KUNIT_EXPECT_EQ(test, mock->msg.insize,
1489 sizeof(struct ec_response_get_protocol_info));
1490 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
1493 /* For cros_ec_get_host_command_version_mask() for MKBP. */
1495 mock = cros_kunit_ec_xfer_mock_next();
1496 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
1498 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
1499 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
1500 KUNIT_EXPECT_EQ(test, mock->msg.insize,
1501 sizeof(struct ec_response_get_cmd_versions));
1502 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions));
1505 /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
1507 mock = cros_kunit_ec_xfer_mock_next();
1508 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
1510 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
1511 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
1512 KUNIT_EXPECT_EQ(test, mock->msg.insize,
1513 sizeof(struct ec_response_get_cmd_versions));
1514 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions));
1517 /* For get_host_event_wake_mask(). */
1521 mock = cros_kunit_ec_xfer_mock_next();
1522 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
1524 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
1525 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HOST_EVENT_GET_WAKE_MASK);
1526 KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_host_event_mask));
1527 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
1529 mask = ec_dev->host_event_wake_mask;
1530 KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_LID_CLOSED), 0);
1531 KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_AC_DISCONNECTED), 0);
1532 KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_LOW), 0);
1533 KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_CRITICAL), 0);
1534 KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY), 0);
1535 KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_PD_MCU), 0);
1536 KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_STATUS), 0);
1540 static void cros_ec_proto_test_cmd_xfer_normal(struct kunit *test)
1542 struct cros_ec_proto_test_priv *priv = test->priv;
1543 struct cros_ec_device *ec_dev = &priv->ec_dev;
1544 struct ec_xfer_mock *mock;
1547 struct cros_ec_command msg;
1551 ec_dev->max_request = 0xff;
1552 ec_dev->max_response = 0xee;
1553 ec_dev->max_passthru = 0xdd;
1555 buf.msg.version = 0;
1556 buf.msg.command = EC_CMD_HELLO;
1558 buf.msg.outsize = 2;
1565 mock = cros_kunit_ec_xfer_mock_add(test, 4);
1566 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1568 data = (u8 *)mock->o_data;
1575 ret = cros_ec_cmd_xfer(ec_dev, &buf.msg);
1576 KUNIT_EXPECT_EQ(test, ret, 4);
1581 mock = cros_kunit_ec_xfer_mock_next();
1582 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
1584 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
1585 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO);
1586 KUNIT_EXPECT_EQ(test, mock->msg.insize, 4);
1587 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 2);
1589 data = (u8 *)mock->i_data;
1590 KUNIT_EXPECT_EQ(test, data[0], 0x55);
1591 KUNIT_EXPECT_EQ(test, data[1], 0xaa);
1593 KUNIT_EXPECT_EQ(test, buf.data[0], 0xaa);
1594 KUNIT_EXPECT_EQ(test, buf.data[1], 0x55);
1595 KUNIT_EXPECT_EQ(test, buf.data[2], 0xcc);
1596 KUNIT_EXPECT_EQ(test, buf.data[3], 0x33);
1600 static void cros_ec_proto_test_cmd_xfer_excess_msg_insize(struct kunit *test)
1602 struct cros_ec_proto_test_priv *priv = test->priv;
1603 struct cros_ec_device *ec_dev = &priv->ec_dev;
1604 struct ec_xfer_mock *mock;
1607 struct cros_ec_command msg;
1611 ec_dev->max_request = 0xff;
1612 ec_dev->max_response = 0xee;
1613 ec_dev->max_passthru = 0xdd;
1615 buf.msg.version = 0;
1616 buf.msg.command = EC_CMD_HELLO;
1617 buf.msg.insize = 0xee + 1;
1618 buf.msg.outsize = 2;
1621 mock = cros_kunit_ec_xfer_mock_add(test, 0xcc);
1622 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1625 ret = cros_ec_cmd_xfer(ec_dev, &buf.msg);
1626 KUNIT_EXPECT_EQ(test, ret, 0xcc);
1629 mock = cros_kunit_ec_xfer_mock_next();
1630 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
1632 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
1633 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO);
1634 KUNIT_EXPECT_EQ(test, mock->msg.insize, 0xee);
1635 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 2);
1639 static void cros_ec_proto_test_cmd_xfer_excess_msg_outsize_without_passthru(struct kunit *test)
1641 struct cros_ec_proto_test_priv *priv = test->priv;
1642 struct cros_ec_device *ec_dev = &priv->ec_dev;
1645 struct cros_ec_command msg;
1649 ec_dev->max_request = 0xff;
1650 ec_dev->max_response = 0xee;
1651 ec_dev->max_passthru = 0xdd;
1653 buf.msg.version = 0;
1654 buf.msg.command = EC_CMD_HELLO;
1656 buf.msg.outsize = 0xff + 1;
1658 ret = cros_ec_cmd_xfer(ec_dev, &buf.msg);
1659 KUNIT_EXPECT_EQ(test, ret, -EMSGSIZE);
1662 static void cros_ec_proto_test_cmd_xfer_excess_msg_outsize_with_passthru(struct kunit *test)
1664 struct cros_ec_proto_test_priv *priv = test->priv;
1665 struct cros_ec_device *ec_dev = &priv->ec_dev;
1668 struct cros_ec_command msg;
1672 ec_dev->max_request = 0xff;
1673 ec_dev->max_response = 0xee;
1674 ec_dev->max_passthru = 0xdd;
1676 buf.msg.version = 0;
1677 buf.msg.command = EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) + EC_CMD_HELLO;
1679 buf.msg.outsize = 0xdd + 1;
1681 ret = cros_ec_cmd_xfer(ec_dev, &buf.msg);
1682 KUNIT_EXPECT_EQ(test, ret, -EMSGSIZE);
1685 static void cros_ec_proto_test_cmd_xfer_protocol_v3_normal(struct kunit *test)
1687 struct cros_ec_proto_test_priv *priv = test->priv;
1688 struct cros_ec_device *ec_dev = &priv->ec_dev;
1690 struct cros_ec_command msg;
1692 memset(&msg, 0, sizeof(msg));
1694 ec_dev->proto_version = 3;
1695 ec_dev->cmd_xfer = cros_kunit_ec_cmd_xfer_mock;
1696 ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock;
1698 ret = cros_ec_cmd_xfer(ec_dev, &msg);
1699 KUNIT_EXPECT_EQ(test, ret, 0);
1701 KUNIT_EXPECT_EQ(test, cros_kunit_ec_cmd_xfer_mock_called, 0);
1702 KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 1);
1705 static void cros_ec_proto_test_cmd_xfer_protocol_v3_no_op(struct kunit *test)
1707 struct cros_ec_proto_test_priv *priv = test->priv;
1708 struct cros_ec_device *ec_dev = &priv->ec_dev;
1710 struct cros_ec_command msg;
1712 memset(&msg, 0, sizeof(msg));
1714 ec_dev->proto_version = 3;
1715 ec_dev->cmd_xfer = cros_kunit_ec_cmd_xfer_mock;
1716 ec_dev->pkt_xfer = NULL;
1718 ret = cros_ec_cmd_xfer(ec_dev, &msg);
1719 KUNIT_EXPECT_EQ(test, ret, -EIO);
1722 static void cros_ec_proto_test_cmd_xfer_protocol_v2_normal(struct kunit *test)
1724 struct cros_ec_proto_test_priv *priv = test->priv;
1725 struct cros_ec_device *ec_dev = &priv->ec_dev;
1727 struct cros_ec_command msg;
1729 memset(&msg, 0, sizeof(msg));
1731 ec_dev->proto_version = 2;
1732 ec_dev->cmd_xfer = cros_kunit_ec_cmd_xfer_mock;
1733 ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock;
1735 ret = cros_ec_cmd_xfer(ec_dev, &msg);
1736 KUNIT_EXPECT_EQ(test, ret, 0);
1738 KUNIT_EXPECT_EQ(test, cros_kunit_ec_cmd_xfer_mock_called, 1);
1739 KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 0);
1742 static void cros_ec_proto_test_cmd_xfer_protocol_v2_no_op(struct kunit *test)
1744 struct cros_ec_proto_test_priv *priv = test->priv;
1745 struct cros_ec_device *ec_dev = &priv->ec_dev;
1747 struct cros_ec_command msg;
1749 memset(&msg, 0, sizeof(msg));
1751 ec_dev->proto_version = 2;
1752 ec_dev->cmd_xfer = NULL;
1753 ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock;
1755 ret = cros_ec_cmd_xfer(ec_dev, &msg);
1756 KUNIT_EXPECT_EQ(test, ret, -EIO);
1759 static void cros_ec_proto_test_cmd_xfer_in_progress_normal(struct kunit *test)
1761 struct cros_ec_proto_test_priv *priv = test->priv;
1762 struct cros_ec_device *ec_dev = &priv->ec_dev;
1763 struct ec_xfer_mock *mock;
1765 struct cros_ec_command msg;
1767 memset(&msg, 0, sizeof(msg));
1769 ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock;
1771 /* For the first host command to return EC_RES_IN_PROGRESS. */
1773 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0);
1774 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1777 /* For EC_CMD_GET_COMMS_STATUS. */
1779 struct ec_response_get_comms_status *data;
1781 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
1782 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1784 data = (struct ec_response_get_comms_status *)mock->o_data;
1788 ret = cros_ec_cmd_xfer(ec_dev, &msg);
1789 KUNIT_EXPECT_EQ(test, ret, sizeof(struct ec_response_get_comms_status));
1791 KUNIT_EXPECT_EQ(test, msg.result, EC_RES_SUCCESS);
1793 /* For the first host command to return EC_RES_IN_PROGRESS. */
1795 mock = cros_kunit_ec_xfer_mock_next();
1796 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
1799 /* For EC_CMD_GET_COMMS_STATUS. */
1801 mock = cros_kunit_ec_xfer_mock_next();
1802 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
1804 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
1805 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_COMMS_STATUS);
1806 KUNIT_EXPECT_EQ(test, mock->msg.insize,
1807 sizeof(struct ec_response_get_comms_status));
1808 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
1811 KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 2);
1814 static void cros_ec_proto_test_cmd_xfer_in_progress_retries_eagain(struct kunit *test)
1816 struct cros_ec_proto_test_priv *priv = test->priv;
1817 struct cros_ec_device *ec_dev = &priv->ec_dev;
1818 struct ec_xfer_mock *mock;
1820 struct cros_ec_command msg;
1822 memset(&msg, 0, sizeof(msg));
1824 ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock;
1826 /* For the first host command to return EC_RES_IN_PROGRESS. */
1828 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0);
1829 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1832 /* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */
1833 cros_kunit_ec_xfer_mock_default_ret = -EAGAIN;
1835 ret = cros_ec_cmd_xfer(ec_dev, &msg);
1836 KUNIT_EXPECT_EQ(test, ret, -EAGAIN);
1838 /* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */
1839 KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 51);
1842 static void cros_ec_proto_test_cmd_xfer_in_progress_retries_status_processing(struct kunit *test)
1844 struct cros_ec_proto_test_priv *priv = test->priv;
1845 struct cros_ec_device *ec_dev = &priv->ec_dev;
1846 struct ec_xfer_mock *mock;
1848 struct cros_ec_command msg;
1850 memset(&msg, 0, sizeof(msg));
1852 ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock;
1854 /* For the first host command to return EC_RES_IN_PROGRESS. */
1856 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0);
1857 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1860 /* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */
1862 struct ec_response_get_comms_status *data;
1865 for (i = 0; i < 50; ++i) {
1866 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
1867 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1869 data = (struct ec_response_get_comms_status *)mock->o_data;
1870 data->flags |= EC_COMMS_STATUS_PROCESSING;
1874 ret = cros_ec_cmd_xfer(ec_dev, &msg);
1875 KUNIT_EXPECT_EQ(test, ret, -EAGAIN);
1877 /* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */
1878 KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 51);
1881 static void cros_ec_proto_test_cmd_xfer_in_progress_xfer_error(struct kunit *test)
1883 struct cros_ec_proto_test_priv *priv = test->priv;
1884 struct cros_ec_device *ec_dev = &priv->ec_dev;
1885 struct ec_xfer_mock *mock;
1887 struct cros_ec_command msg;
1889 memset(&msg, 0, sizeof(msg));
1891 /* For the first host command to return EC_RES_IN_PROGRESS. */
1893 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0);
1894 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1897 /* For EC_CMD_GET_COMMS_STATUS. */
1899 mock = cros_kunit_ec_xfer_mock_addx(test, -EIO, EC_RES_SUCCESS, 0);
1900 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1903 ret = cros_ec_cmd_xfer(ec_dev, &msg);
1904 KUNIT_EXPECT_EQ(test, ret, -EIO);
1907 static void cros_ec_proto_test_cmd_xfer_in_progress_return_error(struct kunit *test)
1909 struct cros_ec_proto_test_priv *priv = test->priv;
1910 struct cros_ec_device *ec_dev = &priv->ec_dev;
1911 struct ec_xfer_mock *mock;
1913 struct cros_ec_command msg;
1915 memset(&msg, 0, sizeof(msg));
1917 ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock;
1919 /* For the first host command to return EC_RES_IN_PROGRESS. */
1921 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0);
1922 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1925 /* For EC_CMD_GET_COMMS_STATUS. */
1927 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
1928 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1931 ret = cros_ec_cmd_xfer(ec_dev, &msg);
1932 KUNIT_EXPECT_EQ(test, ret, 0);
1934 KUNIT_EXPECT_EQ(test, msg.result, EC_RES_INVALID_COMMAND);
1936 KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 2);
1939 static void cros_ec_proto_test_cmd_xfer_in_progress_return0(struct kunit *test)
1941 struct cros_ec_proto_test_priv *priv = test->priv;
1942 struct cros_ec_device *ec_dev = &priv->ec_dev;
1943 struct ec_xfer_mock *mock;
1945 struct cros_ec_command msg;
1947 memset(&msg, 0, sizeof(msg));
1949 ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock;
1951 /* For the first host command to return EC_RES_IN_PROGRESS. */
1953 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0);
1954 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1957 /* For EC_CMD_GET_COMMS_STATUS. */
1959 mock = cros_kunit_ec_xfer_mock_add(test, 0);
1960 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1963 ret = cros_ec_cmd_xfer(ec_dev, &msg);
1964 KUNIT_EXPECT_EQ(test, ret, -EPROTO);
1966 KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 2);
1969 static void cros_ec_proto_test_cmd_xfer_status_normal(struct kunit *test)
1971 struct cros_ec_proto_test_priv *priv = test->priv;
1972 struct cros_ec_device *ec_dev = &priv->ec_dev;
1973 struct ec_xfer_mock *mock;
1975 struct cros_ec_command msg;
1977 memset(&msg, 0, sizeof(msg));
1979 /* For cros_ec_cmd_xfer(). */
1981 mock = cros_kunit_ec_xfer_mock_add(test, 0);
1982 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1985 ret = cros_ec_cmd_xfer_status(ec_dev, &msg);
1986 KUNIT_EXPECT_EQ(test, ret, 0);
1989 static void cros_ec_proto_test_cmd_xfer_status_xfer_error(struct kunit *test)
1991 struct cros_ec_proto_test_priv *priv = test->priv;
1992 struct cros_ec_device *ec_dev = &priv->ec_dev;
1993 struct ec_xfer_mock *mock;
1995 struct cros_ec_command msg;
1997 memset(&msg, 0, sizeof(msg));
1999 /* For cros_ec_cmd_xfer(). */
2001 mock = cros_kunit_ec_xfer_mock_addx(test, -EPROTO, EC_RES_SUCCESS, 0);
2002 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
2005 ret = cros_ec_cmd_xfer_status(ec_dev, &msg);
2006 KUNIT_EXPECT_EQ(test, ret, -EPROTO);
2009 static void cros_ec_proto_test_cmd_xfer_status_return_error(struct kunit *test)
2011 struct cros_ec_proto_test_priv *priv = test->priv;
2012 struct cros_ec_device *ec_dev = &priv->ec_dev;
2013 struct ec_xfer_mock *mock;
2015 struct cros_ec_command msg;
2016 static const int map[] = {
2017 [EC_RES_SUCCESS] = 0,
2018 [EC_RES_INVALID_COMMAND] = -EOPNOTSUPP,
2019 [EC_RES_ERROR] = -EIO,
2020 [EC_RES_INVALID_PARAM] = -EINVAL,
2021 [EC_RES_ACCESS_DENIED] = -EACCES,
2022 [EC_RES_INVALID_RESPONSE] = -EPROTO,
2023 [EC_RES_INVALID_VERSION] = -ENOPROTOOPT,
2024 [EC_RES_INVALID_CHECKSUM] = -EBADMSG,
2026 * EC_RES_IN_PROGRESS is special because cros_ec_send_command() has extra logic to
2027 * handle it. Note that default cros_kunit_ec_xfer_mock_default_ret == 0 thus
2028 * cros_ec_xfer_command() in cros_ec_wait_until_complete() returns 0. As a result,
2029 * it returns -EPROTO without calling cros_ec_map_error().
2031 [EC_RES_IN_PROGRESS] = -EPROTO,
2032 [EC_RES_UNAVAILABLE] = -ENODATA,
2033 [EC_RES_TIMEOUT] = -ETIMEDOUT,
2034 [EC_RES_OVERFLOW] = -EOVERFLOW,
2035 [EC_RES_INVALID_HEADER] = -EBADR,
2036 [EC_RES_REQUEST_TRUNCATED] = -EBADR,
2037 [EC_RES_RESPONSE_TOO_BIG] = -EFBIG,
2038 [EC_RES_BUS_ERROR] = -EFAULT,
2039 [EC_RES_BUSY] = -EBUSY,
2040 [EC_RES_INVALID_HEADER_VERSION] = -EBADMSG,
2041 [EC_RES_INVALID_HEADER_CRC] = -EBADMSG,
2042 [EC_RES_INVALID_DATA_CRC] = -EBADMSG,
2043 [EC_RES_DUP_UNAVAILABLE] = -ENODATA,
2046 memset(&msg, 0, sizeof(msg));
2048 for (i = 0; i < ARRAY_SIZE(map); ++i) {
2049 mock = cros_kunit_ec_xfer_mock_addx(test, 0, i, 0);
2050 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
2052 ret = cros_ec_cmd_xfer_status(ec_dev, &msg);
2053 KUNIT_EXPECT_EQ(test, ret, map[i]);
2057 static void cros_ec_proto_test_get_next_event_no_mkbp_event(struct kunit *test)
2059 struct cros_ec_proto_test_priv *priv = test->priv;
2060 struct cros_ec_device *ec_dev = &priv->ec_dev;
2061 struct ec_xfer_mock *mock;
2063 bool wake_event, more_events;
2065 ec_dev->max_request = 0xff;
2066 ec_dev->max_response = 0xee;
2067 ec_dev->mkbp_event_supported = 0;
2069 /* Set some garbage bytes. */
2073 /* For get_keyboard_state_event(). */
2075 union ec_response_get_next_data_v1 *data;
2077 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
2078 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
2080 data = (union ec_response_get_next_data_v1 *)mock->o_data;
2081 data->host_event = 0xbeef;
2084 ret = cros_ec_get_next_event(ec_dev, &wake_event, &more_events);
2085 KUNIT_EXPECT_EQ(test, ret, sizeof(union ec_response_get_next_data_v1));
2087 KUNIT_EXPECT_EQ(test, ec_dev->event_data.event_type, EC_MKBP_EVENT_KEY_MATRIX);
2088 KUNIT_EXPECT_EQ(test, ec_dev->event_data.data.host_event, 0xbeef);
2090 KUNIT_EXPECT_TRUE(test, wake_event);
2091 KUNIT_EXPECT_FALSE(test, more_events);
2093 /* For get_keyboard_state_event(). */
2095 mock = cros_kunit_ec_xfer_mock_next();
2096 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
2098 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
2099 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_MKBP_STATE);
2100 KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(union ec_response_get_next_data_v1));
2101 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
2105 static void cros_ec_proto_test_get_next_event_mkbp_event_ec_suspended(struct kunit *test)
2107 struct cros_ec_proto_test_priv *priv = test->priv;
2108 struct cros_ec_device *ec_dev = &priv->ec_dev;
2111 ec_dev->mkbp_event_supported = 1;
2112 ec_dev->suspended = true;
2114 ret = cros_ec_get_next_event(ec_dev, NULL, NULL);
2115 KUNIT_EXPECT_EQ(test, ret, -EHOSTDOWN);
2118 static void cros_ec_proto_test_get_next_event_mkbp_event_version0(struct kunit *test)
2120 struct cros_ec_proto_test_priv *priv = test->priv;
2121 struct cros_ec_device *ec_dev = &priv->ec_dev;
2122 struct ec_xfer_mock *mock;
2124 bool wake_event, more_events;
2126 ec_dev->max_request = 0xff;
2127 ec_dev->max_response = 0xee;
2128 ec_dev->mkbp_event_supported = 1;
2130 /* Set some garbage bytes. */
2132 more_events = false;
2134 /* For get_next_event_xfer(). */
2136 struct ec_response_get_next_event *data;
2138 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
2139 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
2141 data = (struct ec_response_get_next_event *)mock->o_data;
2142 data->event_type = EC_MKBP_EVENT_SENSOR_FIFO | EC_MKBP_HAS_MORE_EVENTS;
2143 data->data.sysrq = 0xbeef;
2146 ret = cros_ec_get_next_event(ec_dev, &wake_event, &more_events);
2147 KUNIT_EXPECT_EQ(test, ret, sizeof(struct ec_response_get_next_event));
2149 KUNIT_EXPECT_EQ(test, ec_dev->event_data.event_type, EC_MKBP_EVENT_SENSOR_FIFO);
2150 KUNIT_EXPECT_EQ(test, ec_dev->event_data.data.sysrq, 0xbeef);
2152 KUNIT_EXPECT_FALSE(test, wake_event);
2153 KUNIT_EXPECT_TRUE(test, more_events);
2155 /* For get_next_event_xfer(). */
2157 mock = cros_kunit_ec_xfer_mock_next();
2158 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
2160 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
2161 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_NEXT_EVENT);
2162 KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_get_next_event));
2163 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
2167 static void cros_ec_proto_test_get_next_event_mkbp_event_version2(struct kunit *test)
2169 struct cros_ec_proto_test_priv *priv = test->priv;
2170 struct cros_ec_device *ec_dev = &priv->ec_dev;
2171 struct ec_xfer_mock *mock;
2173 bool wake_event, more_events;
2175 ec_dev->max_request = 0xff;
2176 ec_dev->max_response = 0xee;
2177 ec_dev->mkbp_event_supported = 3;
2179 /* Set some garbage bytes. */
2183 /* For get_next_event_xfer(). */
2185 struct ec_response_get_next_event_v1 *data;
2187 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
2188 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
2190 data = (struct ec_response_get_next_event_v1 *)mock->o_data;
2191 data->event_type = EC_MKBP_EVENT_FINGERPRINT;
2192 data->data.sysrq = 0xbeef;
2195 ret = cros_ec_get_next_event(ec_dev, &wake_event, &more_events);
2196 KUNIT_EXPECT_EQ(test, ret, sizeof(struct ec_response_get_next_event_v1));
2198 KUNIT_EXPECT_EQ(test, ec_dev->event_data.event_type, EC_MKBP_EVENT_FINGERPRINT);
2199 KUNIT_EXPECT_EQ(test, ec_dev->event_data.data.sysrq, 0xbeef);
2201 KUNIT_EXPECT_TRUE(test, wake_event);
2202 KUNIT_EXPECT_FALSE(test, more_events);
2204 /* For get_next_event_xfer(). */
2206 mock = cros_kunit_ec_xfer_mock_next();
2207 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
2209 KUNIT_EXPECT_EQ(test, mock->msg.version, 2);
2210 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_NEXT_EVENT);
2211 KUNIT_EXPECT_EQ(test, mock->msg.insize,
2212 sizeof(struct ec_response_get_next_event_v1));
2213 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
2217 static void cros_ec_proto_test_get_next_event_mkbp_event_host_event_rtc(struct kunit *test)
2219 struct cros_ec_proto_test_priv *priv = test->priv;
2220 struct cros_ec_device *ec_dev = &priv->ec_dev;
2221 struct ec_xfer_mock *mock;
2224 struct ec_response_get_next_event_v1 *data;
2226 ec_dev->max_request = 0xff;
2227 ec_dev->max_response = 0xee;
2228 ec_dev->mkbp_event_supported = 3;
2229 ec_dev->host_event_wake_mask = U32_MAX;
2231 /* Set some garbage bytes. */
2234 /* For get_next_event_xfer(). */
2236 mock = cros_kunit_ec_xfer_mock_add(test,
2237 sizeof(data->event_type) +
2238 sizeof(data->data.host_event));
2239 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
2241 data = (struct ec_response_get_next_event_v1 *)mock->o_data;
2242 data->event_type = EC_MKBP_EVENT_HOST_EVENT;
2243 put_unaligned_le32(EC_HOST_EVENT_MASK(EC_HOST_EVENT_RTC), &data->data.host_event);
2246 ret = cros_ec_get_next_event(ec_dev, &wake_event, NULL);
2247 KUNIT_EXPECT_EQ(test, ret, sizeof(data->event_type) + sizeof(data->data.host_event));
2249 KUNIT_EXPECT_EQ(test, ec_dev->event_data.event_type, EC_MKBP_EVENT_HOST_EVENT);
2251 KUNIT_EXPECT_FALSE(test, wake_event);
2253 /* For get_next_event_xfer(). */
2255 mock = cros_kunit_ec_xfer_mock_next();
2256 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
2258 KUNIT_EXPECT_EQ(test, mock->msg.version, 2);
2259 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_NEXT_EVENT);
2260 KUNIT_EXPECT_EQ(test, mock->msg.insize,
2261 sizeof(struct ec_response_get_next_event_v1));
2262 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
2266 static void cros_ec_proto_test_get_next_event_mkbp_event_host_event_masked(struct kunit *test)
2268 struct cros_ec_proto_test_priv *priv = test->priv;
2269 struct cros_ec_device *ec_dev = &priv->ec_dev;
2270 struct ec_xfer_mock *mock;
2273 struct ec_response_get_next_event_v1 *data;
2275 ec_dev->max_request = 0xff;
2276 ec_dev->max_response = 0xee;
2277 ec_dev->mkbp_event_supported = 3;
2278 ec_dev->host_event_wake_mask = U32_MAX & ~EC_HOST_EVENT_MASK(EC_HOST_EVENT_AC_DISCONNECTED);
2280 /* Set some garbage bytes. */
2283 /* For get_next_event_xfer(). */
2285 mock = cros_kunit_ec_xfer_mock_add(test,
2286 sizeof(data->event_type) +
2287 sizeof(data->data.host_event));
2288 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
2290 data = (struct ec_response_get_next_event_v1 *)mock->o_data;
2291 data->event_type = EC_MKBP_EVENT_HOST_EVENT;
2292 put_unaligned_le32(EC_HOST_EVENT_MASK(EC_HOST_EVENT_AC_DISCONNECTED),
2293 &data->data.host_event);
2296 ret = cros_ec_get_next_event(ec_dev, &wake_event, NULL);
2297 KUNIT_EXPECT_EQ(test, ret, sizeof(data->event_type) + sizeof(data->data.host_event));
2299 KUNIT_EXPECT_EQ(test, ec_dev->event_data.event_type, EC_MKBP_EVENT_HOST_EVENT);
2301 KUNIT_EXPECT_FALSE(test, wake_event);
2303 /* For get_next_event_xfer(). */
2305 mock = cros_kunit_ec_xfer_mock_next();
2306 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
2308 KUNIT_EXPECT_EQ(test, mock->msg.version, 2);
2309 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_NEXT_EVENT);
2310 KUNIT_EXPECT_EQ(test, mock->msg.insize,
2311 sizeof(struct ec_response_get_next_event_v1));
2312 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
2316 static void cros_ec_proto_test_get_host_event_no_mkbp_event(struct kunit *test)
2318 struct cros_ec_proto_test_priv *priv = test->priv;
2319 struct cros_ec_device *ec_dev = &priv->ec_dev;
2322 ec_dev->mkbp_event_supported = 0;
2324 ret = cros_ec_get_host_event(ec_dev);
2325 KUNIT_EXPECT_EQ(test, ret, 0);
2328 static void cros_ec_proto_test_get_host_event_not_host_event(struct kunit *test)
2330 struct cros_ec_proto_test_priv *priv = test->priv;
2331 struct cros_ec_device *ec_dev = &priv->ec_dev;
2334 ec_dev->mkbp_event_supported = 1;
2335 ec_dev->event_data.event_type = EC_MKBP_EVENT_FINGERPRINT;
2337 ret = cros_ec_get_host_event(ec_dev);
2338 KUNIT_EXPECT_EQ(test, ret, 0);
2341 static void cros_ec_proto_test_get_host_event_wrong_event_size(struct kunit *test)
2343 struct cros_ec_proto_test_priv *priv = test->priv;
2344 struct cros_ec_device *ec_dev = &priv->ec_dev;
2347 ec_dev->mkbp_event_supported = 1;
2348 ec_dev->event_data.event_type = EC_MKBP_EVENT_HOST_EVENT;
2349 ec_dev->event_size = 0xff;
2351 ret = cros_ec_get_host_event(ec_dev);
2352 KUNIT_EXPECT_EQ(test, ret, 0);
2355 static void cros_ec_proto_test_get_host_event_normal(struct kunit *test)
2357 struct cros_ec_proto_test_priv *priv = test->priv;
2358 struct cros_ec_device *ec_dev = &priv->ec_dev;
2361 ec_dev->mkbp_event_supported = 1;
2362 ec_dev->event_data.event_type = EC_MKBP_EVENT_HOST_EVENT;
2363 ec_dev->event_size = sizeof(ec_dev->event_data.data.host_event);
2364 put_unaligned_le32(EC_HOST_EVENT_MASK(EC_HOST_EVENT_RTC),
2365 &ec_dev->event_data.data.host_event);
2367 ret = cros_ec_get_host_event(ec_dev);
2368 KUNIT_EXPECT_EQ(test, ret, EC_HOST_EVENT_MASK(EC_HOST_EVENT_RTC));
2371 static void cros_ec_proto_test_check_features_cached(struct kunit *test)
2374 static struct cros_ec_dev ec;
2376 ec.features.flags[0] = EC_FEATURE_MASK_0(EC_FEATURE_FINGERPRINT);
2377 ec.features.flags[1] = EC_FEATURE_MASK_0(EC_FEATURE_SCP);
2379 for (i = 0; i < EC_FEATURE_TYPEC_MUX_REQUIRE_AP_ACK; ++i) {
2380 ret = cros_ec_check_features(&ec, i);
2382 case EC_FEATURE_FINGERPRINT:
2383 case EC_FEATURE_SCP:
2384 KUNIT_EXPECT_TRUE(test, ret);
2387 KUNIT_EXPECT_FALSE(test, ret);
2393 static void cros_ec_proto_test_check_features_not_cached(struct kunit *test)
2395 struct cros_ec_proto_test_priv *priv = test->priv;
2396 struct cros_ec_device *ec_dev = &priv->ec_dev;
2397 struct ec_xfer_mock *mock;
2399 static struct cros_ec_dev ec;
2401 ec_dev->max_request = 0xff;
2402 ec_dev->max_response = 0xee;
2404 ec.dev = ec_dev->dev;
2406 ec.features.flags[0] = -1;
2407 ec.features.flags[1] = -1;
2409 /* For EC_CMD_GET_FEATURES. */
2411 struct ec_response_get_features *data;
2413 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
2414 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
2416 data = (struct ec_response_get_features *)mock->o_data;
2417 data->flags[0] = EC_FEATURE_MASK_0(EC_FEATURE_FINGERPRINT);
2418 data->flags[1] = EC_FEATURE_MASK_0(EC_FEATURE_SCP);
2421 for (i = 0; i < EC_FEATURE_TYPEC_MUX_REQUIRE_AP_ACK; ++i) {
2422 ret = cros_ec_check_features(&ec, i);
2424 case EC_FEATURE_FINGERPRINT:
2425 case EC_FEATURE_SCP:
2426 KUNIT_EXPECT_TRUE(test, ret);
2429 KUNIT_EXPECT_FALSE(test, ret);
2434 /* For EC_CMD_GET_FEATURES. */
2436 mock = cros_kunit_ec_xfer_mock_next();
2437 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
2439 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
2440 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_FEATURES);
2441 KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_get_features));
2442 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
2446 static void cros_ec_proto_test_get_sensor_count_normal(struct kunit *test)
2448 struct cros_ec_proto_test_priv *priv = test->priv;
2449 struct cros_ec_device *ec_dev = &priv->ec_dev;
2450 struct ec_xfer_mock *mock;
2452 static struct cros_ec_dev ec;
2454 ec_dev->max_request = 0xff;
2455 ec_dev->max_response = 0xee;
2457 ec.dev = ec_dev->dev;
2460 /* For EC_CMD_MOTION_SENSE_CMD. */
2462 struct ec_response_motion_sense *data;
2464 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
2465 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
2467 data = (struct ec_response_motion_sense *)mock->o_data;
2468 data->dump.sensor_count = 0xbf;
2471 ret = cros_ec_get_sensor_count(&ec);
2472 KUNIT_EXPECT_EQ(test, ret, 0xbf);
2474 /* For EC_CMD_MOTION_SENSE_CMD. */
2476 struct ec_params_motion_sense *data;
2478 mock = cros_kunit_ec_xfer_mock_next();
2479 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
2481 KUNIT_EXPECT_EQ(test, mock->msg.version, 1);
2482 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_MOTION_SENSE_CMD);
2483 KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_motion_sense));
2484 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data));
2486 data = (struct ec_params_motion_sense *)mock->i_data;
2487 KUNIT_EXPECT_EQ(test, data->cmd, MOTIONSENSE_CMD_DUMP);
2491 static void cros_ec_proto_test_get_sensor_count_xfer_error(struct kunit *test)
2493 struct cros_ec_proto_test_priv *priv = test->priv;
2494 struct cros_ec_device *ec_dev = &priv->ec_dev;
2495 struct ec_xfer_mock *mock;
2497 static struct cros_ec_dev ec;
2499 ec_dev->max_request = 0xff;
2500 ec_dev->max_response = 0xee;
2502 ec.dev = ec_dev->dev;
2505 /* For EC_CMD_MOTION_SENSE_CMD. */
2507 mock = cros_kunit_ec_xfer_mock_addx(test, -EPROTO, EC_RES_SUCCESS, 0);
2508 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
2511 ret = cros_ec_get_sensor_count(&ec);
2512 KUNIT_EXPECT_EQ(test, ret, -EPROTO);
2514 /* For EC_CMD_MOTION_SENSE_CMD. */
2516 struct ec_params_motion_sense *data;
2518 mock = cros_kunit_ec_xfer_mock_next();
2519 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
2521 KUNIT_EXPECT_EQ(test, mock->msg.version, 1);
2522 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_MOTION_SENSE_CMD);
2523 KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_motion_sense));
2524 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data));
2526 data = (struct ec_params_motion_sense *)mock->i_data;
2527 KUNIT_EXPECT_EQ(test, data->cmd, MOTIONSENSE_CMD_DUMP);
2531 static void cros_ec_proto_test_get_sensor_count_legacy(struct kunit *test)
2533 struct cros_ec_proto_test_priv *priv = test->priv;
2534 struct cros_ec_device *ec_dev = &priv->ec_dev;
2535 struct ec_xfer_mock *mock;
2537 static struct cros_ec_dev ec;
2540 int expected_result;
2543 { EC_MEMMAP_ACC_STATUS_PRESENCE_BIT, 2 },
2546 ec_dev->max_request = 0xff;
2547 ec_dev->max_response = 0xee;
2548 ec_dev->cmd_readmem = cros_kunit_readmem_mock;
2550 ec.dev = ec_dev->dev;
2553 for (i = 0; i < ARRAY_SIZE(test_data); ++i) {
2554 /* For EC_CMD_MOTION_SENSE_CMD. */
2556 mock = cros_kunit_ec_xfer_mock_addx(test, -EPROTO, EC_RES_SUCCESS, 0);
2557 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
2562 cros_kunit_readmem_mock_data = kunit_kzalloc(test, 1, GFP_KERNEL);
2563 KUNIT_ASSERT_PTR_NE(test, cros_kunit_readmem_mock_data, NULL);
2564 cros_kunit_readmem_mock_data[0] = test_data[i].readmem_data;
2566 cros_kunit_ec_xfer_mock_default_ret = 1;
2569 ret = cros_ec_get_sensor_count(&ec);
2570 KUNIT_EXPECT_EQ(test, ret, test_data[i].expected_result);
2572 /* For EC_CMD_MOTION_SENSE_CMD. */
2574 struct ec_params_motion_sense *data;
2576 mock = cros_kunit_ec_xfer_mock_next();
2577 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
2579 KUNIT_EXPECT_EQ(test, mock->msg.version, 1);
2580 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_MOTION_SENSE_CMD);
2581 KUNIT_EXPECT_EQ(test, mock->msg.insize,
2582 sizeof(struct ec_response_motion_sense));
2583 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data));
2585 data = (struct ec_params_motion_sense *)mock->i_data;
2586 KUNIT_EXPECT_EQ(test, data->cmd, MOTIONSENSE_CMD_DUMP);
2591 KUNIT_EXPECT_EQ(test, cros_kunit_readmem_mock_offset, EC_MEMMAP_ACC_STATUS);
2596 static void cros_ec_proto_test_ec_cmd(struct kunit *test)
2598 struct cros_ec_proto_test_priv *priv = test->priv;
2599 struct cros_ec_device *ec_dev = &priv->ec_dev;
2600 struct ec_xfer_mock *mock;
2604 ec_dev->max_request = 0xff;
2605 ec_dev->max_response = 0xee;
2614 mock = cros_kunit_ec_xfer_mock_add(test, 2);
2615 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
2617 data = (u8 *)mock->o_data;
2622 ret = cros_ec_cmd(ec_dev, 0x88, 0x77, out, ARRAY_SIZE(out), in, ARRAY_SIZE(in));
2623 KUNIT_EXPECT_EQ(test, ret, 2);
2628 mock = cros_kunit_ec_xfer_mock_next();
2629 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
2631 KUNIT_EXPECT_EQ(test, mock->msg.version, 0x88);
2632 KUNIT_EXPECT_EQ(test, mock->msg.command, 0x77);
2633 KUNIT_EXPECT_EQ(test, mock->msg.insize, ARRAY_SIZE(in));
2634 KUNIT_EXPECT_EQ(test, mock->msg.outsize, ARRAY_SIZE(out));
2636 data = (u8 *)mock->i_data;
2637 KUNIT_EXPECT_EQ(test, data[0], 0xdd);
2638 KUNIT_EXPECT_EQ(test, data[1], 0xcc);
2639 KUNIT_EXPECT_EQ(test, data[2], 0xbb);
2643 static void cros_ec_proto_test_release(struct device *dev)
2647 static int cros_ec_proto_test_init(struct kunit *test)
2649 struct cros_ec_proto_test_priv *priv;
2650 struct cros_ec_device *ec_dev;
2652 priv = kunit_kzalloc(test, sizeof(*priv), GFP_KERNEL);
2657 ec_dev = &priv->ec_dev;
2658 ec_dev->dout = (u8 *)priv->dout;
2659 ec_dev->dout_size = ARRAY_SIZE(priv->dout);
2660 ec_dev->din = (u8 *)priv->din;
2661 ec_dev->din_size = ARRAY_SIZE(priv->din);
2662 ec_dev->proto_version = EC_HOST_REQUEST_VERSION;
2663 ec_dev->dev = kunit_kzalloc(test, sizeof(*ec_dev->dev), GFP_KERNEL);
2666 device_initialize(ec_dev->dev);
2667 dev_set_name(ec_dev->dev, "cros_ec_proto_test");
2668 ec_dev->dev->release = cros_ec_proto_test_release;
2669 ec_dev->cmd_xfer = cros_kunit_ec_xfer_mock;
2670 ec_dev->pkt_xfer = cros_kunit_ec_xfer_mock;
2672 priv->msg = (struct cros_ec_command *)priv->_msg;
2674 cros_kunit_mock_reset();
2679 static void cros_ec_proto_test_exit(struct kunit *test)
2681 struct cros_ec_proto_test_priv *priv = test->priv;
2682 struct cros_ec_device *ec_dev = &priv->ec_dev;
2684 put_device(ec_dev->dev);
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),
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,
2752 kunit_test_suite(cros_ec_proto_test_suite);
2754 MODULE_LICENSE("GPL");