1 // SPDX-License-Identifier: GPL-2.0
3 * Kunit tests for ChromeOS Embedded Controller protocol.
6 #include <kunit/test.h>
8 #include <linux/unaligned.h>
10 #include <linux/platform_data/cros_ec_commands.h>
11 #include <linux/platform_data/cros_ec_proto.h>
14 #include "cros_ec_proto_test_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
;
1546 DEFINE_RAW_FLEX(struct cros_ec_command
, buf
, data
, 0x100);
1548 ec_dev
->max_request
= 0xff;
1549 ec_dev
->max_response
= 0xee;
1550 ec_dev
->max_passthru
= 0xdd;
1553 buf
->command
= EC_CMD_HELLO
;
1556 buf
->data
[0] = 0x55;
1557 buf
->data
[1] = 0xaa;
1562 mock
= cros_kunit_ec_xfer_mock_add(test
, 4);
1563 KUNIT_ASSERT_PTR_NE(test
, mock
, NULL
);
1565 data
= (u8
*)mock
->o_data
;
1572 ret
= cros_ec_cmd_xfer(ec_dev
, buf
);
1573 KUNIT_EXPECT_EQ(test
, ret
, 4);
1578 mock
= cros_kunit_ec_xfer_mock_next();
1579 KUNIT_EXPECT_PTR_NE(test
, mock
, NULL
);
1581 KUNIT_EXPECT_EQ(test
, mock
->msg
.version
, 0);
1582 KUNIT_EXPECT_EQ(test
, mock
->msg
.command
, EC_CMD_HELLO
);
1583 KUNIT_EXPECT_EQ(test
, mock
->msg
.insize
, 4);
1584 KUNIT_EXPECT_EQ(test
, mock
->msg
.outsize
, 2);
1586 data
= (u8
*)mock
->i_data
;
1587 KUNIT_EXPECT_EQ(test
, data
[0], 0x55);
1588 KUNIT_EXPECT_EQ(test
, data
[1], 0xaa);
1590 KUNIT_EXPECT_EQ(test
, buf
->data
[0], 0xaa);
1591 KUNIT_EXPECT_EQ(test
, buf
->data
[1], 0x55);
1592 KUNIT_EXPECT_EQ(test
, buf
->data
[2], 0xcc);
1593 KUNIT_EXPECT_EQ(test
, buf
->data
[3], 0x33);
1597 static void cros_ec_proto_test_cmd_xfer_excess_msg_insize(struct kunit
*test
)
1599 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
1600 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
1601 struct ec_xfer_mock
*mock
;
1603 DEFINE_RAW_FLEX(struct cros_ec_command
, buf
, data
, 0x100);
1605 ec_dev
->max_request
= 0xff;
1606 ec_dev
->max_response
= 0xee;
1607 ec_dev
->max_passthru
= 0xdd;
1610 buf
->command
= EC_CMD_HELLO
;
1611 buf
->insize
= 0xee + 1;
1615 mock
= cros_kunit_ec_xfer_mock_add(test
, 0xcc);
1616 KUNIT_ASSERT_PTR_NE(test
, mock
, NULL
);
1619 ret
= cros_ec_cmd_xfer(ec_dev
, buf
);
1620 KUNIT_EXPECT_EQ(test
, ret
, 0xcc);
1623 mock
= cros_kunit_ec_xfer_mock_next();
1624 KUNIT_EXPECT_PTR_NE(test
, mock
, NULL
);
1626 KUNIT_EXPECT_EQ(test
, mock
->msg
.version
, 0);
1627 KUNIT_EXPECT_EQ(test
, mock
->msg
.command
, EC_CMD_HELLO
);
1628 KUNIT_EXPECT_EQ(test
, mock
->msg
.insize
, 0xee);
1629 KUNIT_EXPECT_EQ(test
, mock
->msg
.outsize
, 2);
1633 static void cros_ec_proto_test_cmd_xfer_excess_msg_outsize_without_passthru(struct kunit
*test
)
1635 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
1636 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
1638 DEFINE_RAW_FLEX(struct cros_ec_command
, buf
, data
, 0x100);
1640 ec_dev
->max_request
= 0xff;
1641 ec_dev
->max_response
= 0xee;
1642 ec_dev
->max_passthru
= 0xdd;
1645 buf
->command
= EC_CMD_HELLO
;
1647 buf
->outsize
= 0xff + 1;
1649 ret
= cros_ec_cmd_xfer(ec_dev
, buf
);
1650 KUNIT_EXPECT_EQ(test
, ret
, -EMSGSIZE
);
1653 static void cros_ec_proto_test_cmd_xfer_excess_msg_outsize_with_passthru(struct kunit
*test
)
1655 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
1656 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
1658 DEFINE_RAW_FLEX(struct cros_ec_command
, buf
, data
, 0x100);
1660 ec_dev
->max_request
= 0xff;
1661 ec_dev
->max_response
= 0xee;
1662 ec_dev
->max_passthru
= 0xdd;
1665 buf
->command
= EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX
) + EC_CMD_HELLO
;
1667 buf
->outsize
= 0xdd + 1;
1669 ret
= cros_ec_cmd_xfer(ec_dev
, buf
);
1670 KUNIT_EXPECT_EQ(test
, ret
, -EMSGSIZE
);
1673 static void cros_ec_proto_test_cmd_xfer_protocol_v3_normal(struct kunit
*test
)
1675 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
1676 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
1678 struct cros_ec_command msg
;
1680 memset(&msg
, 0, sizeof(msg
));
1682 ec_dev
->proto_version
= 3;
1683 ec_dev
->cmd_xfer
= cros_kunit_ec_cmd_xfer_mock
;
1684 ec_dev
->pkt_xfer
= cros_kunit_ec_pkt_xfer_mock
;
1686 ret
= cros_ec_cmd_xfer(ec_dev
, &msg
);
1687 KUNIT_EXPECT_EQ(test
, ret
, 0);
1689 KUNIT_EXPECT_EQ(test
, cros_kunit_ec_cmd_xfer_mock_called
, 0);
1690 KUNIT_EXPECT_EQ(test
, cros_kunit_ec_pkt_xfer_mock_called
, 1);
1693 static void cros_ec_proto_test_cmd_xfer_protocol_v3_no_op(struct kunit
*test
)
1695 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
1696 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
1698 struct cros_ec_command msg
;
1700 memset(&msg
, 0, sizeof(msg
));
1702 ec_dev
->proto_version
= 3;
1703 ec_dev
->cmd_xfer
= cros_kunit_ec_cmd_xfer_mock
;
1704 ec_dev
->pkt_xfer
= NULL
;
1706 ret
= cros_ec_cmd_xfer(ec_dev
, &msg
);
1707 KUNIT_EXPECT_EQ(test
, ret
, -EIO
);
1710 static void cros_ec_proto_test_cmd_xfer_protocol_v2_normal(struct kunit
*test
)
1712 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
1713 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
1715 struct cros_ec_command msg
;
1717 memset(&msg
, 0, sizeof(msg
));
1719 ec_dev
->proto_version
= 2;
1720 ec_dev
->cmd_xfer
= cros_kunit_ec_cmd_xfer_mock
;
1721 ec_dev
->pkt_xfer
= cros_kunit_ec_pkt_xfer_mock
;
1723 ret
= cros_ec_cmd_xfer(ec_dev
, &msg
);
1724 KUNIT_EXPECT_EQ(test
, ret
, 0);
1726 KUNIT_EXPECT_EQ(test
, cros_kunit_ec_cmd_xfer_mock_called
, 1);
1727 KUNIT_EXPECT_EQ(test
, cros_kunit_ec_pkt_xfer_mock_called
, 0);
1730 static void cros_ec_proto_test_cmd_xfer_protocol_v2_no_op(struct kunit
*test
)
1732 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
1733 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
1735 struct cros_ec_command msg
;
1737 memset(&msg
, 0, sizeof(msg
));
1739 ec_dev
->proto_version
= 2;
1740 ec_dev
->cmd_xfer
= NULL
;
1741 ec_dev
->pkt_xfer
= cros_kunit_ec_pkt_xfer_mock
;
1743 ret
= cros_ec_cmd_xfer(ec_dev
, &msg
);
1744 KUNIT_EXPECT_EQ(test
, ret
, -EIO
);
1747 static void cros_ec_proto_test_cmd_xfer_in_progress_normal(struct kunit
*test
)
1749 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
1750 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
1751 struct ec_xfer_mock
*mock
;
1753 struct cros_ec_command msg
;
1755 memset(&msg
, 0, sizeof(msg
));
1757 ec_dev
->pkt_xfer
= cros_kunit_ec_pkt_xfer_mock
;
1759 /* For the first host command to return EC_RES_IN_PROGRESS. */
1761 mock
= cros_kunit_ec_xfer_mock_addx(test
, 0, EC_RES_IN_PROGRESS
, 0);
1762 KUNIT_ASSERT_PTR_NE(test
, mock
, NULL
);
1765 /* For EC_CMD_GET_COMMS_STATUS. */
1767 struct ec_response_get_comms_status
*data
;
1769 mock
= cros_kunit_ec_xfer_mock_add(test
, sizeof(*data
));
1770 KUNIT_ASSERT_PTR_NE(test
, mock
, NULL
);
1772 data
= (struct ec_response_get_comms_status
*)mock
->o_data
;
1776 ret
= cros_ec_cmd_xfer(ec_dev
, &msg
);
1777 KUNIT_EXPECT_EQ(test
, ret
, sizeof(struct ec_response_get_comms_status
));
1779 KUNIT_EXPECT_EQ(test
, msg
.result
, EC_RES_SUCCESS
);
1781 /* For the first host command to return EC_RES_IN_PROGRESS. */
1783 mock
= cros_kunit_ec_xfer_mock_next();
1784 KUNIT_EXPECT_PTR_NE(test
, mock
, NULL
);
1787 /* For EC_CMD_GET_COMMS_STATUS. */
1789 mock
= cros_kunit_ec_xfer_mock_next();
1790 KUNIT_EXPECT_PTR_NE(test
, mock
, NULL
);
1792 KUNIT_EXPECT_EQ(test
, mock
->msg
.version
, 0);
1793 KUNIT_EXPECT_EQ(test
, mock
->msg
.command
, EC_CMD_GET_COMMS_STATUS
);
1794 KUNIT_EXPECT_EQ(test
, mock
->msg
.insize
,
1795 sizeof(struct ec_response_get_comms_status
));
1796 KUNIT_EXPECT_EQ(test
, mock
->msg
.outsize
, 0);
1799 KUNIT_EXPECT_EQ(test
, cros_kunit_ec_pkt_xfer_mock_called
, 2);
1802 static void cros_ec_proto_test_cmd_xfer_in_progress_retries_eagain(struct kunit
*test
)
1804 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
1805 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
1806 struct ec_xfer_mock
*mock
;
1808 struct cros_ec_command msg
;
1810 memset(&msg
, 0, sizeof(msg
));
1812 ec_dev
->pkt_xfer
= cros_kunit_ec_pkt_xfer_mock
;
1814 /* For the first host command to return EC_RES_IN_PROGRESS. */
1816 mock
= cros_kunit_ec_xfer_mock_addx(test
, 0, EC_RES_IN_PROGRESS
, 0);
1817 KUNIT_ASSERT_PTR_NE(test
, mock
, NULL
);
1820 /* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */
1821 cros_kunit_ec_xfer_mock_default_ret
= -EAGAIN
;
1823 ret
= cros_ec_cmd_xfer(ec_dev
, &msg
);
1824 KUNIT_EXPECT_EQ(test
, ret
, -EAGAIN
);
1826 /* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */
1827 KUNIT_EXPECT_EQ(test
, cros_kunit_ec_pkt_xfer_mock_called
, 51);
1830 static void cros_ec_proto_test_cmd_xfer_in_progress_retries_status_processing(struct kunit
*test
)
1832 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
1833 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
1834 struct ec_xfer_mock
*mock
;
1836 struct cros_ec_command msg
;
1838 memset(&msg
, 0, sizeof(msg
));
1840 ec_dev
->pkt_xfer
= cros_kunit_ec_pkt_xfer_mock
;
1842 /* For the first host command to return EC_RES_IN_PROGRESS. */
1844 mock
= cros_kunit_ec_xfer_mock_addx(test
, 0, EC_RES_IN_PROGRESS
, 0);
1845 KUNIT_ASSERT_PTR_NE(test
, mock
, NULL
);
1848 /* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */
1850 struct ec_response_get_comms_status
*data
;
1853 for (i
= 0; i
< 50; ++i
) {
1854 mock
= cros_kunit_ec_xfer_mock_add(test
, sizeof(*data
));
1855 KUNIT_ASSERT_PTR_NE(test
, mock
, NULL
);
1857 data
= (struct ec_response_get_comms_status
*)mock
->o_data
;
1858 data
->flags
|= EC_COMMS_STATUS_PROCESSING
;
1862 ret
= cros_ec_cmd_xfer(ec_dev
, &msg
);
1863 KUNIT_EXPECT_EQ(test
, ret
, -EAGAIN
);
1865 /* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */
1866 KUNIT_EXPECT_EQ(test
, cros_kunit_ec_pkt_xfer_mock_called
, 51);
1869 static void cros_ec_proto_test_cmd_xfer_in_progress_xfer_error(struct kunit
*test
)
1871 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
1872 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
1873 struct ec_xfer_mock
*mock
;
1875 struct cros_ec_command msg
;
1877 memset(&msg
, 0, sizeof(msg
));
1879 /* For the first host command to return EC_RES_IN_PROGRESS. */
1881 mock
= cros_kunit_ec_xfer_mock_addx(test
, 0, EC_RES_IN_PROGRESS
, 0);
1882 KUNIT_ASSERT_PTR_NE(test
, mock
, NULL
);
1885 /* For EC_CMD_GET_COMMS_STATUS. */
1887 mock
= cros_kunit_ec_xfer_mock_addx(test
, -EIO
, EC_RES_SUCCESS
, 0);
1888 KUNIT_ASSERT_PTR_NE(test
, mock
, NULL
);
1891 ret
= cros_ec_cmd_xfer(ec_dev
, &msg
);
1892 KUNIT_EXPECT_EQ(test
, ret
, -EIO
);
1895 static void cros_ec_proto_test_cmd_xfer_in_progress_return_error(struct kunit
*test
)
1897 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
1898 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
1899 struct ec_xfer_mock
*mock
;
1901 struct cros_ec_command msg
;
1903 memset(&msg
, 0, sizeof(msg
));
1905 ec_dev
->pkt_xfer
= cros_kunit_ec_pkt_xfer_mock
;
1907 /* For the first host command to return EC_RES_IN_PROGRESS. */
1909 mock
= cros_kunit_ec_xfer_mock_addx(test
, 0, EC_RES_IN_PROGRESS
, 0);
1910 KUNIT_ASSERT_PTR_NE(test
, mock
, NULL
);
1913 /* For EC_CMD_GET_COMMS_STATUS. */
1915 mock
= cros_kunit_ec_xfer_mock_addx(test
, 0, EC_RES_INVALID_COMMAND
, 0);
1916 KUNIT_ASSERT_PTR_NE(test
, mock
, NULL
);
1919 ret
= cros_ec_cmd_xfer(ec_dev
, &msg
);
1920 KUNIT_EXPECT_EQ(test
, ret
, 0);
1922 KUNIT_EXPECT_EQ(test
, msg
.result
, EC_RES_INVALID_COMMAND
);
1924 KUNIT_EXPECT_EQ(test
, cros_kunit_ec_pkt_xfer_mock_called
, 2);
1927 static void cros_ec_proto_test_cmd_xfer_in_progress_return0(struct kunit
*test
)
1929 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
1930 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
1931 struct ec_xfer_mock
*mock
;
1933 struct cros_ec_command msg
;
1935 memset(&msg
, 0, sizeof(msg
));
1937 ec_dev
->pkt_xfer
= cros_kunit_ec_pkt_xfer_mock
;
1939 /* For the first host command to return EC_RES_IN_PROGRESS. */
1941 mock
= cros_kunit_ec_xfer_mock_addx(test
, 0, EC_RES_IN_PROGRESS
, 0);
1942 KUNIT_ASSERT_PTR_NE(test
, mock
, NULL
);
1945 /* For EC_CMD_GET_COMMS_STATUS. */
1947 mock
= cros_kunit_ec_xfer_mock_add(test
, 0);
1948 KUNIT_ASSERT_PTR_NE(test
, mock
, NULL
);
1951 ret
= cros_ec_cmd_xfer(ec_dev
, &msg
);
1952 KUNIT_EXPECT_EQ(test
, ret
, -EPROTO
);
1954 KUNIT_EXPECT_EQ(test
, cros_kunit_ec_pkt_xfer_mock_called
, 2);
1957 static void cros_ec_proto_test_cmd_xfer_status_normal(struct kunit
*test
)
1959 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
1960 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
1961 struct ec_xfer_mock
*mock
;
1963 struct cros_ec_command msg
;
1965 memset(&msg
, 0, sizeof(msg
));
1967 /* For cros_ec_cmd_xfer(). */
1969 mock
= cros_kunit_ec_xfer_mock_add(test
, 0);
1970 KUNIT_ASSERT_PTR_NE(test
, mock
, NULL
);
1973 ret
= cros_ec_cmd_xfer_status(ec_dev
, &msg
);
1974 KUNIT_EXPECT_EQ(test
, ret
, 0);
1977 static void cros_ec_proto_test_cmd_xfer_status_xfer_error(struct kunit
*test
)
1979 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
1980 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
1981 struct ec_xfer_mock
*mock
;
1983 struct cros_ec_command msg
;
1985 memset(&msg
, 0, sizeof(msg
));
1987 /* For cros_ec_cmd_xfer(). */
1989 mock
= cros_kunit_ec_xfer_mock_addx(test
, -EPROTO
, EC_RES_SUCCESS
, 0);
1990 KUNIT_ASSERT_PTR_NE(test
, mock
, NULL
);
1993 ret
= cros_ec_cmd_xfer_status(ec_dev
, &msg
);
1994 KUNIT_EXPECT_EQ(test
, ret
, -EPROTO
);
1997 static void cros_ec_proto_test_cmd_xfer_status_return_error(struct kunit
*test
)
1999 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
2000 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
2001 struct ec_xfer_mock
*mock
;
2003 struct cros_ec_command msg
;
2004 static const int map
[] = {
2005 [EC_RES_SUCCESS
] = 0,
2006 [EC_RES_INVALID_COMMAND
] = -EOPNOTSUPP
,
2007 [EC_RES_ERROR
] = -EIO
,
2008 [EC_RES_INVALID_PARAM
] = -EINVAL
,
2009 [EC_RES_ACCESS_DENIED
] = -EACCES
,
2010 [EC_RES_INVALID_RESPONSE
] = -EPROTO
,
2011 [EC_RES_INVALID_VERSION
] = -ENOPROTOOPT
,
2012 [EC_RES_INVALID_CHECKSUM
] = -EBADMSG
,
2014 * EC_RES_IN_PROGRESS is special because cros_ec_send_command() has extra logic to
2015 * handle it. Note that default cros_kunit_ec_xfer_mock_default_ret == 0 thus
2016 * cros_ec_xfer_command() in cros_ec_wait_until_complete() returns 0. As a result,
2017 * it returns -EPROTO without calling cros_ec_map_error().
2019 [EC_RES_IN_PROGRESS
] = -EPROTO
,
2020 [EC_RES_UNAVAILABLE
] = -ENODATA
,
2021 [EC_RES_TIMEOUT
] = -ETIMEDOUT
,
2022 [EC_RES_OVERFLOW
] = -EOVERFLOW
,
2023 [EC_RES_INVALID_HEADER
] = -EBADR
,
2024 [EC_RES_REQUEST_TRUNCATED
] = -EBADR
,
2025 [EC_RES_RESPONSE_TOO_BIG
] = -EFBIG
,
2026 [EC_RES_BUS_ERROR
] = -EFAULT
,
2027 [EC_RES_BUSY
] = -EBUSY
,
2028 [EC_RES_INVALID_HEADER_VERSION
] = -EBADMSG
,
2029 [EC_RES_INVALID_HEADER_CRC
] = -EBADMSG
,
2030 [EC_RES_INVALID_DATA_CRC
] = -EBADMSG
,
2031 [EC_RES_DUP_UNAVAILABLE
] = -ENODATA
,
2034 memset(&msg
, 0, sizeof(msg
));
2036 for (i
= 0; i
< ARRAY_SIZE(map
); ++i
) {
2037 mock
= cros_kunit_ec_xfer_mock_addx(test
, 0, i
, 0);
2038 KUNIT_ASSERT_PTR_NE(test
, mock
, NULL
);
2040 ret
= cros_ec_cmd_xfer_status(ec_dev
, &msg
);
2041 KUNIT_EXPECT_EQ(test
, ret
, map
[i
]);
2045 static void cros_ec_proto_test_get_next_event_no_mkbp_event(struct kunit
*test
)
2047 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
2048 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
2049 struct ec_xfer_mock
*mock
;
2051 bool wake_event
, more_events
;
2053 ec_dev
->max_request
= 0xff;
2054 ec_dev
->max_response
= 0xee;
2055 ec_dev
->mkbp_event_supported
= 0;
2057 /* Set some garbage bytes. */
2061 /* For get_keyboard_state_event(). */
2063 union ec_response_get_next_data_v3
*data
;
2065 mock
= cros_kunit_ec_xfer_mock_add(test
, sizeof(*data
));
2066 KUNIT_ASSERT_PTR_NE(test
, mock
, NULL
);
2068 data
= (union ec_response_get_next_data_v3
*)mock
->o_data
;
2069 data
->host_event
= 0xbeef;
2072 ret
= cros_ec_get_next_event(ec_dev
, &wake_event
, &more_events
);
2073 KUNIT_EXPECT_EQ(test
, ret
, sizeof(union ec_response_get_next_data_v3
));
2075 KUNIT_EXPECT_EQ(test
, ec_dev
->event_data
.event_type
, EC_MKBP_EVENT_KEY_MATRIX
);
2076 KUNIT_EXPECT_EQ(test
, ec_dev
->event_data
.data
.host_event
, 0xbeef);
2078 KUNIT_EXPECT_TRUE(test
, wake_event
);
2079 KUNIT_EXPECT_FALSE(test
, more_events
);
2081 /* For get_keyboard_state_event(). */
2083 mock
= cros_kunit_ec_xfer_mock_next();
2084 KUNIT_EXPECT_PTR_NE(test
, mock
, NULL
);
2086 KUNIT_EXPECT_EQ(test
, mock
->msg
.version
, 0);
2087 KUNIT_EXPECT_EQ(test
, mock
->msg
.command
, EC_CMD_MKBP_STATE
);
2088 KUNIT_EXPECT_EQ(test
, mock
->msg
.insize
, sizeof(union ec_response_get_next_data_v3
));
2089 KUNIT_EXPECT_EQ(test
, mock
->msg
.outsize
, 0);
2093 static void cros_ec_proto_test_get_next_event_mkbp_event_ec_suspended(struct kunit
*test
)
2095 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
2096 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
2099 ec_dev
->mkbp_event_supported
= 1;
2100 ec_dev
->suspended
= true;
2102 ret
= cros_ec_get_next_event(ec_dev
, NULL
, NULL
);
2103 KUNIT_EXPECT_EQ(test
, ret
, -EHOSTDOWN
);
2106 static void cros_ec_proto_test_get_next_event_mkbp_event_version0(struct kunit
*test
)
2108 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
2109 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
2110 struct ec_xfer_mock
*mock
;
2112 bool wake_event
, more_events
;
2114 ec_dev
->max_request
= 0xff;
2115 ec_dev
->max_response
= 0xee;
2116 ec_dev
->mkbp_event_supported
= 1;
2118 /* Set some garbage bytes. */
2120 more_events
= false;
2122 /* For get_next_event_xfer(). */
2124 struct ec_response_get_next_event
*data
;
2126 mock
= cros_kunit_ec_xfer_mock_add(test
, sizeof(*data
));
2127 KUNIT_ASSERT_PTR_NE(test
, mock
, NULL
);
2129 data
= (struct ec_response_get_next_event
*)mock
->o_data
;
2130 data
->event_type
= EC_MKBP_EVENT_SENSOR_FIFO
| EC_MKBP_HAS_MORE_EVENTS
;
2131 data
->data
.sysrq
= 0xbeef;
2134 ret
= cros_ec_get_next_event(ec_dev
, &wake_event
, &more_events
);
2135 KUNIT_EXPECT_EQ(test
, ret
, sizeof(struct ec_response_get_next_event
));
2137 KUNIT_EXPECT_EQ(test
, ec_dev
->event_data
.event_type
, EC_MKBP_EVENT_SENSOR_FIFO
);
2138 KUNIT_EXPECT_EQ(test
, ec_dev
->event_data
.data
.sysrq
, 0xbeef);
2140 KUNIT_EXPECT_FALSE(test
, wake_event
);
2141 KUNIT_EXPECT_TRUE(test
, more_events
);
2143 /* For get_next_event_xfer(). */
2145 mock
= cros_kunit_ec_xfer_mock_next();
2146 KUNIT_EXPECT_PTR_NE(test
, mock
, NULL
);
2148 KUNIT_EXPECT_EQ(test
, mock
->msg
.version
, 0);
2149 KUNIT_EXPECT_EQ(test
, mock
->msg
.command
, EC_CMD_GET_NEXT_EVENT
);
2150 KUNIT_EXPECT_EQ(test
, mock
->msg
.insize
, sizeof(struct ec_response_get_next_event
));
2151 KUNIT_EXPECT_EQ(test
, mock
->msg
.outsize
, 0);
2155 static void cros_ec_proto_test_get_next_event_mkbp_event_version2(struct kunit
*test
)
2157 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
2158 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
2159 struct ec_xfer_mock
*mock
;
2161 bool wake_event
, more_events
;
2163 ec_dev
->max_request
= 0xff;
2164 ec_dev
->max_response
= 0xee;
2165 ec_dev
->mkbp_event_supported
= 3;
2167 /* Set some garbage bytes. */
2171 /* For get_next_event_xfer(). */
2173 struct ec_response_get_next_event_v1
*data
;
2175 mock
= cros_kunit_ec_xfer_mock_add(test
, sizeof(*data
));
2176 KUNIT_ASSERT_PTR_NE(test
, mock
, NULL
);
2178 data
= (struct ec_response_get_next_event_v1
*)mock
->o_data
;
2179 data
->event_type
= EC_MKBP_EVENT_FINGERPRINT
;
2180 data
->data
.sysrq
= 0xbeef;
2183 ret
= cros_ec_get_next_event(ec_dev
, &wake_event
, &more_events
);
2184 KUNIT_EXPECT_EQ(test
, ret
, sizeof(struct ec_response_get_next_event_v1
));
2186 KUNIT_EXPECT_EQ(test
, ec_dev
->event_data
.event_type
, EC_MKBP_EVENT_FINGERPRINT
);
2187 KUNIT_EXPECT_EQ(test
, ec_dev
->event_data
.data
.sysrq
, 0xbeef);
2189 KUNIT_EXPECT_TRUE(test
, wake_event
);
2190 KUNIT_EXPECT_FALSE(test
, more_events
);
2192 /* For get_next_event_xfer(). */
2194 mock
= cros_kunit_ec_xfer_mock_next();
2195 KUNIT_EXPECT_PTR_NE(test
, mock
, NULL
);
2197 KUNIT_EXPECT_EQ(test
, mock
->msg
.version
, 2);
2198 KUNIT_EXPECT_EQ(test
, mock
->msg
.command
, EC_CMD_GET_NEXT_EVENT
);
2199 KUNIT_EXPECT_EQ(test
, mock
->msg
.insize
,
2200 sizeof(struct ec_response_get_next_event_v1
));
2201 KUNIT_EXPECT_EQ(test
, mock
->msg
.outsize
, 0);
2205 static void cros_ec_proto_test_get_next_event_mkbp_event_host_event_rtc(struct kunit
*test
)
2207 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
2208 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
2209 struct ec_xfer_mock
*mock
;
2212 struct ec_response_get_next_event_v1
*data
;
2214 ec_dev
->max_request
= 0xff;
2215 ec_dev
->max_response
= 0xee;
2216 ec_dev
->mkbp_event_supported
= 3;
2217 ec_dev
->host_event_wake_mask
= U32_MAX
;
2219 /* Set some garbage bytes. */
2222 /* For get_next_event_xfer(). */
2224 mock
= cros_kunit_ec_xfer_mock_add(test
,
2225 sizeof(data
->event_type
) +
2226 sizeof(data
->data
.host_event
));
2227 KUNIT_ASSERT_PTR_NE(test
, mock
, NULL
);
2229 data
= (struct ec_response_get_next_event_v1
*)mock
->o_data
;
2230 data
->event_type
= EC_MKBP_EVENT_HOST_EVENT
;
2231 put_unaligned_le32(EC_HOST_EVENT_MASK(EC_HOST_EVENT_RTC
), &data
->data
.host_event
);
2234 ret
= cros_ec_get_next_event(ec_dev
, &wake_event
, NULL
);
2235 KUNIT_EXPECT_EQ(test
, ret
, sizeof(data
->event_type
) + sizeof(data
->data
.host_event
));
2237 KUNIT_EXPECT_EQ(test
, ec_dev
->event_data
.event_type
, EC_MKBP_EVENT_HOST_EVENT
);
2239 KUNIT_EXPECT_FALSE(test
, wake_event
);
2241 /* For get_next_event_xfer(). */
2243 mock
= cros_kunit_ec_xfer_mock_next();
2244 KUNIT_EXPECT_PTR_NE(test
, mock
, NULL
);
2246 KUNIT_EXPECT_EQ(test
, mock
->msg
.version
, 2);
2247 KUNIT_EXPECT_EQ(test
, mock
->msg
.command
, EC_CMD_GET_NEXT_EVENT
);
2248 KUNIT_EXPECT_EQ(test
, mock
->msg
.insize
,
2249 sizeof(struct ec_response_get_next_event_v1
));
2250 KUNIT_EXPECT_EQ(test
, mock
->msg
.outsize
, 0);
2254 static void cros_ec_proto_test_get_next_event_mkbp_event_host_event_masked(struct kunit
*test
)
2256 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
2257 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
2258 struct ec_xfer_mock
*mock
;
2261 struct ec_response_get_next_event_v1
*data
;
2263 ec_dev
->max_request
= 0xff;
2264 ec_dev
->max_response
= 0xee;
2265 ec_dev
->mkbp_event_supported
= 3;
2266 ec_dev
->host_event_wake_mask
= U32_MAX
& ~EC_HOST_EVENT_MASK(EC_HOST_EVENT_AC_DISCONNECTED
);
2268 /* Set some garbage bytes. */
2271 /* For get_next_event_xfer(). */
2273 mock
= cros_kunit_ec_xfer_mock_add(test
,
2274 sizeof(data
->event_type
) +
2275 sizeof(data
->data
.host_event
));
2276 KUNIT_ASSERT_PTR_NE(test
, mock
, NULL
);
2278 data
= (struct ec_response_get_next_event_v1
*)mock
->o_data
;
2279 data
->event_type
= EC_MKBP_EVENT_HOST_EVENT
;
2280 put_unaligned_le32(EC_HOST_EVENT_MASK(EC_HOST_EVENT_AC_DISCONNECTED
),
2281 &data
->data
.host_event
);
2284 ret
= cros_ec_get_next_event(ec_dev
, &wake_event
, NULL
);
2285 KUNIT_EXPECT_EQ(test
, ret
, sizeof(data
->event_type
) + sizeof(data
->data
.host_event
));
2287 KUNIT_EXPECT_EQ(test
, ec_dev
->event_data
.event_type
, EC_MKBP_EVENT_HOST_EVENT
);
2289 KUNIT_EXPECT_FALSE(test
, wake_event
);
2291 /* For get_next_event_xfer(). */
2293 mock
= cros_kunit_ec_xfer_mock_next();
2294 KUNIT_EXPECT_PTR_NE(test
, mock
, NULL
);
2296 KUNIT_EXPECT_EQ(test
, mock
->msg
.version
, 2);
2297 KUNIT_EXPECT_EQ(test
, mock
->msg
.command
, EC_CMD_GET_NEXT_EVENT
);
2298 KUNIT_EXPECT_EQ(test
, mock
->msg
.insize
,
2299 sizeof(struct ec_response_get_next_event_v1
));
2300 KUNIT_EXPECT_EQ(test
, mock
->msg
.outsize
, 0);
2304 static void cros_ec_proto_test_get_host_event_no_mkbp_event(struct kunit
*test
)
2306 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
2307 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
2310 ec_dev
->mkbp_event_supported
= 0;
2312 ret
= cros_ec_get_host_event(ec_dev
);
2313 KUNIT_EXPECT_EQ(test
, ret
, 0);
2316 static void cros_ec_proto_test_get_host_event_not_host_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
= 1;
2323 ec_dev
->event_data
.event_type
= EC_MKBP_EVENT_FINGERPRINT
;
2325 ret
= cros_ec_get_host_event(ec_dev
);
2326 KUNIT_EXPECT_EQ(test
, ret
, 0);
2329 static void cros_ec_proto_test_get_host_event_wrong_event_size(struct kunit
*test
)
2331 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
2332 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
2335 ec_dev
->mkbp_event_supported
= 1;
2336 ec_dev
->event_data
.event_type
= EC_MKBP_EVENT_HOST_EVENT
;
2337 ec_dev
->event_size
= 0xff;
2339 ret
= cros_ec_get_host_event(ec_dev
);
2340 KUNIT_EXPECT_EQ(test
, ret
, 0);
2343 static void cros_ec_proto_test_get_host_event_normal(struct kunit
*test
)
2345 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
2346 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
2349 ec_dev
->mkbp_event_supported
= 1;
2350 ec_dev
->event_data
.event_type
= EC_MKBP_EVENT_HOST_EVENT
;
2351 ec_dev
->event_size
= sizeof(ec_dev
->event_data
.data
.host_event
);
2352 put_unaligned_le32(EC_HOST_EVENT_MASK(EC_HOST_EVENT_RTC
),
2353 &ec_dev
->event_data
.data
.host_event
);
2355 ret
= cros_ec_get_host_event(ec_dev
);
2356 KUNIT_EXPECT_EQ(test
, ret
, EC_HOST_EVENT_MASK(EC_HOST_EVENT_RTC
));
2359 static void cros_ec_proto_test_check_features_cached(struct kunit
*test
)
2362 static struct cros_ec_dev ec
;
2364 ec
.features
.flags
[0] = EC_FEATURE_MASK_0(EC_FEATURE_FINGERPRINT
);
2365 ec
.features
.flags
[1] = EC_FEATURE_MASK_0(EC_FEATURE_SCP
);
2367 for (i
= 0; i
< EC_FEATURE_TYPEC_MUX_REQUIRE_AP_ACK
; ++i
) {
2368 ret
= cros_ec_check_features(&ec
, i
);
2370 case EC_FEATURE_FINGERPRINT
:
2371 case EC_FEATURE_SCP
:
2372 KUNIT_EXPECT_TRUE(test
, ret
);
2375 KUNIT_EXPECT_FALSE(test
, ret
);
2381 static void cros_ec_proto_test_check_features_not_cached(struct kunit
*test
)
2383 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
2384 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
2385 struct ec_xfer_mock
*mock
;
2387 static struct cros_ec_dev ec
;
2389 ec_dev
->max_request
= 0xff;
2390 ec_dev
->max_response
= 0xee;
2392 ec
.dev
= ec_dev
->dev
;
2394 ec
.features
.flags
[0] = -1;
2395 ec
.features
.flags
[1] = -1;
2397 /* For EC_CMD_GET_FEATURES. */
2399 struct ec_response_get_features
*data
;
2401 mock
= cros_kunit_ec_xfer_mock_add(test
, sizeof(*data
));
2402 KUNIT_ASSERT_PTR_NE(test
, mock
, NULL
);
2404 data
= (struct ec_response_get_features
*)mock
->o_data
;
2405 data
->flags
[0] = EC_FEATURE_MASK_0(EC_FEATURE_FINGERPRINT
);
2406 data
->flags
[1] = EC_FEATURE_MASK_0(EC_FEATURE_SCP
);
2409 for (i
= 0; i
< EC_FEATURE_TYPEC_MUX_REQUIRE_AP_ACK
; ++i
) {
2410 ret
= cros_ec_check_features(&ec
, i
);
2412 case EC_FEATURE_FINGERPRINT
:
2413 case EC_FEATURE_SCP
:
2414 KUNIT_EXPECT_TRUE(test
, ret
);
2417 KUNIT_EXPECT_FALSE(test
, ret
);
2422 /* For EC_CMD_GET_FEATURES. */
2424 mock
= cros_kunit_ec_xfer_mock_next();
2425 KUNIT_EXPECT_PTR_NE(test
, mock
, NULL
);
2427 KUNIT_EXPECT_EQ(test
, mock
->msg
.version
, 0);
2428 KUNIT_EXPECT_EQ(test
, mock
->msg
.command
, EC_CMD_GET_FEATURES
);
2429 KUNIT_EXPECT_EQ(test
, mock
->msg
.insize
, sizeof(struct ec_response_get_features
));
2430 KUNIT_EXPECT_EQ(test
, mock
->msg
.outsize
, 0);
2434 static void cros_ec_proto_test_get_sensor_count_normal(struct kunit
*test
)
2436 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
2437 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
2438 struct ec_xfer_mock
*mock
;
2440 static struct cros_ec_dev ec
;
2442 ec_dev
->max_request
= 0xff;
2443 ec_dev
->max_response
= 0xee;
2445 ec
.dev
= ec_dev
->dev
;
2448 /* For EC_CMD_MOTION_SENSE_CMD. */
2450 struct ec_response_motion_sense
*data
;
2452 mock
= cros_kunit_ec_xfer_mock_add(test
, sizeof(*data
));
2453 KUNIT_ASSERT_PTR_NE(test
, mock
, NULL
);
2455 data
= (struct ec_response_motion_sense
*)mock
->o_data
;
2456 data
->dump
.sensor_count
= 0xbf;
2459 ret
= cros_ec_get_sensor_count(&ec
);
2460 KUNIT_EXPECT_EQ(test
, ret
, 0xbf);
2462 /* For EC_CMD_MOTION_SENSE_CMD. */
2464 struct ec_params_motion_sense
*data
;
2466 mock
= cros_kunit_ec_xfer_mock_next();
2467 KUNIT_EXPECT_PTR_NE(test
, mock
, NULL
);
2469 KUNIT_EXPECT_EQ(test
, mock
->msg
.version
, 1);
2470 KUNIT_EXPECT_EQ(test
, mock
->msg
.command
, EC_CMD_MOTION_SENSE_CMD
);
2471 KUNIT_EXPECT_EQ(test
, mock
->msg
.insize
, sizeof(struct ec_response_motion_sense
));
2472 KUNIT_EXPECT_EQ(test
, mock
->msg
.outsize
, sizeof(*data
));
2474 data
= (struct ec_params_motion_sense
*)mock
->i_data
;
2475 KUNIT_EXPECT_EQ(test
, data
->cmd
, MOTIONSENSE_CMD_DUMP
);
2479 static void cros_ec_proto_test_get_sensor_count_xfer_error(struct kunit
*test
)
2481 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
2482 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
2483 struct ec_xfer_mock
*mock
;
2485 static struct cros_ec_dev ec
;
2487 ec_dev
->max_request
= 0xff;
2488 ec_dev
->max_response
= 0xee;
2490 ec
.dev
= ec_dev
->dev
;
2493 /* For EC_CMD_MOTION_SENSE_CMD. */
2495 mock
= cros_kunit_ec_xfer_mock_addx(test
, -EPROTO
, EC_RES_SUCCESS
, 0);
2496 KUNIT_ASSERT_PTR_NE(test
, mock
, NULL
);
2499 ret
= cros_ec_get_sensor_count(&ec
);
2500 KUNIT_EXPECT_EQ(test
, ret
, -EPROTO
);
2502 /* For EC_CMD_MOTION_SENSE_CMD. */
2504 struct ec_params_motion_sense
*data
;
2506 mock
= cros_kunit_ec_xfer_mock_next();
2507 KUNIT_EXPECT_PTR_NE(test
, mock
, NULL
);
2509 KUNIT_EXPECT_EQ(test
, mock
->msg
.version
, 1);
2510 KUNIT_EXPECT_EQ(test
, mock
->msg
.command
, EC_CMD_MOTION_SENSE_CMD
);
2511 KUNIT_EXPECT_EQ(test
, mock
->msg
.insize
, sizeof(struct ec_response_motion_sense
));
2512 KUNIT_EXPECT_EQ(test
, mock
->msg
.outsize
, sizeof(*data
));
2514 data
= (struct ec_params_motion_sense
*)mock
->i_data
;
2515 KUNIT_EXPECT_EQ(test
, data
->cmd
, MOTIONSENSE_CMD_DUMP
);
2519 static void cros_ec_proto_test_get_sensor_count_legacy(struct kunit
*test
)
2521 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
2522 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
2523 struct ec_xfer_mock
*mock
;
2525 static struct cros_ec_dev ec
;
2528 int expected_result
;
2531 { EC_MEMMAP_ACC_STATUS_PRESENCE_BIT
, 2 },
2534 ec_dev
->max_request
= 0xff;
2535 ec_dev
->max_response
= 0xee;
2536 ec_dev
->cmd_readmem
= cros_kunit_readmem_mock
;
2538 ec
.dev
= ec_dev
->dev
;
2541 for (i
= 0; i
< ARRAY_SIZE(test_data
); ++i
) {
2542 /* For EC_CMD_MOTION_SENSE_CMD. */
2544 mock
= cros_kunit_ec_xfer_mock_addx(test
, -EPROTO
, EC_RES_SUCCESS
, 0);
2545 KUNIT_ASSERT_PTR_NE(test
, mock
, NULL
);
2550 cros_kunit_readmem_mock_data
= kunit_kzalloc(test
, 1, GFP_KERNEL
);
2551 KUNIT_ASSERT_PTR_NE(test
, cros_kunit_readmem_mock_data
, NULL
);
2552 cros_kunit_readmem_mock_data
[0] = test_data
[i
].readmem_data
;
2554 cros_kunit_ec_xfer_mock_default_ret
= 1;
2557 ret
= cros_ec_get_sensor_count(&ec
);
2558 KUNIT_EXPECT_EQ(test
, ret
, test_data
[i
].expected_result
);
2560 /* For EC_CMD_MOTION_SENSE_CMD. */
2562 struct ec_params_motion_sense
*data
;
2564 mock
= cros_kunit_ec_xfer_mock_next();
2565 KUNIT_EXPECT_PTR_NE(test
, mock
, NULL
);
2567 KUNIT_EXPECT_EQ(test
, mock
->msg
.version
, 1);
2568 KUNIT_EXPECT_EQ(test
, mock
->msg
.command
, EC_CMD_MOTION_SENSE_CMD
);
2569 KUNIT_EXPECT_EQ(test
, mock
->msg
.insize
,
2570 sizeof(struct ec_response_motion_sense
));
2571 KUNIT_EXPECT_EQ(test
, mock
->msg
.outsize
, sizeof(*data
));
2573 data
= (struct ec_params_motion_sense
*)mock
->i_data
;
2574 KUNIT_EXPECT_EQ(test
, data
->cmd
, MOTIONSENSE_CMD_DUMP
);
2579 KUNIT_EXPECT_EQ(test
, cros_kunit_readmem_mock_offset
, EC_MEMMAP_ACC_STATUS
);
2584 static void cros_ec_proto_test_ec_cmd(struct kunit
*test
)
2586 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
2587 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
2588 struct ec_xfer_mock
*mock
;
2592 ec_dev
->max_request
= 0xff;
2593 ec_dev
->max_response
= 0xee;
2602 mock
= cros_kunit_ec_xfer_mock_add(test
, 2);
2603 KUNIT_ASSERT_PTR_NE(test
, mock
, NULL
);
2605 data
= (u8
*)mock
->o_data
;
2610 ret
= cros_ec_cmd(ec_dev
, 0x88, 0x77, out
, ARRAY_SIZE(out
), in
, ARRAY_SIZE(in
));
2611 KUNIT_EXPECT_EQ(test
, ret
, 2);
2616 mock
= cros_kunit_ec_xfer_mock_next();
2617 KUNIT_EXPECT_PTR_NE(test
, mock
, NULL
);
2619 KUNIT_EXPECT_EQ(test
, mock
->msg
.version
, 0x88);
2620 KUNIT_EXPECT_EQ(test
, mock
->msg
.command
, 0x77);
2621 KUNIT_EXPECT_EQ(test
, mock
->msg
.insize
, ARRAY_SIZE(in
));
2622 KUNIT_EXPECT_EQ(test
, mock
->msg
.outsize
, ARRAY_SIZE(out
));
2624 data
= (u8
*)mock
->i_data
;
2625 KUNIT_EXPECT_EQ(test
, data
[0], 0xdd);
2626 KUNIT_EXPECT_EQ(test
, data
[1], 0xcc);
2627 KUNIT_EXPECT_EQ(test
, data
[2], 0xbb);
2631 static void cros_ec_proto_test_release(struct device
*dev
)
2635 static int cros_ec_proto_test_init(struct kunit
*test
)
2637 struct cros_ec_proto_test_priv
*priv
;
2638 struct cros_ec_device
*ec_dev
;
2640 priv
= kunit_kzalloc(test
, sizeof(*priv
), GFP_KERNEL
);
2645 ec_dev
= &priv
->ec_dev
;
2646 ec_dev
->dout
= (u8
*)priv
->dout
;
2647 ec_dev
->dout_size
= ARRAY_SIZE(priv
->dout
);
2648 ec_dev
->din
= (u8
*)priv
->din
;
2649 ec_dev
->din_size
= ARRAY_SIZE(priv
->din
);
2650 ec_dev
->proto_version
= EC_HOST_REQUEST_VERSION
;
2651 ec_dev
->dev
= kunit_kzalloc(test
, sizeof(*ec_dev
->dev
), GFP_KERNEL
);
2654 device_initialize(ec_dev
->dev
);
2655 dev_set_name(ec_dev
->dev
, "cros_ec_proto_test");
2656 ec_dev
->dev
->release
= cros_ec_proto_test_release
;
2657 ec_dev
->cmd_xfer
= cros_kunit_ec_xfer_mock
;
2658 ec_dev
->pkt_xfer
= cros_kunit_ec_xfer_mock
;
2659 mutex_init(&ec_dev
->lock
);
2661 priv
->msg
= (struct cros_ec_command
*)priv
->_msg
;
2663 cros_kunit_mock_reset();
2668 static void cros_ec_proto_test_exit(struct kunit
*test
)
2670 struct cros_ec_proto_test_priv
*priv
= test
->priv
;
2671 struct cros_ec_device
*ec_dev
= &priv
->ec_dev
;
2673 put_device(ec_dev
->dev
);
2676 static struct kunit_case cros_ec_proto_test_cases
[] = {
2677 KUNIT_CASE(cros_ec_proto_test_prepare_tx_legacy_normal
),
2678 KUNIT_CASE(cros_ec_proto_test_prepare_tx_legacy_bad_msg_outsize
),
2679 KUNIT_CASE(cros_ec_proto_test_prepare_tx_normal
),
2680 KUNIT_CASE(cros_ec_proto_test_prepare_tx_bad_msg_outsize
),
2681 KUNIT_CASE(cros_ec_proto_test_check_result
),
2682 KUNIT_CASE(cros_ec_proto_test_query_all_normal
),
2683 KUNIT_CASE(cros_ec_proto_test_query_all_no_pd_return_error
),
2684 KUNIT_CASE(cros_ec_proto_test_query_all_no_pd_return0
),
2685 KUNIT_CASE(cros_ec_proto_test_query_all_legacy_normal_v3_return_error
),
2686 KUNIT_CASE(cros_ec_proto_test_query_all_legacy_normal_v3_return0
),
2687 KUNIT_CASE(cros_ec_proto_test_query_all_legacy_xfer_error
),
2688 KUNIT_CASE(cros_ec_proto_test_query_all_legacy_return_error
),
2689 KUNIT_CASE(cros_ec_proto_test_query_all_legacy_data_error
),
2690 KUNIT_CASE(cros_ec_proto_test_query_all_legacy_return0
),
2691 KUNIT_CASE(cros_ec_proto_test_query_all_no_mkbp
),
2692 KUNIT_CASE(cros_ec_proto_test_query_all_no_mkbp_return_error
),
2693 KUNIT_CASE(cros_ec_proto_test_query_all_no_mkbp_return0
),
2694 KUNIT_CASE(cros_ec_proto_test_query_all_no_host_sleep
),
2695 KUNIT_CASE(cros_ec_proto_test_query_all_no_host_sleep_return0
),
2696 KUNIT_CASE(cros_ec_proto_test_query_all_default_wake_mask_return_error
),
2697 KUNIT_CASE(cros_ec_proto_test_query_all_default_wake_mask_return0
),
2698 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_normal
),
2699 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_excess_msg_insize
),
2700 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_excess_msg_outsize_without_passthru
),
2701 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_excess_msg_outsize_with_passthru
),
2702 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_protocol_v3_normal
),
2703 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_protocol_v3_no_op
),
2704 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_protocol_v2_normal
),
2705 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_protocol_v2_no_op
),
2706 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_normal
),
2707 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_retries_eagain
),
2708 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_retries_status_processing
),
2709 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_xfer_error
),
2710 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_return_error
),
2711 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_return0
),
2712 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_status_normal
),
2713 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_status_xfer_error
),
2714 KUNIT_CASE(cros_ec_proto_test_cmd_xfer_status_return_error
),
2715 KUNIT_CASE(cros_ec_proto_test_get_next_event_no_mkbp_event
),
2716 KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_ec_suspended
),
2717 KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_version0
),
2718 KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_version2
),
2719 KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_host_event_rtc
),
2720 KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_host_event_masked
),
2721 KUNIT_CASE(cros_ec_proto_test_get_host_event_no_mkbp_event
),
2722 KUNIT_CASE(cros_ec_proto_test_get_host_event_not_host_event
),
2723 KUNIT_CASE(cros_ec_proto_test_get_host_event_wrong_event_size
),
2724 KUNIT_CASE(cros_ec_proto_test_get_host_event_normal
),
2725 KUNIT_CASE(cros_ec_proto_test_check_features_cached
),
2726 KUNIT_CASE(cros_ec_proto_test_check_features_not_cached
),
2727 KUNIT_CASE(cros_ec_proto_test_get_sensor_count_normal
),
2728 KUNIT_CASE(cros_ec_proto_test_get_sensor_count_xfer_error
),
2729 KUNIT_CASE(cros_ec_proto_test_get_sensor_count_legacy
),
2730 KUNIT_CASE(cros_ec_proto_test_ec_cmd
),
2734 static struct kunit_suite cros_ec_proto_test_suite
= {
2735 .name
= "cros_ec_proto_test",
2736 .init
= cros_ec_proto_test_init
,
2737 .exit
= cros_ec_proto_test_exit
,
2738 .test_cases
= cros_ec_proto_test_cases
,
2741 kunit_test_suite(cros_ec_proto_test_suite
);
2743 MODULE_DESCRIPTION("Kunit tests for ChromeOS Embedded Controller protocol");
2744 MODULE_LICENSE("GPL");