Message ID | 20220607145639.2362750-10-tzungbi@kernel.org (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | platform/chrome: Kunit tests and refactor for cros_ec_query_all() | expand |
On Tue, Jun 7, 2022 at 7:57 AM Tzung-Bi Shih <tzungbi@kernel.org> wrote: > > Rename cros_ec_host_command_proto_query_v2() to > cros_ec_get_proto_info_legacy() and make it responsible for setting > `ec_dev` fields for EC protocol v2. > > Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org> Reviewed-by: Guenter Roeck <groeck@chromium.org> > --- > Changes from v1: > - Preserve the "cros_ec_" prefix. > > drivers/platform/chrome/cros_ec_proto.c | 72 +++++++++----------- > drivers/platform/chrome/cros_ec_proto_test.c | 22 +++--- > 2 files changed, 44 insertions(+), 50 deletions(-) > > diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chrome/cros_ec_proto.c > index 6f5be9e5ede4..04b9704ed302 100644 > --- a/drivers/platform/chrome/cros_ec_proto.c > +++ b/drivers/platform/chrome/cros_ec_proto.c > @@ -351,51 +351,57 @@ static int cros_ec_get_proto_info(struct cros_ec_device *ec_dev, int devidx) > return ret; > } > > -static int cros_ec_host_command_proto_query_v2(struct cros_ec_device *ec_dev) > +static int cros_ec_get_proto_info_legacy(struct cros_ec_device *ec_dev) > { > struct cros_ec_command *msg; > - struct ec_params_hello *hello_params; > - struct ec_response_hello *hello_response; > + struct ec_params_hello *params; > + struct ec_response_hello *response; > int ret; > - int len = max(sizeof(*hello_params), sizeof(*hello_response)); > > - msg = kmalloc(sizeof(*msg) + len, GFP_KERNEL); > + ec_dev->proto_version = 2; > + > + msg = kzalloc(sizeof(*msg) + max(sizeof(*params), sizeof(*response)), GFP_KERNEL); > if (!msg) > return -ENOMEM; > > - msg->version = 0; > msg->command = EC_CMD_HELLO; > - hello_params = (struct ec_params_hello *)msg->data; > - msg->outsize = sizeof(*hello_params); > - hello_response = (struct ec_response_hello *)msg->data; > - msg->insize = sizeof(*hello_response); > + msg->insize = sizeof(*response); > + msg->outsize = sizeof(*params); > > - hello_params->in_data = 0xa0b0c0d0; > + params = (struct ec_params_hello *)msg->data; > + params->in_data = 0xa0b0c0d0; > > ret = send_command(ec_dev, msg); > - > if (ret < 0) { > - dev_dbg(ec_dev->dev, > - "EC failed to respond to v2 hello: %d\n", > - ret); > + dev_dbg(ec_dev->dev, "EC failed to respond to v2 hello: %d\n", ret); > goto exit; > - } else if (msg->result != EC_RES_SUCCESS) { > - dev_err(ec_dev->dev, > - "EC responded to v2 hello with error: %d\n", > - msg->result); > - ret = msg->result; > + } > + > + ret = cros_ec_map_error(msg->result); > + if (ret) { > + dev_err(ec_dev->dev, "EC responded to v2 hello with error: %d\n", msg->result); > goto exit; > - } else if (hello_response->out_data != 0xa1b2c3d4) { > + } > + > + response = (struct ec_response_hello *)msg->data; > + if (response->out_data != 0xa1b2c3d4) { > dev_err(ec_dev->dev, > "EC responded to v2 hello with bad result: %u\n", > - hello_response->out_data); > + response->out_data); > ret = -EBADMSG; > goto exit; > } > > - ret = 0; > + ec_dev->max_request = EC_PROTO2_MAX_PARAM_SIZE; > + ec_dev->max_response = EC_PROTO2_MAX_PARAM_SIZE; > + ec_dev->max_passthru = 0; > + ec_dev->pkt_xfer = NULL; > + ec_dev->din_size = EC_PROTO2_MSG_BYTES; > + ec_dev->dout_size = EC_PROTO2_MSG_BYTES; > > - exit: > + dev_dbg(ec_dev->dev, "falling back to proto v2\n"); > + ret = 0; > +exit: > kfree(msg); > return ret; > } > @@ -467,20 +473,8 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev) > cros_ec_get_proto_info(ec_dev, CROS_EC_DEV_PD_INDEX); > } else { > /* Try querying with a v2 hello message. */ > - ec_dev->proto_version = 2; > - ret = cros_ec_host_command_proto_query_v2(ec_dev); > - > - if (ret == 0) { > - /* V2 hello succeeded. */ > - dev_dbg(ec_dev->dev, "falling back to proto v2\n"); > - > - ec_dev->max_request = EC_PROTO2_MAX_PARAM_SIZE; > - ec_dev->max_response = EC_PROTO2_MAX_PARAM_SIZE; > - ec_dev->max_passthru = 0; > - ec_dev->pkt_xfer = NULL; > - ec_dev->din_size = EC_PROTO2_MSG_BYTES; > - ec_dev->dout_size = EC_PROTO2_MSG_BYTES; > - } else { > + ret = cros_ec_get_proto_info_legacy(ec_dev); > + if (ret) { > /* > * It's possible for a test to occur too early when > * the EC isn't listening. If this happens, we'll > @@ -488,7 +482,7 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev) > */ > ec_dev->proto_version = EC_PROTO_VERSION_UNKNOWN; > dev_dbg(ec_dev->dev, "EC query failed: %d\n", ret); > - goto exit; > + return ret; > } > } > > diff --git a/drivers/platform/chrome/cros_ec_proto_test.c b/drivers/platform/chrome/cros_ec_proto_test.c > index 473714964cf2..9f7d9666369f 100644 > --- a/drivers/platform/chrome/cros_ec_proto_test.c > +++ b/drivers/platform/chrome/cros_ec_proto_test.c > @@ -484,7 +484,7 @@ static void cros_ec_proto_test_query_all_legacy_normal_v3_return_error(struct ku > KUNIT_ASSERT_PTR_NE(test, mock, NULL); > } > > - /* For cros_ec_host_command_proto_query_v2(). */ > + /* For cros_ec_get_proto_info_legacy(). */ > { > struct ec_response_hello *data; > > @@ -511,7 +511,7 @@ static void cros_ec_proto_test_query_all_legacy_normal_v3_return_error(struct ku > KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); > } > > - /* For cros_ec_host_command_proto_query_v2(). */ > + /* For cros_ec_get_proto_info_legacy(). */ > { > struct ec_params_hello *data; > > @@ -549,7 +549,7 @@ static void cros_ec_proto_test_query_all_legacy_normal_v3_return0(struct kunit * > KUNIT_ASSERT_PTR_NE(test, mock, NULL); > } > > - /* For cros_ec_host_command_proto_query_v2(). */ > + /* For cros_ec_get_proto_info_legacy(). */ > { > struct ec_response_hello *data; > > @@ -576,7 +576,7 @@ static void cros_ec_proto_test_query_all_legacy_normal_v3_return0(struct kunit * > KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); > } > > - /* For cros_ec_host_command_proto_query_v2(). */ > + /* For cros_ec_get_proto_info_legacy(). */ > { > struct ec_params_hello *data; > > @@ -614,7 +614,7 @@ static void cros_ec_proto_test_query_all_legacy_xfer_error(struct kunit *test) > KUNIT_ASSERT_PTR_NE(test, mock, NULL); > } > > - /* For cros_ec_host_command_proto_query_v2(). */ > + /* For cros_ec_get_proto_info_legacy(). */ > { > mock = cros_kunit_ec_xfer_mock_addx(test, -EIO, EC_RES_SUCCESS, 0); > KUNIT_ASSERT_PTR_NE(test, mock, NULL); > @@ -637,7 +637,7 @@ static void cros_ec_proto_test_query_all_legacy_xfer_error(struct kunit *test) > KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); > } > > - /* For cros_ec_host_command_proto_query_v2(). */ > + /* For cros_ec_get_proto_info_legacy(). */ > { > mock = cros_kunit_ec_xfer_mock_next(); > KUNIT_EXPECT_PTR_NE(test, mock, NULL); > @@ -662,7 +662,7 @@ static void cros_ec_proto_test_query_all_legacy_return_error(struct kunit *test) > KUNIT_ASSERT_PTR_NE(test, mock, NULL); > } > > - /* For cros_ec_host_command_proto_query_v2(). */ > + /* For cros_ec_get_proto_info_legacy(). */ > { > mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); > KUNIT_ASSERT_PTR_NE(test, mock, NULL); > @@ -670,7 +670,7 @@ static void cros_ec_proto_test_query_all_legacy_return_error(struct kunit *test) > > cros_ec_proto_test_query_all_pretest(test); > ret = cros_ec_query_all(ec_dev); > - KUNIT_EXPECT_EQ(test, ret, EC_RES_INVALID_COMMAND); > + KUNIT_EXPECT_EQ(test, ret, -EOPNOTSUPP); > KUNIT_EXPECT_EQ(test, ec_dev->proto_version, EC_PROTO_VERSION_UNKNOWN); > > /* For cros_ec_get_proto_info() without passthru. */ > @@ -685,7 +685,7 @@ static void cros_ec_proto_test_query_all_legacy_return_error(struct kunit *test) > KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); > } > > - /* For cros_ec_host_command_proto_query_v2(). */ > + /* For cros_ec_get_proto_info_legacy(). */ > { > mock = cros_kunit_ec_xfer_mock_next(); > KUNIT_EXPECT_PTR_NE(test, mock, NULL); > @@ -710,7 +710,7 @@ static void cros_ec_proto_test_query_all_legacy_data_error(struct kunit *test) > KUNIT_ASSERT_PTR_NE(test, mock, NULL); > } > > - /* For cros_ec_host_command_proto_query_v2(). */ > + /* For cros_ec_get_proto_info_legacy(). */ > { > struct ec_response_hello *data; > > @@ -738,7 +738,7 @@ static void cros_ec_proto_test_query_all_legacy_data_error(struct kunit *test) > KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); > } > > - /* For cros_ec_host_command_proto_query_v2(). */ > + /* For cros_ec_get_proto_info_legacy(). */ > { > mock = cros_kunit_ec_xfer_mock_next(); > KUNIT_EXPECT_PTR_NE(test, mock, NULL); > -- > 2.36.1.255.ge46751e96f-goog >
diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chrome/cros_ec_proto.c index 6f5be9e5ede4..04b9704ed302 100644 --- a/drivers/platform/chrome/cros_ec_proto.c +++ b/drivers/platform/chrome/cros_ec_proto.c @@ -351,51 +351,57 @@ static int cros_ec_get_proto_info(struct cros_ec_device *ec_dev, int devidx) return ret; } -static int cros_ec_host_command_proto_query_v2(struct cros_ec_device *ec_dev) +static int cros_ec_get_proto_info_legacy(struct cros_ec_device *ec_dev) { struct cros_ec_command *msg; - struct ec_params_hello *hello_params; - struct ec_response_hello *hello_response; + struct ec_params_hello *params; + struct ec_response_hello *response; int ret; - int len = max(sizeof(*hello_params), sizeof(*hello_response)); - msg = kmalloc(sizeof(*msg) + len, GFP_KERNEL); + ec_dev->proto_version = 2; + + msg = kzalloc(sizeof(*msg) + max(sizeof(*params), sizeof(*response)), GFP_KERNEL); if (!msg) return -ENOMEM; - msg->version = 0; msg->command = EC_CMD_HELLO; - hello_params = (struct ec_params_hello *)msg->data; - msg->outsize = sizeof(*hello_params); - hello_response = (struct ec_response_hello *)msg->data; - msg->insize = sizeof(*hello_response); + msg->insize = sizeof(*response); + msg->outsize = sizeof(*params); - hello_params->in_data = 0xa0b0c0d0; + params = (struct ec_params_hello *)msg->data; + params->in_data = 0xa0b0c0d0; ret = send_command(ec_dev, msg); - if (ret < 0) { - dev_dbg(ec_dev->dev, - "EC failed to respond to v2 hello: %d\n", - ret); + dev_dbg(ec_dev->dev, "EC failed to respond to v2 hello: %d\n", ret); goto exit; - } else if (msg->result != EC_RES_SUCCESS) { - dev_err(ec_dev->dev, - "EC responded to v2 hello with error: %d\n", - msg->result); - ret = msg->result; + } + + ret = cros_ec_map_error(msg->result); + if (ret) { + dev_err(ec_dev->dev, "EC responded to v2 hello with error: %d\n", msg->result); goto exit; - } else if (hello_response->out_data != 0xa1b2c3d4) { + } + + response = (struct ec_response_hello *)msg->data; + if (response->out_data != 0xa1b2c3d4) { dev_err(ec_dev->dev, "EC responded to v2 hello with bad result: %u\n", - hello_response->out_data); + response->out_data); ret = -EBADMSG; goto exit; } - ret = 0; + ec_dev->max_request = EC_PROTO2_MAX_PARAM_SIZE; + ec_dev->max_response = EC_PROTO2_MAX_PARAM_SIZE; + ec_dev->max_passthru = 0; + ec_dev->pkt_xfer = NULL; + ec_dev->din_size = EC_PROTO2_MSG_BYTES; + ec_dev->dout_size = EC_PROTO2_MSG_BYTES; - exit: + dev_dbg(ec_dev->dev, "falling back to proto v2\n"); + ret = 0; +exit: kfree(msg); return ret; } @@ -467,20 +473,8 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev) cros_ec_get_proto_info(ec_dev, CROS_EC_DEV_PD_INDEX); } else { /* Try querying with a v2 hello message. */ - ec_dev->proto_version = 2; - ret = cros_ec_host_command_proto_query_v2(ec_dev); - - if (ret == 0) { - /* V2 hello succeeded. */ - dev_dbg(ec_dev->dev, "falling back to proto v2\n"); - - ec_dev->max_request = EC_PROTO2_MAX_PARAM_SIZE; - ec_dev->max_response = EC_PROTO2_MAX_PARAM_SIZE; - ec_dev->max_passthru = 0; - ec_dev->pkt_xfer = NULL; - ec_dev->din_size = EC_PROTO2_MSG_BYTES; - ec_dev->dout_size = EC_PROTO2_MSG_BYTES; - } else { + ret = cros_ec_get_proto_info_legacy(ec_dev); + if (ret) { /* * It's possible for a test to occur too early when * the EC isn't listening. If this happens, we'll @@ -488,7 +482,7 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev) */ ec_dev->proto_version = EC_PROTO_VERSION_UNKNOWN; dev_dbg(ec_dev->dev, "EC query failed: %d\n", ret); - goto exit; + return ret; } } diff --git a/drivers/platform/chrome/cros_ec_proto_test.c b/drivers/platform/chrome/cros_ec_proto_test.c index 473714964cf2..9f7d9666369f 100644 --- a/drivers/platform/chrome/cros_ec_proto_test.c +++ b/drivers/platform/chrome/cros_ec_proto_test.c @@ -484,7 +484,7 @@ static void cros_ec_proto_test_query_all_legacy_normal_v3_return_error(struct ku KUNIT_ASSERT_PTR_NE(test, mock, NULL); } - /* For cros_ec_host_command_proto_query_v2(). */ + /* For cros_ec_get_proto_info_legacy(). */ { struct ec_response_hello *data; @@ -511,7 +511,7 @@ static void cros_ec_proto_test_query_all_legacy_normal_v3_return_error(struct ku KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); } - /* For cros_ec_host_command_proto_query_v2(). */ + /* For cros_ec_get_proto_info_legacy(). */ { struct ec_params_hello *data; @@ -549,7 +549,7 @@ static void cros_ec_proto_test_query_all_legacy_normal_v3_return0(struct kunit * KUNIT_ASSERT_PTR_NE(test, mock, NULL); } - /* For cros_ec_host_command_proto_query_v2(). */ + /* For cros_ec_get_proto_info_legacy(). */ { struct ec_response_hello *data; @@ -576,7 +576,7 @@ static void cros_ec_proto_test_query_all_legacy_normal_v3_return0(struct kunit * KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); } - /* For cros_ec_host_command_proto_query_v2(). */ + /* For cros_ec_get_proto_info_legacy(). */ { struct ec_params_hello *data; @@ -614,7 +614,7 @@ static void cros_ec_proto_test_query_all_legacy_xfer_error(struct kunit *test) KUNIT_ASSERT_PTR_NE(test, mock, NULL); } - /* For cros_ec_host_command_proto_query_v2(). */ + /* For cros_ec_get_proto_info_legacy(). */ { mock = cros_kunit_ec_xfer_mock_addx(test, -EIO, EC_RES_SUCCESS, 0); KUNIT_ASSERT_PTR_NE(test, mock, NULL); @@ -637,7 +637,7 @@ static void cros_ec_proto_test_query_all_legacy_xfer_error(struct kunit *test) KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); } - /* For cros_ec_host_command_proto_query_v2(). */ + /* For cros_ec_get_proto_info_legacy(). */ { mock = cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); @@ -662,7 +662,7 @@ static void cros_ec_proto_test_query_all_legacy_return_error(struct kunit *test) KUNIT_ASSERT_PTR_NE(test, mock, NULL); } - /* For cros_ec_host_command_proto_query_v2(). */ + /* For cros_ec_get_proto_info_legacy(). */ { mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); KUNIT_ASSERT_PTR_NE(test, mock, NULL); @@ -670,7 +670,7 @@ static void cros_ec_proto_test_query_all_legacy_return_error(struct kunit *test) cros_ec_proto_test_query_all_pretest(test); ret = cros_ec_query_all(ec_dev); - KUNIT_EXPECT_EQ(test, ret, EC_RES_INVALID_COMMAND); + KUNIT_EXPECT_EQ(test, ret, -EOPNOTSUPP); KUNIT_EXPECT_EQ(test, ec_dev->proto_version, EC_PROTO_VERSION_UNKNOWN); /* For cros_ec_get_proto_info() without passthru. */ @@ -685,7 +685,7 @@ static void cros_ec_proto_test_query_all_legacy_return_error(struct kunit *test) KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); } - /* For cros_ec_host_command_proto_query_v2(). */ + /* For cros_ec_get_proto_info_legacy(). */ { mock = cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); @@ -710,7 +710,7 @@ static void cros_ec_proto_test_query_all_legacy_data_error(struct kunit *test) KUNIT_ASSERT_PTR_NE(test, mock, NULL); } - /* For cros_ec_host_command_proto_query_v2(). */ + /* For cros_ec_get_proto_info_legacy(). */ { struct ec_response_hello *data; @@ -738,7 +738,7 @@ static void cros_ec_proto_test_query_all_legacy_data_error(struct kunit *test) KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); } - /* For cros_ec_host_command_proto_query_v2(). */ + /* For cros_ec_get_proto_info_legacy(). */ { mock = cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL);
Rename cros_ec_host_command_proto_query_v2() to cros_ec_get_proto_info_legacy() and make it responsible for setting `ec_dev` fields for EC protocol v2. Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org> --- Changes from v1: - Preserve the "cros_ec_" prefix. drivers/platform/chrome/cros_ec_proto.c | 72 +++++++++----------- drivers/platform/chrome/cros_ec_proto_test.c | 22 +++--- 2 files changed, 44 insertions(+), 50 deletions(-)