1 // SPDX-License-Identifier: GPL-2.0
3 * Kunit tests for ChromeOS Embedded Controller protocol.
6 #include <kunit/test.h>
8 #include <asm-generic/unaligned.h>
9 #include <linux/platform_data/cros_ec_commands.h>
10 #include <linux/platform_data/cros_ec_proto.h>
13 #include "cros_kunit_util.h"
17 struct cros_ec_proto_test_priv {
18 struct cros_ec_device ec_dev;
21 struct cros_ec_command *msg;
25 static void cros_ec_proto_test_prepare_tx_legacy_normal(struct kunit *test)
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;
33 ec_dev->proto_version = 2;
35 msg->command = EC_CMD_HELLO;
36 msg->outsize = EC_PROTO2_MAX_PARAM_SIZE;
42 ret = cros_ec_prepare_tx(ec_dev, msg);
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);
56 csum = EC_CMD_VERSION0;
58 csum += EC_PROTO2_MAX_PARAM_SIZE;
64 ec_dev->dout[EC_MSG_TX_HEADER_BYTES + EC_PROTO2_MAX_PARAM_SIZE],
68 static void cros_ec_proto_test_prepare_tx_legacy_bad_msg_outsize(struct kunit *test)
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;
75 ec_dev->proto_version = 2;
77 msg->outsize = EC_PROTO2_MAX_PARAM_SIZE + 1;
79 ret = cros_ec_prepare_tx(ec_dev, msg);
80 KUNIT_EXPECT_EQ(test, ret, -EINVAL);
83 static void cros_ec_proto_test_prepare_tx_normal(struct kunit *test)
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;
92 msg->command = EC_CMD_HELLO;
99 ret = cros_ec_prepare_tx(ec_dev, msg);
101 KUNIT_EXPECT_EQ(test, ret, sizeof(*request) + 0x88);
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);
114 csum = EC_HOST_REQUEST_VERSION;
115 csum += EC_CMD_HELLO;
121 KUNIT_EXPECT_EQ(test, request->checksum, (u8)-csum);
124 static void cros_ec_proto_test_prepare_tx_bad_msg_outsize(struct kunit *test)
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;
131 msg->outsize = ec_dev->dout_size - sizeof(struct ec_host_request) + 1;
133 ret = cros_ec_prepare_tx(ec_dev, msg);
134 KUNIT_EXPECT_EQ(test, ret, -EINVAL);
137 static void cros_ec_proto_test_check_result(struct kunit *test)
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;
143 static enum ec_status status[] = {
145 EC_RES_INVALID_COMMAND,
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,
155 EC_RES_INVALID_HEADER,
156 EC_RES_REQUEST_TRUNCATED,
157 EC_RES_RESPONSE_TOO_BIG,
160 EC_RES_INVALID_HEADER_VERSION,
161 EC_RES_INVALID_HEADER_CRC,
162 EC_RES_INVALID_DATA_CRC,
163 EC_RES_DUP_UNAVAILABLE,
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);
172 msg->result = EC_RES_IN_PROGRESS;
173 ret = cros_ec_check_result(ec_dev, msg);
174 KUNIT_EXPECT_EQ(test, ret, -EAGAIN);
177 static void cros_ec_proto_test_query_all_pretest(struct kunit *test)
179 struct cros_ec_proto_test_priv *priv = test->priv;
180 struct cros_ec_device *ec_dev = &priv->ec_dev;
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()).
192 static void cros_ec_proto_test_query_all_normal(struct kunit *test)
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;
199 /* For cros_ec_get_proto_info() without passthru. */
201 struct ec_response_get_protocol_info *data;
203 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
204 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
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;
212 /* For cros_ec_get_proto_info() with passthru. */
214 struct ec_response_get_protocol_info *data;
216 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
217 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
219 data = (struct ec_response_get_protocol_info *)mock->o_data;
220 data->max_request_packet_size = 0xbf;
223 /* For cros_ec_get_host_command_version_mask() for MKBP. */
225 struct ec_response_get_cmd_versions *data;
227 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
228 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
230 data = (struct ec_response_get_cmd_versions *)mock->o_data;
231 data->version_mask = BIT(6) | BIT(5);
234 /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
236 struct ec_response_get_cmd_versions *data;
238 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
239 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
241 data = (struct ec_response_get_cmd_versions *)mock->o_data;
242 data->version_mask = BIT(1);
245 /* For cros_ec_get_host_event_wake_mask(). */
247 struct ec_response_host_event_mask *data;
249 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
250 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
252 data = (struct ec_response_host_event_mask *)mock->o_data;
256 cros_ec_proto_test_query_all_pretest(test);
257 ret = cros_ec_query_all(ec_dev);
258 KUNIT_EXPECT_EQ(test, ret, 0);
260 /* For cros_ec_get_proto_info() without passthru. */
262 mock = cros_kunit_ec_xfer_mock_next();
263 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
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);
278 /* For cros_ec_get_proto_info() with passthru. */
280 mock = cros_kunit_ec_xfer_mock_next();
281 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
291 KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0xbf - sizeof(struct ec_host_request));
294 /* For cros_ec_get_host_command_version_mask() for MKBP. */
296 struct ec_params_get_cmd_versions *data;
298 mock = cros_kunit_ec_xfer_mock_next();
299 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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));
307 data = (struct ec_params_get_cmd_versions *)mock->i_data;
308 KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_GET_NEXT_EVENT);
310 KUNIT_EXPECT_EQ(test, ec_dev->mkbp_event_supported, 7);
313 /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
315 struct ec_params_get_cmd_versions *data;
317 mock = cros_kunit_ec_xfer_mock_next();
318 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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));
326 data = (struct ec_params_get_cmd_versions *)mock->i_data;
327 KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_HOST_SLEEP_EVENT);
329 KUNIT_EXPECT_TRUE(test, ec_dev->host_sleep_v1);
332 /* For cros_ec_get_host_event_wake_mask(). */
334 mock = cros_kunit_ec_xfer_mock_next();
335 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
342 KUNIT_EXPECT_EQ(test, ec_dev->host_event_wake_mask, 0xbeef);
346 static void cros_ec_proto_test_query_all_no_pd_return_error(struct kunit *test)
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;
353 /* Set some garbage bytes. */
354 ec_dev->max_passthru = 0xbf;
356 /* For cros_ec_get_proto_info() without passthru. */
358 struct ec_response_get_protocol_info *data;
360 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
361 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
364 * Although it doesn't check the value, provides valid sizes so that
365 * cros_ec_query_all() allocates din and dout correctly.
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;
372 /* For cros_ec_get_proto_info() with passthru. */
374 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
375 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
378 cros_ec_proto_test_query_all_pretest(test);
379 ret = cros_ec_query_all(ec_dev);
380 KUNIT_EXPECT_EQ(test, ret, 0);
382 /* For cros_ec_get_proto_info() without passthru. */
384 mock = cros_kunit_ec_xfer_mock_next();
385 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
394 /* For cros_ec_get_proto_info() with passthru. */
396 mock = cros_kunit_ec_xfer_mock_next();
397 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
407 KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0);
411 static void cros_ec_proto_test_query_all_no_pd_return0(struct kunit *test)
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;
418 /* Set some garbage bytes. */
419 ec_dev->max_passthru = 0xbf;
421 /* For cros_ec_get_proto_info() without passthru. */
423 struct ec_response_get_protocol_info *data;
425 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
426 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
429 * Although it doesn't check the value, provides valid sizes so that
430 * cros_ec_query_all() allocates din and dout correctly.
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;
437 /* For cros_ec_get_proto_info() with passthru. */
439 mock = cros_kunit_ec_xfer_mock_add(test, 0);
440 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
443 cros_ec_proto_test_query_all_pretest(test);
444 ret = cros_ec_query_all(ec_dev);
445 KUNIT_EXPECT_EQ(test, ret, 0);
447 /* For cros_ec_get_proto_info() without passthru. */
449 mock = cros_kunit_ec_xfer_mock_next();
450 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
459 /* For cros_ec_get_proto_info() with passthru. */
461 mock = cros_kunit_ec_xfer_mock_next();
462 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
472 KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0);
476 static void cros_ec_proto_test_query_all_legacy_normal_v3_return_error(struct kunit *test)
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;
483 /* For cros_ec_get_proto_info() without passthru. */
485 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
486 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
489 /* For cros_ec_get_proto_info_legacy(). */
491 struct ec_response_hello *data;
493 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
494 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
496 data = (struct ec_response_hello *)mock->o_data;
497 data->out_data = 0xa1b2c3d4;
500 cros_ec_proto_test_query_all_pretest(test);
501 ret = cros_ec_query_all(ec_dev);
502 KUNIT_EXPECT_EQ(test, ret, 0);
504 /* For cros_ec_get_proto_info() without passthru. */
506 mock = cros_kunit_ec_xfer_mock_next();
507 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
516 /* For cros_ec_get_proto_info_legacy(). */
518 struct ec_params_hello *data;
520 mock = cros_kunit_ec_xfer_mock_next();
521 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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));
528 data = (struct ec_params_hello *)mock->i_data;
529 KUNIT_EXPECT_EQ(test, data->in_data, 0xa0b0c0d0);
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);
541 static void cros_ec_proto_test_query_all_legacy_normal_v3_return0(struct kunit *test)
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;
548 /* For cros_ec_get_proto_info() without passthru. */
550 mock = cros_kunit_ec_xfer_mock_add(test, 0);
551 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
554 /* For cros_ec_get_proto_info_legacy(). */
556 struct ec_response_hello *data;
558 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
559 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
561 data = (struct ec_response_hello *)mock->o_data;
562 data->out_data = 0xa1b2c3d4;
565 cros_ec_proto_test_query_all_pretest(test);
566 ret = cros_ec_query_all(ec_dev);
567 KUNIT_EXPECT_EQ(test, ret, 0);
569 /* For cros_ec_get_proto_info() without passthru. */
571 mock = cros_kunit_ec_xfer_mock_next();
572 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
581 /* For cros_ec_get_proto_info_legacy(). */
583 struct ec_params_hello *data;
585 mock = cros_kunit_ec_xfer_mock_next();
586 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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));
593 data = (struct ec_params_hello *)mock->i_data;
594 KUNIT_EXPECT_EQ(test, data->in_data, 0xa0b0c0d0);
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);
606 static void cros_ec_proto_test_query_all_legacy_xfer_error(struct kunit *test)
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;
613 /* For cros_ec_get_proto_info() without passthru. */
615 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
616 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
619 /* For cros_ec_get_proto_info_legacy(). */
621 mock = cros_kunit_ec_xfer_mock_addx(test, -EIO, EC_RES_SUCCESS, 0);
622 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
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);
630 /* For cros_ec_get_proto_info() without passthru. */
632 mock = cros_kunit_ec_xfer_mock_next();
633 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
642 /* For cros_ec_get_proto_info_legacy(). */
644 mock = cros_kunit_ec_xfer_mock_next();
645 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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));
654 static void cros_ec_proto_test_query_all_legacy_return_error(struct kunit *test)
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;
661 /* For cros_ec_get_proto_info() without passthru. */
663 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
664 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
667 /* For cros_ec_get_proto_info_legacy(). */
669 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
670 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
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);
678 /* For cros_ec_get_proto_info() without passthru. */
680 mock = cros_kunit_ec_xfer_mock_next();
681 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
690 /* For cros_ec_get_proto_info_legacy(). */
692 mock = cros_kunit_ec_xfer_mock_next();
693 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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));
702 static void cros_ec_proto_test_query_all_legacy_data_error(struct kunit *test)
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;
709 /* For cros_ec_get_proto_info() without passthru. */
711 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
712 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
715 /* For cros_ec_get_proto_info_legacy(). */
717 struct ec_response_hello *data;
719 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
720 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
722 data = (struct ec_response_hello *)mock->o_data;
723 data->out_data = 0xbeefbfbf;
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);
731 /* For cros_ec_get_proto_info() without passthru. */
733 mock = cros_kunit_ec_xfer_mock_next();
734 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
743 /* For cros_ec_get_proto_info_legacy(). */
745 mock = cros_kunit_ec_xfer_mock_next();
746 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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));
755 static void cros_ec_proto_test_query_all_legacy_return0(struct kunit *test)
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;
762 /* For cros_ec_get_proto_info() without passthru. */
764 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
765 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
768 /* For cros_ec_get_proto_info_legacy(). */
770 mock = cros_kunit_ec_xfer_mock_add(test, 0);
771 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
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);
779 /* For cros_ec_get_proto_info() without passthru. */
781 mock = cros_kunit_ec_xfer_mock_next();
782 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
791 /* For cros_ec_get_proto_info_legacy(). */
793 mock = cros_kunit_ec_xfer_mock_next();
794 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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));
803 static void cros_ec_proto_test_query_all_no_mkbp(struct kunit *test)
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;
810 /* Set some garbage bytes. */
811 ec_dev->mkbp_event_supported = 0xbf;
813 /* For cros_ec_get_proto_info() without passthru. */
815 struct ec_response_get_protocol_info *data;
817 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
818 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
821 * Although it doesn't check the value, provides valid sizes so that
822 * cros_ec_query_all() allocates din and dout correctly.
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;
829 /* For cros_ec_get_proto_info() with passthru. */
831 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
832 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
835 /* For cros_ec_get_host_command_version_mask() for MKBP. */
837 struct ec_response_get_cmd_versions *data;
839 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
840 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
842 data = (struct ec_response_get_cmd_versions *)mock->o_data;
843 data->version_mask = 0;
846 cros_ec_proto_test_query_all_pretest(test);
847 ret = cros_ec_query_all(ec_dev);
848 KUNIT_EXPECT_EQ(test, ret, 0);
850 /* For cros_ec_get_proto_info() without passthru. */
852 mock = cros_kunit_ec_xfer_mock_next();
853 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
862 /* For cros_ec_get_proto_info() with passthru. */
864 mock = cros_kunit_ec_xfer_mock_next();
865 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
876 /* For cros_ec_get_host_command_version_mask() for MKBP. */
878 struct ec_params_get_cmd_versions *data;
880 mock = cros_kunit_ec_xfer_mock_next();
881 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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));
889 data = (struct ec_params_get_cmd_versions *)mock->i_data;
890 KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_GET_NEXT_EVENT);
892 KUNIT_EXPECT_EQ(test, ec_dev->mkbp_event_supported, 0);
896 static void cros_ec_proto_test_query_all_no_mkbp_return_error(struct kunit *test)
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;
903 /* Set some garbage bytes. */
904 ec_dev->mkbp_event_supported = 0xbf;
906 /* For cros_ec_get_proto_info() without passthru. */
908 struct ec_response_get_protocol_info *data;
910 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
911 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
914 * Although it doesn't check the value, provides valid sizes so that
915 * cros_ec_query_all() allocates din and dout correctly.
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;
922 /* For cros_ec_get_proto_info() with passthru. */
924 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
925 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
928 /* For cros_ec_get_host_command_version_mask() for MKBP. */
930 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
931 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
934 cros_ec_proto_test_query_all_pretest(test);
935 ret = cros_ec_query_all(ec_dev);
936 KUNIT_EXPECT_EQ(test, ret, 0);
938 /* For cros_ec_get_proto_info() without passthru. */
940 mock = cros_kunit_ec_xfer_mock_next();
941 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
950 /* For cros_ec_get_proto_info() with passthru. */
952 mock = cros_kunit_ec_xfer_mock_next();
953 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
964 /* For cros_ec_get_host_command_version_mask() for MKBP. */
966 struct ec_params_get_cmd_versions *data;
968 mock = cros_kunit_ec_xfer_mock_next();
969 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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));
977 data = (struct ec_params_get_cmd_versions *)mock->i_data;
978 KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_GET_NEXT_EVENT);
980 KUNIT_EXPECT_EQ(test, ec_dev->mkbp_event_supported, 0);
984 static void cros_ec_proto_test_query_all_no_mkbp_return0(struct kunit *test)
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;
991 /* Set some garbage bytes. */
992 ec_dev->mkbp_event_supported = 0xbf;
994 /* For cros_ec_get_proto_info() without passthru. */
996 struct ec_response_get_protocol_info *data;
998 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
999 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1002 * Although it doesn't check the value, provides valid sizes so that
1003 * cros_ec_query_all() allocates din and dout correctly.
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;
1010 /* For cros_ec_get_proto_info() with passthru. */
1012 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
1013 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1016 /* For cros_ec_get_host_command_version_mask() for MKBP. */
1018 mock = cros_kunit_ec_xfer_mock_add(test, 0);
1019 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1022 cros_ec_proto_test_query_all_pretest(test);
1023 ret = cros_ec_query_all(ec_dev);
1024 KUNIT_EXPECT_EQ(test, ret, 0);
1026 /* For cros_ec_get_proto_info() without passthru. */
1028 mock = cros_kunit_ec_xfer_mock_next();
1029 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
1038 /* For cros_ec_get_proto_info() with passthru. */
1040 mock = cros_kunit_ec_xfer_mock_next();
1041 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
1052 /* For cros_ec_get_host_command_version_mask() for MKBP. */
1054 struct ec_params_get_cmd_versions *data;
1056 mock = cros_kunit_ec_xfer_mock_next();
1057 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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));
1065 data = (struct ec_params_get_cmd_versions *)mock->i_data;
1066 KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_GET_NEXT_EVENT);
1068 KUNIT_EXPECT_EQ(test, ec_dev->mkbp_event_supported, 0);
1072 static void cros_ec_proto_test_query_all_no_host_sleep(struct kunit *test)
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;
1079 /* Set some garbage bytes. */
1080 ec_dev->host_sleep_v1 = true;
1082 /* For cros_ec_get_proto_info() without passthru. */
1084 struct ec_response_get_protocol_info *data;
1086 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
1087 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1090 * Although it doesn't check the value, provides valid sizes so that
1091 * cros_ec_query_all() allocates din and dout correctly.
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;
1098 /* For cros_ec_get_proto_info() with passthru. */
1100 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
1101 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1104 /* For cros_ec_get_host_command_version_mask() for MKBP. */
1106 mock = cros_kunit_ec_xfer_mock_add(test, 0);
1107 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1110 /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
1112 struct ec_response_get_cmd_versions *data;
1114 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
1115 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1117 data = (struct ec_response_get_cmd_versions *)mock->o_data;
1118 data->version_mask = 0;
1121 cros_ec_proto_test_query_all_pretest(test);
1122 ret = cros_ec_query_all(ec_dev);
1123 KUNIT_EXPECT_EQ(test, ret, 0);
1125 /* For cros_ec_get_proto_info() without passthru. */
1127 mock = cros_kunit_ec_xfer_mock_next();
1128 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
1137 /* For cros_ec_get_proto_info() with passthru. */
1139 mock = cros_kunit_ec_xfer_mock_next();
1140 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
1151 /* For cros_ec_get_host_command_version_mask() for MKBP. */
1153 mock = cros_kunit_ec_xfer_mock_next();
1154 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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));
1163 /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
1165 mock = cros_kunit_ec_xfer_mock_next();
1166 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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));
1174 KUNIT_EXPECT_FALSE(test, ec_dev->host_sleep_v1);
1178 static void cros_ec_proto_test_query_all_no_host_sleep_return0(struct kunit *test)
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;
1185 /* Set some garbage bytes. */
1186 ec_dev->host_sleep_v1 = true;
1188 /* For cros_ec_get_proto_info() without passthru. */
1190 struct ec_response_get_protocol_info *data;
1192 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
1193 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1196 * Although it doesn't check the value, provides valid sizes so that
1197 * cros_ec_query_all() allocates din and dout correctly.
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;
1204 /* For cros_ec_get_proto_info() with passthru. */
1206 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
1207 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1210 /* For cros_ec_get_host_command_version_mask() for MKBP. */
1212 struct ec_response_get_cmd_versions *data;
1214 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
1215 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
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;
1222 /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
1224 mock = cros_kunit_ec_xfer_mock_add(test, 0);
1225 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1228 cros_ec_proto_test_query_all_pretest(test);
1229 ret = cros_ec_query_all(ec_dev);
1230 KUNIT_EXPECT_EQ(test, ret, 0);
1232 /* For cros_ec_get_proto_info() without passthru. */
1234 mock = cros_kunit_ec_xfer_mock_next();
1235 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
1244 /* For cros_ec_get_proto_info() with passthru. */
1246 mock = cros_kunit_ec_xfer_mock_next();
1247 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
1258 /* For cros_ec_get_host_command_version_mask() for MKBP. */
1260 mock = cros_kunit_ec_xfer_mock_next();
1261 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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));
1270 /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
1272 mock = cros_kunit_ec_xfer_mock_next();
1273 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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));
1281 KUNIT_EXPECT_FALSE(test, ec_dev->host_sleep_v1);
1285 static void cros_ec_proto_test_query_all_default_wake_mask_return_error(struct kunit *test)
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;
1292 /* Set some garbage bytes. */
1293 ec_dev->host_event_wake_mask = U32_MAX;
1295 /* For cros_ec_get_proto_info() without passthru. */
1297 struct ec_response_get_protocol_info *data;
1299 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
1300 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1303 * Although it doesn't check the value, provides valid sizes so that
1304 * cros_ec_query_all() allocates din and dout correctly.
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;
1311 /* For cros_ec_get_proto_info() with passthru. */
1313 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
1314 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1317 /* For cros_ec_get_host_command_version_mask() for MKBP. */
1319 mock = cros_kunit_ec_xfer_mock_add(test, 0);
1320 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1323 /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
1325 mock = cros_kunit_ec_xfer_mock_add(test, 0);
1326 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1329 /* For cros_ec_get_host_event_wake_mask(). */
1331 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
1332 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1335 cros_ec_proto_test_query_all_pretest(test);
1336 ret = cros_ec_query_all(ec_dev);
1337 KUNIT_EXPECT_EQ(test, ret, 0);
1339 /* For cros_ec_get_proto_info() without passthru. */
1341 mock = cros_kunit_ec_xfer_mock_next();
1342 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
1351 /* For cros_ec_get_proto_info() with passthru. */
1353 mock = cros_kunit_ec_xfer_mock_next();
1354 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
1365 /* For cros_ec_get_host_command_version_mask() for MKBP. */
1367 mock = cros_kunit_ec_xfer_mock_next();
1368 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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));
1377 /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
1379 mock = cros_kunit_ec_xfer_mock_next();
1380 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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));
1389 /* For cros_ec_get_host_event_wake_mask(). */
1393 mock = cros_kunit_ec_xfer_mock_next();
1394 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
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);
1412 static void cros_ec_proto_test_query_all_default_wake_mask_return0(struct kunit *test)
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;
1419 /* Set some garbage bytes. */
1420 ec_dev->host_event_wake_mask = U32_MAX;
1422 /* For cros_ec_get_proto_info() without passthru. */
1424 struct ec_response_get_protocol_info *data;
1426 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
1427 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1430 * Although it doesn't check the value, provides valid sizes so that
1431 * cros_ec_query_all() allocates din and dout correctly.
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;
1438 /* For cros_ec_get_proto_info() with passthru. */
1440 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
1441 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1444 /* For cros_ec_get_host_command_version_mask() for MKBP. */
1446 mock = cros_kunit_ec_xfer_mock_add(test, 0);
1447 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1450 /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
1452 mock = cros_kunit_ec_xfer_mock_add(test, 0);
1453 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1456 /* For get_host_event_wake_mask(). */
1458 mock = cros_kunit_ec_xfer_mock_add(test, 0);
1459 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1462 cros_ec_proto_test_query_all_pretest(test);
1463 ret = cros_ec_query_all(ec_dev);
1464 KUNIT_EXPECT_EQ(test, ret, 0);
1466 /* For cros_ec_get_proto_info() without passthru. */
1468 mock = cros_kunit_ec_xfer_mock_next();
1469 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
1478 /* For cros_ec_get_proto_info() with passthru. */
1480 mock = cros_kunit_ec_xfer_mock_next();
1481 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
1492 /* For cros_ec_get_host_command_version_mask() for MKBP. */
1494 mock = cros_kunit_ec_xfer_mock_next();
1495 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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));
1504 /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
1506 mock = cros_kunit_ec_xfer_mock_next();
1507 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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));
1516 /* For get_host_event_wake_mask(). */
1520 mock = cros_kunit_ec_xfer_mock_next();
1521 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
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);
1539 static void cros_ec_proto_test_cmd_xfer_normal(struct kunit *test)
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;
1546 struct cros_ec_command msg;
1550 ec_dev->max_request = 0xff;
1551 ec_dev->max_response = 0xee;
1552 ec_dev->max_passthru = 0xdd;
1554 buf.msg.version = 0;
1555 buf.msg.command = EC_CMD_HELLO;
1557 buf.msg.outsize = 2;
1564 mock = cros_kunit_ec_xfer_mock_add(test, 4);
1565 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1567 data = (u8 *)mock->o_data;
1574 ret = cros_ec_cmd_xfer(ec_dev, &buf.msg);
1575 KUNIT_EXPECT_EQ(test, ret, 4);
1580 mock = cros_kunit_ec_xfer_mock_next();
1581 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
1588 data = (u8 *)mock->i_data;
1589 KUNIT_EXPECT_EQ(test, data[0], 0x55);
1590 KUNIT_EXPECT_EQ(test, data[1], 0xaa);
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);
1599 static void cros_ec_proto_test_cmd_xfer_excess_msg_insize(struct kunit *test)
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;
1606 struct cros_ec_command msg;
1610 ec_dev->max_request = 0xff;
1611 ec_dev->max_response = 0xee;
1612 ec_dev->max_passthru = 0xdd;
1614 buf.msg.version = 0;
1615 buf.msg.command = EC_CMD_HELLO;
1616 buf.msg.insize = 0xee + 1;
1617 buf.msg.outsize = 2;
1620 mock = cros_kunit_ec_xfer_mock_add(test, 0xcc);
1621 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1624 ret = cros_ec_cmd_xfer(ec_dev, &buf.msg);
1625 KUNIT_EXPECT_EQ(test, ret, 0xcc);
1628 mock = cros_kunit_ec_xfer_mock_next();
1629 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
1638 static void cros_ec_proto_test_cmd_xfer_excess_msg_outsize_without_passthru(struct kunit *test)
1640 struct cros_ec_proto_test_priv *priv = test->priv;
1641 struct cros_ec_device *ec_dev = &priv->ec_dev;
1644 struct cros_ec_command msg;
1648 ec_dev->max_request = 0xff;
1649 ec_dev->max_response = 0xee;
1650 ec_dev->max_passthru = 0xdd;
1652 buf.msg.version = 0;
1653 buf.msg.command = EC_CMD_HELLO;
1655 buf.msg.outsize = 0xff + 1;
1657 ret = cros_ec_cmd_xfer(ec_dev, &buf.msg);
1658 KUNIT_EXPECT_EQ(test, ret, -EMSGSIZE);
1661 static void cros_ec_proto_test_cmd_xfer_excess_msg_outsize_with_passthru(struct kunit *test)
1663 struct cros_ec_proto_test_priv *priv = test->priv;
1664 struct cros_ec_device *ec_dev = &priv->ec_dev;
1667 struct cros_ec_command msg;
1671 ec_dev->max_request = 0xff;
1672 ec_dev->max_response = 0xee;
1673 ec_dev->max_passthru = 0xdd;
1675 buf.msg.version = 0;
1676 buf.msg.command = EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) + EC_CMD_HELLO;
1678 buf.msg.outsize = 0xdd + 1;
1680 ret = cros_ec_cmd_xfer(ec_dev, &buf.msg);
1681 KUNIT_EXPECT_EQ(test, ret, -EMSGSIZE);
1684 static void cros_ec_proto_test_cmd_xfer_protocol_v3_normal(struct kunit *test)
1686 struct cros_ec_proto_test_priv *priv = test->priv;
1687 struct cros_ec_device *ec_dev = &priv->ec_dev;
1689 struct cros_ec_command msg;
1691 memset(&msg, 0, sizeof(msg));
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;
1697 ret = cros_ec_cmd_xfer(ec_dev, &msg);
1698 KUNIT_EXPECT_EQ(test, ret, 0);
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);
1704 static void cros_ec_proto_test_cmd_xfer_protocol_v3_no_op(struct kunit *test)
1706 struct cros_ec_proto_test_priv *priv = test->priv;
1707 struct cros_ec_device *ec_dev = &priv->ec_dev;
1709 struct cros_ec_command msg;
1711 memset(&msg, 0, sizeof(msg));
1713 ec_dev->proto_version = 3;
1714 ec_dev->cmd_xfer = cros_kunit_ec_cmd_xfer_mock;
1715 ec_dev->pkt_xfer = NULL;
1717 ret = cros_ec_cmd_xfer(ec_dev, &msg);
1718 KUNIT_EXPECT_EQ(test, ret, -EIO);
1721 static void cros_ec_proto_test_cmd_xfer_protocol_v2_normal(struct kunit *test)
1723 struct cros_ec_proto_test_priv *priv = test->priv;
1724 struct cros_ec_device *ec_dev = &priv->ec_dev;
1726 struct cros_ec_command msg;
1728 memset(&msg, 0, sizeof(msg));
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;
1734 ret = cros_ec_cmd_xfer(ec_dev, &msg);
1735 KUNIT_EXPECT_EQ(test, ret, 0);
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);
1741 static void cros_ec_proto_test_cmd_xfer_protocol_v2_no_op(struct kunit *test)
1743 struct cros_ec_proto_test_priv *priv = test->priv;
1744 struct cros_ec_device *ec_dev = &priv->ec_dev;
1746 struct cros_ec_command msg;
1748 memset(&msg, 0, sizeof(msg));
1750 ec_dev->proto_version = 2;
1751 ec_dev->cmd_xfer = NULL;
1752 ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock;
1754 ret = cros_ec_cmd_xfer(ec_dev, &msg);
1755 KUNIT_EXPECT_EQ(test, ret, -EIO);
1758 static void cros_ec_proto_test_cmd_xfer_in_progress_normal(struct kunit *test)
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;
1764 struct cros_ec_command msg;
1766 memset(&msg, 0, sizeof(msg));
1768 ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock;
1770 /* For the first host command to return EC_RES_IN_PROGRESS. */
1772 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0);
1773 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1776 /* For EC_CMD_GET_COMMS_STATUS. */
1778 struct ec_response_get_comms_status *data;
1780 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
1781 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1783 data = (struct ec_response_get_comms_status *)mock->o_data;
1787 ret = cros_ec_cmd_xfer(ec_dev, &msg);
1788 KUNIT_EXPECT_EQ(test, ret, sizeof(struct ec_response_get_comms_status));
1790 KUNIT_EXPECT_EQ(test, msg.result, EC_RES_SUCCESS);
1792 /* For the first host command to return EC_RES_IN_PROGRESS. */
1794 mock = cros_kunit_ec_xfer_mock_next();
1795 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
1798 /* For EC_CMD_GET_COMMS_STATUS. */
1800 mock = cros_kunit_ec_xfer_mock_next();
1801 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
1810 KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 2);
1813 static void cros_ec_proto_test_cmd_xfer_in_progress_retries_eagain(struct kunit *test)
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;
1819 struct cros_ec_command msg;
1821 memset(&msg, 0, sizeof(msg));
1823 ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock;
1825 /* For the first host command to return EC_RES_IN_PROGRESS. */
1827 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0);
1828 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1831 /* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */
1832 cros_kunit_ec_xfer_mock_default_ret = -EAGAIN;
1834 ret = cros_ec_cmd_xfer(ec_dev, &msg);
1835 KUNIT_EXPECT_EQ(test, ret, -EAGAIN);
1837 /* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */
1838 KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 51);
1841 static void cros_ec_proto_test_cmd_xfer_in_progress_retries_status_processing(struct kunit *test)
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;
1847 struct cros_ec_command msg;
1849 memset(&msg, 0, sizeof(msg));
1851 ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock;
1853 /* For the first host command to return EC_RES_IN_PROGRESS. */
1855 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0);
1856 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1859 /* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */
1861 struct ec_response_get_comms_status *data;
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);
1868 data = (struct ec_response_get_comms_status *)mock->o_data;
1869 data->flags |= EC_COMMS_STATUS_PROCESSING;
1873 ret = cros_ec_cmd_xfer(ec_dev, &msg);
1874 KUNIT_EXPECT_EQ(test, ret, -EAGAIN);
1876 /* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */
1877 KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 51);
1880 static void cros_ec_proto_test_cmd_xfer_in_progress_xfer_error(struct kunit *test)
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;
1886 struct cros_ec_command msg;
1888 memset(&msg, 0, sizeof(msg));
1890 /* For the first host command to return EC_RES_IN_PROGRESS. */
1892 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0);
1893 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1896 /* For EC_CMD_GET_COMMS_STATUS. */
1898 mock = cros_kunit_ec_xfer_mock_addx(test, -EIO, EC_RES_SUCCESS, 0);
1899 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1902 ret = cros_ec_cmd_xfer(ec_dev, &msg);
1903 KUNIT_EXPECT_EQ(test, ret, -EIO);
1906 static void cros_ec_proto_test_cmd_xfer_in_progress_return_error(struct kunit *test)
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;
1912 struct cros_ec_command msg;
1914 memset(&msg, 0, sizeof(msg));
1916 ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock;
1918 /* For the first host command to return EC_RES_IN_PROGRESS. */
1920 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0);
1921 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1924 /* For EC_CMD_GET_COMMS_STATUS. */
1926 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
1927 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1930 ret = cros_ec_cmd_xfer(ec_dev, &msg);
1931 KUNIT_EXPECT_EQ(test, ret, 0);
1933 KUNIT_EXPECT_EQ(test, msg.result, EC_RES_INVALID_COMMAND);
1935 KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 2);
1938 static void cros_ec_proto_test_cmd_xfer_in_progress_return0(struct kunit *test)
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;
1944 struct cros_ec_command msg;
1946 memset(&msg, 0, sizeof(msg));
1948 ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock;
1950 /* For the first host command to return EC_RES_IN_PROGRESS. */
1952 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0);
1953 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1956 /* For EC_CMD_GET_COMMS_STATUS. */
1958 mock = cros_kunit_ec_xfer_mock_add(test, 0);
1959 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1962 ret = cros_ec_cmd_xfer(ec_dev, &msg);
1963 KUNIT_EXPECT_EQ(test, ret, -EPROTO);
1965 KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 2);
1968 static void cros_ec_proto_test_cmd_xfer_status_normal(struct kunit *test)
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;
1974 struct cros_ec_command msg;
1976 memset(&msg, 0, sizeof(msg));
1978 /* For cros_ec_cmd_xfer(). */
1980 mock = cros_kunit_ec_xfer_mock_add(test, 0);
1981 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1984 ret = cros_ec_cmd_xfer_status(ec_dev, &msg);
1985 KUNIT_EXPECT_EQ(test, ret, 0);
1988 static void cros_ec_proto_test_cmd_xfer_status_xfer_error(struct kunit *test)
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;
1994 struct cros_ec_command msg;
1996 memset(&msg, 0, sizeof(msg));
1998 /* For cros_ec_cmd_xfer(). */
2000 mock = cros_kunit_ec_xfer_mock_addx(test, -EPROTO, EC_RES_SUCCESS, 0);
2001 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
2004 ret = cros_ec_cmd_xfer_status(ec_dev, &msg);
2005 KUNIT_EXPECT_EQ(test, ret, -EPROTO);
2008 static void cros_ec_proto_test_cmd_xfer_status_return_error(struct kunit *test)
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;
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,
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().
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,
2045 memset(&msg, 0, sizeof(msg));
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);
2051 ret = cros_ec_cmd_xfer_status(ec_dev, &msg);
2052 KUNIT_EXPECT_EQ(test, ret, map[i]);
2056 static void cros_ec_proto_test_get_next_event_no_mkbp_event(struct kunit *test)
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;
2062 bool wake_event, more_events;
2064 ec_dev->max_request = 0xff;
2065 ec_dev->max_response = 0xee;
2066 ec_dev->mkbp_event_supported = 0;
2068 /* Set some garbage bytes. */
2072 /* For get_keyboard_state_event(). */
2074 union ec_response_get_next_data_v1 *data;
2076 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
2077 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
2079 data = (union ec_response_get_next_data_v1 *)mock->o_data;
2080 data->host_event = 0xbeef;
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));
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);
2089 KUNIT_EXPECT_TRUE(test, wake_event);
2090 KUNIT_EXPECT_FALSE(test, more_events);
2092 /* For get_keyboard_state_event(). */
2094 mock = cros_kunit_ec_xfer_mock_next();
2095 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
2104 static void cros_ec_proto_test_get_next_event_mkbp_event_ec_suspended(struct kunit *test)
2106 struct cros_ec_proto_test_priv *priv = test->priv;
2107 struct cros_ec_device *ec_dev = &priv->ec_dev;
2110 ec_dev->mkbp_event_supported = 1;
2111 ec_dev->suspended = true;
2113 ret = cros_ec_get_next_event(ec_dev, NULL, NULL);
2114 KUNIT_EXPECT_EQ(test, ret, -EHOSTDOWN);
2117 static void cros_ec_proto_test_get_next_event_mkbp_event_version0(struct kunit *test)
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;
2123 bool wake_event, more_events;
2125 ec_dev->max_request = 0xff;
2126 ec_dev->max_response = 0xee;
2127 ec_dev->mkbp_event_supported = 1;
2129 /* Set some garbage bytes. */
2131 more_events = false;
2133 /* For get_next_event_xfer(). */
2135 struct ec_response_get_next_event *data;
2137 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
2138 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
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;
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));
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);
2151 KUNIT_EXPECT_FALSE(test, wake_event);
2152 KUNIT_EXPECT_TRUE(test, more_events);
2154 /* For get_next_event_xfer(). */
2156 mock = cros_kunit_ec_xfer_mock_next();
2157 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
2166 static void cros_ec_proto_test_get_next_event_mkbp_event_version2(struct kunit *test)
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;
2172 bool wake_event, more_events;
2174 ec_dev->max_request = 0xff;
2175 ec_dev->max_response = 0xee;
2176 ec_dev->mkbp_event_supported = 3;
2178 /* Set some garbage bytes. */
2182 /* For get_next_event_xfer(). */
2184 struct ec_response_get_next_event_v1 *data;
2186 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
2187 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
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;
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));
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);
2200 KUNIT_EXPECT_TRUE(test, wake_event);
2201 KUNIT_EXPECT_FALSE(test, more_events);
2203 /* For get_next_event_xfer(). */
2205 mock = cros_kunit_ec_xfer_mock_next();
2206 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
2216 static void cros_ec_proto_test_get_next_event_mkbp_event_host_event_rtc(struct kunit *test)
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;
2223 struct ec_response_get_next_event_v1 *data;
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;
2230 /* Set some garbage bytes. */
2233 /* For get_next_event_xfer(). */
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);
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);
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));
2248 KUNIT_EXPECT_EQ(test, ec_dev->event_data.event_type, EC_MKBP_EVENT_HOST_EVENT);
2250 KUNIT_EXPECT_FALSE(test, wake_event);
2252 /* For get_next_event_xfer(). */
2254 mock = cros_kunit_ec_xfer_mock_next();
2255 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
2265 static void cros_ec_proto_test_get_next_event_mkbp_event_host_event_masked(struct kunit *test)
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;
2272 struct ec_response_get_next_event_v1 *data;
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);
2279 /* Set some garbage bytes. */
2282 /* For get_next_event_xfer(). */
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);
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);
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));
2298 KUNIT_EXPECT_EQ(test, ec_dev->event_data.event_type, EC_MKBP_EVENT_HOST_EVENT);
2300 KUNIT_EXPECT_FALSE(test, wake_event);
2302 /* For get_next_event_xfer(). */
2304 mock = cros_kunit_ec_xfer_mock_next();
2305 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
2315 static void cros_ec_proto_test_get_host_event_no_mkbp_event(struct kunit *test)
2317 struct cros_ec_proto_test_priv *priv = test->priv;
2318 struct cros_ec_device *ec_dev = &priv->ec_dev;
2321 ec_dev->mkbp_event_supported = 0;
2323 ret = cros_ec_get_host_event(ec_dev);
2324 KUNIT_EXPECT_EQ(test, ret, 0);
2327 static void cros_ec_proto_test_get_host_event_not_host_event(struct kunit *test)
2329 struct cros_ec_proto_test_priv *priv = test->priv;
2330 struct cros_ec_device *ec_dev = &priv->ec_dev;
2333 ec_dev->mkbp_event_supported = 1;
2334 ec_dev->event_data.event_type = EC_MKBP_EVENT_FINGERPRINT;
2336 ret = cros_ec_get_host_event(ec_dev);
2337 KUNIT_EXPECT_EQ(test, ret, 0);
2340 static void cros_ec_proto_test_get_host_event_wrong_event_size(struct kunit *test)
2342 struct cros_ec_proto_test_priv *priv = test->priv;
2343 struct cros_ec_device *ec_dev = &priv->ec_dev;
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;
2350 ret = cros_ec_get_host_event(ec_dev);
2351 KUNIT_EXPECT_EQ(test, ret, 0);
2354 static void cros_ec_proto_test_get_host_event_normal(struct kunit *test)
2356 struct cros_ec_proto_test_priv *priv = test->priv;
2357 struct cros_ec_device *ec_dev = &priv->ec_dev;
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);
2366 ret = cros_ec_get_host_event(ec_dev);
2367 KUNIT_EXPECT_EQ(test, ret, EC_HOST_EVENT_MASK(EC_HOST_EVENT_RTC));
2370 static void cros_ec_proto_test_check_features_cached(struct kunit *test)
2373 struct cros_ec_dev ec;
2375 ec.features.flags[0] = EC_FEATURE_MASK_0(EC_FEATURE_FINGERPRINT);
2376 ec.features.flags[1] = EC_FEATURE_MASK_0(EC_FEATURE_SCP);
2378 for (i = 0; i < EC_FEATURE_TYPEC_MUX_REQUIRE_AP_ACK; ++i) {
2379 ret = cros_ec_check_features(&ec, i);
2381 case EC_FEATURE_FINGERPRINT:
2382 case EC_FEATURE_SCP:
2383 KUNIT_EXPECT_TRUE(test, ret);
2386 KUNIT_EXPECT_FALSE(test, ret);
2392 static void cros_ec_proto_test_check_features_not_cached(struct kunit *test)
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;
2398 struct cros_ec_dev ec;
2400 ec_dev->max_request = 0xff;
2401 ec_dev->max_response = 0xee;
2403 ec.dev = ec_dev->dev;
2405 ec.features.flags[0] = -1;
2406 ec.features.flags[1] = -1;
2408 /* For EC_CMD_GET_FEATURES. */
2410 struct ec_response_get_features *data;
2412 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
2413 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
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);
2420 for (i = 0; i < EC_FEATURE_TYPEC_MUX_REQUIRE_AP_ACK; ++i) {
2421 ret = cros_ec_check_features(&ec, i);
2423 case EC_FEATURE_FINGERPRINT:
2424 case EC_FEATURE_SCP:
2425 KUNIT_EXPECT_TRUE(test, ret);
2428 KUNIT_EXPECT_FALSE(test, ret);
2433 /* For EC_CMD_GET_FEATURES. */
2435 mock = cros_kunit_ec_xfer_mock_next();
2436 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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);
2445 static void cros_ec_proto_test_get_sensor_count_normal(struct kunit *test)
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;
2451 struct cros_ec_dev ec;
2453 ec_dev->max_request = 0xff;
2454 ec_dev->max_response = 0xee;
2456 ec.dev = ec_dev->dev;
2459 /* For EC_CMD_MOTION_SENSE_CMD. */
2461 struct ec_response_motion_sense *data;
2463 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
2464 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
2466 data = (struct ec_response_motion_sense *)mock->o_data;
2467 data->dump.sensor_count = 0xbf;
2470 ret = cros_ec_get_sensor_count(&ec);
2471 KUNIT_EXPECT_EQ(test, ret, 0xbf);
2473 /* For EC_CMD_MOTION_SENSE_CMD. */
2475 struct ec_params_motion_sense *data;
2477 mock = cros_kunit_ec_xfer_mock_next();
2478 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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));
2485 data = (struct ec_params_motion_sense *)mock->i_data;
2486 KUNIT_EXPECT_EQ(test, data->cmd, MOTIONSENSE_CMD_DUMP);
2490 static void cros_ec_proto_test_get_sensor_count_xfer_error(struct kunit *test)
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;
2496 struct cros_ec_dev ec;
2498 ec_dev->max_request = 0xff;
2499 ec_dev->max_response = 0xee;
2501 ec.dev = ec_dev->dev;
2504 /* For EC_CMD_MOTION_SENSE_CMD. */
2506 mock = cros_kunit_ec_xfer_mock_addx(test, -EPROTO, EC_RES_SUCCESS, 0);
2507 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
2510 ret = cros_ec_get_sensor_count(&ec);
2511 KUNIT_EXPECT_EQ(test, ret, -EPROTO);
2513 /* For EC_CMD_MOTION_SENSE_CMD. */
2515 struct ec_params_motion_sense *data;
2517 mock = cros_kunit_ec_xfer_mock_next();
2518 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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));
2525 data = (struct ec_params_motion_sense *)mock->i_data;
2526 KUNIT_EXPECT_EQ(test, data->cmd, MOTIONSENSE_CMD_DUMP);
2530 static void cros_ec_proto_test_get_sensor_count_legacy(struct kunit *test)
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;
2536 struct cros_ec_dev ec;
2539 int expected_result;
2542 { EC_MEMMAP_ACC_STATUS_PRESENCE_BIT, 2 },
2545 ec_dev->max_request = 0xff;
2546 ec_dev->max_response = 0xee;
2547 ec_dev->cmd_readmem = cros_kunit_readmem_mock;
2549 ec.dev = ec_dev->dev;
2552 for (i = 0; i < ARRAY_SIZE(test_data); ++i) {
2553 /* For EC_CMD_MOTION_SENSE_CMD. */
2555 mock = cros_kunit_ec_xfer_mock_addx(test, -EPROTO, EC_RES_SUCCESS, 0);
2556 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
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;
2565 cros_kunit_ec_xfer_mock_default_ret = 1;
2568 ret = cros_ec_get_sensor_count(&ec);
2569 KUNIT_EXPECT_EQ(test, ret, test_data[i].expected_result);
2571 /* For EC_CMD_MOTION_SENSE_CMD. */
2573 struct ec_params_motion_sense *data;
2575 mock = cros_kunit_ec_xfer_mock_next();
2576 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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));
2584 data = (struct ec_params_motion_sense *)mock->i_data;
2585 KUNIT_EXPECT_EQ(test, data->cmd, MOTIONSENSE_CMD_DUMP);
2590 KUNIT_EXPECT_EQ(test, cros_kunit_readmem_mock_offset, EC_MEMMAP_ACC_STATUS);
2595 static void cros_ec_proto_test_ec_cmd(struct kunit *test)
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;
2603 ec_dev->max_request = 0xff;
2604 ec_dev->max_response = 0xee;
2613 mock = cros_kunit_ec_xfer_mock_add(test, 2);
2614 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
2616 data = (u8 *)mock->o_data;
2621 ret = cros_ec_cmd(ec_dev, 0x88, 0x77, out, ARRAY_SIZE(out), in, ARRAY_SIZE(in));
2622 KUNIT_EXPECT_EQ(test, ret, 2);
2627 mock = cros_kunit_ec_xfer_mock_next();
2628 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
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));
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);
2642 static void cros_ec_proto_test_release(struct device *dev)
2646 static int cros_ec_proto_test_init(struct kunit *test)
2648 struct cros_ec_proto_test_priv *priv;
2649 struct cros_ec_device *ec_dev;
2651 priv = kunit_kzalloc(test, sizeof(*priv), GFP_KERNEL);
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);
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;
2671 priv->msg = (struct cros_ec_command *)priv->_msg;
2673 cros_kunit_mock_reset();
2678 static void cros_ec_proto_test_exit(struct kunit *test)
2680 struct cros_ec_proto_test_priv *priv = test->priv;
2681 struct cros_ec_device *ec_dev = &priv->ec_dev;
2683 put_device(ec_dev->dev);
2686 static struct kunit_case cros_ec_proto_test_cases[] = {
2687 KUNIT_CASE(cros_ec_proto_test_prepare_tx_legacy_normal),
2688 KUNIT_CASE(cros_ec_proto_test_prepare_tx_legacy_bad_msg_outsize),
2689 KUNIT_CASE(cros_ec_proto_test_prepare_tx_normal),
2690 KUNIT_CASE(cros_ec_proto_test_prepare_tx_bad_msg_outsize),
2691 KUNIT_CASE(cros_ec_proto_test_check_result),
2692 KUNIT_CASE(cros_ec_proto_test_query_all_normal),
2693 KUNIT_CASE(cros_ec_proto_test_query_all_no_pd_return_error),
2694 KUNIT_CASE(cros_ec_proto_test_query_all_no_pd_return0),
2695 KUNIT_CASE(cros_ec_proto_test_query_all_legacy_normal_v3_return_error),
2696 KUNIT_CASE(cros_ec_proto_test_query_all_legacy_normal_v3_return0),
2697 KUNIT_CASE(cros_ec_proto_test_query_all_legacy_xfer_error),
2698 KUNIT_CASE(cros_ec_proto_test_query_all_legacy_return_error),
2699 KUNIT_CASE(cros_ec_proto_test_query_all_legacy_data_error),
2700 KUNIT_CASE(cros_ec_proto_test_query_all_legacy_return0),
2701 KUNIT_CASE(cros_ec_proto_test_query_all_no_mkbp),
2702 KUNIT_CASE(cros_ec_proto_test_query_all_no_mkbp_return_error),
2703 KUNIT_CASE(cros_ec_proto_test_query_all_no_mkbp_return0),
2704 KUNIT_CASE(cros_ec_proto_test_query_all_no_host_sleep),
2705 KUNIT_CASE(cros_ec_proto_test_query_all_no_host_sleep_return0),
2706 KUNIT_CASE(cros_ec_proto_test_query_all_default_wake_mask_return_error),
2707 KUNIT_CASE(cros_ec_proto_test_query_all_default_wake_mask_return0),
2708 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_normal),
2709 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_excess_msg_insize),
2710 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_excess_msg_outsize_without_passthru),
2711 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_excess_msg_outsize_with_passthru),
2712 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_protocol_v3_normal),
2713 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_protocol_v3_no_op),
2714 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_protocol_v2_normal),
2715 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_protocol_v2_no_op),
2716 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_normal),
2717 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_retries_eagain),
2718 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_retries_status_processing),
2719 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_xfer_error),
2720 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_return_error),
2721 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_return0),
2722 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_status_normal),
2723 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_status_xfer_error),
2724 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_status_return_error),
2725 KUNIT_CASE(cros_ec_proto_test_get_next_event_no_mkbp_event),
2726 KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_ec_suspended),
2727 KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_version0),
2728 KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_version2),
2729 KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_host_event_rtc),
2730 KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_host_event_masked),
2731 KUNIT_CASE(cros_ec_proto_test_get_host_event_no_mkbp_event),
2732 KUNIT_CASE(cros_ec_proto_test_get_host_event_not_host_event),
2733 KUNIT_CASE(cros_ec_proto_test_get_host_event_wrong_event_size),
2734 KUNIT_CASE(cros_ec_proto_test_get_host_event_normal),
2735 KUNIT_CASE(cros_ec_proto_test_check_features_cached),
2736 KUNIT_CASE(cros_ec_proto_test_check_features_not_cached),
2737 KUNIT_CASE(cros_ec_proto_test_get_sensor_count_normal),
2738 KUNIT_CASE(cros_ec_proto_test_get_sensor_count_xfer_error),
2739 KUNIT_CASE(cros_ec_proto_test_get_sensor_count_legacy),
2740 KUNIT_CASE(cros_ec_proto_test_ec_cmd),
2744 static struct kunit_suite cros_ec_proto_test_suite = {
2745 .name = "cros_ec_proto_test",
2746 .init = cros_ec_proto_test_init,
2747 .exit = cros_ec_proto_test_exit,
2748 .test_cases = cros_ec_proto_test_cases,
2751 kunit_test_suite(cros_ec_proto_test_suite);
2753 MODULE_LICENSE("GPL");