brintos

brintos / linux-shallow public Read only

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