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