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