Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * Kunit tests for ChromeOS Embedded Controller protocol.
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      * cros_ec_query_all() will free din and dout and allocate them again to fit the usage by
0184      * calling devm_kfree() and devm_kzalloc().  Set them to NULL as they aren't managed by
0185      * ec_dev->dev but allocated statically in struct cros_ec_proto_test_priv
0186      * (see cros_ec_proto_test_init()).
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     /* For cros_ec_get_proto_info() without passthru. */
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     /* For cros_ec_get_proto_info() with passthru. */
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     /* For cros_ec_get_host_command_version_mask() for MKBP. */
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     /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
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     /* For cros_ec_get_host_event_wake_mask(). */
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     /* For cros_ec_get_proto_info() without passthru. */
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     /* For cros_ec_get_proto_info() with passthru. */
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     /* For cros_ec_get_host_command_version_mask() for MKBP. */
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     /* For cros_ec_get_host_command_version_mask() for host sleep v1. */
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     /* For cros_ec_get_host_event_wake_mask(). */
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     /* Set some garbage bytes. */
0354     ec_dev->max_passthru = 0xbf;
0355 
0356     /* For cros_ec_get_proto_info() without passthru. */
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          * Although it doesn't check the value, provides valid sizes so that
0365          * cros_ec_query_all() allocates din and dout correctly.
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     /* For cros_ec_get_proto_info() with passthru. */
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     /* For cros_ec_get_proto_info() without passthru. */
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     /* For cros_ec_get_proto_info() with passthru. */
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     /* Set some garbage bytes. */
0419     ec_dev->max_passthru = 0xbf;
0420 
0421     /* For cros_ec_get_proto_info() without passthru. */
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          * Although it doesn't check the value, provides valid sizes so that
0430          * cros_ec_query_all() allocates din and dout correctly.
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     /* For cros_ec_get_proto_info() with passthru. */
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     /* For cros_ec_get_proto_info() without passthru. */
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     /* For cros_ec_get_proto_info() with passthru. */
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     /* For cros_ec_get_proto_info() without passthru. */
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     /* For cros_ec_get_proto_info_legacy(). */
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     /* For cros_ec_get_proto_info() without passthru. */
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     /* For cros_ec_get_proto_info_legacy(). */
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     /* For cros_ec_get_proto_info() without passthru. */
0549     {
0550         mock = cros_kunit_ec_xfer_mock_add(test, 0);
0551         KUNIT_ASSERT_PTR_NE(test, mock, NULL);
0552     }
0553 
0554     /* For cros_ec_get_proto_info_legacy(). */
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     /* For cros_ec_get_proto_info() without passthru. */
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     /* For cros_ec_get_proto_info_legacy(). */
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     /* For cros_ec_get_proto_info() without passthru. */
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     /* For cros_ec_get_proto_info_legacy(). */
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     /* For cros_ec_get_proto_info() without passthru. */
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     /* For cros_ec_get_proto_info_legacy(). */
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     /* For cros_ec_get_proto_info() without passthru. */
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     /* For cros_ec_get_proto_info_legacy(). */
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     /* For cros_ec_get_proto_info() without passthru. */
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     /* For cros_ec_get_proto_info_legacy(). */
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     /* For cros_ec_get_proto_info() without passthru. */
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     /* For cros_ec_get_proto_info_legacy(). */
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     /* For cros_ec_get_proto_info() without passthru. */
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     /* For cros_ec_get_proto_info_legacy(). */
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     /* For cros_ec_get_proto_info() without passthru. */
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     /* For cros_ec_get_proto_info_legacy(). */
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     /* For cros_ec_get_proto_info() without passthru. */
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     /* For cros_ec_get_proto_info_legacy(). */
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     /* Set some garbage bytes. */
0811     ec_dev->mkbp_event_supported = 0xbf;
0812 
0813     /* For cros_ec_get_proto_info() without passthru. */
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          * Although it doesn't check the value, provides valid sizes so that
0822          * cros_ec_query_all() allocates din and dout correctly.
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     /* For cros_ec_get_proto_info() with passthru. */
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     /* For cros_ec_get_host_command_version_mask() for MKBP. */
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     /* For cros_ec_get_proto_info() without passthru. */
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     /* For cros_ec_get_proto_info() with passthru. */
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     /* For cros_ec_get_host_command_version_mask() for MKBP. */
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     /* Set some garbage bytes. */
0904     ec_dev->mkbp_event_supported = 0xbf;
0905 
0906     /* For cros_ec_get_proto_info() without passthru. */
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          * Although it doesn't check the value, provides valid sizes so that
0915          * cros_ec_query_all() allocates din and dout correctly.
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     /* For cros_ec_get_proto_info() with passthru. */
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     /* For cros_ec_get_host_command_version_mask() for MKBP. */
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     /* For cros_ec_get_proto_info() without passthru. */
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     /* For cros_ec_get_proto_info() with passthru. */
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     /* For cros_ec_get_host_command_version_mask() for MKBP. */
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     /* Set some garbage bytes. */
0992     ec_dev->mkbp_event_supported = 0xbf;
0993 
0994     /* For cros_ec_get_proto_info() without passthru. */
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          * 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");