From nobody Tue Apr 28 05:09:42 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 59638C43334 for ; Mon, 6 Jun 2022 14:12:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239612AbiFFOMD (ORCPT ); Mon, 6 Jun 2022 10:12:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38902 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239587AbiFFOL6 (ORCPT ); Mon, 6 Jun 2022 10:11:58 -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 2669227FD2 for ; Mon, 6 Jun 2022 07:11:58 -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 B7ABC61375 for ; Mon, 6 Jun 2022 14:11:57 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 43AE0C3411C; Mon, 6 Jun 2022 14:11:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654524717; bh=jEFcX4+rGobfNa0MECgKONfbmATsAGer9hHBokT4s5g=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=tk2F0WXXTci5g5Ag501ao+8yKFGIEhoEAodqi9ePh1wX6HgIoeJVv+DTNhSxMNMU3 Avq4i5/1UBm8a1XWTBW6oQB6FUJf1nhymkWYPJQoxAXG2TgAc9YGUo37XkvPeiPB+k ePRDONbAdVao5Uh0Ynq7XRrVPgj5qKdar+EIepL9S/Leg2wttJ1JGfIshZEFldLDqU XeVQISK2J5fh4mWl8PqxkMF2xtPyfvLlVuWZl/wmsClpnBTKF537xKAtkC0CEnb9fR 3BRk7MCVjezwq9oixFjgRF0Gdc804skcEfPOvaAVIbRMoEikdNzQr8RXzhX8n+lHC2 zvZUIRY2uQLig== 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 01/13] platform/chrome: cros_ec_commands: fix compile errors Date: Mon, 6 Jun 2022 14:10:39 +0000 Message-Id: <20220606141051.285823-2-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220606141051.285823-1-tzungbi@kernel.org> References: <20220606141051.285823-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), | ^~~ Signed-off-by: Tzung-Bi Shih Reviewed-by: Guenter Roeck --- 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 Tue Apr 28 05:09:42 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 CF6EBC43334 for ; Mon, 6 Jun 2022 14:12:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239632AbiFFOMN (ORCPT ); Mon, 6 Jun 2022 10:12:13 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39178 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239608AbiFFOMB (ORCPT ); Mon, 6 Jun 2022 10:12:01 -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 AFF3027FD2 for ; Mon, 6 Jun 2022 07:11:59 -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 3F43B61375 for ; Mon, 6 Jun 2022 14:11:59 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7F2F9C385A9; Mon, 6 Jun 2022 14:11:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654524718; bh=ppKdfUtHpTsabmF3vrZj0E4BBPQxPH/ai56h3lCAxwc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ES1FXl9TM+Rxu2cDQuv5svzr96VtvAwCSO2fWU2HteEcu/C3fffBHlmBaHmhnJhts Ou8pM2IRU/jW8PFgbzOa8tC+bbaqoAVtiL4eX5KLRcYh6GxK3Qp0lzCGLRVXlGpyOS sZauVqnsxIFvrkvZWEooDqNq2+3kD0ehuJMB1jG5H3bc7UkVYHIjtxd1XAjn40F1Ye 8VeE5sXq01++Yq9VvLQhCTwDapdEiEk+F8eHZ+SMcX6M0/lPj2nqSaF/WWS+z8h8xE jJUFi5FFevAK2OGGN8YqmhmWBW5SeJMkNX8BlozhznpwAFVhOq/Fcu/qCIufaJrRr6 CnjYNhmcYUqOw== 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 02/13] platform/chrome: cros_ec_proto: add Kunit tests for cros_ec_query_all() Date: Mon, 6 Jun 2022 14:10:40 +0000 Message-Id: <20220606141051.285823-3-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220606141051.285823-1-tzungbi@kernel.org> References: <20220606141051.285823-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. Signed-off-by: Tzung-Bi Shih --- drivers/platform/chrome/Kconfig | 6 + drivers/platform/chrome/Makefile | 1 + drivers/platform/chrome/cros_ec_proto_test.c | 738 +++++++++++++++++++ drivers/platform/chrome/cros_kunit_util.c | 98 +++ drivers/platform/chrome/cros_kunit_util.h | 36 + 5 files changed, 879 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..c5e16566a634 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,719 @@ 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. + */ + 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(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); + + /* + * 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, + sizeof(struct ec_response_get_protocol_info)); + 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(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, + sizeof(struct ec_response_get_protocol_info)); + 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_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 fill_protocol_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 fill_protocol_info() with passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, + sizeof(struct ec_response_get_protocol_info)); + 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 fill_protocol_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 fill_protocol_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(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_mkbp2(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 fill_protocol_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 fill_protocol_info() with passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, + sizeof(struct ec_response_get_protocol_info)); + 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 fill_protocol_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 fill_protocol_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(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 fill_protocol_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 fill_protocol_info() with passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, + sizeof(struct ec_response_get_protocol_info)); + 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, + sizeof(struct ec_response_get_cmd_versions)); + 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 fill_protocol_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 fill_protocol_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(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(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; + + /* 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, + sizeof(struct ec_response_get_protocol_info)); + 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, + sizeof(struct ec_response_get_cmd_versions)); + 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, + sizeof(struct ec_response_get_cmd_versions)); + 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, + sizeof(struct ec_response_host_event_mask)); + 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 int cros_ec_proto_test_init(struct kunit *test) { struct cros_ec_proto_test_priv *priv; @@ -188,24 +902,48 @@ 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); + 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), + KUNIT_CASE(cros_ec_proto_test_query_all_legacy_normal), + KUNIT_CASE(cros_ec_proto_test_query_all_no_mkbp), + KUNIT_CASE(cros_ec_proto_test_query_all_no_mkbp2), + KUNIT_CASE(cros_ec_proto_test_query_all_no_host_sleep), + KUNIT_CASE(cros_ec_proto_test_query_all_default_wake_mask), {} }; =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 Tue Apr 28 05:09:42 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 F0E7EC433EF for ; Mon, 6 Jun 2022 14:12:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239677AbiFFOMd (ORCPT ); Mon, 6 Jun 2022 10:12:33 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39442 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239618AbiFFOME (ORCPT ); Mon, 6 Jun 2022 10:12:04 -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 CAAE5286CB for ; Mon, 6 Jun 2022 07:12:02 -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 34962B8198E for ; Mon, 6 Jun 2022 14:12:01 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 061B2C3411C; Mon, 6 Jun 2022 14:11:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654524719; bh=NG9Ahol0D40WIa3TD7DWKeF0kj/lH0XE0BgaOK4ImFo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PYLup2pwJC88cmfGkBeIna9UpxYT158lnEQyvXgU+9NheOqcXEf1VVv0wr2vGE2DZ Q9E9eWtOZEkJ6Fl4ddYiwuUkr+FDN499/p6KN391tCkNLFGWdnpWC27ndXzRWwG3Xa UAjBnVQYqI2qF1GKuk4SohESTevDVILHmp4g8SYzhTew4++OeV24et71z3U+7rbq5j zb7J0g2xQaaaDfYsJYpJzy8GV9ZJ3eTqO/BrRTis3qwiXFgYL1T3cU+2rZpaTBs3ww A4dJMnEwVTGFdy+p5NSwew0fcYo5qJA7E7lvhddBf7LpYw85ih5WUhg+G/qFJXYm74 KRRMLBXbYCwQw== 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 03/13] platform/chrome: use macros for passthru indexes Date: Mon, 6 Jun 2022 14:10:41 +0000 Message-Id: <20220606141051.285823-4-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220606141051.285823-1-tzungbi@kernel.org> References: <20220606141051.285823-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. Signed-off-by: Tzung-Bi Shih Reviewed-by: Guenter Roeck Reviewed-by: Guenter Roeck --- drivers/platform/chrome/cros_ec.c | 3 --- drivers/platform/chrome/cros_ec_proto.c | 6 +++--- drivers/platform/chrome/cros_ec_proto_test.c | 18 ++++++++++++------ drivers/platform/chrome/cros_ec_trace.h | 8 ++++---- include/linux/platform_data/cros_ec_proto.h | 3 +++ 5 files changed, 22 insertions(+), 16 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 c5e16566a634..5169bf33360b 100644 --- a/drivers/platform/chrome/cros_ec_proto_test.c +++ b/drivers/platform/chrome/cros_ec_proto_test.c @@ -280,7 +280,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); @@ -393,7 +394,8 @@ static void cros_ec_proto_test_query_all_no_pd(struct k= unit *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); @@ -535,7 +537,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); @@ -623,7 +626,8 @@ static void cros_ec_proto_test_query_all_no_mkbp2(struc= t 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); @@ -723,7 +727,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); @@ -833,7 +838,8 @@ static void cros_ec_proto_test_query_all_default_wake_m= ask(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); 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 Tue Apr 28 05:09:42 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 A8569C433EF for ; Mon, 6 Jun 2022 14:12:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239640AbiFFOMR (ORCPT ); Mon, 6 Jun 2022 10:12:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39290 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239610AbiFFOMD (ORCPT ); Mon, 6 Jun 2022 10:12:03 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 319CC286CA for ; Mon, 6 Jun 2022 07:12:02 -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 C1D596137A for ; Mon, 6 Jun 2022 14:12:01 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3F333C3411D; Mon, 6 Jun 2022 14:12:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654524721; bh=iV6GhG3HSROh+z7BH4me2g0TrNYK+Ev992HDhTgueqg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=F0nLvprPnjL77YA9W3XsD9rCVdvb8LIvFipi7fUlGmpCXAX41zTqibfaRoSae1YVf 2lAsTr47A/9jxVN05Oy2QwgIJS8BHhj49J/lROuHYqSJi2N+uYsYkEIxm01eHyCK6K nvKXNYt88MYaCOhOEdn3umif85kOUIfadHe3s7C8zDI5hTbt26u38/oN/NKGSC3XE2 lTyMa17Ytyl4HE5D+WkE32Gm1VIdbmehIESltMZPg5qUflpnhC5NSiWXMtqCwtX0Z6 yBCjba+31BQ1/NnU6PQSmi1et2d5S+QpG2HSfQ0/tswC+2GCzJbvswEDqpSHv4iZi7 WMVmE7Jocty4w== 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 04/13] platform/chrome: cros_ec_proto: assign buffer size from protocol info Date: Mon, 6 Jun 2022 14:10:42 +0000 Message-Id: <20220606141051.285823-5-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220606141051.285823-1-tzungbi@kernel.org> References: <20220606141051.285823-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. Signed-off-by: Tzung-Bi Shih Reviewed-by: Guenter Roeck --- 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 Tue Apr 28 05:09:42 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 C20C3C433EF for ; Mon, 6 Jun 2022 14:12:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239659AbiFFOM3 (ORCPT ); Mon, 6 Jun 2022 10:12:29 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39516 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239622AbiFFOME (ORCPT ); Mon, 6 Jun 2022 10:12:04 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5E62C286D3 for ; Mon, 6 Jun 2022 07:12:03 -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 E1D6F61381 for ; Mon, 6 Jun 2022 14:12:02 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 78E6BC3411F; Mon, 6 Jun 2022 14:12:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654524722; bh=sKbLOjcvTC3/wmYtXtfhTTJamRUWHaDSmI+uYF6/kc4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=iX82aC1GgIgH+mRpaBr9kO47GvUTJIvV+I0oYDV3ZK+pElUiY2AhudzCCvu3v+Lgo DU19u833X95M85CvHy5HuaRHqOtxPZDjMqfes9X8JkFq5S4Qh8Hascgg/oRa+H0Bpt zi2IOYgL+8gG5jKJ3+3yydTJK2UAu1m8e3LFg1Z5QhK/cHX3GJtEDL9u+2q1QAzIfH +QmAwwv1gYypmZ5Z/NKNCn8YQn5p0YRGRsgsC7yNT3AiZUHpScSAIEipcZdW24CAlR gN65Q0mTkDI/WO9vCW3QuTXNPNQRFbZaUDLLbchuUDnCSdWPC6M4qz/pVxi5+8SvAe M+t7bO9t3/jdQ== 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 05/13] platform/chrome: cros_ec_proto: remove redundant NULL check Date: Mon, 6 Jun 2022 14:10:43 +0000 Message-Id: <20220606141051.285823-6-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220606141051.285823-1-tzungbi@kernel.org> References: <20220606141051.285823-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. Signed-off-by: Tzung-Bi Shih Reviewed-by: Guenter Roeck --- 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 Tue Apr 28 05:09:42 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 9519FC43334 for ; Mon, 6 Jun 2022 14:12:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239648AbiFFOMT (ORCPT ); Mon, 6 Jun 2022 10:12:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39648 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239624AbiFFOMF (ORCPT ); Mon, 6 Jun 2022 10:12:05 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 919E2286E9 for ; Mon, 6 Jun 2022 07:12:04 -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 282BF61376 for ; Mon, 6 Jun 2022 14:12:04 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id B61B6C3411D; Mon, 6 Jun 2022 14:12:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654524723; bh=RnH0fzWxCPD22wn/jU3q2AjRqABY470RtTuq54kRfkY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=YU1ySO20vnU/I4kEoWJpb5Cgjv8Q6VZj0WOIy7HkSn+JMIompxbX0eALuqhpLAeaz QWrRzTCPMdXRI704uTPD9x3UoETZBWWICwOL6iOGtoerVdnWQNRMxLZRjMkWDumdCu GG/N7Po0i+7GQZGRhZQDzqnrztNr8BxzaH1lU2UGFsiPps1IFDtkZSvY5xPwFOds7V kIk0Ydno6EbX5Ur58u3z+I9reP4E7dnuLhI3I+xzJFHGL6AOViq3CmDvt1AtduULiC 7xxLF7F931ZbtnXJLLETUrRXuu1khcJgSJhFT98AZzkAdtBm+fzAbszoY6X3KoNLRh FtysHshIe7m4w== 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 06/13] platform/chrome: cros_ec_proto: use cros_ec_map_error() Date: Mon, 6 Jun 2022 14:10:44 +0000 Message-Id: <20220606141051.285823-7-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220606141051.285823-1-tzungbi@kernel.org> References: <20220606141051.285823-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. Signed-off-by: Tzung-Bi Shih Reviewed-by: Guenter Roeck --- 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 Tue Apr 28 05:09:42 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 E502EC433EF for ; Mon, 6 Jun 2022 14:12:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239664AbiFFOMr (ORCPT ); Mon, 6 Jun 2022 10:12:47 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39964 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239613AbiFFOMK (ORCPT ); Mon, 6 Jun 2022 10:12:10 -0400 Received: from sin.source.kernel.org (sin.source.kernel.org [145.40.73.55]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CC9C013D1C for ; Mon, 6 Jun 2022 07:12:08 -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 sin.source.kernel.org (Postfix) with ESMTPS id 95D15CE1B91 for ; Mon, 6 Jun 2022 14:12:06 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id EFD65C3411C; Mon, 6 Jun 2022 14:12:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654524724; bh=lGEAv6EhkksqsGHf4CEfbHrL1PvhP0/478q2J5yXn3s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=G7LnS7M3/jXlyX/bEIV5lZ1Dkz8sAJmIdbcu+3StpcDT9o0IbD54iW5tBCe2YZXX5 +ruMvZHI/ynzBQYa4aznjGG1pgIRJ6mHC7XUeHE5cQ3QX0XgmNbvSc/PmZvmeNJfDZ 269Xz726airOGRsZJjenO0qsWOY0wlNFEBBlAuk+pCWMPD0kD/f3P6bJvurrxpNzo8 Rf81LbYKe3cDbUsH3Totz2Mt7fIF829i02a6nSctaZMnuTjbzHAOA8w7jYmAhGMCUU 9zEkEj9zIVgclKDY28iSnJeZgNHfu8o4yXgiPj3O8HZepWtqcqLdxbV5DrIYQjKsFx vOy51RuZsVndw== 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 07/13] platform/chrome: cros_ec_proto: separate fill_protocol_info() Date: Mon, 6 Jun 2022 14:10:45 +0000 Message-Id: <20220606141051.285823-8-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220606141051.285823-1-tzungbi@kernel.org> References: <20220606141051.285823-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 fill_protocol_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. Signed-off-by: Tzung-Bi Shih --- drivers/platform/chrome/cros_ec_proto.c | 130 +++++++++---------- drivers/platform/chrome/cros_ec_proto_test.c | 28 ++-- 2 files changed, 76 insertions(+), 82 deletions(-) diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chr= ome/cros_ec_proto.c index 71ba6a56ad7c..f57b4dba95b7 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 fill_protocol_info(struct cros_ec_device *ec_dev, int devidx) { - /* - * 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. - */ + struct cros_ec_command *msg; + struct ec_response_get_protocol_info *info; int ret; =20 - memset(msg, 0, sizeof(*msg)); + 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; + 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,43 @@ 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; } =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; + ret =3D cros_ec_map_error(msg->result); + if (ret) + goto exit; + + 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 +451,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 (!fill_protocol_info(ec_dev, CROS_EC_DEV_EC_INDEX)) { + /* Check for PD. */ + fill_protocol_info(ec_dev, CROS_EC_DEV_PD_INDEX); } else { /* Try querying with a v2 hello message. */ ec_dev->proto_version =3D 2; @@ -524,8 +520,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 +551,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 5169bf33360b..cdedbdfc1885 100644 --- a/drivers/platform/chrome/cros_ec_proto_test.c +++ b/drivers/platform/chrome/cros_ec_proto_test.c @@ -194,7 +194,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 fill_protocol_info() without passthru. */ { struct ec_response_get_protocol_info *data; =20 @@ -207,7 +207,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 fill_protocol_info() with passthru. */ { struct ec_response_get_protocol_info *data; =20 @@ -255,7 +255,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 fill_protocol_info() without passthru. */ { mock =3D cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); @@ -273,7 +273,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 fill_protocol_info() with passthru. */ { mock =3D cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); @@ -348,7 +348,7 @@ static void cros_ec_proto_test_query_all_no_pd(struct k= unit *test) struct ec_xfer_mock *mock; int ret; =20 - /* For cros_ec_host_command_proto_query() without passthru. */ + /* For fill_protocol_info() without passthru. */ { struct ec_response_get_protocol_info *data; =20 @@ -364,7 +364,7 @@ static void cros_ec_proto_test_query_all_no_pd(struct k= unit *test) data->max_response_packet_size =3D 0xef; } =20 - /* For cros_ec_host_command_proto_query() with passthru. */ + /* For fill_protocol_info() with passthru. */ { mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, sizeof(struct ec_response_get_protocol_info)); @@ -375,7 +375,7 @@ static void cros_ec_proto_test_query_all_no_pd(struct k= unit *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 fill_protocol_info() without passthru. */ { mock =3D cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); @@ -387,7 +387,7 @@ static void cros_ec_proto_test_query_all_no_pd(struct k= unit *test) KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); } =20 - /* For cros_ec_host_command_proto_query() with passthru. */ + /* For fill_protocol_info() with passthru. */ { mock =3D cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); @@ -411,7 +411,7 @@ static void cros_ec_proto_test_query_all_legacy_normal(= struct kunit *test) struct ec_xfer_mock *mock; int ret; =20 - /* For cros_ec_host_command_proto_query() without passthru. */ + /* For fill_protocol_info() without passthru. */ { mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, sizeof(struct ec_response_get_protocol_info)); @@ -433,7 +433,7 @@ static void cros_ec_proto_test_query_all_legacy_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 fill_protocol_info() without passthru. */ { mock =3D cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); @@ -771,7 +771,7 @@ static void cros_ec_proto_test_query_all_default_wake_m= ask(struct kunit *test) /* Set some garbage bytes. */ ec_dev->host_event_wake_mask =3D U32_MAX; =20 - /* For cros_ec_host_command_proto_query() without passthru. */ + /* For fill_protocol_info() without passthru. */ { struct ec_response_get_protocol_info *data; =20 @@ -787,7 +787,7 @@ static void cros_ec_proto_test_query_all_default_wake_m= ask(struct kunit *test) data->max_response_packet_size =3D 0xef; } =20 - /* For cros_ec_host_command_proto_query() with passthru. */ + /* For fill_protocol_info() with passthru. */ { mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, sizeof(struct ec_response_get_protocol_info)); @@ -819,7 +819,7 @@ static void cros_ec_proto_test_query_all_default_wake_m= ask(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 fill_protocol_info() without passthru. */ { mock =3D cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); @@ -831,7 +831,7 @@ static void cros_ec_proto_test_query_all_default_wake_m= ask(struct kunit *test) KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); } =20 - /* For cros_ec_host_command_proto_query() with passthru. */ + /* For fill_protocol_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 Tue Apr 28 05:09:42 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 14B83C433EF for ; Mon, 6 Jun 2022 14:12:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239687AbiFFOMv (ORCPT ); Mon, 6 Jun 2022 10:12:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39966 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239626AbiFFOMK (ORCPT ); Mon, 6 Jun 2022 10:12:10 -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 D7EB9397 for ; Mon, 6 Jun 2022 07:12:08 -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 6FD69B819F4 for ; Mon, 6 Jun 2022 14:12:07 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 36460C385A9; Mon, 6 Jun 2022 14:12:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654524726; bh=9wzElO881O9xQMsS2PzouDUmDxr/gRI/ym+HLKM4i04=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=G8aqutko2G3cLSMvxqreIQ+zCXlkKwBVJizsxnyBgWQ2Ez52fosChEG7MarC1ksjw qP+lxLsXnC0htedZ7Ej4Qiai1R2M2VHLsyq+jNqE5Q3bUYaEHmnR7FjrZYvTabSDZm OIdKRjWsOlmam4c+T075RQVaAt64xDD37jazttm1+Hi+SWgorFIE587goAmNoGxBEs hPMxu3ygl8E778y6Wy9j87UKkW4XemPUParLGCx/2D8XMQvjKoL8pPKHkftc/IRExU IRxGnPYZZ9bR3ep43q+ldjx4eMkHReZpKYjk+YkKsyHwptbxt8pdh0AtZFo44BD7RU QFHVJCGFM0+Nw== 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 08/13] platform/chrome: cros_ec_proto: separate fill_protocol_info_legacy() Date: Mon, 6 Jun 2022 14:10:46 +0000 Message-Id: <20220606141051.285823-9-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220606141051.285823-1-tzungbi@kernel.org> References: <20220606141051.285823-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 fill_protocol_info_legacy() and make it responsible for setting `ec_dev` fields for EC protocol v2. Signed-off-by: Tzung-Bi Shih --- drivers/platform/chrome/cros_ec_proto.c | 72 +++++++++----------- drivers/platform/chrome/cros_ec_proto_test.c | 4 +- 2 files changed, 35 insertions(+), 41 deletions(-) diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chr= ome/cros_ec_proto.c index f57b4dba95b7..abb30a685567 100644 --- a/drivers/platform/chrome/cros_ec_proto.c +++ b/drivers/platform/chrome/cros_ec_proto.c @@ -344,51 +344,57 @@ static int fill_protocol_info(struct cros_ec_device *= 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 fill_protocol_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; } @@ -460,20 +466,8 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev) fill_protocol_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 fill_protocol_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 @@ -481,7 +475,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 cdedbdfc1885..79150bf511fb 100644 --- a/drivers/platform/chrome/cros_ec_proto_test.c +++ b/drivers/platform/chrome/cros_ec_proto_test.c @@ -418,7 +418,7 @@ static void cros_ec_proto_test_query_all_legacy_normal(= struct kunit *test) KUNIT_ASSERT_PTR_NE(test, mock, NULL); } =20 - /* For cros_ec_host_command_proto_query_v2(). */ + /* For fill_protocol_info_legacy(). */ { struct ec_response_hello *data; =20 @@ -445,7 +445,7 @@ static void cros_ec_proto_test_query_all_legacy_normal(= struct kunit *test) KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); } =20 - /* For cros_ec_host_command_proto_query_v2(). */ + /* For fill_protocol_info_legacy(). */ { struct ec_params_hello *data; =20 --=20 2.36.1.255.ge46751e96f-goog From nobody Tue Apr 28 05:09:42 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 18A43C43334 for ; Mon, 6 Jun 2022 14:12:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239606AbiFFOMh (ORCPT ); Mon, 6 Jun 2022 10:12:37 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39918 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239623AbiFFOMJ (ORCPT ); Mon, 6 Jun 2022 10:12:09 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D7EFB1178 for ; Mon, 6 Jun 2022 07:12:08 -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 EAB0961376 for ; Mon, 6 Jun 2022 14:12:07 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 70288C341C4; Mon, 6 Jun 2022 14:12:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654524727; bh=IDJd2ngMfd4ziS/HQIuZWqAxD2Z0NWrPdYp/crTIQBI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Tnck8GKIA4z72tw7EOxg2TJ9dtdwIWJEU6+HnqP9ucMo1TS8yNF84quIk2hiSNEVy 8M7yaBeMySkSmJcn8vEoglnoIXe5SJbbVBp+Vl1iDgG4q/bZO/igKqD+d3TxP7+pXi V9FnMKqlOtQ3l1IAUhQWeXQVsnQ4Dqejvv4p73k6UF6zzY0fA/7CCJNcvnuQxQo1rE LRt8rAhPXietqhyRYLI5j4Tl26RlqJ6D6qk6VUOsXbDV5s0OnVV6IUWoSm4v1RnLhV 8ecX8vTQkuTAuOCHsVWI/BR+zCG0pOASJ8HhZ5eo1SlEye4+O6QL1XZJMimx4qw+iL 8DA74tJjeM9qw== 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 09/13] platform/chrome: cros_ec_proto: use devm_krealloc() Date: Mon, 6 Jun 2022 14:10:47 +0000 Message-Id: <20220606141051.285823-10-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220606141051.285823-1-tzungbi@kernel.org> References: <20220606141051.285823-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 devm_krealloc() to re-allocate `din` and `dout`. Also remove the unneeded devm_kfree() in error handling path as they are device managed memory. Signed-off-by: Tzung-Bi Shih --- drivers/platform/chrome/cros_ec_proto.c | 25 ++++++-------------- drivers/platform/chrome/cros_ec_proto_test.c | 3 +-- 2 files changed, 8 insertions(+), 20 deletions(-) diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chr= ome/cros_ec_proto.c index abb30a685567..5f4414f05d66 100644 --- a/drivers/platform/chrome/cros_ec_proto.c +++ b/drivers/platform/chrome/cros_ec_proto.c @@ -479,21 +479,13 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev) } } =20 - devm_kfree(dev, ec_dev->din); - devm_kfree(dev, ec_dev->dout); - - ec_dev->din =3D devm_kzalloc(dev, ec_dev->din_size, GFP_KERNEL); - if (!ec_dev->din) { - ret =3D -ENOMEM; - goto exit; - } + ec_dev->din =3D devm_krealloc(dev, ec_dev->din, ec_dev->din_size, GFP_KER= NEL | __GFP_ZERO); + if (!ec_dev->din) + return -ENOMEM; =20 - ec_dev->dout =3D devm_kzalloc(dev, ec_dev->dout_size, GFP_KERNEL); - if (!ec_dev->dout) { - devm_kfree(dev, ec_dev->din); - ret =3D -ENOMEM; - goto exit; - } + ec_dev->dout =3D devm_krealloc(dev, ec_dev->dout, ec_dev->dout_size, GFP_= KERNEL | __GFP_ZERO); + if (!ec_dev->dout) + return -ENOMEM; =20 /* Probe if MKBP event is supported */ ret =3D cros_ec_get_host_command_version_mask(ec_dev, @@ -542,10 +534,7 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev) "failed to retrieve wake mask: %d\n", ret); } =20 - ret =3D 0; - -exit: - return ret; + return 0; } EXPORT_SYMBOL(cros_ec_query_all); =20 diff --git a/drivers/platform/chrome/cros_ec_proto_test.c b/drivers/platfor= m/chrome/cros_ec_proto_test.c index 79150bf511fb..22f9322787f4 100644 --- a/drivers/platform/chrome/cros_ec_proto_test.c +++ b/drivers/platform/chrome/cros_ec_proto_test.c @@ -180,8 +180,7 @@ static void cros_ec_proto_test_query_all_pretest(struct= kunit *test) =20 /* * 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. + * calling devm_krealloc(). Set them to NULL as they aren't managed by e= c_dev->dev. */ ec_dev->din =3D NULL; ec_dev->dout =3D NULL; --=20 2.36.1.255.ge46751e96f-goog From nobody Tue Apr 28 05:09:42 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 DF253C433EF for ; Mon, 6 Jun 2022 14:12:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239681AbiFFOMn (ORCPT ); Mon, 6 Jun 2022 10:12:43 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40150 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239598AbiFFOMO (ORCPT ); Mon, 6 Jun 2022 10:12:14 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 86DBA18362 for ; Mon, 6 Jun 2022 07:12:11 -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 CB218B819FC for ; Mon, 6 Jun 2022 14:12:09 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id AB625C3411F; Mon, 6 Jun 2022 14:12:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654524728; bh=zE3keGA2rUQlZAJOsUqxllyR6XVIoHy7R3cjiqJ6oiY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Dc49kEiYEQhhYYhYviY0kbfSJLnOpf4SyxLam6na0yHt+5ugZX1y4cVji3LeGDRsP GlnFZFqTUaDgc7iUmhEK8y83uIB3SkKScLHidnHMtqEbX7+D+R8Q6knZfohWGz/T8p c/gewoW1/RRy0dCrOoB2/aRvpPrAl4JwcjHKe0EJdLkiLra4wZiKdbgt/+GExzD6VC 4S5I4t3UsyA5odYa/F7gZmcnJ/PbdIKg5/Ka4rGYjEzsU+U5UZxwKZ+kFAvThAmwxF ii26k5VtRPdnXT5kh4nNNi2eqMxwLMcejgGhLurP3lVtmWhc6VMFSa6VOyMGT9g4jR A97cIpw62VUPw== 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 10/13] platform/chrome: cros_ec_proto: arrange get_host_command_version_mask() Date: Mon, 6 Jun 2022 14:10:48 +0000 Message-Id: <20220606141051.285823-11-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220606141051.285823-1-tzungbi@kernel.org> References: <20220606141051.285823-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() is a private (static) function. Rename it to get_host_command_version_mask(). - Join multiple lines into one if it can fit in 100 columns. - Don't show MKBP support version if it doesn't support. Signed-off-by: Tzung-Bi Shih --- drivers/platform/chrome/cros_ec_proto.c | 26 ++++++---------- drivers/platform/chrome/cros_ec_proto_test.c | 32 ++++++++++---------- 2 files changed, 25 insertions(+), 33 deletions(-) diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chr= ome/cros_ec_proto.c index 5f4414f05d66..07b57ea105b6 100644 --- a/drivers/platform/chrome/cros_ec_proto.c +++ b/drivers/platform/chrome/cros_ec_proto.c @@ -400,7 +400,7 @@ static int fill_protocol_info_legacy(struct cros_ec_dev= ice *ec_dev) } =20 /* - * cros_ec_get_host_command_version_mask + * get_host_command_version_mask * * Get the version mask of a given command. * @@ -415,16 +415,14 @@ static int fill_protocol_info_legacy(struct cros_ec_d= evice *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 get_host_command_version_mask(struct cros_ec_device *ec_dev, u1= 6 cmd, u32 *mask) { struct ec_params_get_cmd_versions *pver; struct ec_response_get_cmd_versions *rver; struct cros_ec_command *msg; int ret; =20 - msg =3D kmalloc(sizeof(*msg) + max(sizeof(*rver), sizeof(*pver)), - GFP_KERNEL); + msg =3D kmalloc(sizeof(*msg) + max(sizeof(*rver), sizeof(*pver)), GFP_KER= NEL); if (!msg) return -ENOMEM; =20 @@ -443,7 +441,6 @@ static int cros_ec_get_host_command_version_mask(struct= cros_ec_device *ec_dev, } =20 kfree(msg); - return ret; } =20 @@ -488,21 +485,16 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev) return -ENOMEM; =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); - if (ret < 0 || ver_mask =3D=3D 0) + ret =3D get_host_command_version_mask(ec_dev, EC_CMD_GET_NEXT_EVENT, &ver= _mask); + 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); - - 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, - EC_CMD_HOST_SLEEP_EVENT, - &ver_mask); + ret =3D get_host_command_version_mask(ec_dev, EC_CMD_HOST_SLEEP_EVENT, &v= er_mask); ec_dev->host_sleep_v1 =3D (ret >=3D 0 && (ver_mask & EC_VER_MASK(1))); =20 /* Get host event wake mask. */ diff --git a/drivers/platform/chrome/cros_ec_proto_test.c b/drivers/platfor= m/chrome/cros_ec_proto_test.c index 22f9322787f4..e2c369765612 100644 --- a/drivers/platform/chrome/cros_ec_proto_test.c +++ b/drivers/platform/chrome/cros_ec_proto_test.c @@ -217,7 +217,7 @@ static void cros_ec_proto_test_query_all_normal(struct = kunit *test) data->max_request_packet_size =3D 0xbf; } =20 - /* For cros_ec_get_host_command_version_mask() for MKBP. */ + /* For get_host_command_version_mask() for MKBP. */ { struct ec_response_get_cmd_versions *data; =20 @@ -228,7 +228,7 @@ static void cros_ec_proto_test_query_all_normal(struct = kunit *test) data->version_mask =3D BIT(6) | BIT(5); } =20 - /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ + /* For get_host_command_version_mask() for host sleep v1. */ { struct ec_response_get_cmd_versions *data; =20 @@ -288,7 +288,7 @@ static void cros_ec_proto_test_query_all_normal(struct = kunit *test) KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0xbf - sizeof(struct ec_host= _request)); } =20 - /* For cros_ec_get_host_command_version_mask() for MKBP. */ + /* For get_host_command_version_mask() for MKBP. */ { struct ec_params_get_cmd_versions *data; =20 @@ -307,7 +307,7 @@ static void cros_ec_proto_test_query_all_normal(struct = kunit *test) KUNIT_EXPECT_EQ(test, ec_dev->mkbp_event_supported, 7); } =20 - /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ + /* For get_host_command_version_mask() for host sleep v1. */ { struct ec_params_get_cmd_versions *data; =20 @@ -502,7 +502,7 @@ static void cros_ec_proto_test_query_all_no_mkbp(struct= kunit *test) KUNIT_ASSERT_PTR_NE(test, mock, NULL); } =20 - /* For cros_ec_get_host_command_version_mask() for MKBP. */ + /* For get_host_command_version_mask() for MKBP. */ { struct ec_response_get_cmd_versions *data; =20 @@ -543,7 +543,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_get_host_command_version_mask() for MKBP. */ + /* For get_host_command_version_mask() for MKBP. */ { struct ec_params_get_cmd_versions *data; =20 @@ -596,7 +596,7 @@ static void cros_ec_proto_test_query_all_no_mkbp2(struc= t kunit *test) KUNIT_ASSERT_PTR_NE(test, mock, NULL); } =20 - /* For cros_ec_get_host_command_version_mask() for MKBP. */ + /* For get_host_command_version_mask() for MKBP. */ { mock =3D cros_kunit_ec_xfer_mock_add(test, 0); KUNIT_ASSERT_PTR_NE(test, mock, NULL); @@ -632,7 +632,7 @@ static void cros_ec_proto_test_query_all_no_mkbp2(struc= t kunit *test) KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); } =20 - /* For cros_ec_get_host_command_version_mask() for MKBP. */ + /* For get_host_command_version_mask() for MKBP. */ { struct ec_params_get_cmd_versions *data; =20 @@ -685,14 +685,14 @@ static void cros_ec_proto_test_query_all_no_host_slee= p(struct kunit *test) KUNIT_ASSERT_PTR_NE(test, mock, NULL); } =20 - /* For cros_ec_get_host_command_version_mask() for MKBP. */ + /* For get_host_command_version_mask() for MKBP. */ { mock =3D cros_kunit_ec_xfer_mock_add(test, sizeof(struct ec_response_get_cmd_versions)); KUNIT_ASSERT_PTR_NE(test, mock, NULL); } =20 - /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ + /* For get_host_command_version_mask() for host sleep v1. */ { struct ec_response_get_cmd_versions *data; =20 @@ -733,7 +733,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_get_host_command_version_mask() for MKBP. */ + /* For get_host_command_version_mask() for MKBP. */ { mock =3D cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); @@ -745,7 +745,7 @@ static void cros_ec_proto_test_query_all_no_host_sleep(= struct kunit *test) KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd= _versions)); } =20 - /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ + /* For get_host_command_version_mask() for host sleep v1. */ { mock =3D cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); @@ -793,14 +793,14 @@ static void cros_ec_proto_test_query_all_default_wake= _mask(struct kunit *test) KUNIT_ASSERT_PTR_NE(test, mock, NULL); } =20 - /* For cros_ec_get_host_command_version_mask() for MKBP. */ + /* For get_host_command_version_mask() for MKBP. */ { mock =3D cros_kunit_ec_xfer_mock_add(test, sizeof(struct ec_response_get_cmd_versions)); KUNIT_ASSERT_PTR_NE(test, mock, NULL); } =20 - /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ + /* For get_host_command_version_mask() for host sleep v1. */ { mock =3D cros_kunit_ec_xfer_mock_add(test, sizeof(struct ec_response_get_cmd_versions)); @@ -844,7 +844,7 @@ static void cros_ec_proto_test_query_all_default_wake_m= ask(struct kunit *test) KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); } =20 - /* For cros_ec_get_host_command_version_mask() for MKBP. */ + /* For get_host_command_version_mask() for MKBP. */ { mock =3D cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); @@ -856,7 +856,7 @@ static void cros_ec_proto_test_query_all_default_wake_m= ask(struct kunit *test) KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd= _versions)); } =20 - /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ + /* For get_host_command_version_mask() for host sleep v1. */ { mock =3D cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); --=20 2.36.1.255.ge46751e96f-goog From nobody Tue Apr 28 05:09:42 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 6687CC43334 for ; Mon, 6 Jun 2022 14:12:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239695AbiFFOM4 (ORCPT ); Mon, 6 Jun 2022 10:12:56 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40232 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239615AbiFFOMO (ORCPT ); Mon, 6 Jun 2022 10:12:14 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 59CAE25C72 for ; Mon, 6 Jun 2022 07:12:12 -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 0A39EB819F4 for ; Mon, 6 Jun 2022 14:12:11 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id E5B06C385A9; Mon, 6 Jun 2022 14:12:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654524729; bh=7TiEgNiICfiuJiznG+dnnnYsuwyExFEvzD8fxQfd54M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=aPG5LCC1R+cUJc/eTyPITmVUkmxNiwDBH0vA1QR/WTiSNunGx96KDlsysLsUX2M8v hoihExCPUH9tiILDQBM+H6nA6acEOwJyG1RW02lvd1S5o9G5XUHyCXY07yb1rk2dRE YUvtr5jgaxp6AlGMdYZnmbMAqOXDKJhrNYSrUuXNzDMbkBvf1FTbl5/bIeyeAtkH8J Dx6dNosK/nMWk4sfuYdNT/qukggdJ5el2QsCJdyRTyL0JOB+AJDu+qf9CcPdprkNyh S7x54g0djuMshhyQm7WwOJN00N9nvq7iluykJRWcIm19auBi2CNi4J43LXc7nIpXSI URLjoKMGevdLg== 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 11/13] platform/chrome: cros_ec_proto: fix get_host_command_version_mask() returns Date: Mon, 6 Jun 2022 14:10:49 +0000 Message-Id: <20220606141051.285823-12-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220606141051.285823-1-tzungbi@kernel.org> References: <20220606141051.285823-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" `mask` of get_host_command_version_mask() is valid only if it returns positive number (i.e. sizeof(struct ec_response_get_cmd_versions)). - Remove the unneeded `ver_mask` initialization. - Update callers of get_host_command_version_mask() for checking correct return values. - Add a Kunit test: `ver_mask` has some garbage bytes from previous EC_CMD_GET_NEXT_EVENT but there is no host sleep. Signed-off-by: Tzung-Bi Shih --- drivers/platform/chrome/cros_ec_proto.c | 8 +- drivers/platform/chrome/cros_ec_proto_test.c | 109 +++++++++++++++++++ 2 files changed, 113 insertions(+), 4 deletions(-) diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chr= ome/cros_ec_proto.c index 07b57ea105b6..91c945c9911f 100644 --- a/drivers/platform/chrome/cros_ec_proto.c +++ b/drivers/platform/chrome/cros_ec_proto.c @@ -409,7 +409,7 @@ static int fill_protocol_info_legacy(struct cros_ec_dev= ice *ec_dev) * @cmd: command to get the version of. * @mask: result when function returns 0. * - * @return 0 on success, error code otherwise + * @return >0 on success, error code otherwise * * LOCKING: * the caller has ec_dev->lock mutex or the caller knows there is @@ -454,7 +454,7 @@ static int get_host_command_version_mask(struct cros_ec= _device *ec_dev, u16 cmd, 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. */ @@ -486,7 +486,7 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev) =20 /* Probe if MKBP event is supported */ ret =3D get_host_command_version_mask(ec_dev, EC_CMD_GET_NEXT_EVENT, &ver= _mask); - if (ret < 0 || ver_mask =3D=3D 0) { + if (ret <=3D 0 || ver_mask =3D=3D 0) { ec_dev->mkbp_event_supported =3D 0; } else { ec_dev->mkbp_event_supported =3D fls(ver_mask); @@ -495,7 +495,7 @@ 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 get_host_command_version_mask(ec_dev, EC_CMD_HOST_SLEEP_EVENT, &v= er_mask); - ec_dev->host_sleep_v1 =3D (ret >=3D 0 && (ver_mask & EC_VER_MASK(1))); + ec_dev->host_sleep_v1 =3D (ret > 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); diff --git a/drivers/platform/chrome/cros_ec_proto_test.c b/drivers/platfor= m/chrome/cros_ec_proto_test.c index e2c369765612..7d73aeb99d1d 100644 --- a/drivers/platform/chrome/cros_ec_proto_test.c +++ b/drivers/platform/chrome/cros_ec_proto_test.c @@ -760,6 +760,114 @@ static void cros_ec_proto_test_query_all_no_host_slee= p(struct kunit *test) } } =20 +static void cros_ec_proto_test_query_all_no_host_sleep2(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 fill_protocol_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 fill_protocol_info() with passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, + sizeof(struct ec_response_get_protocol_info)); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + /* For 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 get_host_command_version_mask(). */ + data =3D (struct ec_response_get_cmd_versions *)mock->o_data; + data->version_mask =3D 0xbeef; + } + + /* For 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 fill_protocol_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 fill_protocol_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 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 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(struct kunit *t= est) { struct cros_ec_proto_test_priv *priv =3D test->priv; @@ -941,6 +1049,7 @@ static struct kunit_case cros_ec_proto_test_cases[] = =3D { KUNIT_CASE(cros_ec_proto_test_query_all_no_mkbp), KUNIT_CASE(cros_ec_proto_test_query_all_no_mkbp2), KUNIT_CASE(cros_ec_proto_test_query_all_no_host_sleep), + KUNIT_CASE(cros_ec_proto_test_query_all_no_host_sleep2), KUNIT_CASE(cros_ec_proto_test_query_all_default_wake_mask), {} }; --=20 2.36.1.255.ge46751e96f-goog From nobody Tue Apr 28 05:09:42 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 CEB9FC43334 for ; Mon, 6 Jun 2022 14:13:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239707AbiFFOND (ORCPT ); Mon, 6 Jun 2022 10:13:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40150 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239637AbiFFOMO (ORCPT ); Mon, 6 Jun 2022 10:12:14 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CB4CD25E99 for ; Mon, 6 Jun 2022 07:12:13 -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 65A88B8198E for ; Mon, 6 Jun 2022 14:12:12 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2BB15C34115; Mon, 6 Jun 2022 14:12:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654524731; bh=Yjcb3OtJcORaaknCRkodg9aE4+gNM5Rv2TFudD30oJo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BkROBVw41E47C3tHROfSq601AFrmhE5NsUfe/c1T8qpIwkKTfxkJm2BYyd7lalQID s05OYxFC/Kpn1hVVBxon4Vk8MX1CMD3RGe0+srhAl57ZmEnYQsDdr3JJvkl9dHrsAu LkmvrZjnvwO3dUjERP2HgUg86d6qtfOHA8bn9yBRWB63bVS4tYVaOUzMXOOBiWyOBa B+QEFufytkTZR92FBiWvfnVln4qKC/74mAuiQcz6XtunTOcuDuRYZo0lXQDKbttuZ6 I5hfTCtjFOpKMGnPK6wt6wmk+ly7CImbzKN4VWCBqt5izL2qK64xMl4OnwvOv2Qc46 YJDSrHAPzbO2Q== 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 12/13] platform/chrome: cros_ec_proto: arrange get_host_event_wake_mask() Date: Mon, 6 Jun 2022 14:10:50 +0000 Message-Id: <20220606141051.285823-13-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220606141051.285823-1-tzungbi@kernel.org> References: <20220606141051.285823-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() is a private (static) function. Rename it to get_host_event_wake_mask(). - Join multiple lines into one if it can fit in 100 columns. Signed-off-by: Tzung-Bi Shih --- drivers/platform/chrome/cros_ec_proto.c | 9 ++++----- drivers/platform/chrome/cros_ec_proto_test.c | 8 ++++---- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chr= ome/cros_ec_proto.c index 91c945c9911f..1622e24747c9 100644 --- a/drivers/platform/chrome/cros_ec_proto.c +++ b/drivers/platform/chrome/cros_ec_proto.c @@ -230,7 +230,7 @@ int cros_ec_check_result(struct cros_ec_device *ec_dev, EXPORT_SYMBOL(cros_ec_check_result); =20 /* - * cros_ec_get_host_event_wake_mask + * get_host_event_wake_mask * * Get the mask of host events that cause wake from suspend. * @@ -242,7 +242,7 @@ 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,= uint32_t *mask) +static int 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; @@ -498,7 +498,7 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev) ec_dev->host_sleep_v1 =3D (ret > 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); + ret =3D 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, @@ -522,8 +522,7 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev) * other errors. */ if (ret !=3D -EOPNOTSUPP) - dev_err(ec_dev->dev, - "failed to retrieve wake mask: %d\n", ret); + dev_err(ec_dev->dev, "failed to retrieve wake mask: %d\n", ret); } =20 return 0; diff --git a/drivers/platform/chrome/cros_ec_proto_test.c b/drivers/platfor= m/chrome/cros_ec_proto_test.c index 7d73aeb99d1d..f63196289f54 100644 --- a/drivers/platform/chrome/cros_ec_proto_test.c +++ b/drivers/platform/chrome/cros_ec_proto_test.c @@ -239,7 +239,7 @@ static void cros_ec_proto_test_query_all_normal(struct = kunit *test) data->version_mask =3D BIT(1); } =20 - /* For cros_ec_get_host_event_wake_mask(). */ + /* For get_host_event_wake_mask(). */ { struct ec_response_host_event_mask *data; =20 @@ -326,7 +326,7 @@ static void cros_ec_proto_test_query_all_normal(struct = kunit *test) KUNIT_EXPECT_TRUE(test, ec_dev->host_sleep_v1); } =20 - /* For cros_ec_get_host_event_wake_mask(). */ + /* For get_host_event_wake_mask(). */ { mock =3D cros_kunit_ec_xfer_mock_next(); KUNIT_EXPECT_PTR_NE(test, mock, NULL); @@ -915,7 +915,7 @@ static void cros_ec_proto_test_query_all_default_wake_m= ask(struct kunit *test) KUNIT_ASSERT_PTR_NE(test, mock, NULL); } =20 - /* For cros_ec_get_host_event_wake_mask(). */ + /* For get_host_event_wake_mask(). */ { mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, sizeof(struct ec_response_host_event_mask)); @@ -976,7 +976,7 @@ static void cros_ec_proto_test_query_all_default_wake_m= ask(struct kunit *test) KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd= _versions)); } =20 - /* For cros_ec_get_host_event_wake_mask(). */ + /* For get_host_event_wake_mask(). */ { u32 mask; =20 --=20 2.36.1.255.ge46751e96f-goog From nobody Tue Apr 28 05:09:42 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 7BB48C43334 for ; Mon, 6 Jun 2022 14:13:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239700AbiFFONB (ORCPT ); Mon, 6 Jun 2022 10:13:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40242 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239636AbiFFOMO (ORCPT ); Mon, 6 Jun 2022 10:12:14 -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 CAF5B25E8F for ; Mon, 6 Jun 2022 07:12:13 -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 DAAFE6136A for ; Mon, 6 Jun 2022 14:12:12 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 65BF5C385A9; Mon, 6 Jun 2022 14:12:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654524732; bh=k9eV0AnZ2X92k+wBWdLIl2ZtT9hBC/I4zr6ytrdT4zc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=t4hZjEOXJ+NuA8XiPXLNzjQEQxggNNC+CMnJqlnw70hbYI7M++7qA7bPCh4TmXIc6 6CJ4K6ejPGr1yvAhZpPNhhsCB2DGfU5OXk96TM5p63+troMV0xxY2T5k0ERfomZB9K 5UtMSsyo1qy1MZ6T2NrRV4vCjJV5y6PcvJTkefj+aNWypnlcr6RDIAWyAmBiy3v068 cndivhxIumK2c5lZute2owjcr+XXqQGCdfrECc/DI3D9VXJSakqY8EocnsDawMfYx6 jeJIlSbHFFxsVfbn0X7dLZe1UE2eLzZS/+4MphAVEFSERBEg5PEC5AX41+cAv0n5cZ cWb/8R8pxfPLA== 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 13/13] platform/chrome: cros_ec_proto: fix get_host_event_wake_mask() returns Date: Mon, 6 Jun 2022 14:10:51 +0000 Message-Id: <20220606141051.285823-14-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.1.255.ge46751e96f-goog In-Reply-To: <20220606141051.285823-1-tzungbi@kernel.org> References: <20220606141051.285823-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" get_host_event_wake_mask() only gets valid result if send_command() returns sizeof(struct ec_response_host_event_mask). Simplify the code and correct the callers. Also add a Kunit test for guarding if get_host_event_wake_mask() returns 0. Signed-off-by: Tzung-Bi Shih --- drivers/platform/chrome/cros_ec_proto.c | 15 +-- drivers/platform/chrome/cros_ec_proto_test.c | 131 +++++++++++++++++++ 2 files changed, 137 insertions(+), 9 deletions(-) diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chr= ome/cros_ec_proto.c index 1622e24747c9..1d2399473f35 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 @@ -256,19 +256,16 @@ static int get_host_event_wake_mask(struct cros_ec_de= vice *ec_dev, uint32_t *mas msg->insize =3D sizeof(*r); =20 ret =3D send_command(ec_dev, msg); - if (ret >=3D 0) { + if (ret > 0) { mapped =3D cros_ec_map_error(msg->result); if (mapped) { ret =3D mapped; - goto exit; + } else { + r =3D (struct ec_response_host_event_mask *)msg->data; + *mask =3D r->mask; } } - if (ret > 0) { - r =3D (struct ec_response_host_event_mask *)msg->data; - *mask =3D r->mask; - } =20 -exit: kfree(msg); return ret; } @@ -499,7 +496,7 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev) =20 /* Get host event wake mask. */ ret =3D get_host_event_wake_mask(ec_dev, &ec_dev->host_event_wake_mask); - if (ret < 0) { + if (ret <=3D 0) { /* * If the EC doesn't support EC_CMD_HOST_EVENT_GET_WAKE_MASK, * use a reasonable default. Note that we ignore various diff --git a/drivers/platform/chrome/cros_ec_proto_test.c b/drivers/platfor= m/chrome/cros_ec_proto_test.c index f63196289f54..1ccc837b30cf 100644 --- a/drivers/platform/chrome/cros_ec_proto_test.c +++ b/drivers/platform/chrome/cros_ec_proto_test.c @@ -999,6 +999,136 @@ static void cros_ec_proto_test_query_all_default_wake= _mask(struct kunit *test) } } =20 +static void cros_ec_proto_test_query_all_default_wake_mask2(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 fill_protocol_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 fill_protocol_info() with passthru. */ + { + mock =3D cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, + sizeof(struct ec_response_get_protocol_info)); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + /* For get_host_command_version_mask() for MKBP. */ + { + mock =3D cros_kunit_ec_xfer_mock_add(test, + sizeof(struct ec_response_get_cmd_versions)); + KUNIT_ASSERT_PTR_NE(test, mock, NULL); + } + + /* For get_host_command_version_mask() for host sleep v1. */ + { + mock =3D cros_kunit_ec_xfer_mock_add(test, + sizeof(struct ec_response_get_cmd_versions)); + 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 fill_protocol_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 fill_protocol_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 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 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 int cros_ec_proto_test_init(struct kunit *test) { struct cros_ec_proto_test_priv *priv; @@ -1051,6 +1181,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_sleep2), KUNIT_CASE(cros_ec_proto_test_query_all_default_wake_mask), + KUNIT_CASE(cros_ec_proto_test_query_all_default_wake_mask2), {} }; =20 --=20 2.36.1.255.ge46751e96f-goog