From nobody Mon Apr 27 23:53:46 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 71E76C43334 for ; Thu, 9 Jun 2022 08:51:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242435AbiFIIvV (ORCPT ); Thu, 9 Jun 2022 04:51:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42566 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242492AbiFIIuq (ORCPT ); Thu, 9 Jun 2022 04:50:46 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DEC75152D9D for ; Thu, 9 Jun 2022 01:50:17 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 8DAD4B82C8B for ; Thu, 9 Jun 2022 08:50:16 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4DFF1C3411E; Thu, 9 Jun 2022 08:50:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654764615; bh=kSKP42ykG3A4myTitkeRDF2p6ezFTYtRvxAW7SZhgSQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ofFnETWpJ8tYyqXpwgCwo2kXg+InhjBQl0MT8Poo6HsphBba1wCKcMEcVivQvbHN2 F+kH49w3uzI6LESRzM7sgdENm9xXXYzq7fAX6QGhd6nM1AvACdBKpHwgP4El7sdTOX oR/FnYG52YJ1kY+8WLbkJ8+vEX2GIkzAP2z0oPjfFe6tdcPFCHhdMepKCFv9SFqnmG HCFEeqzqzOShTr7fr93FPqjLdMsIzujvYCdoUB9bQKtIik9Iww6dx0RuNDYLPRA6Jy dWTvJwnqp+DZxLLdo040wu1FQhf6KhpqfoPgLWwyj1cfSXscRLUblfFwHrpqx8dQLJ DGKKH1ksxY+PA== From: Tzung-Bi Shih To: bleung@chromium.org, groeck@chromium.org Cc: chrome-platform@lists.linux.dev, tzungbi@kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 01/21] platform/chrome: cros_ec_commands: fix compile errors Date: Thu, 9 Jun 2022 08:49:37 +0000 Message-Id: <20220609084957.3684698-2-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220609084957.3684698-1-tzungbi@kernel.org> References: <20220609084957.3684698-1-tzungbi@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Fix compile errors when including cros_ec_commands.h solely. 1. cros_ec_commands.h:587:9: error: unknown type name 'uint8_t' 587 | uint8_t flags; | ^~~~~~~ 2. cros_ec_commands.h:1105:43: error: implicit declaration of function 'BIT' 1105 | EC_COMMS_STATUS_PROCESSING =3D BIT(0), | ^~~ Reviewed-by: Guenter Roeck Signed-off-by: Tzung-Bi Shih --- No change from v2 and v3. Changes from v1: - Add R-b tag. include/linux/platform_data/cros_ec_commands.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/linux/platform_data/cros_ec_commands.h b/include/linux= /platform_data/cros_ec_commands.h index 8cfa8cfca77e..a5b749a85707 100644 --- a/include/linux/platform_data/cros_ec_commands.h +++ b/include/linux/platform_data/cros_ec_commands.h @@ -13,8 +13,8 @@ #ifndef __CROS_EC_COMMANDS_H #define __CROS_EC_COMMANDS_H =20 - - +#include +#include =20 #define BUILD_ASSERT(_cond) =20 --=20 2.36.1.255.ge46751e96f-goog From nobody Mon Apr 27 23:53:46 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 605EEC43334 for ; Thu, 9 Jun 2022 08:51:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242155AbiFIIvf (ORCPT ); Thu, 9 Jun 2022 04:51:35 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42514 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242324AbiFIIuq (ORCPT ); Thu, 9 Jun 2022 04:50:46 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AA04B152D8E for ; Thu, 9 Jun 2022 01:50:17 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 286FA619BD for ; Thu, 9 Jun 2022 08:50:17 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 86DD1C385A5; Thu, 9 Jun 2022 08:50:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654764616; bh=JhdIlBjpXDSzi+BoiG8P9nYVQ81LFjSCYLtt7cLTNf8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=S6Vy3bjzJpkWdlHDX6SVlCe6dQYRBpDL/x4qV2VfjckYUbG1T69PYEq//VR7PE6Tq Yp5tER3HtiTLZQRwboUamXL9K9G85dLy+wm42BKTvNtuaoyqzWpv89R0euzR2k66eU 8LGzm35AbO4QV9zPccUpKhwy0cgnIeNu1Pmf8zCPJ/XceJvn3RbfeIyq7cPeNGKdRx jDlGWQIhyhACSnT9xYSUqF59sLAJfeajoZGYpZtpY1Fr/mrLeKCrL1QtxaZVGfrv+P dAVlKbyNbPmVLLq8OloFoQ4WZ8D/jCGo5tE7xHaTT91czLZgDnHcIwyIaS9Gfq23Nf Jf3uoz0PadJCA== From: Tzung-Bi Shih To: bleung@chromium.org, groeck@chromium.org Cc: chrome-platform@lists.linux.dev, tzungbi@kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 02/21] platform/chrome: cros_ec_proto: add Kunit tests for cros_ec_query_all() Date: Thu, 9 Jun 2022 08:49:38 +0000 Message-Id: <20220609084957.3684698-3-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220609084957.3684698-1-tzungbi@kernel.org> References: <20220609084957.3684698-1-tzungbi@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" cros_ec_query_all() sends multiple host commands to EC for querying supported protocols and settings. Add required mock for interacting with cros_ec_query_all() and Kunit tests. Reviewed-by: Guenter Roeck Signed-off-by: Tzung-Bi Shih --- No change from v2 and v3. Changes from v1: - Initialize the mock ec_dev->dev more to get rid of kernel WARN(). - Elaborate more on the test case names. drivers/platform/chrome/Kconfig | 6 + drivers/platform/chrome/Makefile | 1 + drivers/platform/chrome/cros_ec_proto_test.c | 802 +++++++++++++++++++ drivers/platform/chrome/cros_kunit_util.c | 98 +++ drivers/platform/chrome/cros_kunit_util.h | 36 + 5 files changed, 943 insertions(+) create mode 100644 drivers/platform/chrome/cros_kunit_util.c create mode 100644 drivers/platform/chrome/cros_kunit_util.h diff --git a/drivers/platform/chrome/Kconfig b/drivers/platform/chrome/Kcon= fig index 4b3d2427e8dd..0b069d874845 100644 --- a/drivers/platform/chrome/Kconfig +++ b/drivers/platform/chrome/Kconfig @@ -268,11 +268,17 @@ config CHROMEOS_PRIVACY_SCREEN source "drivers/platform/chrome/wilco_ec/Kconfig" =20 # Kunit test cases +config CROS_KUNIT + tristate + help + ChromeOS Kunit. + config CROS_EC_PROTO_KUNIT_TEST tristate "Kunit tests for ChromeOS EC protocol" if !KUNIT_ALL_TESTS depends on KUNIT && CROS_EC default KUNIT_ALL_TESTS select CROS_EC_PROTO + select CROS_KUNIT help Kunit tests for the ChromeOS Embedded Controller protocol. =20 diff --git a/drivers/platform/chrome/Makefile b/drivers/platform/chrome/Mak= efile index 3c380066c6b6..a06bc56d12a8 100644 --- a/drivers/platform/chrome/Makefile +++ b/drivers/platform/chrome/Makefile @@ -32,4 +32,5 @@ obj-$(CONFIG_CROS_USBPD_NOTIFY) +=3D cros_usbpd_notify.o obj-$(CONFIG_WILCO_EC) +=3D wilco_ec/ =20 # Kunit test cases +obj-$(CONFIG_CROS_KUNIT) +=3D cros_kunit_util.o obj-$(CONFIG_CROS_EC_PROTO_KUNIT_TEST) +=3D cros_ec_proto_test.o diff --git a/drivers/platform/chrome/cros_ec_proto_test.c b/drivers/platfor= m/chrome/cros_ec_proto_test.c index 25c4fca5c165..675306c16d47 100644 --- a/drivers/platform/chrome/cros_ec_proto_test.c +++ b/drivers/platform/chrome/cros_ec_proto_test.c @@ -9,6 +9,7 @@ #include =20 #include "cros_ec.h" +#include "cros_kunit_util.h" =20 #define BUFSIZE 512 =20 @@ -172,6 +173,779 @@ static void cros_ec_proto_test_check_result(struct ku= nit *test) KUNIT_EXPECT_EQ(test, ret, -EAGAIN); } =20 +static void cros_ec_proto_test_query_all_pretest(struct kunit *test) +{ + struct cros_ec_proto_test_priv *priv =3D test->priv; + struct cros_ec_device *ec_dev =3D &priv->ec_dev; + + /* + * cros_ec_query_all() will free din and dout and allocate them again to = fit the usage by + * calling devm_kfree() and devm_kzalloc(). Set them to NULL as they are= n't managed by + * ec_dev->dev but allocated statically in struct cros_ec_proto_test_priv + * (see cros_ec_proto_test_init()). + */ + ec_dev->din =3D NULL; + ec_dev->dout =3D NULL; +} + +static void cros_ec_proto_test_query_all_normal(struct kunit *test) +{ + struct cros_ec_proto_test_priv *priv =3D test->priv; + struct cros_ec_device *ec_dev =3D &priv->ec_dev; + struct ec_xfer_mock *mock; + int ret; + + /* For cros_ec_host_command_proto_query() without passthru. */ + { + struct ec_response_get_protocol_info *data; + + mock =3D cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + + data =3D (struct ec_response_get_protocol_info *)mock->o_data; + data->protocol_versions =3D BIT(3) | BIT(2); + data->max_request_packet_size =3D 0xbe; + data->max_response_packet_size =3D 0xef; + } + + /* For cros_ec_host_command_proto_query() with passthru. */ + { + struct ec_response_get_protocol_info *data; + + mock =3D cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + + data =3D (struct ec_response_get_protocol_info *)mock->o_data; + data->max_request_packet_size =3D 0xbf; + } + + /* For cros_ec_get_host_command_version_mask() for MKBP. */ + { + struct ec_response_get_cmd_versions *data; + + mock =3D cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + + data =3D (struct ec_response_get_cmd_versions *)mock->o_data; + data->version_mask =3D BIT(6) | BIT(5); + } + + /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ + { + struct ec_response_get_cmd_versions *data; + + mock =3D cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + + data =3D (struct ec_response_get_cmd_versions *)mock->o_data; + data->version_mask =3D BIT(1); + } + + /* For cros_ec_get_host_event_wake_mask(). */ + { + struct ec_response_host_event_mask *data; + + mock =3D cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + + data =3D (struct ec_response_host_event_mask *)mock->o_data; + data->mask =3D 0xbeef; + } + + cros_ec_proto_test_query_all_pretest(test); + ret =3D cros_ec_query_all(ec_dev); + KUNIT_EXPECT_EQ(test, ret, 0); + + /* For cros_ec_host_command_proto_query() without passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_protocol_info)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); + + KUNIT_EXPECT_EQ(test, ec_dev->max_request, 0xbe - sizeof(struct ec_host_= request)); + KUNIT_EXPECT_EQ(test, ec_dev->max_response, 0xef - sizeof(struct ec_host= _response)); + KUNIT_EXPECT_EQ(test, ec_dev->proto_version, 3); + KUNIT_EXPECT_EQ(test, ec_dev->din_size, 0xef + EC_MAX_RESPONSE_OVERHEAD); + KUNIT_EXPECT_EQ(test, ec_dev->dout_size, 0xbe + EC_MAX_REQUEST_OVERHEAD); + } + + /* For cros_ec_host_command_proto_query() with passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, + EC_CMD_PASSTHRU_OFFSET(1) | EC_CMD_GET_PROTOCOL_INFO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_protocol_info)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); + + KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0xbf - sizeof(struct ec_host= _request)); + } + + /* For cros_ec_get_host_command_version_mask() for MKBP. */ + { + struct ec_params_get_cmd_versions *data; + + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_cmd_versions)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data)); + + data =3D (struct ec_params_get_cmd_versions *)mock->i_data; + KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_GET_NEXT_EVENT); + + KUNIT_EXPECT_EQ(test, ec_dev->mkbp_event_supported, 7); + } + + /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ + { + struct ec_params_get_cmd_versions *data; + + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_cmd_versions)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data)); + + data =3D (struct ec_params_get_cmd_versions *)mock->i_data; + KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_HOST_SLEEP_EVENT); + + KUNIT_EXPECT_TRUE(test, ec_dev->host_sleep_v1); + } + + /* For cros_ec_get_host_event_wake_mask(). */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HOST_EVENT_GET_WAKE_MASK= ); + KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_host_e= vent_mask)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); + + KUNIT_EXPECT_EQ(test, ec_dev->host_event_wake_mask, 0xbeef); + } +} + +static void cros_ec_proto_test_query_all_no_pd_return_error(struct kunit *= test) +{ + struct cros_ec_proto_test_priv *priv =3D test->priv; + struct cros_ec_device *ec_dev =3D &priv->ec_dev; + struct ec_xfer_mock *mock; + int ret; + + /* Set some garbage bytes. */ + ec_dev->max_passthru =3D 0xbf; + + /* For cros_ec_host_command_proto_query() without passthru. */ + { + struct ec_response_get_protocol_info *data; + + mock =3D cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + + /* + * Although it doesn't check the value, provides valid sizes so that + * cros_ec_query_all() allocates din and dout correctly. + */ + data =3D (struct ec_response_get_protocol_info *)mock->o_data; + data->max_request_packet_size =3D 0xbe; + data->max_response_packet_size =3D 0xef; + } + + /* For cros_ec_host_command_proto_query() with passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0= ); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + cros_ec_proto_test_query_all_pretest(test); + ret =3D cros_ec_query_all(ec_dev); + KUNIT_EXPECT_EQ(test, ret, 0); + + /* For cros_ec_host_command_proto_query() without passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_protocol_info)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); + } + + /* For cros_ec_host_command_proto_query() with passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, + EC_CMD_PASSTHRU_OFFSET(1) | EC_CMD_GET_PROTOCOL_INFO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_protocol_info)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); + + KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0); + } +} + +static void cros_ec_proto_test_query_all_legacy_normal_v3_return_error(str= uct kunit *test) +{ + struct cros_ec_proto_test_priv *priv =3D test->priv; + struct cros_ec_device *ec_dev =3D &priv->ec_dev; + struct ec_xfer_mock *mock; + int ret; + + /* For cros_ec_host_command_proto_query() without passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0= ); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + /* For cros_ec_host_command_proto_query_v2(). */ + { + struct ec_response_hello *data; + + mock =3D cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + + data =3D (struct ec_response_hello *)mock->o_data; + data->out_data =3D 0xa1b2c3d4; + } + + cros_ec_proto_test_query_all_pretest(test); + ret =3D cros_ec_query_all(ec_dev); + KUNIT_EXPECT_EQ(test, ret, 0); + + /* For cros_ec_host_command_proto_query() without passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_protocol_info)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); + } + + /* For cros_ec_host_command_proto_query_v2(). */ + { + struct ec_params_hello *data; + + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello)= ); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data)); + + data =3D (struct ec_params_hello *)mock->i_data; + KUNIT_EXPECT_EQ(test, data->in_data, 0xa0b0c0d0); + + KUNIT_EXPECT_EQ(test, ec_dev->proto_version, 2); + KUNIT_EXPECT_EQ(test, ec_dev->max_request, EC_PROTO2_MAX_PARAM_SIZE); + KUNIT_EXPECT_EQ(test, ec_dev->max_response, EC_PROTO2_MAX_PARAM_SIZE); + KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0); + KUNIT_EXPECT_PTR_EQ(test, ec_dev->pkt_xfer, NULL); + KUNIT_EXPECT_EQ(test, ec_dev->din_size, EC_PROTO2_MSG_BYTES); + KUNIT_EXPECT_EQ(test, ec_dev->dout_size, EC_PROTO2_MSG_BYTES); + } +} + +static void cros_ec_proto_test_query_all_legacy_xfer_error(struct kunit *t= est) +{ + struct cros_ec_proto_test_priv *priv =3D test->priv; + struct cros_ec_device *ec_dev =3D &priv->ec_dev; + struct ec_xfer_mock *mock; + int ret; + + /* For cros_ec_host_command_proto_query() without passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0= ); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + /* For cros_ec_host_command_proto_query_v2(). */ + { + mock =3D cros_kunit_ec_xfer_mock_addx(test, -EIO, EC_RES_SUCCESS, 0); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + cros_ec_proto_test_query_all_pretest(test); + ret =3D cros_ec_query_all(ec_dev); + KUNIT_EXPECT_EQ(test, ret, -EIO); + KUNIT_EXPECT_EQ(test, ec_dev->proto_version, EC_PROTO_VERSION_UNKNOWN); + + /* For cros_ec_host_command_proto_query() without passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_protocol_info)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); + } + + /* For cros_ec_host_command_proto_query_v2(). */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello)= ); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_hello)); + } +} + +static void cros_ec_proto_test_query_all_legacy_return_error(struct kunit = *test) +{ + struct cros_ec_proto_test_priv *priv =3D test->priv; + struct cros_ec_device *ec_dev =3D &priv->ec_dev; + struct ec_xfer_mock *mock; + int ret; + + /* For cros_ec_host_command_proto_query() without passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0= ); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + /* For cros_ec_host_command_proto_query_v2(). */ + { + mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0= ); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + cros_ec_proto_test_query_all_pretest(test); + ret =3D cros_ec_query_all(ec_dev); + KUNIT_EXPECT_EQ(test, ret, EC_RES_INVALID_COMMAND); + KUNIT_EXPECT_EQ(test, ec_dev->proto_version, EC_PROTO_VERSION_UNKNOWN); + + /* For cros_ec_host_command_proto_query() without passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_protocol_info)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); + } + + /* For cros_ec_host_command_proto_query_v2(). */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello)= ); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_hello)); + } +} + +static void cros_ec_proto_test_query_all_legacy_data_error(struct kunit *t= est) +{ + struct cros_ec_proto_test_priv *priv =3D test->priv; + struct cros_ec_device *ec_dev =3D &priv->ec_dev; + struct ec_xfer_mock *mock; + int ret; + + /* For cros_ec_host_command_proto_query() without passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0= ); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + /* For cros_ec_host_command_proto_query_v2(). */ + { + struct ec_response_hello *data; + + mock =3D cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + + data =3D (struct ec_response_hello *)mock->o_data; + data->out_data =3D 0xbeefbfbf; + } + + cros_ec_proto_test_query_all_pretest(test); + ret =3D cros_ec_query_all(ec_dev); + KUNIT_EXPECT_EQ(test, ret, -EBADMSG); + KUNIT_EXPECT_EQ(test, ec_dev->proto_version, EC_PROTO_VERSION_UNKNOWN); + + /* For cros_ec_host_command_proto_query() without passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_protocol_info)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); + } + + /* For cros_ec_host_command_proto_query_v2(). */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello)= ); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_hello)); + } +} + +static void cros_ec_proto_test_query_all_no_mkbp(struct kunit *test) +{ + struct cros_ec_proto_test_priv *priv =3D test->priv; + struct cros_ec_device *ec_dev =3D &priv->ec_dev; + struct ec_xfer_mock *mock; + int ret; + + /* Set some garbage bytes. */ + ec_dev->mkbp_event_supported =3D 0xbf; + + /* For cros_ec_host_command_proto_query() without passthru. */ + { + struct ec_response_get_protocol_info *data; + + mock =3D cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + + /* + * Although it doesn't check the value, provides valid sizes so that + * cros_ec_query_all() allocates din and dout correctly. + */ + data =3D (struct ec_response_get_protocol_info *)mock->o_data; + data->max_request_packet_size =3D 0xbe; + data->max_response_packet_size =3D 0xef; + } + + /* For cros_ec_host_command_proto_query() with passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0= ); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + /* For cros_ec_get_host_command_version_mask() for MKBP. */ + { + struct ec_response_get_cmd_versions *data; + + mock =3D cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + + data =3D (struct ec_response_get_cmd_versions *)mock->o_data; + data->version_mask =3D 0; + } + + cros_ec_proto_test_query_all_pretest(test); + ret =3D cros_ec_query_all(ec_dev); + KUNIT_EXPECT_EQ(test, ret, 0); + + /* For cros_ec_host_command_proto_query() without passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_protocol_info)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); + } + + /* For cros_ec_host_command_proto_query() with passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, + EC_CMD_PASSTHRU_OFFSET(1) | EC_CMD_GET_PROTOCOL_INFO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_protocol_info)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); + } + + /* For cros_ec_get_host_command_version_mask() for MKBP. */ + { + struct ec_params_get_cmd_versions *data; + + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_cmd_versions)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data)); + + data =3D (struct ec_params_get_cmd_versions *)mock->i_data; + KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_GET_NEXT_EVENT); + + KUNIT_EXPECT_EQ(test, ec_dev->mkbp_event_supported, 0); + } +} + +static void cros_ec_proto_test_query_all_no_host_sleep(struct kunit *test) +{ + struct cros_ec_proto_test_priv *priv =3D test->priv; + struct cros_ec_device *ec_dev =3D &priv->ec_dev; + struct ec_xfer_mock *mock; + int ret; + + /* Set some garbage bytes. */ + ec_dev->host_sleep_v1 =3D true; + + /* For cros_ec_host_command_proto_query() without passthru. */ + { + struct ec_response_get_protocol_info *data; + + mock =3D cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + + /* + * Although it doesn't check the value, provides valid sizes so that + * cros_ec_query_all() allocates din and dout correctly. + */ + data =3D (struct ec_response_get_protocol_info *)mock->o_data; + data->max_request_packet_size =3D 0xbe; + data->max_response_packet_size =3D 0xef; + } + + /* For cros_ec_host_command_proto_query() with passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0= ); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + /* For cros_ec_get_host_command_version_mask() for MKBP. */ + { + mock =3D cros_kunit_ec_xfer_mock_add(test, 0); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ + { + struct ec_response_get_cmd_versions *data; + + mock =3D cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + + data =3D (struct ec_response_get_cmd_versions *)mock->o_data; + data->version_mask =3D 0; + } + + cros_ec_proto_test_query_all_pretest(test); + ret =3D cros_ec_query_all(ec_dev); + KUNIT_EXPECT_EQ(test, ret, 0); + + /* For cros_ec_host_command_proto_query() without passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_protocol_info)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); + } + + /* For cros_ec_host_command_proto_query() with passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, + EC_CMD_PASSTHRU_OFFSET(1) | EC_CMD_GET_PROTOCOL_INFO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_protocol_info)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); + } + + /* For cros_ec_get_host_command_version_mask() for MKBP. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_cmd_versions)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd= _versions)); + } + + /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_cmd_versions)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd= _versions)); + + KUNIT_EXPECT_FALSE(test, ec_dev->host_sleep_v1); + } +} + +static void cros_ec_proto_test_query_all_default_wake_mask_return_error(st= ruct kunit *test) +{ + struct cros_ec_proto_test_priv *priv =3D test->priv; + struct cros_ec_device *ec_dev =3D &priv->ec_dev; + struct ec_xfer_mock *mock; + int ret; + + /* Set some garbage bytes. */ + ec_dev->host_event_wake_mask =3D U32_MAX; + + /* For cros_ec_host_command_proto_query() without passthru. */ + { + struct ec_response_get_protocol_info *data; + + mock =3D cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + + /* + * Although it doesn't check the value, provides valid sizes so that + * cros_ec_query_all() allocates din and dout correctly. + */ + data =3D (struct ec_response_get_protocol_info *)mock->o_data; + data->max_request_packet_size =3D 0xbe; + data->max_response_packet_size =3D 0xef; + } + + /* For cros_ec_host_command_proto_query() with passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0= ); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + /* For cros_ec_get_host_command_version_mask() for MKBP. */ + { + mock =3D cros_kunit_ec_xfer_mock_add(test, 0); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ + { + mock =3D cros_kunit_ec_xfer_mock_add(test, 0); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + /* For cros_ec_get_host_event_wake_mask(). */ + { + mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0= ); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + cros_ec_proto_test_query_all_pretest(test); + ret =3D cros_ec_query_all(ec_dev); + KUNIT_EXPECT_EQ(test, ret, 0); + + /* For cros_ec_host_command_proto_query() without passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_protocol_info)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); + } + + /* For cros_ec_host_command_proto_query() with passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, + EC_CMD_PASSTHRU_OFFSET(1) | EC_CMD_GET_PROTOCOL_INFO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_protocol_info)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); + } + + /* For cros_ec_get_host_command_version_mask() for MKBP. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_cmd_versions)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd= _versions)); + } + + /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_cmd_versions)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd= _versions)); + } + + /* For cros_ec_get_host_event_wake_mask(). */ + { + u32 mask; + + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HOST_EVENT_GET_WAKE_MASK= ); + KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_host_e= vent_mask)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); + + mask =3D ec_dev->host_event_wake_mask; + KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_LID_CLOSED= ), 0); + KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_AC_DISCONN= ECTED), 0); + KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_LO= W), 0); + KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_CR= ITICAL), 0); + KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY), = 0); + KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_PD_MCU), 0= ); + KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_ST= ATUS), 0); + } +} + +static void cros_ec_proto_test_release(struct device *dev) +{ +} + static int cros_ec_proto_test_init(struct kunit *test) { struct cros_ec_proto_test_priv *priv; @@ -188,24 +962,52 @@ static int cros_ec_proto_test_init(struct kunit *test) ec_dev->din =3D (u8 *)priv->din; ec_dev->din_size =3D ARRAY_SIZE(priv->din); ec_dev->proto_version =3D EC_HOST_REQUEST_VERSION; + ec_dev->dev =3D kunit_kzalloc(test, sizeof(*ec_dev->dev), GFP_KERNEL); + if (!ec_dev->dev) + return -ENOMEM; + device_initialize(ec_dev->dev); + dev_set_name(ec_dev->dev, "cros_ec_proto_test"); + ec_dev->dev->release =3D cros_ec_proto_test_release; + ec_dev->cmd_xfer =3D cros_kunit_ec_xfer_mock; + ec_dev->pkt_xfer =3D cros_kunit_ec_xfer_mock; =20 priv->msg =3D (struct cros_ec_command *)priv->_msg; =20 + cros_kunit_mock_reset(); + return 0; } =20 +static void cros_ec_proto_test_exit(struct kunit *test) +{ + struct cros_ec_proto_test_priv *priv =3D test->priv; + struct cros_ec_device *ec_dev =3D &priv->ec_dev; + + put_device(ec_dev->dev); +} + static struct kunit_case cros_ec_proto_test_cases[] =3D { KUNIT_CASE(cros_ec_proto_test_prepare_tx_legacy_normal), KUNIT_CASE(cros_ec_proto_test_prepare_tx_legacy_bad_msg_outsize), KUNIT_CASE(cros_ec_proto_test_prepare_tx_normal), KUNIT_CASE(cros_ec_proto_test_prepare_tx_bad_msg_outsize), KUNIT_CASE(cros_ec_proto_test_check_result), + KUNIT_CASE(cros_ec_proto_test_query_all_normal), + KUNIT_CASE(cros_ec_proto_test_query_all_no_pd_return_error), + KUNIT_CASE(cros_ec_proto_test_query_all_legacy_normal_v3_return_error), + KUNIT_CASE(cros_ec_proto_test_query_all_legacy_xfer_error), + KUNIT_CASE(cros_ec_proto_test_query_all_legacy_return_error), + KUNIT_CASE(cros_ec_proto_test_query_all_legacy_data_error), + KUNIT_CASE(cros_ec_proto_test_query_all_no_mkbp), + KUNIT_CASE(cros_ec_proto_test_query_all_no_host_sleep), + KUNIT_CASE(cros_ec_proto_test_query_all_default_wake_mask_return_error), {} }; =20 static struct kunit_suite cros_ec_proto_test_suite =3D { .name =3D "cros_ec_proto_test", .init =3D cros_ec_proto_test_init, + .exit =3D cros_ec_proto_test_exit, .test_cases =3D cros_ec_proto_test_cases, }; =20 diff --git a/drivers/platform/chrome/cros_kunit_util.c b/drivers/platform/c= hrome/cros_kunit_util.c new file mode 100644 index 000000000000..e031777dea87 --- /dev/null +++ b/drivers/platform/chrome/cros_kunit_util.c @@ -0,0 +1,98 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * CrOS Kunit tests utilities. + */ + +#include + +#include +#include +#include +#include + +#include "cros_ec.h" +#include "cros_kunit_util.h" + +int cros_kunit_ec_xfer_mock_default_ret; +EXPORT_SYMBOL_GPL(cros_kunit_ec_xfer_mock_default_ret); + +static struct list_head cros_kunit_ec_xfer_mock_in; +static struct list_head cros_kunit_ec_xfer_mock_out; + +int cros_kunit_ec_xfer_mock(struct cros_ec_device *ec_dev, struct cros_ec_= command *msg) +{ + struct ec_xfer_mock *mock; + + mock =3D list_first_entry_or_null(&cros_kunit_ec_xfer_mock_in, struct ec_= xfer_mock, list); + if (!mock) + return cros_kunit_ec_xfer_mock_default_ret; + + list_del(&mock->list); + + memcpy(&mock->msg, msg, sizeof(*msg)); + if (msg->outsize) { + mock->i_data =3D kunit_kzalloc(mock->test, msg->outsize, GFP_KERNEL); + if (mock->i_data) + memcpy(mock->i_data, msg->data, msg->outsize); + } + + msg->result =3D mock->result; + if (msg->insize) + memcpy(msg->data, mock->o_data, min(msg->insize, mock->o_data_len)); + + list_add_tail(&mock->list, &cros_kunit_ec_xfer_mock_out); + + return mock->ret; +} +EXPORT_SYMBOL_GPL(cros_kunit_ec_xfer_mock); + +struct ec_xfer_mock *cros_kunit_ec_xfer_mock_add(struct kunit *test, size_= t size) +{ + return cros_kunit_ec_xfer_mock_addx(test, size, EC_RES_SUCCESS, size); +} +EXPORT_SYMBOL_GPL(cros_kunit_ec_xfer_mock_add); + +struct ec_xfer_mock *cros_kunit_ec_xfer_mock_addx(struct kunit *test, + int ret, int result, size_t size) +{ + struct ec_xfer_mock *mock; + + mock =3D kunit_kzalloc(test, sizeof(*mock), GFP_KERNEL); + if (!mock) + return NULL; + + list_add_tail(&mock->list, &cros_kunit_ec_xfer_mock_in); + mock->test =3D test; + + mock->ret =3D ret; + mock->result =3D result; + mock->o_data =3D kunit_kzalloc(test, size, GFP_KERNEL); + if (!mock->o_data) + return NULL; + mock->o_data_len =3D size; + + return mock; +} +EXPORT_SYMBOL_GPL(cros_kunit_ec_xfer_mock_addx); + +struct ec_xfer_mock *cros_kunit_ec_xfer_mock_next(void) +{ + struct ec_xfer_mock *mock; + + mock =3D list_first_entry_or_null(&cros_kunit_ec_xfer_mock_out, struct ec= _xfer_mock, list); + if (mock) + list_del(&mock->list); + + return mock; +} +EXPORT_SYMBOL_GPL(cros_kunit_ec_xfer_mock_next); + +void cros_kunit_mock_reset(void) +{ + cros_kunit_ec_xfer_mock_default_ret =3D 0; + INIT_LIST_HEAD(&cros_kunit_ec_xfer_mock_in); + INIT_LIST_HEAD(&cros_kunit_ec_xfer_mock_out); +} +EXPORT_SYMBOL_GPL(cros_kunit_mock_reset); + +MODULE_LICENSE("GPL"); diff --git a/drivers/platform/chrome/cros_kunit_util.h b/drivers/platform/c= hrome/cros_kunit_util.h new file mode 100644 index 000000000000..79c4525f873c --- /dev/null +++ b/drivers/platform/chrome/cros_kunit_util.h @@ -0,0 +1,36 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * CrOS Kunit tests utilities. + */ + +#ifndef _CROS_KUNIT_UTIL_H_ +#define _CROS_KUNIT_UTIL_H_ + +#include + +struct ec_xfer_mock { + struct list_head list; + struct kunit *test; + + /* input */ + struct cros_ec_command msg; + void *i_data; + + /* output */ + int ret; + int result; + void *o_data; + u32 o_data_len; +}; + +extern int cros_kunit_ec_xfer_mock_default_ret; + +int cros_kunit_ec_xfer_mock(struct cros_ec_device *ec_dev, struct cros_ec_= command *msg); +struct ec_xfer_mock *cros_kunit_ec_xfer_mock_add(struct kunit *test, size_= t size); +struct ec_xfer_mock *cros_kunit_ec_xfer_mock_addx(struct kunit *test, + int ret, int result, size_t size); +struct ec_xfer_mock *cros_kunit_ec_xfer_mock_next(void); + +void cros_kunit_mock_reset(void); + +#endif --=20 2.36.1.255.ge46751e96f-goog From nobody Mon Apr 27 23:53:46 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 23B9BC43334 for ; Thu, 9 Jun 2022 08:51:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242076AbiFIIvi (ORCPT ); Thu, 9 Jun 2022 04:51:38 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42464 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242198AbiFIIur (ORCPT ); Thu, 9 Jun 2022 04:50:47 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 57076152B87 for ; Thu, 9 Jun 2022 01:50:20 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 165CBB82C7E for ; Thu, 9 Jun 2022 08:50:19 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id E0835C385A2; Thu, 9 Jun 2022 08:50:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654764617; bh=J9GGIxlZOhW+RMTVhKD3kBY4HOeiWcxSKXHF8FCQars=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pzVH7/xtVkpeu4lKoISmFmXgWPVsoRhxGeFZU7+3Q1MHCEzBCt5UX5fVCgnlIVhMl QdUY6qej+Pc+abAdgd4rWrYkyRx42tbUkK9Q9uAIHI02326KXa5ipOTQcmhfJGLy5k 14+WPx+fsk83zwZYO4brvx4kTUlDk7ALbHaQb0a+loELOsIN0zmJTvvHJoZbSCMujP GQYprn0eVbe41olA0clw3N/4+GG6cNzrPqI8f5qQY3h6rFT2KzvE6qXrftYzZK7s2/ zOoE8HyyPw26KgkUbRrcIj6rix1WjubTbCMV6EbaoNr0ZdRd2BayukcXn5AzeZ7gAK N6B8+h3RpdlRw== From: Tzung-Bi Shih To: bleung@chromium.org, groeck@chromium.org Cc: chrome-platform@lists.linux.dev, tzungbi@kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 03/21] platform/chrome: use macros for passthru indexes Date: Thu, 9 Jun 2022 08:49:39 +0000 Message-Id: <20220609084957.3684698-4-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220609084957.3684698-1-tzungbi@kernel.org> References: <20220609084957.3684698-1-tzungbi@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Move passthru indexes for EC and PD devices to common header. Also use them instead of literal constants. Reviewed-by: Guenter Roeck Signed-off-by: Tzung-Bi Shih --- No change from v2 and v3. Changes from v1: - Add R-b tag. drivers/platform/chrome/cros_ec.c | 3 --- drivers/platform/chrome/cros_ec_proto.c | 6 +++--- drivers/platform/chrome/cros_ec_proto_test.c | 15 ++++++++++----- drivers/platform/chrome/cros_ec_trace.h | 8 ++++---- include/linux/platform_data/cros_ec_proto.h | 3 +++ 5 files changed, 20 insertions(+), 15 deletions(-) diff --git a/drivers/platform/chrome/cros_ec.c b/drivers/platform/chrome/cr= os_ec.c index b3e94cdf7d1a..e51a3f2176c7 100644 --- a/drivers/platform/chrome/cros_ec.c +++ b/drivers/platform/chrome/cros_ec.c @@ -19,9 +19,6 @@ =20 #include "cros_ec.h" =20 -#define CROS_EC_DEV_EC_INDEX 0 -#define CROS_EC_DEV_PD_INDEX 1 - static struct cros_ec_platform ec_p =3D { .ec_name =3D CROS_EC_DEV_NAME, .cmd_offset =3D EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_EC_INDEX), diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chr= ome/cros_ec_proto.c index 13ced9d2dd71..65191af5139c 100644 --- a/drivers/platform/chrome/cros_ec_proto.c +++ b/drivers/platform/chrome/cros_ec_proto.c @@ -433,7 +433,7 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev) =20 /* First try sending with proto v3. */ ec_dev->proto_version =3D 3; - ret =3D cros_ec_host_command_proto_query(ec_dev, 0, proto_msg); + ret =3D cros_ec_host_command_proto_query(ec_dev, CROS_EC_DEV_EC_INDEX, pr= oto_msg); =20 if (ret =3D=3D 0) { proto_info =3D (struct ec_response_get_protocol_info *) @@ -459,7 +459,7 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev) /* * Check for PD */ - ret =3D cros_ec_host_command_proto_query(ec_dev, 1, proto_msg); + ret =3D cros_ec_host_command_proto_query(ec_dev, CROS_EC_DEV_PD_INDEX, p= roto_msg); =20 if (ret) { dev_dbg(ec_dev->dev, "no PD chip found: %d\n", ret); @@ -609,7 +609,7 @@ int cros_ec_cmd_xfer(struct cros_ec_device *ec_dev, str= uct cros_ec_command *msg) msg->insize =3D ec_dev->max_response; } =20 - if (msg->command < EC_CMD_PASSTHRU_OFFSET(1)) { + if (msg->command < EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX)) { if (msg->outsize > ec_dev->max_request) { dev_err(ec_dev->dev, "request of size %u is too big (max: %u)\n", diff --git a/drivers/platform/chrome/cros_ec_proto_test.c b/drivers/platfor= m/chrome/cros_ec_proto_test.c index 675306c16d47..f8dbfb0d8dc8 100644 --- a/drivers/platform/chrome/cros_ec_proto_test.c +++ b/drivers/platform/chrome/cros_ec_proto_test.c @@ -281,7 +281,8 @@ static void cros_ec_proto_test_query_all_normal(struct = kunit *test) =20 KUNIT_EXPECT_EQ(test, mock->msg.version, 0); KUNIT_EXPECT_EQ(test, mock->msg.command, - EC_CMD_PASSTHRU_OFFSET(1) | EC_CMD_GET_PROTOCOL_INFO); + EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | + EC_CMD_GET_PROTOCOL_INFO); KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_get_protocol_info)); KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); @@ -396,7 +397,8 @@ static void cros_ec_proto_test_query_all_no_pd_return_e= rror(struct kunit *test) =20 KUNIT_EXPECT_EQ(test, mock->msg.version, 0); KUNIT_EXPECT_EQ(test, mock->msg.command, - EC_CMD_PASSTHRU_OFFSET(1) | EC_CMD_GET_PROTOCOL_INFO); + EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | + EC_CMD_GET_PROTOCOL_INFO); KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_get_protocol_info)); KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); @@ -685,7 +687,8 @@ static void cros_ec_proto_test_query_all_no_mkbp(struct= kunit *test) =20 KUNIT_EXPECT_EQ(test, mock->msg.version, 0); KUNIT_EXPECT_EQ(test, mock->msg.command, - EC_CMD_PASSTHRU_OFFSET(1) | EC_CMD_GET_PROTOCOL_INFO); + EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | + EC_CMD_GET_PROTOCOL_INFO); KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_get_protocol_info)); KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); @@ -783,7 +786,8 @@ static void cros_ec_proto_test_query_all_no_host_sleep(= struct kunit *test) =20 KUNIT_EXPECT_EQ(test, mock->msg.version, 0); KUNIT_EXPECT_EQ(test, mock->msg.command, - EC_CMD_PASSTHRU_OFFSET(1) | EC_CMD_GET_PROTOCOL_INFO); + EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | + EC_CMD_GET_PROTOCOL_INFO); KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_get_protocol_info)); KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); @@ -889,7 +893,8 @@ static void cros_ec_proto_test_query_all_default_wake_m= ask_return_error(struct k =20 KUNIT_EXPECT_EQ(test, mock->msg.version, 0); KUNIT_EXPECT_EQ(test, mock->msg.command, - EC_CMD_PASSTHRU_OFFSET(1) | EC_CMD_GET_PROTOCOL_INFO); + EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | + EC_CMD_GET_PROTOCOL_INFO); KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_get_protocol_info)); KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); diff --git a/drivers/platform/chrome/cros_ec_trace.h b/drivers/platform/chr= ome/cros_ec_trace.h index 9bb5cd2c98b8..d7e407de88df 100644 --- a/drivers/platform/chrome/cros_ec_trace.h +++ b/drivers/platform/chrome/cros_ec_trace.h @@ -30,8 +30,8 @@ TRACE_EVENT(cros_ec_request_start, ), TP_fast_assign( __entry->version =3D cmd->version; - __entry->offset =3D cmd->command / EC_CMD_PASSTHRU_OFFSET(1); - __entry->command =3D cmd->command % EC_CMD_PASSTHRU_OFFSET(1); + __entry->offset =3D cmd->command / EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD= _INDEX); + __entry->command =3D cmd->command % EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_P= D_INDEX); __entry->outsize =3D cmd->outsize; __entry->insize =3D cmd->insize; ), @@ -55,8 +55,8 @@ TRACE_EVENT(cros_ec_request_done, ), TP_fast_assign( __entry->version =3D cmd->version; - __entry->offset =3D cmd->command / EC_CMD_PASSTHRU_OFFSET(1); - __entry->command =3D cmd->command % EC_CMD_PASSTHRU_OFFSET(1); + __entry->offset =3D cmd->command / EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD= _INDEX); + __entry->command =3D cmd->command % EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_P= D_INDEX); __entry->outsize =3D cmd->outsize; __entry->insize =3D cmd->insize; __entry->result =3D cmd->result; diff --git a/include/linux/platform_data/cros_ec_proto.h b/include/linux/pl= atform_data/cros_ec_proto.h index 138fd912c808..6475a8066f00 100644 --- a/include/linux/platform_data/cros_ec_proto.h +++ b/include/linux/platform_data/cros_ec_proto.h @@ -21,6 +21,9 @@ #define CROS_EC_DEV_SCP_NAME "cros_scp" #define CROS_EC_DEV_TP_NAME "cros_tp" =20 +#define CROS_EC_DEV_EC_INDEX 0 +#define CROS_EC_DEV_PD_INDEX 1 + /* * The EC is unresponsive for a time after a reboot command. Add a * simple delay to make sure that the bus stays locked. --=20 2.36.1.255.ge46751e96f-goog From nobody Mon Apr 27 23:53:46 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id CE8E6C43334 for ; Thu, 9 Jun 2022 08:53:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231740AbiFIIxI (ORCPT ); Thu, 9 Jun 2022 04:53:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42560 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231132AbiFIIur (ORCPT ); Thu, 9 Jun 2022 04:50:47 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3FFFF151FFA for ; Thu, 9 Jun 2022 01:50:19 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 90BFD619AC for ; Thu, 9 Jun 2022 08:50:19 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 23F33C36AFE; Thu, 9 Jun 2022 08:50:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654764619; bh=6z5racoITI8151LbBBfK7WD0SMSYCiCuN3ZDAWXqFdo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qEBarKUU02tNA4nCtEhqAT6uQAvQNV4bOl7Hg+FgGsdZwMR0FCeb/s12DbAoXedji MYFbmm0jCpL5RWkt6ZpK5fBNzZ6ZaS3yDFM/NJK1kRoKhSktAg09uzM/UBYsqp6HwA MZXdD8jYbyIkDFpd2vPeJRuokjOQ6ObPC4AsNeps4qlLYT/KuTyWjHSE39tcaMkoTQ JktUw53s4lBM88uEcM96HnWFebzVaVt6fIWMQsujwnyMz6aS8VMxcPieSv9KSGUGJo 0Qd3P3Lxy3yXCrSrrXPWdZOgJc91M4R/4ZyQsYEkTM7ai1LvIkY/Zi8wYVf0SVgCmF F7pK5dVjbq98A== From: Tzung-Bi Shih To: bleung@chromium.org, groeck@chromium.org Cc: chrome-platform@lists.linux.dev, tzungbi@kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 04/21] platform/chrome: cros_ec_proto: assign buffer size from protocol info Date: Thu, 9 Jun 2022 08:49:40 +0000 Message-Id: <20220609084957.3684698-5-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220609084957.3684698-1-tzungbi@kernel.org> References: <20220609084957.3684698-1-tzungbi@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" `din_size` is calculated from `ec_dev->max_response`. `ec_dev->max_response` is further calculated from the protocol info. To make it clear, assign `din_size` and `dout_size` from protocol info directly. Reviewed-by: Guenter Roeck Signed-off-by: Tzung-Bi Shih --- No change from v2 and v3. Changes from v1: - Add R-b tag. drivers/platform/chrome/cros_ec_proto.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chr= ome/cros_ec_proto.c index 65191af5139c..629dce3e6ab3 100644 --- a/drivers/platform/chrome/cros_ec_proto.c +++ b/drivers/platform/chrome/cros_ec_proto.c @@ -449,12 +449,8 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev) "using proto v%u\n", ec_dev->proto_version); =20 - ec_dev->din_size =3D ec_dev->max_response + - sizeof(struct ec_host_response) + - EC_MAX_RESPONSE_OVERHEAD; - ec_dev->dout_size =3D ec_dev->max_request + - sizeof(struct ec_host_request) + - EC_MAX_REQUEST_OVERHEAD; + ec_dev->din_size =3D proto_info->max_response_packet_size + EC_MAX_RESPO= NSE_OVERHEAD; + ec_dev->dout_size =3D proto_info->max_request_packet_size + EC_MAX_REQUE= ST_OVERHEAD; =20 /* * Check for PD --=20 2.36.1.255.ge46751e96f-goog From nobody Mon Apr 27 23:53:46 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E4A9FC433EF for ; Thu, 9 Jun 2022 08:53:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232184AbiFIIxP (ORCPT ); Thu, 9 Jun 2022 04:53:15 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42562 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242504AbiFIIur (ORCPT ); Thu, 9 Jun 2022 04:50:47 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1061E152D9F for ; Thu, 9 Jun 2022 01:50:21 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id CC851619C5 for ; Thu, 9 Jun 2022 08:50:20 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5BE5AC34114; Thu, 9 Jun 2022 08:50:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654764620; bh=AVQPAlvoed25CjITUiMu/d9gzA0bFkUaJK7QzC+hnrQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eRoljWwoEO76w7GvrJugwFacv8tQgZt+u7WU9sUetCVyfBFSR1QUVZSIW0OtJ8D/0 wFWLPi4KE1dTBYmOtaFaaDQK12R767npgj9eyFZibWuW23KD+A2SjpnXk/FL0uiemr TMqVxvjDyP4hvd6NseJKiWCY7DsQlKzYeAHqP7YMRt98mC7W+NaWTixkjo2suC9pJy 9E4wl5w1yQt7q/J99CMYrVD9QOmRWNOTS1ucGpGUToYoutE9Sxe2YL65RW9rSda1rA 2HTrigsuQf0fwOTTNG6yy1FwjSKCuUPWT4MNr9PtX/QQDZ+GXuMEO2QuUnI6CAlZ43 DLPES+wWCffLA== From: Tzung-Bi Shih To: bleung@chromium.org, groeck@chromium.org Cc: chrome-platform@lists.linux.dev, tzungbi@kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 05/21] platform/chrome: cros_ec_proto: remove redundant NULL check Date: Thu, 9 Jun 2022 08:49:41 +0000 Message-Id: <20220609084957.3684698-6-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220609084957.3684698-1-tzungbi@kernel.org> References: <20220609084957.3684698-1-tzungbi@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" send_command() already checks if `ec_dev->pkt_xfer` is NULL. Remove the redundant check. Reviewed-by: Guenter Roeck Signed-off-by: Tzung-Bi Shih --- No change from v2 and v3. Changes from v1: - Add R-b tag. drivers/platform/chrome/cros_ec_proto.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chr= ome/cros_ec_proto.c index 629dce3e6ab3..1b851dcd20c9 100644 --- a/drivers/platform/chrome/cros_ec_proto.c +++ b/drivers/platform/chrome/cros_ec_proto.c @@ -281,9 +281,6 @@ static int cros_ec_host_command_proto_query(struct cros= _ec_device *ec_dev, */ int ret; =20 - if (!ec_dev->pkt_xfer) - return -EPROTONOSUPPORT; - memset(msg, 0, sizeof(*msg)); msg->command =3D EC_CMD_PASSTHRU_OFFSET(devidx) | EC_CMD_GET_PROTOCOL_INF= O; msg->insize =3D sizeof(struct ec_response_get_protocol_info); --=20 2.36.1.255.ge46751e96f-goog From nobody Mon Apr 27 23:53:46 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9D0D4C43334 for ; Thu, 9 Jun 2022 08:51:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242594AbiFIIvn (ORCPT ); Thu, 9 Jun 2022 04:51:43 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42704 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242538AbiFIIur (ORCPT ); Thu, 9 Jun 2022 04:50:47 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CC9DE15350E for ; Thu, 9 Jun 2022 01:50:22 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 1228D619BD for ; Thu, 9 Jun 2022 08:50:22 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 93AF4C3411F; Thu, 9 Jun 2022 08:50:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654764621; bh=uARUCg0Pgs3BIs4Y1NJYedVzWvU62bT4jsUlDV4+chE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eOPoFyTqOyG6nAVGUSbXjfjwLisBDW86C3A0+LfupbWnC7IsHmeHJTJAFsfxThJw4 nE0/o46ducxawRSP9Rip+RVByCN05VyuwiGaZKMX1jqufqUXAZPrsKNA9tu+H5n993 b1P+4mt8NtcOA6l1zG/P9FRQwyYBcDy75pdR234TtcCMfyJWTyKLZwo5BbKIX/sYjZ GA3oPRnJry8yRRHYgIbbS7E1+lEoGvPf+6MJrAmnlgbRV17j+DJB+tETagwvgm02H0 bDRRHXR4i2YAhjGg6BAd0ltRdJzrivgRgpTiIEAq3C+N4plkPKEngXNja+cJZ/bghl 7f7vItLo+4N3g== From: Tzung-Bi Shih To: bleung@chromium.org, groeck@chromium.org Cc: chrome-platform@lists.linux.dev, tzungbi@kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 06/21] platform/chrome: cros_ec_proto: use cros_ec_map_error() Date: Thu, 9 Jun 2022 08:49:42 +0000 Message-Id: <20220609084957.3684698-7-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220609084957.3684698-1-tzungbi@kernel.org> References: <20220609084957.3684698-1-tzungbi@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Use cros_ec_map_error() in cros_ec_get_host_event_wake_mask(). The behavior of cros_ec_get_host_event_wake_mask() slightly changed. It is acceptable because the caller only needs it returns negative integers for indicating errors. Especially, the EC_RES_INVALID_COMMAND still maps to -EOPNOTSUPP. Reviewed-by: Guenter Roeck Signed-off-by: Tzung-Bi Shih --- No change from v2 and v3. Changes from v1: - Add R-b tag. drivers/platform/chrome/cros_ec_proto.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chr= ome/cros_ec_proto.c index 1b851dcd20c9..71ba6a56ad7c 100644 --- a/drivers/platform/chrome/cros_ec_proto.c +++ b/drivers/platform/chrome/cros_ec_proto.c @@ -247,7 +247,7 @@ static int cros_ec_get_host_event_wake_mask(struct cros= _ec_device *ec_dev, uint32_t *mask) { struct ec_response_host_event_mask *r; - int ret; + int ret, mapped; =20 msg->command =3D EC_CMD_HOST_EVENT_GET_WAKE_MASK; msg->version =3D 0; @@ -256,10 +256,9 @@ static int cros_ec_get_host_event_wake_mask(struct cro= s_ec_device *ec_dev, =20 ret =3D send_command(ec_dev, msg); if (ret >=3D 0) { - if (msg->result =3D=3D EC_RES_INVALID_COMMAND) - return -EOPNOTSUPP; - if (msg->result !=3D EC_RES_SUCCESS) - return -EPROTO; + mapped =3D cros_ec_map_error(msg->result); + if (mapped) + return mapped; } if (ret > 0) { r =3D (struct ec_response_host_event_mask *)msg->data; --=20 2.36.1.255.ge46751e96f-goog From nobody Mon Apr 27 23:53:46 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3CC89C433EF for ; Thu, 9 Jun 2022 08:51:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242538AbiFIIvv (ORCPT ); Thu, 9 Jun 2022 04:51:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42572 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242005AbiFIIur (ORCPT ); Thu, 9 Jun 2022 04:50:47 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4C1C4AE7E for ; Thu, 9 Jun 2022 01:50:25 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id D9082B82C83 for ; Thu, 9 Jun 2022 08:50:23 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C9D33C3411B; Thu, 9 Jun 2022 08:50:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654764622; bh=GM3UrcYoRpqxyMaux+k17+rED5Bxv3k8VcaU+2CkToo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DSgbjeqlebiFfGZErrbbvDPuuzcLPj7TsrzvUddhry4/i8NjYbPLyEJldnMKQL5pt fUGbGlPA3F7Y0+qHWY+cNwh3fsPpXRa95SG/mcCpHGAmcS0MVF/tR40x7hLi9ugM1X N2DFRrOIWnztMPH87MwWrcZFQCK0LVIei9/ZvjnZsI4GXWMtQX7a2VMdAgPqtzAu5c n1FdQEMCElZi6U6ClQ4jBPddFsRLJGA6x7UNV3K/HBChodWV/DvrJ3tvftkcCn2tGK M3INFPBPwqSXBzoI3q5/V5mtPR5OuQBqzEH4zusvhXZFP/lvDIqp/C8iTTcurxvGFi huS2BzAmmMR4A== From: Tzung-Bi Shih To: bleung@chromium.org, groeck@chromium.org Cc: chrome-platform@lists.linux.dev, tzungbi@kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 07/21] platform/chrome: cros_ec_proto: separate cros_ec_get_proto_info() Date: Thu, 9 Jun 2022 08:49:43 +0000 Message-Id: <20220609084957.3684698-8-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220609084957.3684698-1-tzungbi@kernel.org> References: <20220609084957.3684698-1-tzungbi@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Rename cros_ec_host_command_proto_query() to cros_ec_get_proto_info() and make it responsible for setting `ec_dev` fields according to the response protocol info. Also make cros_ec_get_host_event_wake_mask() allocate its own message buffer. It was lucky that size of `struct ec_response_host_event_mask` is less than `struct ec_response_get_protocol_info`. Thus, the buffer wasn't overflow. Reviewed-by: Guenter Roeck Signed-off-by: Tzung-Bi Shih --- No change from v3. Changes from v2: - Add R-b tag. Changes from v1: - Preserve the "cros_ec_" prefix. drivers/platform/chrome/cros_ec_proto.c | 134 +++++++++---------- drivers/platform/chrome/cros_ec_proto_test.c | 56 ++++---- 2 files changed, 93 insertions(+), 97 deletions(-) diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chr= ome/cros_ec_proto.c index 71ba6a56ad7c..893b76703da6 100644 --- a/drivers/platform/chrome/cros_ec_proto.c +++ b/drivers/platform/chrome/cros_ec_proto.c @@ -242,47 +242,53 @@ EXPORT_SYMBOL(cros_ec_check_result); * the caller has ec_dev->lock mutex, or the caller knows there is * no other command in progress. */ -static int cros_ec_get_host_event_wake_mask(struct cros_ec_device *ec_dev, - struct cros_ec_command *msg, - uint32_t *mask) +static int cros_ec_get_host_event_wake_mask(struct cros_ec_device *ec_dev,= uint32_t *mask) { + struct cros_ec_command *msg; struct ec_response_host_event_mask *r; int ret, mapped; =20 + msg =3D kzalloc(sizeof(*msg) + sizeof(*r), GFP_KERNEL); + if (!msg) + return -ENOMEM; + msg->command =3D EC_CMD_HOST_EVENT_GET_WAKE_MASK; - msg->version =3D 0; - msg->outsize =3D 0; msg->insize =3D sizeof(*r); =20 ret =3D send_command(ec_dev, msg); if (ret >=3D 0) { mapped =3D cros_ec_map_error(msg->result); - if (mapped) - return mapped; + if (mapped) { + ret =3D mapped; + goto exit; + } } if (ret > 0) { r =3D (struct ec_response_host_event_mask *)msg->data; *mask =3D r->mask; } =20 +exit: + kfree(msg); return ret; } =20 -static int cros_ec_host_command_proto_query(struct cros_ec_device *ec_dev, - int devidx, - struct cros_ec_command *msg) +static int cros_ec_get_proto_info(struct cros_ec_device *ec_dev, int devid= x) { - /* - * Try using v3+ to query for supported protocols. If this - * command fails, fall back to v2. Returns the highest protocol - * supported by the EC. - * Also sets the max request/response/passthru size. - */ - int ret; + struct cros_ec_command *msg; + struct ec_response_get_protocol_info *info; + int ret, mapped; + + ec_dev->proto_version =3D 3; + if (devidx > 0) + ec_dev->max_passthru =3D 0; + + msg =3D kzalloc(sizeof(*msg) + sizeof(*info), GFP_KERNEL); + if (!msg) + return -ENOMEM; =20 - memset(msg, 0, sizeof(*msg)); msg->command =3D EC_CMD_PASSTHRU_OFFSET(devidx) | EC_CMD_GET_PROTOCOL_INF= O; - msg->insize =3D sizeof(struct ec_response_get_protocol_info); + msg->insize =3D sizeof(*info); =20 ret =3D send_command(ec_dev, msg); /* @@ -299,15 +305,45 @@ static int cros_ec_host_command_proto_query(struct cr= os_ec_device *ec_dev, dev_dbg(ec_dev->dev, "failed to check for EC[%d] protocol version: %d\n", devidx, ret); - return ret; + goto exit; + } + + mapped =3D cros_ec_map_error(msg->result); + if (mapped) { + ret =3D mapped; + goto exit; } =20 - if (devidx > 0 && msg->result =3D=3D EC_RES_INVALID_COMMAND) - return -ENODEV; - else if (msg->result !=3D EC_RES_SUCCESS) - return msg->result; + info =3D (struct ec_response_get_protocol_info *)msg->data; + + switch (devidx) { + case CROS_EC_DEV_EC_INDEX: + ec_dev->max_request =3D info->max_request_packet_size - + sizeof(struct ec_host_request); + ec_dev->max_response =3D info->max_response_packet_size - + sizeof(struct ec_host_response); + ec_dev->proto_version =3D min(EC_HOST_REQUEST_VERSION, + fls(info->protocol_versions) - 1); + ec_dev->din_size =3D info->max_response_packet_size + EC_MAX_RESPONSE_OV= ERHEAD; + ec_dev->dout_size =3D info->max_request_packet_size + EC_MAX_REQUEST_OVE= RHEAD; + + dev_dbg(ec_dev->dev, "using proto v%u\n", ec_dev->proto_version); + break; + case CROS_EC_DEV_PD_INDEX: + ec_dev->max_passthru =3D info->max_request_packet_size - + sizeof(struct ec_host_request); + + dev_dbg(ec_dev->dev, "found PD chip\n"); + break; + default: + dev_dbg(ec_dev->dev, "unknwon passthru index: %d\n", devidx); + break; + } =20 - return 0; + ret =3D 0; +exit: + kfree(msg); + return ret; } =20 static int cros_ec_host_command_proto_query_v2(struct cros_ec_device *ec_d= ev) @@ -417,51 +453,13 @@ static int cros_ec_get_host_command_version_mask(stru= ct cros_ec_device *ec_dev, int cros_ec_query_all(struct cros_ec_device *ec_dev) { struct device *dev =3D ec_dev->dev; - struct cros_ec_command *proto_msg; - struct ec_response_get_protocol_info *proto_info; u32 ver_mask =3D 0; int ret; =20 - proto_msg =3D kzalloc(sizeof(*proto_msg) + sizeof(*proto_info), - GFP_KERNEL); - if (!proto_msg) - return -ENOMEM; - /* First try sending with proto v3. */ - ec_dev->proto_version =3D 3; - ret =3D cros_ec_host_command_proto_query(ec_dev, CROS_EC_DEV_EC_INDEX, pr= oto_msg); - - if (ret =3D=3D 0) { - proto_info =3D (struct ec_response_get_protocol_info *) - proto_msg->data; - ec_dev->max_request =3D proto_info->max_request_packet_size - - sizeof(struct ec_host_request); - ec_dev->max_response =3D proto_info->max_response_packet_size - - sizeof(struct ec_host_response); - ec_dev->proto_version =3D - min(EC_HOST_REQUEST_VERSION, - fls(proto_info->protocol_versions) - 1); - dev_dbg(ec_dev->dev, - "using proto v%u\n", - ec_dev->proto_version); - - ec_dev->din_size =3D proto_info->max_response_packet_size + EC_MAX_RESPO= NSE_OVERHEAD; - ec_dev->dout_size =3D proto_info->max_request_packet_size + EC_MAX_REQUE= ST_OVERHEAD; - - /* - * Check for PD - */ - ret =3D cros_ec_host_command_proto_query(ec_dev, CROS_EC_DEV_PD_INDEX, p= roto_msg); - - if (ret) { - dev_dbg(ec_dev->dev, "no PD chip found: %d\n", ret); - ec_dev->max_passthru =3D 0; - } else { - dev_dbg(ec_dev->dev, "found PD chip\n"); - ec_dev->max_passthru =3D - proto_info->max_request_packet_size - - sizeof(struct ec_host_request); - } + if (!cros_ec_get_proto_info(ec_dev, CROS_EC_DEV_EC_INDEX)) { + /* Check for PD. */ + cros_ec_get_proto_info(ec_dev, CROS_EC_DEV_PD_INDEX); } else { /* Try querying with a v2 hello message. */ ec_dev->proto_version =3D 2; @@ -524,8 +522,7 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev) ec_dev->host_sleep_v1 =3D (ret >=3D 0 && (ver_mask & EC_VER_MASK(1))); =20 /* Get host event wake mask. */ - ret =3D cros_ec_get_host_event_wake_mask(ec_dev, proto_msg, - &ec_dev->host_event_wake_mask); + ret =3D cros_ec_get_host_event_wake_mask(ec_dev, &ec_dev->host_event_wake= _mask); if (ret < 0) { /* * If the EC doesn't support EC_CMD_HOST_EVENT_GET_WAKE_MASK, @@ -556,7 +553,6 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev) ret =3D 0; =20 exit: - kfree(proto_msg); return ret; } EXPORT_SYMBOL(cros_ec_query_all); diff --git a/drivers/platform/chrome/cros_ec_proto_test.c b/drivers/platfor= m/chrome/cros_ec_proto_test.c index f8dbfb0d8dc8..8b16666c1657 100644 --- a/drivers/platform/chrome/cros_ec_proto_test.c +++ b/drivers/platform/chrome/cros_ec_proto_test.c @@ -195,7 +195,7 @@ static void cros_ec_proto_test_query_all_normal(struct = kunit *test) struct ec_xfer_mock *mock; int ret; =20 - /* For cros_ec_host_command_proto_query() without passthru. */ + /* For cros_ec_get_proto_info() without passthru. */ { struct ec_response_get_protocol_info *data; =20 @@ -208,7 +208,7 @@ static void cros_ec_proto_test_query_all_normal(struct = kunit *test) data->max_response_packet_size =3D 0xef; } =20 - /* For cros_ec_host_command_proto_query() with passthru. */ + /* For cros_ec_get_proto_info() with passthru. */ { struct ec_response_get_protocol_info *data; =20 @@ -256,7 +256,7 @@ static void cros_ec_proto_test_query_all_normal(struct = kunit *test) ret =3D cros_ec_query_all(ec_dev); KUNIT_EXPECT_EQ(test, ret, 0); =20 - /* For cros_ec_host_command_proto_query() without passthru. */ + /* For cros_ec_get_proto_info() without passthru. */ { mock =3D cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); @@ -274,7 +274,7 @@ static void cros_ec_proto_test_query_all_normal(struct = kunit *test) KUNIT_EXPECT_EQ(test, ec_dev->dout_size, 0xbe + EC_MAX_REQUEST_OVERHEAD); } =20 - /* For cros_ec_host_command_proto_query() with passthru. */ + /* For cros_ec_get_proto_info() with passthru. */ { mock =3D cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); @@ -352,7 +352,7 @@ static void cros_ec_proto_test_query_all_no_pd_return_e= rror(struct kunit *test) /* Set some garbage bytes. */ ec_dev->max_passthru =3D 0xbf; =20 - /* For cros_ec_host_command_proto_query() without passthru. */ + /* For cros_ec_get_proto_info() without passthru. */ { struct ec_response_get_protocol_info *data; =20 @@ -368,7 +368,7 @@ static void cros_ec_proto_test_query_all_no_pd_return_e= rror(struct kunit *test) data->max_response_packet_size =3D 0xef; } =20 - /* For cros_ec_host_command_proto_query() with passthru. */ + /* For cros_ec_get_proto_info() with passthru. */ { mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0= ); KUNIT_ASSERT_PTR_NE(test, mock, NULL); @@ -378,7 +378,7 @@ static void cros_ec_proto_test_query_all_no_pd_return_e= rror(struct kunit *test) ret =3D cros_ec_query_all(ec_dev); KUNIT_EXPECT_EQ(test, ret, 0); =20 - /* For cros_ec_host_command_proto_query() without passthru. */ + /* For cros_ec_get_proto_info() without passthru. */ { mock =3D cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); @@ -390,7 +390,7 @@ static void cros_ec_proto_test_query_all_no_pd_return_e= rror(struct kunit *test) KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); } =20 - /* For cros_ec_host_command_proto_query() with passthru. */ + /* For cros_ec_get_proto_info() with passthru. */ { mock =3D cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); @@ -414,7 +414,7 @@ static void cros_ec_proto_test_query_all_legacy_normal_= v3_return_error(struct ku struct ec_xfer_mock *mock; int ret; =20 - /* For cros_ec_host_command_proto_query() without passthru. */ + /* For cros_ec_get_proto_info() without passthru. */ { mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0= ); KUNIT_ASSERT_PTR_NE(test, mock, NULL); @@ -435,7 +435,7 @@ static void cros_ec_proto_test_query_all_legacy_normal_= v3_return_error(struct ku ret =3D cros_ec_query_all(ec_dev); KUNIT_EXPECT_EQ(test, ret, 0); =20 - /* For cros_ec_host_command_proto_query() without passthru. */ + /* For cros_ec_get_proto_info() without passthru. */ { mock =3D cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); @@ -479,7 +479,7 @@ static void cros_ec_proto_test_query_all_legacy_xfer_er= ror(struct kunit *test) struct ec_xfer_mock *mock; int ret; =20 - /* For cros_ec_host_command_proto_query() without passthru. */ + /* For cros_ec_get_proto_info() without passthru. */ { mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0= ); KUNIT_ASSERT_PTR_NE(test, mock, NULL); @@ -496,7 +496,7 @@ static void cros_ec_proto_test_query_all_legacy_xfer_er= ror(struct kunit *test) KUNIT_EXPECT_EQ(test, ret, -EIO); KUNIT_EXPECT_EQ(test, ec_dev->proto_version, EC_PROTO_VERSION_UNKNOWN); =20 - /* For cros_ec_host_command_proto_query() without passthru. */ + /* For cros_ec_get_proto_info() without passthru. */ { mock =3D cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); @@ -527,7 +527,7 @@ static void cros_ec_proto_test_query_all_legacy_return_= error(struct kunit *test) struct ec_xfer_mock *mock; int ret; =20 - /* For cros_ec_host_command_proto_query() without passthru. */ + /* For cros_ec_get_proto_info() without passthru. */ { mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0= ); KUNIT_ASSERT_PTR_NE(test, mock, NULL); @@ -544,7 +544,7 @@ static void cros_ec_proto_test_query_all_legacy_return_= error(struct kunit *test) KUNIT_EXPECT_EQ(test, ret, EC_RES_INVALID_COMMAND); KUNIT_EXPECT_EQ(test, ec_dev->proto_version, EC_PROTO_VERSION_UNKNOWN); =20 - /* For cros_ec_host_command_proto_query() without passthru. */ + /* For cros_ec_get_proto_info() without passthru. */ { mock =3D cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); @@ -575,7 +575,7 @@ static void cros_ec_proto_test_query_all_legacy_data_er= ror(struct kunit *test) struct ec_xfer_mock *mock; int ret; =20 - /* For cros_ec_host_command_proto_query() without passthru. */ + /* For cros_ec_get_proto_info() without passthru. */ { mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0= ); KUNIT_ASSERT_PTR_NE(test, mock, NULL); @@ -597,7 +597,7 @@ static void cros_ec_proto_test_query_all_legacy_data_er= ror(struct kunit *test) KUNIT_EXPECT_EQ(test, ret, -EBADMSG); KUNIT_EXPECT_EQ(test, ec_dev->proto_version, EC_PROTO_VERSION_UNKNOWN); =20 - /* For cros_ec_host_command_proto_query() without passthru. */ + /* For cros_ec_get_proto_info() without passthru. */ { mock =3D cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); @@ -631,7 +631,7 @@ static void cros_ec_proto_test_query_all_no_mkbp(struct= kunit *test) /* Set some garbage bytes. */ ec_dev->mkbp_event_supported =3D 0xbf; =20 - /* For cros_ec_host_command_proto_query() without passthru. */ + /* For cros_ec_get_proto_info() without passthru. */ { struct ec_response_get_protocol_info *data; =20 @@ -647,7 +647,7 @@ static void cros_ec_proto_test_query_all_no_mkbp(struct= kunit *test) data->max_response_packet_size =3D 0xef; } =20 - /* For cros_ec_host_command_proto_query() with passthru. */ + /* For cros_ec_get_proto_info() with passthru. */ { mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0= ); KUNIT_ASSERT_PTR_NE(test, mock, NULL); @@ -668,7 +668,7 @@ static void cros_ec_proto_test_query_all_no_mkbp(struct= kunit *test) ret =3D cros_ec_query_all(ec_dev); KUNIT_EXPECT_EQ(test, ret, 0); =20 - /* For cros_ec_host_command_proto_query() without passthru. */ + /* For cros_ec_get_proto_info() without passthru. */ { mock =3D cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); @@ -680,7 +680,7 @@ static void cros_ec_proto_test_query_all_no_mkbp(struct= kunit *test) KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); } =20 - /* For cros_ec_host_command_proto_query() with passthru. */ + /* For cros_ec_get_proto_info() with passthru. */ { mock =3D cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); @@ -724,7 +724,7 @@ static void cros_ec_proto_test_query_all_no_host_sleep(= struct kunit *test) /* Set some garbage bytes. */ ec_dev->host_sleep_v1 =3D true; =20 - /* For cros_ec_host_command_proto_query() without passthru. */ + /* For cros_ec_get_proto_info() without passthru. */ { struct ec_response_get_protocol_info *data; =20 @@ -740,7 +740,7 @@ static void cros_ec_proto_test_query_all_no_host_sleep(= struct kunit *test) data->max_response_packet_size =3D 0xef; } =20 - /* For cros_ec_host_command_proto_query() with passthru. */ + /* For cros_ec_get_proto_info() with passthru. */ { mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0= ); KUNIT_ASSERT_PTR_NE(test, mock, NULL); @@ -767,7 +767,7 @@ static void cros_ec_proto_test_query_all_no_host_sleep(= struct kunit *test) ret =3D cros_ec_query_all(ec_dev); KUNIT_EXPECT_EQ(test, ret, 0); =20 - /* For cros_ec_host_command_proto_query() without passthru. */ + /* For cros_ec_get_proto_info() without passthru. */ { mock =3D cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); @@ -779,7 +779,7 @@ static void cros_ec_proto_test_query_all_no_host_sleep(= struct kunit *test) KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); } =20 - /* For cros_ec_host_command_proto_query() with passthru. */ + /* For cros_ec_get_proto_info() with passthru. */ { mock =3D cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); @@ -830,7 +830,7 @@ static void cros_ec_proto_test_query_all_default_wake_m= ask_return_error(struct k /* Set some garbage bytes. */ ec_dev->host_event_wake_mask =3D U32_MAX; =20 - /* For cros_ec_host_command_proto_query() without passthru. */ + /* For cros_ec_get_proto_info() without passthru. */ { struct ec_response_get_protocol_info *data; =20 @@ -846,7 +846,7 @@ static void cros_ec_proto_test_query_all_default_wake_m= ask_return_error(struct k data->max_response_packet_size =3D 0xef; } =20 - /* For cros_ec_host_command_proto_query() with passthru. */ + /* For cros_ec_get_proto_info() with passthru. */ { mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0= ); KUNIT_ASSERT_PTR_NE(test, mock, NULL); @@ -874,7 +874,7 @@ static void cros_ec_proto_test_query_all_default_wake_m= ask_return_error(struct k ret =3D cros_ec_query_all(ec_dev); KUNIT_EXPECT_EQ(test, ret, 0); =20 - /* For cros_ec_host_command_proto_query() without passthru. */ + /* For cros_ec_get_proto_info() without passthru. */ { mock =3D cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); @@ -886,7 +886,7 @@ static void cros_ec_proto_test_query_all_default_wake_m= ask_return_error(struct k KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); } =20 - /* For cros_ec_host_command_proto_query() with passthru. */ + /* For cros_ec_get_proto_info() with passthru. */ { mock =3D cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); --=20 2.36.1.255.ge46751e96f-goog From nobody Mon Apr 27 23:53:46 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 291F8C43334 for ; Thu, 9 Jun 2022 08:53:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242568AbiFIIxD (ORCPT ); Thu, 9 Jun 2022 04:53:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42570 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242558AbiFIIur (ORCPT ); Thu, 9 Jun 2022 04:50:47 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DD2226412 for ; Thu, 9 Jun 2022 01:50:24 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 7D1D2619BF for ; Thu, 9 Jun 2022 08:50:24 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0E0BEC341C4; Thu, 9 Jun 2022 08:50:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654764623; bh=EdG5OzLY+Z1n/Q+SjiOMB4FhLiYyt4zEUGFNSpTwj60=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=a+fMI/zkshXHHppgKQ8POJy21qBAAELzVB8HogyH90j4WofG3hawu0enCJ/ENYs3x I+lr591B9lG3aIYlWEpaBuN8nkQJGWHX/nJ27+Gv503A0P0QfO89DmOq8LizaqPADk qAEJQCPuFEzV1+93lHPVakQQZUE/fYXvrcOMgQhQKfWtAQS+W3eEdhb9lQ4l/98k0x Kmy3R4SU42z4L6/A2cIwTRBZvMvgPfozlrSQXjfAeWNbqMLW6elSrQRxaZRRiXkl4B 2PsoTqSTGJdpSU7IAIfz5jciaKcqcLM42FnE1UdDTTVDGXFbkNU5u3lwhtwqMy0tAq b0RIbplaIZOMA== From: Tzung-Bi Shih To: bleung@chromium.org, groeck@chromium.org Cc: chrome-platform@lists.linux.dev, tzungbi@kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 08/21] platform/chrome: cros_ec_proto: add Kunit tests for getting proto info Date: Thu, 9 Jun 2022 08:49:44 +0000 Message-Id: <20220609084957.3684698-9-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220609084957.3684698-1-tzungbi@kernel.org> References: <20220609084957.3684698-1-tzungbi@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" cros_ec_get_proto_info() expects to receive sizeof(struct ec_response_get_protocol_info) from send_command(). The payload is valid only if the return value is positive. Add Kunit tests for returning 0 from send_command() in cros_ec_get_proto_info(). Reviewed-by: Guenter Roeck Signed-off-by: Tzung-Bi Shih --- Changes from v3: - Add R-b tag. drivers/platform/chrome/cros_ec_proto_test.c | 132 +++++++++++++++++++ 1 file changed, 132 insertions(+) diff --git a/drivers/platform/chrome/cros_ec_proto_test.c b/drivers/platfor= m/chrome/cros_ec_proto_test.c index 8b16666c1657..1378ac90e1cb 100644 --- a/drivers/platform/chrome/cros_ec_proto_test.c +++ b/drivers/platform/chrome/cros_ec_proto_test.c @@ -407,6 +407,71 @@ static void cros_ec_proto_test_query_all_no_pd_return_= error(struct kunit *test) } } =20 +static void cros_ec_proto_test_query_all_no_pd_return0(struct kunit *test) +{ + struct cros_ec_proto_test_priv *priv =3D test->priv; + struct cros_ec_device *ec_dev =3D &priv->ec_dev; + struct ec_xfer_mock *mock; + int ret; + + /* Set some garbage bytes. */ + ec_dev->max_passthru =3D 0xbf; + + /* For cros_ec_get_proto_info() without passthru. */ + { + struct ec_response_get_protocol_info *data; + + mock =3D cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + + /* + * Although it doesn't check the value, provides valid sizes so that + * cros_ec_query_all() allocates din and dout correctly. + */ + data =3D (struct ec_response_get_protocol_info *)mock->o_data; + data->max_request_packet_size =3D 0xbe; + data->max_response_packet_size =3D 0xef; + } + + /* For cros_ec_get_proto_info() with passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_add(test, 0); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + cros_ec_proto_test_query_all_pretest(test); + ret =3D cros_ec_query_all(ec_dev); + KUNIT_EXPECT_EQ(test, ret, 0); + + /* For cros_ec_get_proto_info() without passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_protocol_info)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); + } + + /* For cros_ec_get_proto_info() with passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, + EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | + EC_CMD_GET_PROTOCOL_INFO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_protocol_info)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); + + KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0); + } +} + static void cros_ec_proto_test_query_all_legacy_normal_v3_return_error(str= uct kunit *test) { struct cros_ec_proto_test_priv *priv =3D test->priv; @@ -472,6 +537,71 @@ static void cros_ec_proto_test_query_all_legacy_normal= _v3_return_error(struct ku } } =20 +static void cros_ec_proto_test_query_all_legacy_normal_v3_return0(struct k= unit *test) +{ + struct cros_ec_proto_test_priv *priv =3D test->priv; + struct cros_ec_device *ec_dev =3D &priv->ec_dev; + struct ec_xfer_mock *mock; + int ret; + + /* For cros_ec_get_proto_info() without passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_add(test, 0); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + /* For cros_ec_host_command_proto_query_v2(). */ + { + struct ec_response_hello *data; + + mock =3D cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + + data =3D (struct ec_response_hello *)mock->o_data; + data->out_data =3D 0xa1b2c3d4; + } + + cros_ec_proto_test_query_all_pretest(test); + ret =3D cros_ec_query_all(ec_dev); + KUNIT_EXPECT_EQ(test, ret, 0); + + /* For cros_ec_get_proto_info() without passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_protocol_info)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); + } + + /* For cros_ec_host_command_proto_query_v2(). */ + { + struct ec_params_hello *data; + + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello)= ); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data)); + + data =3D (struct ec_params_hello *)mock->i_data; + KUNIT_EXPECT_EQ(test, data->in_data, 0xa0b0c0d0); + + KUNIT_EXPECT_EQ(test, ec_dev->proto_version, 2); + KUNIT_EXPECT_EQ(test, ec_dev->max_request, EC_PROTO2_MAX_PARAM_SIZE); + KUNIT_EXPECT_EQ(test, ec_dev->max_response, EC_PROTO2_MAX_PARAM_SIZE); + KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0); + KUNIT_EXPECT_PTR_EQ(test, ec_dev->pkt_xfer, NULL); + KUNIT_EXPECT_EQ(test, ec_dev->din_size, EC_PROTO2_MSG_BYTES); + KUNIT_EXPECT_EQ(test, ec_dev->dout_size, EC_PROTO2_MSG_BYTES); + } +} + static void cros_ec_proto_test_query_all_legacy_xfer_error(struct kunit *t= est) { struct cros_ec_proto_test_priv *priv =3D test->priv; @@ -999,7 +1129,9 @@ static struct kunit_case cros_ec_proto_test_cases[] = =3D { KUNIT_CASE(cros_ec_proto_test_check_result), KUNIT_CASE(cros_ec_proto_test_query_all_normal), KUNIT_CASE(cros_ec_proto_test_query_all_no_pd_return_error), + KUNIT_CASE(cros_ec_proto_test_query_all_no_pd_return0), KUNIT_CASE(cros_ec_proto_test_query_all_legacy_normal_v3_return_error), + KUNIT_CASE(cros_ec_proto_test_query_all_legacy_normal_v3_return0), KUNIT_CASE(cros_ec_proto_test_query_all_legacy_xfer_error), KUNIT_CASE(cros_ec_proto_test_query_all_legacy_return_error), KUNIT_CASE(cros_ec_proto_test_query_all_legacy_data_error), --=20 2.36.1.255.ge46751e96f-goog From nobody Mon Apr 27 23:53:46 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 10800C433EF for ; Thu, 9 Jun 2022 08:51:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242655AbiFIIvz (ORCPT ); Thu, 9 Jun 2022 04:51:55 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42644 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242055AbiFIIur (ORCPT ); Thu, 9 Jun 2022 04:50:47 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 35BD043389 for ; Thu, 9 Jun 2022 01:50:26 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id B9723619C2 for ; Thu, 9 Jun 2022 08:50:25 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 45397C34114; Thu, 9 Jun 2022 08:50:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654764625; bh=qT9HHzpCPbOfweuAb1jcncAnFhfIOxUfMjm69+qjQJ0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=YsXLve99cAnKjrIYtBPJlQudQ27+xYonnmjQOSkXVUdmP1mt482HaDpX4yP8jMoKF ksgfzy08QO6/sNG4TbY3x71zoiiC/pCK/+lpb2U298ATydLrTh9sObQK3PlEek4s95 dLMwyAyYgHMFQ2j8jD4CqijGRcGIEoAl3R3H6ZKeew59ddfOHGYxigQSC/4dmPywaM megsi5B8t0/r5bP6/7MrSWGrVwMHHOHVgzfSUldqrK5p1nLqulZqL72KObmrz0lWre o6TdqdWNzcKys5Iv7EBSDw3ixVZWw9sUNzZqiqJW/CVn2+lqyqWAOa+u2y9pWc3YMr HK9P48ntgwcDw== From: Tzung-Bi Shih To: bleung@chromium.org, groeck@chromium.org Cc: chrome-platform@lists.linux.dev, tzungbi@kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 09/21] platform/chrome: cros_ec_proto: handle empty payload in getting proto info Date: Thu, 9 Jun 2022 08:49:45 +0000 Message-Id: <20220609084957.3684698-10-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220609084957.3684698-1-tzungbi@kernel.org> References: <20220609084957.3684698-1-tzungbi@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" cros_ec_get_proto_info() expects to receive sizeof(struct ec_response_get_protocol_info) from send_command(). The payload is valid only if the return value is positive. Return -EPROTO if send_command() returns 0 in cros_ec_get_proto_info(). Reviewed-by: Guenter Roeck Signed-off-by: Tzung-Bi Shih --- Changes from v3: - Add R-b tag. Changes from v2: - Separate Kunit test to another patch. drivers/platform/chrome/cros_ec_proto.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chr= ome/cros_ec_proto.c index 893b76703da6..6f5be9e5ede4 100644 --- a/drivers/platform/chrome/cros_ec_proto.c +++ b/drivers/platform/chrome/cros_ec_proto.c @@ -314,6 +314,11 @@ static int cros_ec_get_proto_info(struct cros_ec_devic= e *ec_dev, int devidx) goto exit; } =20 + if (ret =3D=3D 0) { + ret =3D -EPROTO; + goto exit; + } + info =3D (struct ec_response_get_protocol_info *)msg->data; =20 switch (devidx) { --=20 2.36.1.255.ge46751e96f-goog From nobody Mon Apr 27 23:53:46 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6EA96C43334 for ; Thu, 9 Jun 2022 08:52:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242716AbiFIIwm (ORCPT ); Thu, 9 Jun 2022 04:52:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42656 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241939AbiFIIur (ORCPT ); Thu, 9 Jun 2022 04:50:47 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 931244551A for ; Thu, 9 Jun 2022 01:50:27 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id EDD52619AC for ; Thu, 9 Jun 2022 08:50:26 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7D0F3C341C0; Thu, 9 Jun 2022 08:50:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654764626; bh=VXVTb8UycHpUpVRa/xQgYwy0PCefetlRUUYTqy80b9U=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fWpVVqEYIHUeyxJm/e7fvVlI5mnpdsbI0q5U8oj/kniu3piRZ/AJFacEhvKFAnNXl rNXk6t9UUkgQ0ZlbLj2d6VRPupxIMK8L8OvOl1fqoGsJQStJbQb8vIKk+wUBPAYom5 boeqCKi+EEe0g0fMWepNFXgYULZMblXNCNt2aeVrWuY8JNUQH2VMRvQddnHczeo4mV 0gghL3Z0HnGAkvwm0yaJ+uH3MKjiHdGAOFpuL1poaW0L7xh9uLR9mX3zx7ZcGKr3It ULjBGShfC9hQsnCFkScQCGTZRAH2jPr79c6C3FG8pI3vOJiP6EPM/LRT3VDyUawbhV QZ983H1DH6ZoA== From: Tzung-Bi Shih To: bleung@chromium.org, groeck@chromium.org Cc: chrome-platform@lists.linux.dev, tzungbi@kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 10/21] platform/chrome: cros_ec_proto: separate cros_ec_get_proto_info_legacy() Date: Thu, 9 Jun 2022 08:49:46 +0000 Message-Id: <20220609084957.3684698-11-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220609084957.3684698-1-tzungbi@kernel.org> References: <20220609084957.3684698-1-tzungbi@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" 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. Reviewed-by: Guenter Roeck Signed-off-by: Tzung-Bi Shih --- No change from v3. Changes from v2: - Add R-b tag. 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/chr= ome/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_devi= ce *ec_dev, int devidx) return ret; } =20 -static int cros_ec_host_command_proto_query_v2(struct cros_ec_device *ec_d= ev) +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 =3D max(sizeof(*hello_params), sizeof(*hello_response)); =20 - msg =3D kmalloc(sizeof(*msg) + len, GFP_KERNEL); + ec_dev->proto_version =3D 2; + + msg =3D kzalloc(sizeof(*msg) + max(sizeof(*params), sizeof(*response)), G= FP_KERNEL); if (!msg) return -ENOMEM; =20 - msg->version =3D 0; msg->command =3D EC_CMD_HELLO; - hello_params =3D (struct ec_params_hello *)msg->data; - msg->outsize =3D sizeof(*hello_params); - hello_response =3D (struct ec_response_hello *)msg->data; - msg->insize =3D sizeof(*hello_response); + msg->insize =3D sizeof(*response); + msg->outsize =3D sizeof(*params); =20 - hello_params->in_data =3D 0xa0b0c0d0; + params =3D (struct ec_params_hello *)msg->data; + params->in_data =3D 0xa0b0c0d0; =20 ret =3D 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 !=3D EC_RES_SUCCESS) { - dev_err(ec_dev->dev, - "EC responded to v2 hello with error: %d\n", - msg->result); - ret =3D msg->result; + } + + ret =3D cros_ec_map_error(msg->result); + if (ret) { + dev_err(ec_dev->dev, "EC responded to v2 hello with error: %d\n", msg->r= esult); goto exit; - } else if (hello_response->out_data !=3D 0xa1b2c3d4) { + } + + response =3D (struct ec_response_hello *)msg->data; + if (response->out_data !=3D 0xa1b2c3d4) { dev_err(ec_dev->dev, "EC responded to v2 hello with bad result: %u\n", - hello_response->out_data); + response->out_data); ret =3D -EBADMSG; goto exit; } =20 - ret =3D 0; + ec_dev->max_request =3D EC_PROTO2_MAX_PARAM_SIZE; + ec_dev->max_response =3D EC_PROTO2_MAX_PARAM_SIZE; + ec_dev->max_passthru =3D 0; + ec_dev->pkt_xfer =3D NULL; + ec_dev->din_size =3D EC_PROTO2_MSG_BYTES; + ec_dev->dout_size =3D EC_PROTO2_MSG_BYTES; =20 - exit: + dev_dbg(ec_dev->dev, "falling back to proto v2\n"); + ret =3D 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 =3D 2; - ret =3D cros_ec_host_command_proto_query_v2(ec_dev); - - if (ret =3D=3D 0) { - /* V2 hello succeeded. */ - dev_dbg(ec_dev->dev, "falling back to proto v2\n"); - - ec_dev->max_request =3D EC_PROTO2_MAX_PARAM_SIZE; - ec_dev->max_response =3D EC_PROTO2_MAX_PARAM_SIZE; - ec_dev->max_passthru =3D 0; - ec_dev->pkt_xfer =3D NULL; - ec_dev->din_size =3D EC_PROTO2_MSG_BYTES; - ec_dev->dout_size =3D EC_PROTO2_MSG_BYTES; - } else { + ret =3D 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 =3D EC_PROTO_VERSION_UNKNOWN; dev_dbg(ec_dev->dev, "EC query failed: %d\n", ret); - goto exit; + return ret; } } =20 diff --git a/drivers/platform/chrome/cros_ec_proto_test.c b/drivers/platfor= m/chrome/cros_ec_proto_test.c index 1378ac90e1cb..8e47cb70dc8b 100644 --- a/drivers/platform/chrome/cros_ec_proto_test.c +++ b/drivers/platform/chrome/cros_ec_proto_test.c @@ -485,7 +485,7 @@ static void cros_ec_proto_test_query_all_legacy_normal_= v3_return_error(struct ku KUNIT_ASSERT_PTR_NE(test, mock, NULL); } =20 - /* For cros_ec_host_command_proto_query_v2(). */ + /* For cros_ec_get_proto_info_legacy(). */ { struct ec_response_hello *data; =20 @@ -512,7 +512,7 @@ static void cros_ec_proto_test_query_all_legacy_normal_= v3_return_error(struct ku KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); } =20 - /* For cros_ec_host_command_proto_query_v2(). */ + /* For cros_ec_get_proto_info_legacy(). */ { struct ec_params_hello *data; =20 @@ -550,7 +550,7 @@ static void cros_ec_proto_test_query_all_legacy_normal_= v3_return0(struct kunit * KUNIT_ASSERT_PTR_NE(test, mock, NULL); } =20 - /* For cros_ec_host_command_proto_query_v2(). */ + /* For cros_ec_get_proto_info_legacy(). */ { struct ec_response_hello *data; =20 @@ -577,7 +577,7 @@ static void cros_ec_proto_test_query_all_legacy_normal_= v3_return0(struct kunit * KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); } =20 - /* For cros_ec_host_command_proto_query_v2(). */ + /* For cros_ec_get_proto_info_legacy(). */ { struct ec_params_hello *data; =20 @@ -615,7 +615,7 @@ static void cros_ec_proto_test_query_all_legacy_xfer_er= ror(struct kunit *test) KUNIT_ASSERT_PTR_NE(test, mock, NULL); } =20 - /* For cros_ec_host_command_proto_query_v2(). */ + /* For cros_ec_get_proto_info_legacy(). */ { mock =3D cros_kunit_ec_xfer_mock_addx(test, -EIO, EC_RES_SUCCESS, 0); KUNIT_ASSERT_PTR_NE(test, mock, NULL); @@ -638,7 +638,7 @@ static void cros_ec_proto_test_query_all_legacy_xfer_er= ror(struct kunit *test) KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); } =20 - /* For cros_ec_host_command_proto_query_v2(). */ + /* For cros_ec_get_proto_info_legacy(). */ { mock =3D cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); @@ -663,7 +663,7 @@ static void cros_ec_proto_test_query_all_legacy_return_= error(struct kunit *test) KUNIT_ASSERT_PTR_NE(test, mock, NULL); } =20 - /* For cros_ec_host_command_proto_query_v2(). */ + /* For cros_ec_get_proto_info_legacy(). */ { mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0= ); KUNIT_ASSERT_PTR_NE(test, mock, NULL); @@ -671,7 +671,7 @@ static void cros_ec_proto_test_query_all_legacy_return_= error(struct kunit *test) =20 cros_ec_proto_test_query_all_pretest(test); ret =3D 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); =20 /* For cros_ec_get_proto_info() without passthru. */ @@ -686,7 +686,7 @@ static void cros_ec_proto_test_query_all_legacy_return_= error(struct kunit *test) KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); } =20 - /* For cros_ec_host_command_proto_query_v2(). */ + /* For cros_ec_get_proto_info_legacy(). */ { mock =3D cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); @@ -711,7 +711,7 @@ static void cros_ec_proto_test_query_all_legacy_data_er= ror(struct kunit *test) KUNIT_ASSERT_PTR_NE(test, mock, NULL); } =20 - /* For cros_ec_host_command_proto_query_v2(). */ + /* For cros_ec_get_proto_info_legacy(). */ { struct ec_response_hello *data; =20 @@ -739,7 +739,7 @@ static void cros_ec_proto_test_query_all_legacy_data_er= ror(struct kunit *test) KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); } =20 - /* For cros_ec_host_command_proto_query_v2(). */ + /* For cros_ec_get_proto_info_legacy(). */ { mock =3D cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); --=20 2.36.1.255.ge46751e96f-goog From nobody Mon Apr 27 23:53:46 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 71A6EC433EF for ; Thu, 9 Jun 2022 08:52:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240899AbiFIIwu (ORCPT ); Thu, 9 Jun 2022 04:52:50 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42794 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242572AbiFIIur (ORCPT ); Thu, 9 Jun 2022 04:50:47 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9047A62E8 for ; Thu, 9 Jun 2022 01:50:28 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 2DF65619BF for ; Thu, 9 Jun 2022 08:50:28 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id B5C45C34114; Thu, 9 Jun 2022 08:50:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654764627; bh=2gdFBqKLJNRIYd2oIDEi1sQydP61hfqpk73r+DEhJx0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=J18H0C5zWO2JhmqCUSA7oT9XRwJRc6f/+MOCez+6Ny7OyI6jA9+Be5vT7LdJNMmjz uRVokqX9UTkd2jbsMF6FRTWO1//YrxDiWTkfYbtZuMOrPuwDXbTfpb/iAIlEh0NFQM +g8Q98X2l6MUbXgovP5LQ8RAViEDV8p6iM4K569qdYBI936xZR0wjtOKGS4nZe0tFi jrxzfOSmWrXDWtIGWNVyKiRE/pfVAAr+ggv+Snkq6GI/x6FdvRy6NlF6F5Tg1uAAIf a8UoDxM4mh+LybaeiYGKsTZhPjAHyeXdo54dTHlsV5qd0xT4n2xR45+5ZXkuFsJFiW xSiHLwl+gMOFA== From: Tzung-Bi Shih To: bleung@chromium.org, groeck@chromium.org Cc: chrome-platform@lists.linux.dev, tzungbi@kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 11/21] platform/chrome: cros_ec_proto: add Kunit test for getting legacy info Date: Thu, 9 Jun 2022 08:49:47 +0000 Message-Id: <20220609084957.3684698-12-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220609084957.3684698-1-tzungbi@kernel.org> References: <20220609084957.3684698-1-tzungbi@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" cros_ec_get_proto_info_legacy() expects to receive sizeof(struct ec_response_hello) from send_command(). The payload is valid only if the return value is positive. Add a Kunit test for returning 0 from send_command() in cros_ec_get_proto_info_legacy(). Reviewed-by: Guenter Roeck Signed-off-by: Tzung-Bi Shih --- Changes from v3: - Add R-b tag. drivers/platform/chrome/cros_ec_proto_test.c | 49 ++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/drivers/platform/chrome/cros_ec_proto_test.c b/drivers/platfor= m/chrome/cros_ec_proto_test.c index 8e47cb70dc8b..63071af81c94 100644 --- a/drivers/platform/chrome/cros_ec_proto_test.c +++ b/drivers/platform/chrome/cros_ec_proto_test.c @@ -751,6 +751,54 @@ static void cros_ec_proto_test_query_all_legacy_data_e= rror(struct kunit *test) } } =20 +static void cros_ec_proto_test_query_all_legacy_return0(struct kunit *test) +{ + struct cros_ec_proto_test_priv *priv =3D test->priv; + struct cros_ec_device *ec_dev =3D &priv->ec_dev; + struct ec_xfer_mock *mock; + int ret; + + /* For cros_ec_get_proto_info() without passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0= ); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + /* For cros_ec_get_proto_info_legacy(). */ + { + mock =3D cros_kunit_ec_xfer_mock_add(test, 0); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + cros_ec_proto_test_query_all_pretest(test); + ret =3D cros_ec_query_all(ec_dev); + KUNIT_EXPECT_EQ(test, ret, -EPROTO); + KUNIT_EXPECT_EQ(test, ec_dev->proto_version, EC_PROTO_VERSION_UNKNOWN); + + /* For cros_ec_get_proto_info() without passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_protocol_info)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); + } + + /* For cros_ec_get_proto_info_legacy(). */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello)= ); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_hello)); + } +} + static void cros_ec_proto_test_query_all_no_mkbp(struct kunit *test) { struct cros_ec_proto_test_priv *priv =3D test->priv; @@ -1135,6 +1183,7 @@ static struct kunit_case cros_ec_proto_test_cases[] = =3D { KUNIT_CASE(cros_ec_proto_test_query_all_legacy_xfer_error), KUNIT_CASE(cros_ec_proto_test_query_all_legacy_return_error), KUNIT_CASE(cros_ec_proto_test_query_all_legacy_data_error), + KUNIT_CASE(cros_ec_proto_test_query_all_legacy_return0), KUNIT_CASE(cros_ec_proto_test_query_all_no_mkbp), KUNIT_CASE(cros_ec_proto_test_query_all_no_host_sleep), KUNIT_CASE(cros_ec_proto_test_query_all_default_wake_mask_return_error), --=20 2.36.1.255.ge46751e96f-goog From nobody Mon Apr 27 23:53:46 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 83A30C43334 for ; Thu, 9 Jun 2022 08:51:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242164AbiFIIvq (ORCPT ); Thu, 9 Jun 2022 04:51:46 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42788 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242571AbiFIIur (ORCPT ); Thu, 9 Jun 2022 04:50:47 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8441123BDC for ; Thu, 9 Jun 2022 01:50:29 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 6708E619BD for ; Thu, 9 Jun 2022 08:50:29 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id ED794C341C0; Thu, 9 Jun 2022 08:50:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654764628; bh=PPW9kWyUtvh6O+9p8p4bHoodFe3Jhm8gBrr0zshmtH0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=nD1WawmXL8edgmvR2XUYkuIuVV3SCFIIHq7/RPjcuWyBsYdL7lDDv4LExceL6o68V 50Z40LjhhwHVe5bBpP/OuAAU0m8bThKK/6Ghs/ZY4svsKqgaWjwC6jdVY4Lv1HqtyX VTyo/IvkdPoddYATq1SAlV7THSLCPpifSb9BbidP0MECLQuDxcxI+255j2HS/YCu9M 3V7ou3Pz0KhlMnR/ZaXm3GjLTSfjxbuUTW+xRhGqgVUIvaqLMi0eQIl9Y8W9G45jXw mvrHgJ5oBFjSo/zlezI/wiLYgYAedTaNO66PZvX9vYqitJ/MY/uy0WwP/FSstPhSmF qX3d8v2xAWnMw== From: Tzung-Bi Shih To: bleung@chromium.org, groeck@chromium.org Cc: chrome-platform@lists.linux.dev, tzungbi@kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 12/21] platform/chrome: cros_ec_proto: handle empty payload in getting info legacy Date: Thu, 9 Jun 2022 08:49:48 +0000 Message-Id: <20220609084957.3684698-13-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220609084957.3684698-1-tzungbi@kernel.org> References: <20220609084957.3684698-1-tzungbi@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" cros_ec_get_proto_info_legacy() expects to receive sizeof(struct ec_response_hello) from send_command(). The payload is valid only if the return value is positive. Return -EPROTO if send_command() returns 0 in cros_ec_get_proto_info_legacy(). Reviewed-by: Guenter Roeck Signed-off-by: Tzung-Bi Shih --- Changes from v3: - Add R-b tag. Changes from v2: - Separate Kunit test to another patch. drivers/platform/chrome/cros_ec_proto.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chr= ome/cros_ec_proto.c index 04b9704ed302..473654f50bca 100644 --- a/drivers/platform/chrome/cros_ec_proto.c +++ b/drivers/platform/chrome/cros_ec_proto.c @@ -356,7 +356,7 @@ static int cros_ec_get_proto_info_legacy(struct cros_ec= _device *ec_dev) struct cros_ec_command *msg; struct ec_params_hello *params; struct ec_response_hello *response; - int ret; + int ret, mapped; =20 ec_dev->proto_version =3D 2; =20 @@ -377,12 +377,18 @@ static int cros_ec_get_proto_info_legacy(struct cros_= ec_device *ec_dev) goto exit; } =20 - ret =3D cros_ec_map_error(msg->result); - if (ret) { + mapped =3D cros_ec_map_error(msg->result); + if (mapped) { + ret =3D mapped; dev_err(ec_dev->dev, "EC responded to v2 hello with error: %d\n", msg->r= esult); goto exit; } =20 + if (ret =3D=3D 0) { + ret =3D -EPROTO; + goto exit; + } + response =3D (struct ec_response_hello *)msg->data; if (response->out_data !=3D 0xa1b2c3d4) { dev_err(ec_dev->dev, --=20 2.36.1.255.ge46751e96f-goog From nobody Mon Apr 27 23:53:46 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A6138C433EF for ; Thu, 9 Jun 2022 08:52:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242676AbiFIIwf (ORCPT ); Thu, 9 Jun 2022 04:52:35 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42654 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232860AbiFIIus (ORCPT ); Thu, 9 Jun 2022 04:50:48 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1804247558 for ; Thu, 9 Jun 2022 01:50:31 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id A8DF6619BF for ; Thu, 9 Jun 2022 08:50:30 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 32778C3411E; Thu, 9 Jun 2022 08:50:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654764630; bh=LINcrOmBhCitcXeglTlWjq+ceqlHnSXh5c4ROdaebSA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=e9uG/NZSeSkoug7HdJCMYW4KSjKvTbhbZS3JvhHelhVQpRfrZKEDpVLzrGpLb694n q+zeDdqV3v7TiP0/+8cWBljcXluPnvMGu7nQtON3Q4Pdz+eD5BB11Sfl1pSB7YkKDg gBOLsFeziGWF32/+ZjIGEOd765Jfk8ZM5bS86Ux7Zz7n8TjIfhAg3cIfcMFR+ueJl6 It96VCbWeLOLlfxh+k3OiKeK9catHYATXTu2y2etzFm2kKorkNYJDGtspeL5/EFV1B +gpCJ6NLaAZDrnj9iWMk/qtytGuvoAcmjWRL6eHDu7UGDUcR25SNSD+OT8CZUBBcs8 wMFjmGGK1iC9Q== From: Tzung-Bi Shih To: bleung@chromium.org, groeck@chromium.org Cc: chrome-platform@lists.linux.dev, tzungbi@kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 13/21] platform/chrome: cros_ec_proto: don't show MKBP version if unsupported Date: Thu, 9 Jun 2022 08:49:49 +0000 Message-Id: <20220609084957.3684698-14-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220609084957.3684698-1-tzungbi@kernel.org> References: <20220609084957.3684698-1-tzungbi@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" It wrongly showed the following message when it doesn't support MKBP: "MKBP support version 4294967295". Fix it. Reviewed-by: Guenter Roeck Signed-off-by: Tzung-Bi Shih --- No change from v3. Changes from v2: - Add R-b tag. drivers/platform/chrome/cros_ec_proto.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chr= ome/cros_ec_proto.c index 473654f50bca..e6e9b5b59e58 100644 --- a/drivers/platform/chrome/cros_ec_proto.c +++ b/drivers/platform/chrome/cros_ec_proto.c @@ -512,13 +512,13 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev) ret =3D cros_ec_get_host_command_version_mask(ec_dev, EC_CMD_GET_NEXT_EVENT, &ver_mask); - if (ret < 0 || ver_mask =3D=3D 0) + if (ret < 0 || ver_mask =3D=3D 0) { ec_dev->mkbp_event_supported =3D 0; - else + } else { ec_dev->mkbp_event_supported =3D fls(ver_mask); =20 - dev_dbg(ec_dev->dev, "MKBP support version %u\n", - ec_dev->mkbp_event_supported - 1); + dev_dbg(ec_dev->dev, "MKBP support version %u\n", ec_dev->mkbp_event_sup= ported - 1); + } =20 /* Probe if host sleep v1 is supported for S0ix failure detection. */ ret =3D cros_ec_get_host_command_version_mask(ec_dev, --=20 2.36.1.255.ge46751e96f-goog From nobody Mon Apr 27 23:53:46 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id AE874C433EF for ; Thu, 9 Jun 2022 08:52:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242712AbiFIIwb (ORCPT ); Thu, 9 Jun 2022 04:52:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43042 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242518AbiFIIus (ORCPT ); Thu, 9 Jun 2022 04:50:48 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E02AB2AC6 for ; Thu, 9 Jun 2022 01:50:33 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 9475BB82C89 for ; Thu, 9 Jun 2022 08:50:32 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6A3B4C34114; Thu, 9 Jun 2022 08:50:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654764631; bh=FuHJEPkhi9pGFBwQJd3k04GT6ckgjnbCG+2grfpJ114=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TbuYdlNerWOumMXOC1zCmNGxek/p3TJnSFiPkUI62Rd+0DmwCMe14hL24diMslSzm ojMqWz4lo3D7A1OjLN8vnoWKRx2bZ5lLEl8jCFXsIoMVivNMkUsJWWT5BVTSbi2V+x pc2Y2KSFvr0IG+1PBBCnqfvqSPTIwT69m3Vp3Te4zfm4ASpQgtQeFkA0r+c4Jqn24b XU3wzqGSuHR9ZRKkF4uzuV/qPpz12BTzqsrWJjl1r7HTacISD1nzOY+lCiXErFfD/c W7aG4Jc6ZueunKXqp9GpxzD4PZ8kwpkbfEvHz+m9yPJ1PFFsY0Di0qRXjyVXqWXrXm t1DWEHINSmWlA== From: Tzung-Bi Shih To: bleung@chromium.org, groeck@chromium.org Cc: chrome-platform@lists.linux.dev, tzungbi@kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 14/21] platform/chrome: cros_ec_proto: return 0 on getting cmd mask success Date: Thu, 9 Jun 2022 08:49:50 +0000 Message-Id: <20220609084957.3684698-15-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220609084957.3684698-1-tzungbi@kernel.org> References: <20220609084957.3684698-1-tzungbi@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" cros_ec_get_host_command_version_mask() used to return value from send_command() which is number of available bytes for input payload on success (i.e. sizeof(struct ec_response_get_cmd_versions)). However, the callers don't need to know how many bytes are available. Don't return number of available bytes. Instead, return 0 on success; otherwise, negative integers on error. Also remove the unneeded `ver_mask` initialization as the callers should take it only if cros_ec_get_host_command_version_mask() returns 0. Reviewed-by: Guenter Roeck Signed-off-by: Tzung-Bi Shih --- Changes from v3: - Add R-b tag. Changes from v2: - Separate Kunit test to another patch. - Rephrase the commit message. Changes from v1: - Return 0 on success; otherwise, negative intergers. drivers/platform/chrome/cros_ec_proto.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chr= ome/cros_ec_proto.c index e6e9b5b59e58..20a1f8f7e70d 100644 --- a/drivers/platform/chrome/cros_ec_proto.c +++ b/drivers/platform/chrome/cros_ec_proto.c @@ -453,6 +453,7 @@ static int cros_ec_get_host_command_version_mask(struct= cros_ec_device *ec_dev, if (ret > 0) { rver =3D (struct ec_response_get_cmd_versions *)msg->data; *mask =3D rver->version_mask; + ret =3D 0; } =20 kfree(msg); @@ -470,7 +471,7 @@ static int cros_ec_get_host_command_version_mask(struct= cros_ec_device *ec_dev, int cros_ec_query_all(struct cros_ec_device *ec_dev) { struct device *dev =3D ec_dev->dev; - u32 ver_mask =3D 0; + u32 ver_mask; int ret; =20 /* First try sending with proto v3. */ @@ -509,9 +510,7 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev) } =20 /* Probe if MKBP event is supported */ - ret =3D cros_ec_get_host_command_version_mask(ec_dev, - EC_CMD_GET_NEXT_EVENT, - &ver_mask); + ret =3D cros_ec_get_host_command_version_mask(ec_dev, EC_CMD_GET_NEXT_EVE= NT, &ver_mask); if (ret < 0 || ver_mask =3D=3D 0) { ec_dev->mkbp_event_supported =3D 0; } else { @@ -521,10 +520,8 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev) } =20 /* Probe if host sleep v1 is supported for S0ix failure detection. */ - ret =3D cros_ec_get_host_command_version_mask(ec_dev, - EC_CMD_HOST_SLEEP_EVENT, - &ver_mask); - ec_dev->host_sleep_v1 =3D (ret >=3D 0 && (ver_mask & EC_VER_MASK(1))); + ret =3D cros_ec_get_host_command_version_mask(ec_dev, EC_CMD_HOST_SLEEP_E= VENT, &ver_mask); + ec_dev->host_sleep_v1 =3D (ret =3D=3D 0 && (ver_mask & EC_VER_MASK(1))); =20 /* Get host event wake mask. */ ret =3D cros_ec_get_host_event_wake_mask(ec_dev, &ec_dev->host_event_wake= _mask); --=20 2.36.1.255.ge46751e96f-goog From nobody Mon Apr 27 23:53:46 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 53454C43334 for ; Thu, 9 Jun 2022 08:52:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242477AbiFIIwE (ORCPT ); Thu, 9 Jun 2022 04:52:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43040 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242573AbiFIIut (ORCPT ); Thu, 9 Jun 2022 04:50:49 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2C40C47561 for ; Thu, 9 Jun 2022 01:50:35 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id CDA2DB82C8A for ; Thu, 9 Jun 2022 08:50:33 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id A2D7CC341C0; Thu, 9 Jun 2022 08:50:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654764632; bh=YqibN8iiTS3WQ3U0XqWD/LCELanWa3MM7HbOLkVQWUc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NVL9Ti3US19rJXfx4EVpU6oEPkJtSv8z56PyA2UxYncgOFqDjqoMPBgxufkwyHa3F //LJTWhEuRI5Gsf4ZOSOc9tg/meVgl8Nm5BDnHF54BcA2ZssPXRFKUrD03c0ooM8lx BVpqQeQtF0+nbnUcf5LGTKkh1V1t96CJGEaTQPH+jfRs22m5ZPpz28XKRCqmUDSxGe 7hl1D3XOmyNYxAt+3iixn16Bw/oncXzTk0mvNpgRKvBOcPCLacjJURDujUF4+AtU8V +d5w/lMnw+MTVgxUT8qetMnqMyxIwbbSqyUOhVraja+kkV5NywcT43zFVSx6ZwiYSH Yh1akVX1E/umA== From: Tzung-Bi Shih To: bleung@chromium.org, groeck@chromium.org Cc: chrome-platform@lists.linux.dev, tzungbi@kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 15/21] platform/chrome: cros_ec_proto: add Kunit test for getting cmd mask error Date: Thu, 9 Jun 2022 08:49:51 +0000 Message-Id: <20220609084957.3684698-16-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220609084957.3684698-1-tzungbi@kernel.org> References: <20220609084957.3684698-1-tzungbi@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" cros_ec_query_all() uses cros_ec_get_host_command_version_mask() to query the supported MKBP version; cros_ec_get_host_command_version_mask() uses send_command() for transferring the host command. Returning >=3D0 from send_command() only denotes the transfer was success. cros_ec_get_host_command_version_mask() should check if EC wasn't happy by checking `msg->result`. Add a Kunit test for returning error in `msg->result` in cros_ec_get_host_command_version_mask(). For the case, cros_ec_query_all() should find the EC device doesn't support MKBP. Reviewed-by: Guenter Roeck Signed-off-by: Tzung-Bi Shih --- Changes from v3: - Add R-b tag. - Fix typo s/transfering/transferring/. drivers/platform/chrome/cros_ec_proto_test.c | 89 ++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/drivers/platform/chrome/cros_ec_proto_test.c b/drivers/platfor= m/chrome/cros_ec_proto_test.c index 63071af81c94..ce7a2f64f01b 100644 --- a/drivers/platform/chrome/cros_ec_proto_test.c +++ b/drivers/platform/chrome/cros_ec_proto_test.c @@ -892,6 +892,94 @@ static void cros_ec_proto_test_query_all_no_mkbp(struc= t kunit *test) } } =20 +static void cros_ec_proto_test_query_all_no_mkbp_return_error(struct kunit= *test) +{ + struct cros_ec_proto_test_priv *priv =3D test->priv; + struct cros_ec_device *ec_dev =3D &priv->ec_dev; + struct ec_xfer_mock *mock; + int ret; + + /* Set some garbage bytes. */ + ec_dev->mkbp_event_supported =3D 0xbf; + + /* For cros_ec_get_proto_info() without passthru. */ + { + struct ec_response_get_protocol_info *data; + + mock =3D cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + + /* + * Although it doesn't check the value, provides valid sizes so that + * cros_ec_query_all() allocates din and dout correctly. + */ + data =3D (struct ec_response_get_protocol_info *)mock->o_data; + data->max_request_packet_size =3D 0xbe; + data->max_response_packet_size =3D 0xef; + } + + /* For cros_ec_get_proto_info() with passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0= ); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + /* For cros_ec_get_host_command_version_mask() for MKBP. */ + { + mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0= ); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + cros_ec_proto_test_query_all_pretest(test); + ret =3D cros_ec_query_all(ec_dev); + KUNIT_EXPECT_EQ(test, ret, 0); + + /* For cros_ec_get_proto_info() without passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_protocol_info)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); + } + + /* For cros_ec_get_proto_info() with passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, + EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | + EC_CMD_GET_PROTOCOL_INFO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_protocol_info)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); + } + + /* For cros_ec_get_host_command_version_mask() for MKBP. */ + { + struct ec_params_get_cmd_versions *data; + + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_cmd_versions)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data)); + + data =3D (struct ec_params_get_cmd_versions *)mock->i_data; + KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_GET_NEXT_EVENT); + + KUNIT_EXPECT_EQ(test, ec_dev->mkbp_event_supported, 0); + } +} + static void cros_ec_proto_test_query_all_no_host_sleep(struct kunit *test) { struct cros_ec_proto_test_priv *priv =3D test->priv; @@ -1185,6 +1273,7 @@ static struct kunit_case cros_ec_proto_test_cases[] = =3D { KUNIT_CASE(cros_ec_proto_test_query_all_legacy_data_error), KUNIT_CASE(cros_ec_proto_test_query_all_legacy_return0), KUNIT_CASE(cros_ec_proto_test_query_all_no_mkbp), + KUNIT_CASE(cros_ec_proto_test_query_all_no_mkbp_return_error), KUNIT_CASE(cros_ec_proto_test_query_all_no_host_sleep), KUNIT_CASE(cros_ec_proto_test_query_all_default_wake_mask_return_error), {} --=20 2.36.1.255.ge46751e96f-goog From nobody Mon Apr 27 23:53:46 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 742ABC433EF for ; Thu, 9 Jun 2022 08:52:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242335AbiFIIv7 (ORCPT ); Thu, 9 Jun 2022 04:51:59 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43020 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242411AbiFIIut (ORCPT ); Thu, 9 Jun 2022 04:50:49 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F1EA84755D for ; Thu, 9 Jun 2022 01:50:34 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 55477619BD for ; Thu, 9 Jun 2022 08:50:34 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id D958BC34114; Thu, 9 Jun 2022 08:50:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654764633; bh=SgO6CDbY+UqjQi0CI0tKrqW4Qj9sx/TpOYxB52nDipM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jKUhJL/WxZjYO14TYAH9gpFSMLiB9QTVqRJQ36VeQcqfiUVnBjKY93G+XCEpmTPyq AOvDkdLAhMy5RNgKLbRVH5TlSUHCMDYGk7MPQqlhEkrDXjb4oRBQO5xbjR1nkxZ8g+ 9pbqes08M7rstzxEaewT0nA32X3lxM+SvyD4VkJh7/E/AOYLDSpbYhKg3oQOvPmnX/ 9p6MynIED2Iha0mVJqSoyajrFpcFCIb1vsgFtdMTCXi/b2Z021TutBVFOczrsgIgvu TNYlzHy6Emm7ssWPxejHhtq8is3eB0mC8RHLHv/Squ2WAuWVXXcuDupQ/Ahd9jMCxj IPqI/s0oH5w/g== From: Tzung-Bi Shih To: bleung@chromium.org, groeck@chromium.org Cc: chrome-platform@lists.linux.dev, tzungbi@kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 16/21] platform/chrome: cros_ec_proto: check `msg->result` in getting cmd mask Date: Thu, 9 Jun 2022 08:49:52 +0000 Message-Id: <20220609084957.3684698-17-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220609084957.3684698-1-tzungbi@kernel.org> References: <20220609084957.3684698-1-tzungbi@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" cros_ec_get_host_command_version_mask() should check if EC wasn't happy by checking `msg->result`. Use cros_ec_map_error() and return the error code if any. Reviewed-by: Guenter Roeck Signed-off-by: Tzung-Bi Shih --- Changes from v3: - Add R-b tag. drivers/platform/chrome/cros_ec_proto.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chr= ome/cros_ec_proto.c index 20a1f8f7e70d..ac445bbbd060 100644 --- a/drivers/platform/chrome/cros_ec_proto.c +++ b/drivers/platform/chrome/cros_ec_proto.c @@ -428,13 +428,12 @@ static int cros_ec_get_proto_info_legacy(struct cros_= ec_device *ec_dev) * the caller has ec_dev->lock mutex or the caller knows there is * no other command in progress. */ -static int cros_ec_get_host_command_version_mask(struct cros_ec_device *ec= _dev, - u16 cmd, u32 *mask) +static int cros_ec_get_host_command_version_mask(struct cros_ec_device *ec= _dev, u16 cmd, u32 *mask) { struct ec_params_get_cmd_versions *pver; struct ec_response_get_cmd_versions *rver; struct cros_ec_command *msg; - int ret; + int ret, mapped; =20 msg =3D kmalloc(sizeof(*msg) + max(sizeof(*rver), sizeof(*pver)), GFP_KERNEL); @@ -450,14 +449,20 @@ static int cros_ec_get_host_command_version_mask(stru= ct cros_ec_device *ec_dev, pver->cmd =3D cmd; =20 ret =3D send_command(ec_dev, msg); - if (ret > 0) { - rver =3D (struct ec_response_get_cmd_versions *)msg->data; - *mask =3D rver->version_mask; - ret =3D 0; + if (ret < 0) + goto exit; + + mapped =3D cros_ec_map_error(msg->result); + if (mapped) { + ret =3D mapped; + goto exit; } =20 + rver =3D (struct ec_response_get_cmd_versions *)msg->data; + *mask =3D rver->version_mask; + ret =3D 0; +exit: kfree(msg); - return ret; } =20 --=20 2.36.1.255.ge46751e96f-goog From nobody Mon Apr 27 23:53:46 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 92E4EC43334 for ; Thu, 9 Jun 2022 08:52:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242179AbiFIIw3 (ORCPT ); Thu, 9 Jun 2022 04:52:29 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41854 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242576AbiFIIut (ORCPT ); Thu, 9 Jun 2022 04:50:49 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 12DAF47571 for ; Thu, 9 Jun 2022 01:50:36 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 9393F619DA for ; Thu, 9 Jun 2022 08:50:35 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1CB8AC385A2; Thu, 9 Jun 2022 08:50:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654764635; bh=u+Yb4k5ENICLoEU8++U20DGqPdr8Nep76Z7YzNP8wNw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QrwliOYkcniM5X30zZ5cJTScRJYp4Ni8wP6+84/TTSoZe6SMMQOGFcMF8VRnE9dwL xwamXU7DloXexQY04XOkPnFAfVgy/j1jsuJXc9DWGejd+8rE84GTo/Nu/3YOz4EGMA SMqTfVM/3ukffLKyUkkQIj9MJsb0QFU2ZPaKcr7X4cjTQ4NvmKI10H5ikTuFxPfOe4 jn1d9EIsm4piS+Sxu87AF1jvY80Tmo3XyDZpCKuIXQzlTWe2vH6vzqTucxBz6TdLlY WbyVETGAVjc16YF35nwYi1gEhm4UbpNbCPIFC0dRDyoy7hY8tnkhi5qurLaG7f9dvq Doe88dPgEXF4g== From: Tzung-Bi Shih To: bleung@chromium.org, groeck@chromium.org Cc: chrome-platform@lists.linux.dev, tzungbi@kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 17/21] platform/chrome: cros_ec_proto: add Kunit tests for getting cmd mask Date: Thu, 9 Jun 2022 08:49:53 +0000 Message-Id: <20220609084957.3684698-18-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220609084957.3684698-1-tzungbi@kernel.org> References: <20220609084957.3684698-1-tzungbi@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" cros_ec_get_host_command_version_mask() expects to receive sizeof(struct ec_response_get_cmd_versions) from send_command(). The payload is valid only if the return value is positive. Add Kunit tests for returning 0 from send_command() in cros_ec_get_host_command_version_mask(). Note that because the 2 cros_ec_get_host_command_version_mask() use the same `ver_mask`. cros_ec_proto_test_query_all_no_host_sleep_return0() polluates the `ver_mask` and returns 0 on the second send_command() to make sure the second cros_ec_get_host_command_version_mask() doesn't take the garbage from the previous call. Reviewed-by: Guenter Roeck Signed-off-by: Tzung-Bi Shih --- Changes from v3: - Add R-b tag. drivers/platform/chrome/cros_ec_proto_test.c | 197 +++++++++++++++++++ 1 file changed, 197 insertions(+) diff --git a/drivers/platform/chrome/cros_ec_proto_test.c b/drivers/platfor= m/chrome/cros_ec_proto_test.c index ce7a2f64f01b..757d601f4aee 100644 --- a/drivers/platform/chrome/cros_ec_proto_test.c +++ b/drivers/platform/chrome/cros_ec_proto_test.c @@ -980,6 +980,94 @@ static void cros_ec_proto_test_query_all_no_mkbp_retur= n_error(struct kunit *test } } =20 +static void cros_ec_proto_test_query_all_no_mkbp_return0(struct kunit *tes= t) +{ + struct cros_ec_proto_test_priv *priv =3D test->priv; + struct cros_ec_device *ec_dev =3D &priv->ec_dev; + struct ec_xfer_mock *mock; + int ret; + + /* Set some garbage bytes. */ + ec_dev->mkbp_event_supported =3D 0xbf; + + /* For cros_ec_get_proto_info() without passthru. */ + { + struct ec_response_get_protocol_info *data; + + mock =3D cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + + /* + * Although it doesn't check the value, provides valid sizes so that + * cros_ec_query_all() allocates din and dout correctly. + */ + data =3D (struct ec_response_get_protocol_info *)mock->o_data; + data->max_request_packet_size =3D 0xbe; + data->max_response_packet_size =3D 0xef; + } + + /* For cros_ec_get_proto_info() with passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0= ); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + /* For cros_ec_get_host_command_version_mask() for MKBP. */ + { + mock =3D cros_kunit_ec_xfer_mock_add(test, 0); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + cros_ec_proto_test_query_all_pretest(test); + ret =3D cros_ec_query_all(ec_dev); + KUNIT_EXPECT_EQ(test, ret, 0); + + /* For cros_ec_get_proto_info() without passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_protocol_info)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); + } + + /* For cros_ec_get_proto_info() with passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, + EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | + EC_CMD_GET_PROTOCOL_INFO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_protocol_info)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); + } + + /* For cros_ec_get_host_command_version_mask() for MKBP. */ + { + struct ec_params_get_cmd_versions *data; + + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_cmd_versions)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data)); + + data =3D (struct ec_params_get_cmd_versions *)mock->i_data; + KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_GET_NEXT_EVENT); + + KUNIT_EXPECT_EQ(test, ec_dev->mkbp_event_supported, 0); + } +} + static void cros_ec_proto_test_query_all_no_host_sleep(struct kunit *test) { struct cros_ec_proto_test_priv *priv =3D test->priv; @@ -1086,6 +1174,113 @@ static void cros_ec_proto_test_query_all_no_host_sl= eep(struct kunit *test) } } =20 +static void cros_ec_proto_test_query_all_no_host_sleep_return0(struct kuni= t *test) +{ + struct cros_ec_proto_test_priv *priv =3D test->priv; + struct cros_ec_device *ec_dev =3D &priv->ec_dev; + struct ec_xfer_mock *mock; + int ret; + + /* Set some garbage bytes. */ + ec_dev->host_sleep_v1 =3D true; + + /* For cros_ec_get_proto_info() without passthru. */ + { + struct ec_response_get_protocol_info *data; + + mock =3D cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + + /* + * Although it doesn't check the value, provides valid sizes so that + * cros_ec_query_all() allocates din and dout correctly. + */ + data =3D (struct ec_response_get_protocol_info *)mock->o_data; + data->max_request_packet_size =3D 0xbe; + data->max_response_packet_size =3D 0xef; + } + + /* For cros_ec_get_proto_info() with passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0= ); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + /* For cros_ec_get_host_command_version_mask() for MKBP. */ + { + struct ec_response_get_cmd_versions *data; + + mock =3D cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + + /* In order to pollute next cros_ec_get_host_command_version_mask(). */ + data =3D (struct ec_response_get_cmd_versions *)mock->o_data; + data->version_mask =3D 0xbeef; + } + + /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ + { + mock =3D cros_kunit_ec_xfer_mock_add(test, 0); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + cros_ec_proto_test_query_all_pretest(test); + ret =3D cros_ec_query_all(ec_dev); + KUNIT_EXPECT_EQ(test, ret, 0); + + /* For cros_ec_get_proto_info() without passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_protocol_info)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); + } + + /* For cros_ec_get_proto_info() with passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, + EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | + EC_CMD_GET_PROTOCOL_INFO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_protocol_info)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); + } + + /* For cros_ec_get_host_command_version_mask() for MKBP. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_cmd_versions)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd= _versions)); + } + + /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_cmd_versions)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd= _versions)); + + KUNIT_EXPECT_FALSE(test, ec_dev->host_sleep_v1); + } +} + static void cros_ec_proto_test_query_all_default_wake_mask_return_error(st= ruct kunit *test) { struct cros_ec_proto_test_priv *priv =3D test->priv; @@ -1274,7 +1469,9 @@ static struct kunit_case cros_ec_proto_test_cases[] = =3D { KUNIT_CASE(cros_ec_proto_test_query_all_legacy_return0), KUNIT_CASE(cros_ec_proto_test_query_all_no_mkbp), KUNIT_CASE(cros_ec_proto_test_query_all_no_mkbp_return_error), + KUNIT_CASE(cros_ec_proto_test_query_all_no_mkbp_return0), KUNIT_CASE(cros_ec_proto_test_query_all_no_host_sleep), + KUNIT_CASE(cros_ec_proto_test_query_all_no_host_sleep_return0), KUNIT_CASE(cros_ec_proto_test_query_all_default_wake_mask_return_error), {} }; --=20 2.36.1.255.ge46751e96f-goog From nobody Mon Apr 27 23:53:46 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 69C27C433EF for ; Thu, 9 Jun 2022 08:52:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242573AbiFIIwR (ORCPT ); Thu, 9 Jun 2022 04:52:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41910 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242587AbiFIIuu (ORCPT ); Thu, 9 Jun 2022 04:50:50 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BE57748330 for ; Thu, 9 Jun 2022 01:50:38 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 7EEF0B82C83 for ; Thu, 9 Jun 2022 08:50:37 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 544E1C3411F; Thu, 9 Jun 2022 08:50:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654764636; bh=f069RBwbvty/hrrbrykAMX7yJ7tJNSW+6U5hCyLUYZA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oZVRsKg6IuidfW4OHyD38cNwoXMeI+q7JwwJR5X2jQ4FTW+8TABWe0iLL2JoegLuU ZWuAWiyt8gJVzhuYhw2EuGQr6MM+rE1eVU8qkSXkrbGoCVYfDUVJqgP9kNRMNJnP6P kBMhm5EQctfHNK6wtbme59c62XRfa8e7XsAT6pK+6So9MrvkboxGeRXbKqs44LRsZl zDsOlB+FDXPP48AfG2094Au/BvzQc13K4SWbtghql8X8154dGdFh/qbjuDDnvMewNu +ubO54aicN6AGljp4KifbyIMufUSj3m6vYDrvhMY+glpW2sVQE0XifY197RXGtn6ey baJcRH10Zn+Dg== From: Tzung-Bi Shih To: bleung@chromium.org, groeck@chromium.org Cc: chrome-platform@lists.linux.dev, tzungbi@kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 18/21] platform/chrome: cros_ec_proto: handle empty payload in getting cmd mask Date: Thu, 9 Jun 2022 08:49:54 +0000 Message-Id: <20220609084957.3684698-19-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220609084957.3684698-1-tzungbi@kernel.org> References: <20220609084957.3684698-1-tzungbi@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" cros_ec_get_host_command_version_mask() expects to receive sizeof(struct ec_response_get_cmd_versions) from send_command(). The payload is valid only if the return value is positive. Return -EPROTO if send_command() returns 0 in cros_ec_get_host_command_version_mask(). Reviewed-by: Guenter Roeck Signed-off-by: Tzung-Bi Shih --- Changes from v3: - Add R-b tag. drivers/platform/chrome/cros_ec_proto.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chr= ome/cros_ec_proto.c index ac445bbbd060..28c103315144 100644 --- a/drivers/platform/chrome/cros_ec_proto.c +++ b/drivers/platform/chrome/cros_ec_proto.c @@ -458,6 +458,11 @@ static int cros_ec_get_host_command_version_mask(struc= t cros_ec_device *ec_dev, goto exit; } =20 + if (ret =3D=3D 0) { + ret =3D -EPROTO; + goto exit; + } + rver =3D (struct ec_response_get_cmd_versions *)msg->data; *mask =3D rver->version_mask; ret =3D 0; --=20 2.36.1.255.ge46751e96f-goog From nobody Mon Apr 27 23:53:46 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1C1AFC433EF for ; Thu, 9 Jun 2022 08:52:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242624AbiFIIwW (ORCPT ); Thu, 9 Jun 2022 04:52:22 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41986 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242602AbiFIIuv (ORCPT ); Thu, 9 Jun 2022 04:50:51 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EDAA14838F for ; Thu, 9 Jun 2022 01:50:39 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id AA9A3B82C8C for ; Thu, 9 Jun 2022 08:50:38 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8BD60C385A9; Thu, 9 Jun 2022 08:50:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654764637; bh=ALskAB7uMDL0rnO7G/AGFH8ycfhIWZ7nlarq7eYiqxw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Bip3M02J+XtnZd+kejCcrw9WAFXB27husZyxcbznOxi2M7DSOBaZ57qfSIGaYrYso 7tcq8wkfiHYJm0h3O2YglY7yzdrouA2/ncthmDJw59iORO94bhG81LKlKdvOOALjzf Q2Uyx4+bIjjHCSZj8cow+k1az6hcQ7pB4KzsEjkSU1tQXYEmu/BXtqAPmTWeqh4sBd i0U2AVu6/QMrURmjGZfQugDHaw/WneAIVoC70BRwADokQ4+F6czNNmpt47UucBckFX EWqJixlT8SYEiTLCY+GY98izNwPWzUp3eJVEvT4Cy1hrU8uuRYTuvOF5LvHpDCoWKO bpbR4OWjKHiLg== From: Tzung-Bi Shih To: bleung@chromium.org, groeck@chromium.org Cc: chrome-platform@lists.linux.dev, tzungbi@kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 19/21] platform/chrome: cros_ec_proto: return 0 on getting wake mask success Date: Thu, 9 Jun 2022 08:49:55 +0000 Message-Id: <20220609084957.3684698-20-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220609084957.3684698-1-tzungbi@kernel.org> References: <20220609084957.3684698-1-tzungbi@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" cros_ec_get_host_event_wake_mask() used to return value from send_command() which is number of bytes for input payload on success (i.e. sizeof(struct ec_response_host_event_mask)). However, the callers don't need to know how many bytes are available. Don't return number of available bytes. Instead, return 0 on success; otherwise, negative integers on error. Reviewed-by: Guenter Roeck Signed-off-by: Tzung-Bi Shih --- Changes from v3: - Add R-b tag. Changes from v2: - Separate Kunit test to another patch. Changes from v1: - Return 0 on success; otherwise, negative intergers. drivers/platform/chrome/cros_ec_proto.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chr= ome/cros_ec_proto.c index 28c103315144..760a6da0965a 100644 --- a/drivers/platform/chrome/cros_ec_proto.c +++ b/drivers/platform/chrome/cros_ec_proto.c @@ -236,7 +236,7 @@ EXPORT_SYMBOL(cros_ec_check_result); * * @ec_dev: EC device to call * @msg: message structure to use - * @mask: result when function returns >=3D0. + * @mask: result when function returns 0. * * LOCKING: * the caller has ec_dev->lock mutex, or the caller knows there is @@ -266,6 +266,7 @@ static int cros_ec_get_host_event_wake_mask(struct cros= _ec_device *ec_dev, uint3 if (ret > 0) { r =3D (struct ec_response_host_event_mask *)msg->data; *mask =3D r->mask; + ret =3D 0; } =20 exit: --=20 2.36.1.255.ge46751e96f-goog From nobody Mon Apr 27 23:53:46 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D3813C433EF for ; Thu, 9 Jun 2022 08:52:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242489AbiFIIwM (ORCPT ); Thu, 9 Jun 2022 04:52:12 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41950 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242601AbiFIIuv (ORCPT ); Thu, 9 Jun 2022 04:50:51 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A473048326 for ; Thu, 9 Jun 2022 01:50:39 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 41FF5619BF for ; Thu, 9 Jun 2022 08:50:39 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C3812C385A2; Thu, 9 Jun 2022 08:50:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654764638; bh=J76Kh2YOzMKz0oWEPCJNmcPFTpBe7ChudUbsgZwHM5Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=q/xOzlZODjIGvJ8b7+EYEGK/WAozRvSFxP+RFAxnDpoyU1Ia6ILhVmjXCQdhKxHN/ yfsLCR9haWQ3OdDLMhQxaSU5GWM4ykfOlRJpTDGTNCMsk0GDgHY4baJdNVS0xebOYc baprRGpXw+d2d4xiK4xq/+nFy4BMY4sn8KfFqTwp0ATdNpM2vbr0BiYoec4hn/B4AU yXeGj0f42NgNdA8534WVTbeHA9TnEUnLmZO9JB2Bd6dTNEhZa9U7BWyBTEbrXYohR6 V/7E+cF8bhgjzHN3R5o2IRn49t5nAlxUYhZsNcebOB3CgSeKakFM2TWjKQw9D7lgz7 ik9oc9CohLAnw== From: Tzung-Bi Shih To: bleung@chromium.org, groeck@chromium.org Cc: chrome-platform@lists.linux.dev, tzungbi@kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 20/21] platform/chrome: cros_ec_proto: add Kunit test for getting wake mask Date: Thu, 9 Jun 2022 08:49:56 +0000 Message-Id: <20220609084957.3684698-21-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220609084957.3684698-1-tzungbi@kernel.org> References: <20220609084957.3684698-1-tzungbi@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" cros_ec_get_host_event_wake_mask() expects to receive sizeof(struct ec_response_host_event_mask) from send_command(). The payload is valid only if the return value is positive. Add Kunit tests for returning 0 from send_command() in cros_ec_get_host_event_wake_mask(). Reviewed-by: Guenter Roeck Signed-off-by: Tzung-Bi Shih --- Changes from v3: - Add R-b tag. drivers/platform/chrome/cros_ec_proto_test.c | 128 +++++++++++++++++++ 1 file changed, 128 insertions(+) diff --git a/drivers/platform/chrome/cros_ec_proto_test.c b/drivers/platfor= m/chrome/cros_ec_proto_test.c index 757d601f4aee..1e2a1522c288 100644 --- a/drivers/platform/chrome/cros_ec_proto_test.c +++ b/drivers/platform/chrome/cros_ec_proto_test.c @@ -1408,6 +1408,133 @@ static void cros_ec_proto_test_query_all_default_wa= ke_mask_return_error(struct k } } =20 +static void cros_ec_proto_test_query_all_default_wake_mask_return0(struct = kunit *test) +{ + struct cros_ec_proto_test_priv *priv =3D test->priv; + struct cros_ec_device *ec_dev =3D &priv->ec_dev; + struct ec_xfer_mock *mock; + int ret; + + /* Set some garbage bytes. */ + ec_dev->host_event_wake_mask =3D U32_MAX; + + /* For cros_ec_get_proto_info() without passthru. */ + { + struct ec_response_get_protocol_info *data; + + mock =3D cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + + /* + * Although it doesn't check the value, provides valid sizes so that + * cros_ec_query_all() allocates din and dout correctly. + */ + data =3D (struct ec_response_get_protocol_info *)mock->o_data; + data->max_request_packet_size =3D 0xbe; + data->max_response_packet_size =3D 0xef; + } + + /* For cros_ec_get_proto_info() with passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0= ); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + /* For cros_ec_get_host_command_version_mask() for MKBP. */ + { + mock =3D cros_kunit_ec_xfer_mock_add(test, 0); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ + { + mock =3D cros_kunit_ec_xfer_mock_add(test, 0); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + /* For get_host_event_wake_mask(). */ + { + mock =3D cros_kunit_ec_xfer_mock_add(test, 0); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + cros_ec_proto_test_query_all_pretest(test); + ret =3D cros_ec_query_all(ec_dev); + KUNIT_EXPECT_EQ(test, ret, 0); + + /* For cros_ec_get_proto_info() without passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_protocol_info)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); + } + + /* For cros_ec_get_proto_info() with passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, + EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | + EC_CMD_GET_PROTOCOL_INFO); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_protocol_info)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); + } + + /* For cros_ec_get_host_command_version_mask() for MKBP. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_cmd_versions)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd= _versions)); + } + + /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ + { + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); + KUNIT_EXPECT_EQ(test, mock->msg.insize, + sizeof(struct ec_response_get_cmd_versions)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd= _versions)); + } + + /* For get_host_event_wake_mask(). */ + { + u32 mask; + + mock =3D cros_kunit_ec_xfer_mock_next(); + KUNIT_EXPECT_PTR_NE(test, mock, NULL); + + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HOST_EVENT_GET_WAKE_MASK= ); + KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_host_e= vent_mask)); + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); + + mask =3D ec_dev->host_event_wake_mask; + KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_LID_CLOSED= ), 0); + KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_AC_DISCONN= ECTED), 0); + KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_LO= W), 0); + KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_CR= ITICAL), 0); + KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY), = 0); + KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_PD_MCU), 0= ); + KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_ST= ATUS), 0); + } +} + static void cros_ec_proto_test_release(struct device *dev) { } @@ -1473,6 +1600,7 @@ static struct kunit_case cros_ec_proto_test_cases[] = =3D { KUNIT_CASE(cros_ec_proto_test_query_all_no_host_sleep), KUNIT_CASE(cros_ec_proto_test_query_all_no_host_sleep_return0), KUNIT_CASE(cros_ec_proto_test_query_all_default_wake_mask_return_error), + KUNIT_CASE(cros_ec_proto_test_query_all_default_wake_mask_return0), {} }; =20 --=20 2.36.1.255.ge46751e96f-goog From nobody Mon Apr 27 23:53:46 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B17C1C43334 for ; Thu, 9 Jun 2022 08:53:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242749AbiFIIxS (ORCPT ); Thu, 9 Jun 2022 04:53:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42084 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242607AbiFIIuw (ORCPT ); Thu, 9 Jun 2022 04:50:52 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DB5E5483BF for ; Thu, 9 Jun 2022 01:50:40 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 78A3B619AC for ; Thu, 9 Jun 2022 08:50:40 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 09B2DC34114; Thu, 9 Jun 2022 08:50:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654764639; bh=1FZCyMr6ih6zxzovPaeP8IrHIWKNkoBjM09gYC8FEgY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OE2/bFNVhJtHla0mWHqi9xlH36l5isSw4hBRjisRsUHZKo0PuCbzM8AX1txZf+JvL JyLbYj2XzaF0JLRYS10VVU2EDr+RDMa406Lvaf9HfYTrrlyGofGrID683tIlrFsD0N JlDRiGN+lJnugh5kbqc2bj8kBqDJqa5hdRMDiBZ7Q/ZxA/LN7ykWIDeXEe311mDnW9 fRfDX2CcvXm6jPMzQEt7JO1M8nSuCTUOLd5OI/kIspB/XQ4CgjbdLkUCB07VkhFRUa zt4Cwukj1Ha3vQsPy+VPwsx60hJhOkBU7uDhyclTMnP0+xpisePkjFxK4nXVXOvKKo LYgK+tiCsNilg== From: Tzung-Bi Shih To: bleung@chromium.org, groeck@chromium.org Cc: chrome-platform@lists.linux.dev, tzungbi@kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 21/21] platform/chrome: cros_ec_proto: handle empty payload in getting wake mask Date: Thu, 9 Jun 2022 08:49:57 +0000 Message-Id: <20220609084957.3684698-22-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220609084957.3684698-1-tzungbi@kernel.org> References: <20220609084957.3684698-1-tzungbi@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" cros_ec_get_host_event_wake_mask() expects to receive sizeof(struct ec_response_host_event_mask) from send_command(). The payload is valid only if the return value is positive. Return -EPROTO if send_command() returns 0 in cros_ec_get_host_event_wake_mask(). Reviewed-by: Guenter Roeck Signed-off-by: Tzung-Bi Shih --- Changes from v3: - Add R-b tag. drivers/platform/chrome/cros_ec_proto.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chr= ome/cros_ec_proto.c index 760a6da0965a..ef942e8d0e8f 100644 --- a/drivers/platform/chrome/cros_ec_proto.c +++ b/drivers/platform/chrome/cros_ec_proto.c @@ -256,19 +256,23 @@ static int cros_ec_get_host_event_wake_mask(struct cr= os_ec_device *ec_dev, uint3 msg->insize =3D sizeof(*r); =20 ret =3D send_command(ec_dev, msg); - if (ret >=3D 0) { - mapped =3D cros_ec_map_error(msg->result); - if (mapped) { - ret =3D mapped; - goto exit; - } + if (ret < 0) + goto exit; + + mapped =3D cros_ec_map_error(msg->result); + if (mapped) { + ret =3D mapped; + goto exit; } - if (ret > 0) { - r =3D (struct ec_response_host_event_mask *)msg->data; - *mask =3D r->mask; - ret =3D 0; + + if (ret =3D=3D 0) { + ret =3D -EPROTO; + goto exit; } =20 + r =3D (struct ec_response_host_event_mask *)msg->data; + *mask =3D r->mask; + ret =3D 0; exit: kfree(msg); return ret; --=20 2.36.1.255.ge46751e96f-goog