0001
0002
0003
0004
0005
0006 #include <kunit/test.h>
0007
0008 #include <asm-generic/unaligned.h>
0009 #include <linux/platform_data/cros_ec_commands.h>
0010 #include <linux/platform_data/cros_ec_proto.h>
0011
0012 #include "cros_ec.h"
0013 #include "cros_kunit_util.h"
0014
0015 #define BUFSIZE 512
0016
0017 struct cros_ec_proto_test_priv {
0018 struct cros_ec_device ec_dev;
0019 u8 dout[BUFSIZE];
0020 u8 din[BUFSIZE];
0021 struct cros_ec_command *msg;
0022 u8 _msg[BUFSIZE];
0023 };
0024
0025 static void cros_ec_proto_test_prepare_tx_legacy_normal(struct kunit *test)
0026 {
0027 struct cros_ec_proto_test_priv *priv = test->priv;
0028 struct cros_ec_device *ec_dev = &priv->ec_dev;
0029 struct cros_ec_command *msg = priv->msg;
0030 int ret, i;
0031 u8 csum;
0032
0033 ec_dev->proto_version = 2;
0034
0035 msg->command = EC_CMD_HELLO;
0036 msg->outsize = EC_PROTO2_MAX_PARAM_SIZE;
0037 msg->data[0] = 0xde;
0038 msg->data[1] = 0xad;
0039 msg->data[2] = 0xbe;
0040 msg->data[3] = 0xef;
0041
0042 ret = cros_ec_prepare_tx(ec_dev, msg);
0043
0044 KUNIT_EXPECT_EQ(test, ret, EC_MSG_TX_PROTO_BYTES + EC_PROTO2_MAX_PARAM_SIZE);
0045 KUNIT_EXPECT_EQ(test, ec_dev->dout[0], EC_CMD_VERSION0);
0046 KUNIT_EXPECT_EQ(test, ec_dev->dout[1], EC_CMD_HELLO);
0047 KUNIT_EXPECT_EQ(test, ec_dev->dout[2], EC_PROTO2_MAX_PARAM_SIZE);
0048 KUNIT_EXPECT_EQ(test, EC_MSG_TX_HEADER_BYTES, 3);
0049 KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + 0], 0xde);
0050 KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + 1], 0xad);
0051 KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + 2], 0xbe);
0052 KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + 3], 0xef);
0053 for (i = 4; i < EC_PROTO2_MAX_PARAM_SIZE; ++i)
0054 KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + i], 0);
0055
0056 csum = EC_CMD_VERSION0;
0057 csum += EC_CMD_HELLO;
0058 csum += EC_PROTO2_MAX_PARAM_SIZE;
0059 csum += 0xde;
0060 csum += 0xad;
0061 csum += 0xbe;
0062 csum += 0xef;
0063 KUNIT_EXPECT_EQ(test,
0064 ec_dev->dout[EC_MSG_TX_HEADER_BYTES + EC_PROTO2_MAX_PARAM_SIZE],
0065 csum);
0066 }
0067
0068 static void cros_ec_proto_test_prepare_tx_legacy_bad_msg_outsize(struct kunit *test)
0069 {
0070 struct cros_ec_proto_test_priv *priv = test->priv;
0071 struct cros_ec_device *ec_dev = &priv->ec_dev;
0072 struct cros_ec_command *msg = priv->msg;
0073 int ret;
0074
0075 ec_dev->proto_version = 2;
0076
0077 msg->outsize = EC_PROTO2_MAX_PARAM_SIZE + 1;
0078
0079 ret = cros_ec_prepare_tx(ec_dev, msg);
0080 KUNIT_EXPECT_EQ(test, ret, -EINVAL);
0081 }
0082
0083 static void cros_ec_proto_test_prepare_tx_normal(struct kunit *test)
0084 {
0085 struct cros_ec_proto_test_priv *priv = test->priv;
0086 struct cros_ec_device *ec_dev = &priv->ec_dev;
0087 struct cros_ec_command *msg = priv->msg;
0088 struct ec_host_request *request = (struct ec_host_request *)ec_dev->dout;
0089 int ret, i;
0090 u8 csum;
0091
0092 msg->command = EC_CMD_HELLO;
0093 msg->outsize = 0x88;
0094 msg->data[0] = 0xde;
0095 msg->data[1] = 0xad;
0096 msg->data[2] = 0xbe;
0097 msg->data[3] = 0xef;
0098
0099 ret = cros_ec_prepare_tx(ec_dev, msg);
0100
0101 KUNIT_EXPECT_EQ(test, ret, sizeof(*request) + 0x88);
0102
0103 KUNIT_EXPECT_EQ(test, request->struct_version, EC_HOST_REQUEST_VERSION);
0104 KUNIT_EXPECT_EQ(test, request->command, EC_CMD_HELLO);
0105 KUNIT_EXPECT_EQ(test, request->command_version, 0);
0106 KUNIT_EXPECT_EQ(test, request->data_len, 0x88);
0107 KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + 0], 0xde);
0108 KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + 1], 0xad);
0109 KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + 2], 0xbe);
0110 KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + 3], 0xef);
0111 for (i = 4; i < 0x88; ++i)
0112 KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + i], 0);
0113
0114 csum = EC_HOST_REQUEST_VERSION;
0115 csum += EC_CMD_HELLO;
0116 csum += 0x88;
0117 csum += 0xde;
0118 csum += 0xad;
0119 csum += 0xbe;
0120 csum += 0xef;
0121 KUNIT_EXPECT_EQ(test, request->checksum, (u8)-csum);
0122 }
0123
0124 static void cros_ec_proto_test_prepare_tx_bad_msg_outsize(struct kunit *test)
0125 {
0126 struct cros_ec_proto_test_priv *priv = test->priv;
0127 struct cros_ec_device *ec_dev = &priv->ec_dev;
0128 struct cros_ec_command *msg = priv->msg;
0129 int ret;
0130
0131 msg->outsize = ec_dev->dout_size - sizeof(struct ec_host_request) + 1;
0132
0133 ret = cros_ec_prepare_tx(ec_dev, msg);
0134 KUNIT_EXPECT_EQ(test, ret, -EINVAL);
0135 }
0136
0137 static void cros_ec_proto_test_check_result(struct kunit *test)
0138 {
0139 struct cros_ec_proto_test_priv *priv = test->priv;
0140 struct cros_ec_device *ec_dev = &priv->ec_dev;
0141 struct cros_ec_command *msg = priv->msg;
0142 int ret, i;
0143 static enum ec_status status[] = {
0144 EC_RES_SUCCESS,
0145 EC_RES_INVALID_COMMAND,
0146 EC_RES_ERROR,
0147 EC_RES_INVALID_PARAM,
0148 EC_RES_ACCESS_DENIED,
0149 EC_RES_INVALID_RESPONSE,
0150 EC_RES_INVALID_VERSION,
0151 EC_RES_INVALID_CHECKSUM,
0152 EC_RES_UNAVAILABLE,
0153 EC_RES_TIMEOUT,
0154 EC_RES_OVERFLOW,
0155 EC_RES_INVALID_HEADER,
0156 EC_RES_REQUEST_TRUNCATED,
0157 EC_RES_RESPONSE_TOO_BIG,
0158 EC_RES_BUS_ERROR,
0159 EC_RES_BUSY,
0160 EC_RES_INVALID_HEADER_VERSION,
0161 EC_RES_INVALID_HEADER_CRC,
0162 EC_RES_INVALID_DATA_CRC,
0163 EC_RES_DUP_UNAVAILABLE,
0164 };
0165
0166 for (i = 0; i < ARRAY_SIZE(status); ++i) {
0167 msg->result = status[i];
0168 ret = cros_ec_check_result(ec_dev, msg);
0169 KUNIT_EXPECT_EQ(test, ret, 0);
0170 }
0171
0172 msg->result = EC_RES_IN_PROGRESS;
0173 ret = cros_ec_check_result(ec_dev, msg);
0174 KUNIT_EXPECT_EQ(test, ret, -EAGAIN);
0175 }
0176
0177 static void cros_ec_proto_test_query_all_pretest(struct kunit *test)
0178 {
0179 struct cros_ec_proto_test_priv *priv = test->priv;
0180 struct cros_ec_device *ec_dev = &priv->ec_dev;
0181
0182
0183
0184
0185
0186
0187
0188 ec_dev->din = NULL;
0189 ec_dev->dout = NULL;
0190 }
0191
0192 static void cros_ec_proto_test_query_all_normal(struct kunit *test)
0193 {
0194 struct cros_ec_proto_test_priv *priv = test->priv;
0195 struct cros_ec_device *ec_dev = &priv->ec_dev;
0196 struct ec_xfer_mock *mock;
0197 int ret;
0198
0199
0200 {
0201 struct ec_response_get_protocol_info *data;
0202
0203 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
0204 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
0205
0206 data = (struct ec_response_get_protocol_info *)mock->o_data;
0207 data->protocol_versions = BIT(3) | BIT(2);
0208 data->max_request_packet_size = 0xbe;
0209 data->max_response_packet_size = 0xef;
0210 }
0211
0212
0213 {
0214 struct ec_response_get_protocol_info *data;
0215
0216 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
0217 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
0218
0219 data = (struct ec_response_get_protocol_info *)mock->o_data;
0220 data->max_request_packet_size = 0xbf;
0221 }
0222
0223
0224 {
0225 struct ec_response_get_cmd_versions *data;
0226
0227 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
0228 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
0229
0230 data = (struct ec_response_get_cmd_versions *)mock->o_data;
0231 data->version_mask = BIT(6) | BIT(5);
0232 }
0233
0234
0235 {
0236 struct ec_response_get_cmd_versions *data;
0237
0238 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
0239 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
0240
0241 data = (struct ec_response_get_cmd_versions *)mock->o_data;
0242 data->version_mask = BIT(1);
0243 }
0244
0245
0246 {
0247 struct ec_response_host_event_mask *data;
0248
0249 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
0250 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
0251
0252 data = (struct ec_response_host_event_mask *)mock->o_data;
0253 data->mask = 0xbeef;
0254 }
0255
0256 cros_ec_proto_test_query_all_pretest(test);
0257 ret = cros_ec_query_all(ec_dev);
0258 KUNIT_EXPECT_EQ(test, ret, 0);
0259
0260
0261 {
0262 mock = cros_kunit_ec_xfer_mock_next();
0263 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
0264
0265 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
0266 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
0267 KUNIT_EXPECT_EQ(test, mock->msg.insize,
0268 sizeof(struct ec_response_get_protocol_info));
0269 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
0270
0271 KUNIT_EXPECT_EQ(test, ec_dev->max_request, 0xbe - sizeof(struct ec_host_request));
0272 KUNIT_EXPECT_EQ(test, ec_dev->max_response, 0xef - sizeof(struct ec_host_response));
0273 KUNIT_EXPECT_EQ(test, ec_dev->proto_version, 3);
0274 KUNIT_EXPECT_EQ(test, ec_dev->din_size, 0xef + EC_MAX_RESPONSE_OVERHEAD);
0275 KUNIT_EXPECT_EQ(test, ec_dev->dout_size, 0xbe + EC_MAX_REQUEST_OVERHEAD);
0276 }
0277
0278
0279 {
0280 mock = cros_kunit_ec_xfer_mock_next();
0281 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
0282
0283 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
0284 KUNIT_EXPECT_EQ(test, mock->msg.command,
0285 EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) |
0286 EC_CMD_GET_PROTOCOL_INFO);
0287 KUNIT_EXPECT_EQ(test, mock->msg.insize,
0288 sizeof(struct ec_response_get_protocol_info));
0289 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
0290
0291 KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0xbf - sizeof(struct ec_host_request));
0292 }
0293
0294
0295 {
0296 struct ec_params_get_cmd_versions *data;
0297
0298 mock = cros_kunit_ec_xfer_mock_next();
0299 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
0300
0301 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
0302 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
0303 KUNIT_EXPECT_EQ(test, mock->msg.insize,
0304 sizeof(struct ec_response_get_cmd_versions));
0305 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data));
0306
0307 data = (struct ec_params_get_cmd_versions *)mock->i_data;
0308 KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_GET_NEXT_EVENT);
0309
0310 KUNIT_EXPECT_EQ(test, ec_dev->mkbp_event_supported, 7);
0311 }
0312
0313
0314 {
0315 struct ec_params_get_cmd_versions *data;
0316
0317 mock = cros_kunit_ec_xfer_mock_next();
0318 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
0319
0320 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
0321 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
0322 KUNIT_EXPECT_EQ(test, mock->msg.insize,
0323 sizeof(struct ec_response_get_cmd_versions));
0324 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data));
0325
0326 data = (struct ec_params_get_cmd_versions *)mock->i_data;
0327 KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_HOST_SLEEP_EVENT);
0328
0329 KUNIT_EXPECT_TRUE(test, ec_dev->host_sleep_v1);
0330 }
0331
0332
0333 {
0334 mock = cros_kunit_ec_xfer_mock_next();
0335 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
0336
0337 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
0338 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HOST_EVENT_GET_WAKE_MASK);
0339 KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_host_event_mask));
0340 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
0341
0342 KUNIT_EXPECT_EQ(test, ec_dev->host_event_wake_mask, 0xbeef);
0343 }
0344 }
0345
0346 static void cros_ec_proto_test_query_all_no_pd_return_error(struct kunit *test)
0347 {
0348 struct cros_ec_proto_test_priv *priv = test->priv;
0349 struct cros_ec_device *ec_dev = &priv->ec_dev;
0350 struct ec_xfer_mock *mock;
0351 int ret;
0352
0353
0354 ec_dev->max_passthru = 0xbf;
0355
0356
0357 {
0358 struct ec_response_get_protocol_info *data;
0359
0360 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
0361 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
0362
0363
0364
0365
0366
0367 data = (struct ec_response_get_protocol_info *)mock->o_data;
0368 data->max_request_packet_size = 0xbe;
0369 data->max_response_packet_size = 0xef;
0370 }
0371
0372
0373 {
0374 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
0375 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
0376 }
0377
0378 cros_ec_proto_test_query_all_pretest(test);
0379 ret = cros_ec_query_all(ec_dev);
0380 KUNIT_EXPECT_EQ(test, ret, 0);
0381
0382
0383 {
0384 mock = cros_kunit_ec_xfer_mock_next();
0385 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
0386
0387 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
0388 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
0389 KUNIT_EXPECT_EQ(test, mock->msg.insize,
0390 sizeof(struct ec_response_get_protocol_info));
0391 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
0392 }
0393
0394
0395 {
0396 mock = cros_kunit_ec_xfer_mock_next();
0397 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
0398
0399 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
0400 KUNIT_EXPECT_EQ(test, mock->msg.command,
0401 EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) |
0402 EC_CMD_GET_PROTOCOL_INFO);
0403 KUNIT_EXPECT_EQ(test, mock->msg.insize,
0404 sizeof(struct ec_response_get_protocol_info));
0405 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
0406
0407 KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0);
0408 }
0409 }
0410
0411 static void cros_ec_proto_test_query_all_no_pd_return0(struct kunit *test)
0412 {
0413 struct cros_ec_proto_test_priv *priv = test->priv;
0414 struct cros_ec_device *ec_dev = &priv->ec_dev;
0415 struct ec_xfer_mock *mock;
0416 int ret;
0417
0418
0419 ec_dev->max_passthru = 0xbf;
0420
0421
0422 {
0423 struct ec_response_get_protocol_info *data;
0424
0425 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
0426 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
0427
0428
0429
0430
0431
0432 data = (struct ec_response_get_protocol_info *)mock->o_data;
0433 data->max_request_packet_size = 0xbe;
0434 data->max_response_packet_size = 0xef;
0435 }
0436
0437
0438 {
0439 mock = cros_kunit_ec_xfer_mock_add(test, 0);
0440 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
0441 }
0442
0443 cros_ec_proto_test_query_all_pretest(test);
0444 ret = cros_ec_query_all(ec_dev);
0445 KUNIT_EXPECT_EQ(test, ret, 0);
0446
0447
0448 {
0449 mock = cros_kunit_ec_xfer_mock_next();
0450 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
0451
0452 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
0453 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
0454 KUNIT_EXPECT_EQ(test, mock->msg.insize,
0455 sizeof(struct ec_response_get_protocol_info));
0456 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
0457 }
0458
0459
0460 {
0461 mock = cros_kunit_ec_xfer_mock_next();
0462 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
0463
0464 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
0465 KUNIT_EXPECT_EQ(test, mock->msg.command,
0466 EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) |
0467 EC_CMD_GET_PROTOCOL_INFO);
0468 KUNIT_EXPECT_EQ(test, mock->msg.insize,
0469 sizeof(struct ec_response_get_protocol_info));
0470 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
0471
0472 KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0);
0473 }
0474 }
0475
0476 static void cros_ec_proto_test_query_all_legacy_normal_v3_return_error(struct kunit *test)
0477 {
0478 struct cros_ec_proto_test_priv *priv = test->priv;
0479 struct cros_ec_device *ec_dev = &priv->ec_dev;
0480 struct ec_xfer_mock *mock;
0481 int ret;
0482
0483
0484 {
0485 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
0486 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
0487 }
0488
0489
0490 {
0491 struct ec_response_hello *data;
0492
0493 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
0494 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
0495
0496 data = (struct ec_response_hello *)mock->o_data;
0497 data->out_data = 0xa1b2c3d4;
0498 }
0499
0500 cros_ec_proto_test_query_all_pretest(test);
0501 ret = cros_ec_query_all(ec_dev);
0502 KUNIT_EXPECT_EQ(test, ret, 0);
0503
0504
0505 {
0506 mock = cros_kunit_ec_xfer_mock_next();
0507 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
0508
0509 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
0510 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
0511 KUNIT_EXPECT_EQ(test, mock->msg.insize,
0512 sizeof(struct ec_response_get_protocol_info));
0513 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
0514 }
0515
0516
0517 {
0518 struct ec_params_hello *data;
0519
0520 mock = cros_kunit_ec_xfer_mock_next();
0521 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
0522
0523 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
0524 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO);
0525 KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello));
0526 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data));
0527
0528 data = (struct ec_params_hello *)mock->i_data;
0529 KUNIT_EXPECT_EQ(test, data->in_data, 0xa0b0c0d0);
0530
0531 KUNIT_EXPECT_EQ(test, ec_dev->proto_version, 2);
0532 KUNIT_EXPECT_EQ(test, ec_dev->max_request, EC_PROTO2_MAX_PARAM_SIZE);
0533 KUNIT_EXPECT_EQ(test, ec_dev->max_response, EC_PROTO2_MAX_PARAM_SIZE);
0534 KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0);
0535 KUNIT_EXPECT_PTR_EQ(test, ec_dev->pkt_xfer, NULL);
0536 KUNIT_EXPECT_EQ(test, ec_dev->din_size, EC_PROTO2_MSG_BYTES);
0537 KUNIT_EXPECT_EQ(test, ec_dev->dout_size, EC_PROTO2_MSG_BYTES);
0538 }
0539 }
0540
0541 static void cros_ec_proto_test_query_all_legacy_normal_v3_return0(struct kunit *test)
0542 {
0543 struct cros_ec_proto_test_priv *priv = test->priv;
0544 struct cros_ec_device *ec_dev = &priv->ec_dev;
0545 struct ec_xfer_mock *mock;
0546 int ret;
0547
0548
0549 {
0550 mock = cros_kunit_ec_xfer_mock_add(test, 0);
0551 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
0552 }
0553
0554
0555 {
0556 struct ec_response_hello *data;
0557
0558 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
0559 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
0560
0561 data = (struct ec_response_hello *)mock->o_data;
0562 data->out_data = 0xa1b2c3d4;
0563 }
0564
0565 cros_ec_proto_test_query_all_pretest(test);
0566 ret = cros_ec_query_all(ec_dev);
0567 KUNIT_EXPECT_EQ(test, ret, 0);
0568
0569
0570 {
0571 mock = cros_kunit_ec_xfer_mock_next();
0572 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
0573
0574 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
0575 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
0576 KUNIT_EXPECT_EQ(test, mock->msg.insize,
0577 sizeof(struct ec_response_get_protocol_info));
0578 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
0579 }
0580
0581
0582 {
0583 struct ec_params_hello *data;
0584
0585 mock = cros_kunit_ec_xfer_mock_next();
0586 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
0587
0588 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
0589 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO);
0590 KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello));
0591 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data));
0592
0593 data = (struct ec_params_hello *)mock->i_data;
0594 KUNIT_EXPECT_EQ(test, data->in_data, 0xa0b0c0d0);
0595
0596 KUNIT_EXPECT_EQ(test, ec_dev->proto_version, 2);
0597 KUNIT_EXPECT_EQ(test, ec_dev->max_request, EC_PROTO2_MAX_PARAM_SIZE);
0598 KUNIT_EXPECT_EQ(test, ec_dev->max_response, EC_PROTO2_MAX_PARAM_SIZE);
0599 KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0);
0600 KUNIT_EXPECT_PTR_EQ(test, ec_dev->pkt_xfer, NULL);
0601 KUNIT_EXPECT_EQ(test, ec_dev->din_size, EC_PROTO2_MSG_BYTES);
0602 KUNIT_EXPECT_EQ(test, ec_dev->dout_size, EC_PROTO2_MSG_BYTES);
0603 }
0604 }
0605
0606 static void cros_ec_proto_test_query_all_legacy_xfer_error(struct kunit *test)
0607 {
0608 struct cros_ec_proto_test_priv *priv = test->priv;
0609 struct cros_ec_device *ec_dev = &priv->ec_dev;
0610 struct ec_xfer_mock *mock;
0611 int ret;
0612
0613
0614 {
0615 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
0616 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
0617 }
0618
0619
0620 {
0621 mock = cros_kunit_ec_xfer_mock_addx(test, -EIO, EC_RES_SUCCESS, 0);
0622 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
0623 }
0624
0625 cros_ec_proto_test_query_all_pretest(test);
0626 ret = cros_ec_query_all(ec_dev);
0627 KUNIT_EXPECT_EQ(test, ret, -EIO);
0628 KUNIT_EXPECT_EQ(test, ec_dev->proto_version, EC_PROTO_VERSION_UNKNOWN);
0629
0630
0631 {
0632 mock = cros_kunit_ec_xfer_mock_next();
0633 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
0634
0635 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
0636 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
0637 KUNIT_EXPECT_EQ(test, mock->msg.insize,
0638 sizeof(struct ec_response_get_protocol_info));
0639 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
0640 }
0641
0642
0643 {
0644 mock = cros_kunit_ec_xfer_mock_next();
0645 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
0646
0647 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
0648 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO);
0649 KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello));
0650 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_hello));
0651 }
0652 }
0653
0654 static void cros_ec_proto_test_query_all_legacy_return_error(struct kunit *test)
0655 {
0656 struct cros_ec_proto_test_priv *priv = test->priv;
0657 struct cros_ec_device *ec_dev = &priv->ec_dev;
0658 struct ec_xfer_mock *mock;
0659 int ret;
0660
0661
0662 {
0663 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
0664 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
0665 }
0666
0667
0668 {
0669 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
0670 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
0671 }
0672
0673 cros_ec_proto_test_query_all_pretest(test);
0674 ret = cros_ec_query_all(ec_dev);
0675 KUNIT_EXPECT_EQ(test, ret, -EOPNOTSUPP);
0676 KUNIT_EXPECT_EQ(test, ec_dev->proto_version, EC_PROTO_VERSION_UNKNOWN);
0677
0678
0679 {
0680 mock = cros_kunit_ec_xfer_mock_next();
0681 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
0682
0683 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
0684 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
0685 KUNIT_EXPECT_EQ(test, mock->msg.insize,
0686 sizeof(struct ec_response_get_protocol_info));
0687 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
0688 }
0689
0690
0691 {
0692 mock = cros_kunit_ec_xfer_mock_next();
0693 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
0694
0695 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
0696 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO);
0697 KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello));
0698 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_hello));
0699 }
0700 }
0701
0702 static void cros_ec_proto_test_query_all_legacy_data_error(struct kunit *test)
0703 {
0704 struct cros_ec_proto_test_priv *priv = test->priv;
0705 struct cros_ec_device *ec_dev = &priv->ec_dev;
0706 struct ec_xfer_mock *mock;
0707 int ret;
0708
0709
0710 {
0711 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
0712 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
0713 }
0714
0715
0716 {
0717 struct ec_response_hello *data;
0718
0719 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
0720 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
0721
0722 data = (struct ec_response_hello *)mock->o_data;
0723 data->out_data = 0xbeefbfbf;
0724 }
0725
0726 cros_ec_proto_test_query_all_pretest(test);
0727 ret = cros_ec_query_all(ec_dev);
0728 KUNIT_EXPECT_EQ(test, ret, -EBADMSG);
0729 KUNIT_EXPECT_EQ(test, ec_dev->proto_version, EC_PROTO_VERSION_UNKNOWN);
0730
0731
0732 {
0733 mock = cros_kunit_ec_xfer_mock_next();
0734 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
0735
0736 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
0737 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
0738 KUNIT_EXPECT_EQ(test, mock->msg.insize,
0739 sizeof(struct ec_response_get_protocol_info));
0740 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
0741 }
0742
0743
0744 {
0745 mock = cros_kunit_ec_xfer_mock_next();
0746 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
0747
0748 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
0749 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO);
0750 KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello));
0751 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_hello));
0752 }
0753 }
0754
0755 static void cros_ec_proto_test_query_all_legacy_return0(struct kunit *test)
0756 {
0757 struct cros_ec_proto_test_priv *priv = test->priv;
0758 struct cros_ec_device *ec_dev = &priv->ec_dev;
0759 struct ec_xfer_mock *mock;
0760 int ret;
0761
0762
0763 {
0764 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
0765 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
0766 }
0767
0768
0769 {
0770 mock = cros_kunit_ec_xfer_mock_add(test, 0);
0771 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
0772 }
0773
0774 cros_ec_proto_test_query_all_pretest(test);
0775 ret = cros_ec_query_all(ec_dev);
0776 KUNIT_EXPECT_EQ(test, ret, -EPROTO);
0777 KUNIT_EXPECT_EQ(test, ec_dev->proto_version, EC_PROTO_VERSION_UNKNOWN);
0778
0779
0780 {
0781 mock = cros_kunit_ec_xfer_mock_next();
0782 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
0783
0784 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
0785 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
0786 KUNIT_EXPECT_EQ(test, mock->msg.insize,
0787 sizeof(struct ec_response_get_protocol_info));
0788 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
0789 }
0790
0791
0792 {
0793 mock = cros_kunit_ec_xfer_mock_next();
0794 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
0795
0796 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
0797 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO);
0798 KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello));
0799 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_hello));
0800 }
0801 }
0802
0803 static void cros_ec_proto_test_query_all_no_mkbp(struct kunit *test)
0804 {
0805 struct cros_ec_proto_test_priv *priv = test->priv;
0806 struct cros_ec_device *ec_dev = &priv->ec_dev;
0807 struct ec_xfer_mock *mock;
0808 int ret;
0809
0810
0811 ec_dev->mkbp_event_supported = 0xbf;
0812
0813
0814 {
0815 struct ec_response_get_protocol_info *data;
0816
0817 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
0818 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
0819
0820
0821
0822
0823
0824 data = (struct ec_response_get_protocol_info *)mock->o_data;
0825 data->max_request_packet_size = 0xbe;
0826 data->max_response_packet_size = 0xef;
0827 }
0828
0829
0830 {
0831 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
0832 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
0833 }
0834
0835
0836 {
0837 struct ec_response_get_cmd_versions *data;
0838
0839 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
0840 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
0841
0842 data = (struct ec_response_get_cmd_versions *)mock->o_data;
0843 data->version_mask = 0;
0844 }
0845
0846 cros_ec_proto_test_query_all_pretest(test);
0847 ret = cros_ec_query_all(ec_dev);
0848 KUNIT_EXPECT_EQ(test, ret, 0);
0849
0850
0851 {
0852 mock = cros_kunit_ec_xfer_mock_next();
0853 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
0854
0855 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
0856 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
0857 KUNIT_EXPECT_EQ(test, mock->msg.insize,
0858 sizeof(struct ec_response_get_protocol_info));
0859 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
0860 }
0861
0862
0863 {
0864 mock = cros_kunit_ec_xfer_mock_next();
0865 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
0866
0867 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
0868 KUNIT_EXPECT_EQ(test, mock->msg.command,
0869 EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) |
0870 EC_CMD_GET_PROTOCOL_INFO);
0871 KUNIT_EXPECT_EQ(test, mock->msg.insize,
0872 sizeof(struct ec_response_get_protocol_info));
0873 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
0874 }
0875
0876
0877 {
0878 struct ec_params_get_cmd_versions *data;
0879
0880 mock = cros_kunit_ec_xfer_mock_next();
0881 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
0882
0883 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
0884 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
0885 KUNIT_EXPECT_EQ(test, mock->msg.insize,
0886 sizeof(struct ec_response_get_cmd_versions));
0887 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data));
0888
0889 data = (struct ec_params_get_cmd_versions *)mock->i_data;
0890 KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_GET_NEXT_EVENT);
0891
0892 KUNIT_EXPECT_EQ(test, ec_dev->mkbp_event_supported, 0);
0893 }
0894 }
0895
0896 static void cros_ec_proto_test_query_all_no_mkbp_return_error(struct kunit *test)
0897 {
0898 struct cros_ec_proto_test_priv *priv = test->priv;
0899 struct cros_ec_device *ec_dev = &priv->ec_dev;
0900 struct ec_xfer_mock *mock;
0901 int ret;
0902
0903
0904 ec_dev->mkbp_event_supported = 0xbf;
0905
0906
0907 {
0908 struct ec_response_get_protocol_info *data;
0909
0910 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
0911 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
0912
0913
0914
0915
0916
0917 data = (struct ec_response_get_protocol_info *)mock->o_data;
0918 data->max_request_packet_size = 0xbe;
0919 data->max_response_packet_size = 0xef;
0920 }
0921
0922
0923 {
0924 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
0925 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
0926 }
0927
0928
0929 {
0930 mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
0931 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
0932 }
0933
0934 cros_ec_proto_test_query_all_pretest(test);
0935 ret = cros_ec_query_all(ec_dev);
0936 KUNIT_EXPECT_EQ(test, ret, 0);
0937
0938
0939 {
0940 mock = cros_kunit_ec_xfer_mock_next();
0941 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
0942
0943 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
0944 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO);
0945 KUNIT_EXPECT_EQ(test, mock->msg.insize,
0946 sizeof(struct ec_response_get_protocol_info));
0947 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
0948 }
0949
0950
0951 {
0952 mock = cros_kunit_ec_xfer_mock_next();
0953 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
0954
0955 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
0956 KUNIT_EXPECT_EQ(test, mock->msg.command,
0957 EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) |
0958 EC_CMD_GET_PROTOCOL_INFO);
0959 KUNIT_EXPECT_EQ(test, mock->msg.insize,
0960 sizeof(struct ec_response_get_protocol_info));
0961 KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
0962 }
0963
0964
0965 {
0966 struct ec_params_get_cmd_versions *data;
0967
0968 mock = cros_kunit_ec_xfer_mock_next();
0969 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
0970
0971 KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
0972 KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS);
0973 KUNIT_EXPECT_EQ(test, mock->msg.insize,
0974 sizeof(struct ec_response_get_cmd_versions));
0975 KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data));
0976
0977 data = (struct ec_params_get_cmd_versions *)mock->i_data;
0978 KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_GET_NEXT_EVENT);
0979
0980 KUNIT_EXPECT_EQ(test, ec_dev->mkbp_event_supported, 0);
0981 }
0982 }
0983
0984 static void cros_ec_proto_test_query_all_no_mkbp_return0(struct kunit *test)
0985 {
0986 struct cros_ec_proto_test_priv *priv = test->priv;
0987 struct cros_ec_device *ec_dev = &priv->ec_dev;
0988 struct ec_xfer_mock *mock;
0989 int ret;
0990
0991
0992 ec_dev->mkbp_event_supported = 0xbf;
0993
0994
0995 {
0996 struct ec_response_get_protocol_info *data;
0997
0998 mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
0999 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1000
1001
1002
1003
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
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
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
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
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
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
1080 ec_dev->host_sleep_v1 = true;
1081
1082
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
1091
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
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
1105 {
1106 mock = cros_kunit_ec_xfer_mock_add(test, 0);
1107 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1108 }
1109
1110
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
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
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
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
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
1186 ec_dev->host_sleep_v1 = true;
1187
1188
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
1197
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
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
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
1218 data = (struct ec_response_get_cmd_versions *)mock->o_data;
1219 data->version_mask = 0xbeef;
1220 }
1221
1222
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
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
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
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
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
1293 ec_dev->host_event_wake_mask = U32_MAX;
1294
1295
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
1304
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
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
1318 {
1319 mock = cros_kunit_ec_xfer_mock_add(test, 0);
1320 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1321 }
1322
1323
1324 {
1325 mock = cros_kunit_ec_xfer_mock_add(test, 0);
1326 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1327 }
1328
1329
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
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
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
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
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
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
1420 ec_dev->host_event_wake_mask = U32_MAX;
1421
1422
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
1431
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
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
1445 {
1446 mock = cros_kunit_ec_xfer_mock_add(test, 0);
1447 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1448 }
1449
1450
1451 {
1452 mock = cros_kunit_ec_xfer_mock_add(test, 0);
1453 KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1454 }
1455
1456
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
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
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
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
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
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
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
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
1793 {
1794 mock = cros_kunit_ec_xfer_mock_next();
1795 KUNIT_EXPECT_PTR_NE(test, mock, NULL);
1796 }
1797
1798
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
2026
2027
2028
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
2069 wake_event = false;
2070 more_events = true;
2071
2072
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
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
2130 wake_event = true;
2131 more_events = false;
2132
2133
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
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
2179 wake_event = false;
2180 more_events = true;
2181
2182
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
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
2231 wake_event = true;
2232
2233
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
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
2280 wake_event = true;
2281
2282
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
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
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
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
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
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
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
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
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
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
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
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");