From nobody Sat May 9 11:04:57 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 E6713C433EF for ; Wed, 18 May 2022 09:18:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233969AbiERJSi (ORCPT ); Wed, 18 May 2022 05:18:38 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43144 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233951AbiERJSf (ORCPT ); Wed, 18 May 2022 05:18:35 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E26241A051 for ; Wed, 18 May 2022 02:18:33 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 86E4D616F9 for ; Wed, 18 May 2022 09:18:33 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id BD4ADC385A5; Wed, 18 May 2022 09:18:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1652865512; bh=6rLezUzKWqLKI6DG7y/Y4pd3Z/CMgk7TBbjkXlTm+bI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=tiHDPQCAGNn7tl+lYKAdpfAzId9qq0doC26nQk5npNanuU06Ur7/SgEOp7JHo0UPM uUxABiSkTi6bBAFjfcjJEuOOuHaSuPJJ23gV4h/NbFTJ2b/m6GVBT76h7WggpGGFyK v/gqsA6kAqPHh0bQgj5CdoDFajvoBcXSQoBnV27S1D9dhW1Zjc/M9W7Jc5ArqRGZ3V N09Atl4MgfP5egu8wnxoaLFLekxUJmjrugkcM1EgdHDe8Uzek8AuNaDFxeVvM2UHd0 PZktenEhT/FMv07fZbzkMyUEgft3WYVMk34R8IzOlzK3KLaa4U4AaEWdnkNkVheoh4 TWgMeWSYAlFXw== From: Tzung-Bi Shih To: bleung@chromium.org, groeck@chromium.org Cc: chrome-platform@lists.linux.dev, linux-kernel@vger.kernel.org, tzungbi@kernel.org, dianders@chromium.org Subject: [PATCH 1/4] platform/chrome: cros_ec_proto: add Kunit tests for cros_ec_prepare_tx() Date: Wed, 18 May 2022 17:18:11 +0800 Message-Id: <20220518091814.2028579-2-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.0.550.gb090851708-goog In-Reply-To: <20220518091814.2028579-1-tzungbi@kernel.org> References: <20220518091814.2028579-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_prepare_tx() is used to fill the protocol headers according to the requested protocol version. Add Kunit tests cros_ec_prepare_tx() for each version. Signed-off-by: Tzung-Bi Shih Reviewed-by: Guenter Roeck --- drivers/platform/chrome/Kconfig | 9 + drivers/platform/chrome/Makefile | 3 + drivers/platform/chrome/cros_ec_proto_test.c | 173 +++++++++++++++++++ 3 files changed, 185 insertions(+) create mode 100644 drivers/platform/chrome/cros_ec_proto_test.c diff --git a/drivers/platform/chrome/Kconfig b/drivers/platform/chrome/Kcon= fig index 717299cbccac..4b3d2427e8dd 100644 --- a/drivers/platform/chrome/Kconfig +++ b/drivers/platform/chrome/Kconfig @@ -267,4 +267,13 @@ config CHROMEOS_PRIVACY_SCREEN =20 source "drivers/platform/chrome/wilco_ec/Kconfig" =20 +# Kunit test cases +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 + help + Kunit tests for the ChromeOS Embedded Controller protocol. + endif # CHROMEOS_PLATFORMS diff --git a/drivers/platform/chrome/Makefile b/drivers/platform/chrome/Mak= efile index 52f5a2dde8b8..3c380066c6b6 100644 --- a/drivers/platform/chrome/Makefile +++ b/drivers/platform/chrome/Makefile @@ -30,3 +30,6 @@ obj-$(CONFIG_CROS_USBPD_LOGGER) +=3D cros_usbpd_logger.o obj-$(CONFIG_CROS_USBPD_NOTIFY) +=3D cros_usbpd_notify.o =20 obj-$(CONFIG_WILCO_EC) +=3D wilco_ec/ + +# Kunit test cases +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 new file mode 100644 index 000000000000..61abb18ac00b --- /dev/null +++ b/drivers/platform/chrome/cros_ec_proto_test.c @@ -0,0 +1,173 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Kunit tests for ChromeOS Embedded Controller protocol. + */ + +#include + +#include +#include + +#include "cros_ec.h" + +#define BUFSIZE 512 + +struct cros_ec_proto_test_priv { + struct cros_ec_device ec_dev; + u8 dout[BUFSIZE]; + u8 din[BUFSIZE]; + struct cros_ec_command *msg; + u8 _msg[BUFSIZE]; +}; + +static void cros_ec_proto_test_prepare_tx_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 cros_ec_command *msg =3D priv->msg; + int ret, i; + u8 csum; + + ec_dev->proto_version =3D 2; + + msg->command =3D EC_CMD_HELLO; + msg->outsize =3D EC_PROTO2_MAX_PARAM_SIZE; + msg->data[0] =3D 0xde; + msg->data[1] =3D 0xad; + msg->data[2] =3D 0xbe; + msg->data[3] =3D 0xef; + + ret =3D cros_ec_prepare_tx(ec_dev, msg); + + KUNIT_EXPECT_EQ(test, ret, EC_MSG_TX_PROTO_BYTES + EC_PROTO2_MAX_PARAM_SI= ZE); + KUNIT_EXPECT_EQ(test, ec_dev->dout[0], EC_CMD_VERSION0); + KUNIT_EXPECT_EQ(test, ec_dev->dout[1], EC_CMD_HELLO); + KUNIT_EXPECT_EQ(test, ec_dev->dout[2], EC_PROTO2_MAX_PARAM_SIZE); + KUNIT_EXPECT_EQ(test, EC_MSG_TX_HEADER_BYTES, 3); + KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + 0], 0xde); + KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + 1], 0xad); + KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + 2], 0xbe); + KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + 3], 0xef); + for (i =3D 4; i < EC_PROTO2_MAX_PARAM_SIZE; ++i) + KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + i], 0); + + csum =3D EC_CMD_VERSION0; + csum +=3D EC_CMD_HELLO; + csum +=3D EC_PROTO2_MAX_PARAM_SIZE; + csum +=3D 0xde; + csum +=3D 0xad; + csum +=3D 0xbe; + csum +=3D 0xef; + KUNIT_EXPECT_EQ(test, + ec_dev->dout[EC_MSG_TX_HEADER_BYTES + EC_PROTO2_MAX_PARAM_SIZE], + csum); +} + +static void cros_ec_proto_test_prepare_tx_legacy_bad_msg_outsize(struct ku= nit *test) +{ + struct cros_ec_proto_test_priv *priv =3D test->priv; + struct cros_ec_device *ec_dev =3D &priv->ec_dev; + struct cros_ec_command *msg =3D priv->msg; + int ret; + + ec_dev->proto_version =3D 2; + + msg->outsize =3D EC_PROTO2_MAX_PARAM_SIZE + 1; + + ret =3D cros_ec_prepare_tx(ec_dev, msg); + KUNIT_EXPECT_EQ(test, ret, -EINVAL); +} + +static void cros_ec_proto_test_prepare_tx_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 cros_ec_command *msg =3D priv->msg; + struct ec_host_request *request =3D (struct ec_host_request *)ec_dev->dou= t; + int ret, i; + u8 csum; + + msg->command =3D EC_CMD_HELLO; + msg->outsize =3D 0x88; + msg->data[0] =3D 0xde; + msg->data[1] =3D 0xad; + msg->data[2] =3D 0xbe; + msg->data[3] =3D 0xef; + + ret =3D cros_ec_prepare_tx(ec_dev, msg); + + KUNIT_EXPECT_EQ(test, ret, sizeof(*request) + 0x88); + + KUNIT_EXPECT_EQ(test, request->struct_version, EC_HOST_REQUEST_VERSION); + KUNIT_EXPECT_EQ(test, request->command, EC_CMD_HELLO); + KUNIT_EXPECT_EQ(test, request->command_version, 0); + KUNIT_EXPECT_EQ(test, request->data_len, 0x88); + KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + 0], 0xde); + KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + 1], 0xad); + KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + 2], 0xbe); + KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + 3], 0xef); + for (i =3D 4; i < 0x88; ++i) + KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + i], 0); + + csum =3D EC_HOST_REQUEST_VERSION; + csum +=3D EC_CMD_HELLO; + csum +=3D 0x88; + csum +=3D 0xde; + csum +=3D 0xad; + csum +=3D 0xbe; + csum +=3D 0xef; + KUNIT_EXPECT_EQ(test, request->checksum, (u8)-csum); +} + +static void cros_ec_proto_test_prepare_tx_bad_msg_outsize(struct kunit *te= st) +{ + struct cros_ec_proto_test_priv *priv =3D test->priv; + struct cros_ec_device *ec_dev =3D &priv->ec_dev; + struct cros_ec_command *msg =3D priv->msg; + int ret; + + msg->outsize =3D ec_dev->dout_size - sizeof(struct ec_host_request) + 1; + + ret =3D cros_ec_prepare_tx(ec_dev, msg); + KUNIT_EXPECT_EQ(test, ret, -EINVAL); +} + +static int cros_ec_proto_test_init(struct kunit *test) +{ + struct cros_ec_proto_test_priv *priv; + struct cros_ec_device *ec_dev; + + priv =3D kunit_kzalloc(test, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + test->priv =3D priv; + + ec_dev =3D &priv->ec_dev; + ec_dev->dout =3D (u8 *)priv->dout; + ec_dev->dout_size =3D ARRAY_SIZE(priv->dout); + 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; + + priv->msg =3D (struct cros_ec_command *)priv->_msg; + + return 0; +} + +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), + {} +}; + +static struct kunit_suite cros_ec_proto_test_suite =3D { + .name =3D "cros_ec_proto_test", + .init =3D cros_ec_proto_test_init, + .test_cases =3D cros_ec_proto_test_cases, +}; + +kunit_test_suite(cros_ec_proto_test_suite); + +MODULE_LICENSE("GPL"); --=20 2.36.0.550.gb090851708-goog From nobody Sat May 9 11:04:57 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 DE5B5C433EF for ; Wed, 18 May 2022 09:18:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234005AbiERJSp (ORCPT ); Wed, 18 May 2022 05:18:45 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43236 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233954AbiERJSg (ORCPT ); Wed, 18 May 2022 05:18:36 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8997A1EAF2 for ; Wed, 18 May 2022 02:18:35 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 2408D616EE for ; Wed, 18 May 2022 09:18:35 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 56E84C34115; Wed, 18 May 2022 09:18:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1652865514; bh=ZxnBh42w0CZG6u7DBza0nWMtyG7KckyK4dV0afsK/lQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ivDt7d4TkiBOCd+5XzY5wywDi/BieFMTpUoVSEHz46Ht56CY+dKB/o6IZTJcntjmv V2PX+x8noU7EEawRqsKOu2vqBnfdv+Gr8Wr8z/QapNNycD36nFyTIABkTCneOnlLGm 3KGJ+FaycOeRgBQo1vVVY/u4edECP104UTsCpD05yjKOkqQCFoggcDt++dMM9zkA5i 7KUe9zYwIp4ltz63dGjoGUvm2ozSpmvJB8KSMdaqfRcBvJQDcX7S18iSL8LAED6XBm UpHS/890yYqXouQdIbmiskdMzPVj8pPBxwbUKrPKRDTvU08yg0oNVMF28KREoCBruZ ThRwnsYWJA/Ew== From: Tzung-Bi Shih To: bleung@chromium.org, groeck@chromium.org Cc: chrome-platform@lists.linux.dev, linux-kernel@vger.kernel.org, tzungbi@kernel.org, dianders@chromium.org Subject: [PATCH 2/4] platform/chrome: cros_ec_proto: factor legacy out from cros_ec_prepare_tx() Date: Wed, 18 May 2022 17:18:12 +0800 Message-Id: <20220518091814.2028579-3-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.0.550.gb090851708-goog In-Reply-To: <20220518091814.2028579-1-tzungbi@kernel.org> References: <20220518091814.2028579-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_prepare_tx() mixed the code for both versions. To be neat and to make it clear, factor the legacy part out as a separate function, rename the function, and update the comments. Specifically, - prepare_tx(), for current protocol version (i.e. 3). - prepare_tx_legacy(), for protocol version <=3D 2. Signed-off-by: Tzung-Bi Shih Reviewed-by: Guenter Roeck --- drivers/platform/chrome/cros_ec_proto.c | 51 ++++++++++++++----------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chr= ome/cros_ec_proto.c index ff767dccdf0f..01ab58b3269b 100644 --- a/drivers/platform/chrome/cros_ec_proto.c +++ b/drivers/platform/chrome/cros_ec_proto.c @@ -52,8 +52,8 @@ static int cros_ec_map_error(uint32_t result) return ret; } =20 -static int prepare_packet(struct cros_ec_device *ec_dev, - struct cros_ec_command *msg) +static int prepare_tx(struct cros_ec_device *ec_dev, + struct cros_ec_command *msg) { struct ec_host_request *request; u8 *out; @@ -85,6 +85,28 @@ static int prepare_packet(struct cros_ec_device *ec_dev, return sizeof(*request) + msg->outsize; } =20 +static int prepare_tx_legacy(struct cros_ec_device *ec_dev, + struct cros_ec_command *msg) +{ + u8 *out; + u8 csum; + int i; + + if (msg->outsize > EC_PROTO2_MAX_PARAM_SIZE) + return -EINVAL; + + out =3D ec_dev->dout; + out[0] =3D EC_CMD_VERSION0 + msg->version; + out[1] =3D msg->command; + out[2] =3D msg->outsize; + csum =3D out[0] + out[1] + out[2]; + for (i =3D 0; i < msg->outsize; i++) + csum +=3D out[EC_MSG_TX_HEADER_BYTES + i] =3D msg->data[i]; + out[EC_MSG_TX_HEADER_BYTES + msg->outsize] =3D csum; + + return EC_MSG_TX_PROTO_BYTES + msg->outsize; +} + static int send_command(struct cros_ec_device *ec_dev, struct cros_ec_command *msg) { @@ -161,35 +183,18 @@ static int send_command(struct cros_ec_device *ec_dev, * @ec_dev: Device to register. * @msg: Message to write. * - * This is intended to be used by all ChromeOS EC drivers, but at present - * only SPI uses it. Once LPC uses the same protocol it can start using it. - * I2C could use it now, with a refactor of the existing code. + * This is used by all ChromeOS EC drivers to prepare the outgoing message + * according to different protocol versions. * * Return: number of prepared bytes on success or negative error code. */ int cros_ec_prepare_tx(struct cros_ec_device *ec_dev, struct cros_ec_command *msg) { - u8 *out; - u8 csum; - int i; - if (ec_dev->proto_version > 2) - return prepare_packet(ec_dev, msg); - - if (msg->outsize > EC_PROTO2_MAX_PARAM_SIZE) - return -EINVAL; - - out =3D ec_dev->dout; - out[0] =3D EC_CMD_VERSION0 + msg->version; - out[1] =3D msg->command; - out[2] =3D msg->outsize; - csum =3D out[0] + out[1] + out[2]; - for (i =3D 0; i < msg->outsize; i++) - csum +=3D out[EC_MSG_TX_HEADER_BYTES + i] =3D msg->data[i]; - out[EC_MSG_TX_HEADER_BYTES + msg->outsize] =3D csum; + return prepare_tx(ec_dev, msg); =20 - return EC_MSG_TX_PROTO_BYTES + msg->outsize; + return prepare_tx_legacy(ec_dev, msg); } EXPORT_SYMBOL(cros_ec_prepare_tx); =20 --=20 2.36.0.550.gb090851708-goog From nobody Sat May 9 11:04:57 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 7D288C433EF for ; Wed, 18 May 2022 09:18:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234017AbiERJSu (ORCPT ); Wed, 18 May 2022 05:18:50 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43424 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233975AbiERJSk (ORCPT ); Wed, 18 May 2022 05:18:40 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id ACB301EAF2 for ; Wed, 18 May 2022 02:18:38 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 66A94B81ED3 for ; Wed, 18 May 2022 09:18:37 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id E5FE4C385A5; Wed, 18 May 2022 09:18:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1652865516; bh=L6zkHW06fOBMQjiYiu7OCLitsyF4v1uG+91rOEJs/Mg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hjspsp5e6ukLQwNI1J4c/+gb4HkGQ1sD/RAHBBjHXEoyfXy7FTV1EZ0eVplVhzIzX M/HDaPXzxxogF4t3/jLeEcuEzlRXAGgHu4eHLOkLeAAS+lBaKTZfQFGqaXT+u5U1tV GMW4562QDIGPCIqik/v2M9KIaI3fpLr9/yMNLDpQBtcJk5n9uS3fZWgzLnNFjRr0Sk lM+eoLIozVWOi5ju8sLLpLizuevXozsT0CPq65iNh5j2OdzOw15lA4PRh7+obuG1TW f5aMt9aqYHRc/CYyA1sTGwJtfsrsPYhxOa2CovEd7ub+tc6NYwJ9AjrGTmt8e1iHbb D475h8UJgnA1w== From: Tzung-Bi Shih To: bleung@chromium.org, groeck@chromium.org Cc: chrome-platform@lists.linux.dev, linux-kernel@vger.kernel.org, tzungbi@kernel.org, dianders@chromium.org Subject: [PATCH 3/4] platform/chrome: cros_ec_proto: update cros_ec_check_result() comment Date: Wed, 18 May 2022 17:18:13 +0800 Message-Id: <20220518091814.2028579-4-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.0.550.gb090851708-goog In-Reply-To: <20220518091814.2028579-1-tzungbi@kernel.org> References: <20220518091814.2028579-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" At first glance, cros_ec_check_result() is quite like cros_ec_map_error(). They check for `ec_msg->result` and return corresponding errors. However, as calling from `pkt_xfer` and `cmd_xfer`, cros_ec_check_result() should not report furthermore errors. -EAGAIN is the only exception. See [1][2][3] for some known userland programs' code. The return code from ioctl only denotes the EC communication status. Userland programs would further analyze the `result` in struct cros_ec_command* for follow-up actions (e.g. [4]). To clarify, update the function comment. [1]: https://crrev.com/54400e93a75ef440a83d6eaac2cec066daf99cf0/util/comm-d= ev.c#154 [2]: https://crrev.com/fe32670a89bf59e1aff84bba9dd3295657b85e9b/cros_ec_dev= .c#296 [3]: https://crrev.com/4e19eb1d89de0422ff1bbd3f7260b131c761098c/drivers/goo= gle/cros_ec_dev.c#120 [4]: https://crrev.com/54400e93a75ef440a83d6eaac2cec066daf99cf0/util/comm-d= ev.c#164 Signed-off-by: Tzung-Bi Shih Reviewed-by: Guenter Roeck --- Changes from previous version: (https://patchwork.kernel.org/project/chrome-platform/patch/20220517082817.= 1591526-1-tzungbi@kernel.org/) - Update the link of [3]. drivers/platform/chrome/cros_ec_proto.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chr= ome/cros_ec_proto.c index 01ab58b3269b..13ced9d2dd71 100644 --- a/drivers/platform/chrome/cros_ec_proto.c +++ b/drivers/platform/chrome/cros_ec_proto.c @@ -204,9 +204,12 @@ EXPORT_SYMBOL(cros_ec_prepare_tx); * @msg: Message to check. * * This is used by ChromeOS EC drivers to check the ec_msg->result for - * errors and to warn about them. + * EC_RES_IN_PROGRESS and to warn about them. * - * Return: 0 on success or negative error code. + * The function should not check for furthermore error codes. Otherwise, + * it would break the ABI. + * + * Return: -EAGAIN if ec_msg->result =3D=3D EC_RES_IN_PROGRESS. Otherwise= , 0. */ int cros_ec_check_result(struct cros_ec_device *ec_dev, struct cros_ec_command *msg) --=20 2.36.0.550.gb090851708-goog From nobody Sat May 9 11:04:57 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 8D759C433FE for ; Wed, 18 May 2022 09:18:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234033AbiERJS5 (ORCPT ); Wed, 18 May 2022 05:18:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43560 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233989AbiERJSm (ORCPT ); Wed, 18 May 2022 05:18:42 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 83E1B20F6C for ; Wed, 18 May 2022 02:18:40 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id F2CBAB81EEF for ; Wed, 18 May 2022 09:18:38 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7F234C34113; Wed, 18 May 2022 09:18:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1652865517; bh=QyFJZzEsnEsrlWMWXjof8oPuhELGLvpS5gdy1Ruuuug=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jJ8nNnOFTHP2OIXelVrkUf4+jpbb7chiaCx1Q4napWwuqZvsjfqmWHKWUxGn5DUfQ Vc7f86+sIjT4dU9NfbnD5E2Yvza44XD5oRkL0kGJ5t+3HIQHGVWnduIe1tOAr3NipU uRxu2QhM91rXfQo6IFqX8mzHsv87j8tYcSAldamFcZ/8RXPnWogpVQiYxxrMX6nvqd gESqERjl/smC4+yvcfjI6GUQmuXhmQixKSVKyxHrkTWZtNrzimUjmQ3RyOUs8i9xln wwuzfPwYCZOcNo7kgtzCwBLhJgrUy/n/g1BMfLUG/Odd1l3Puy9+Ucu5kFDV3sETYI molyAKtOjNWvg== From: Tzung-Bi Shih To: bleung@chromium.org, groeck@chromium.org Cc: chrome-platform@lists.linux.dev, linux-kernel@vger.kernel.org, tzungbi@kernel.org, dianders@chromium.org Subject: [PATCH 4/4] platform/chrome: cros_ec_proto: add Kunit tests for cros_ec_check_result() Date: Wed, 18 May 2022 17:18:14 +0800 Message-Id: <20220518091814.2028579-5-tzungbi@kernel.org> X-Mailer: git-send-email 2.36.0.550.gb090851708-goog In-Reply-To: <20220518091814.2028579-1-tzungbi@kernel.org> References: <20220518091814.2028579-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_check_result() is used to check if the EC communication success but EC responded EC_RES_IN_PROGRESS. It should return 0 even if EC wasn't happy about the host command. Add Kunit tests for cros_ec_check_result(). Signed-off-by: Tzung-Bi Shih Reviewed-by: Guenter Roeck --- drivers/platform/chrome/cros_ec_proto_test.c | 41 ++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/drivers/platform/chrome/cros_ec_proto_test.c b/drivers/platfor= m/chrome/cros_ec_proto_test.c index 61abb18ac00b..25c4fca5c165 100644 --- a/drivers/platform/chrome/cros_ec_proto_test.c +++ b/drivers/platform/chrome/cros_ec_proto_test.c @@ -132,6 +132,46 @@ static void cros_ec_proto_test_prepare_tx_bad_msg_outs= ize(struct kunit *test) KUNIT_EXPECT_EQ(test, ret, -EINVAL); } =20 +static void cros_ec_proto_test_check_result(struct kunit *test) +{ + struct cros_ec_proto_test_priv *priv =3D test->priv; + struct cros_ec_device *ec_dev =3D &priv->ec_dev; + struct cros_ec_command *msg =3D priv->msg; + int ret, i; + static enum ec_status status[] =3D { + EC_RES_SUCCESS, + EC_RES_INVALID_COMMAND, + EC_RES_ERROR, + EC_RES_INVALID_PARAM, + EC_RES_ACCESS_DENIED, + EC_RES_INVALID_RESPONSE, + EC_RES_INVALID_VERSION, + EC_RES_INVALID_CHECKSUM, + EC_RES_UNAVAILABLE, + EC_RES_TIMEOUT, + EC_RES_OVERFLOW, + EC_RES_INVALID_HEADER, + EC_RES_REQUEST_TRUNCATED, + EC_RES_RESPONSE_TOO_BIG, + EC_RES_BUS_ERROR, + EC_RES_BUSY, + EC_RES_INVALID_HEADER_VERSION, + EC_RES_INVALID_HEADER_CRC, + EC_RES_INVALID_DATA_CRC, + EC_RES_DUP_UNAVAILABLE, + }; + + for (i =3D 0; i < ARRAY_SIZE(status); ++i) { + msg->result =3D status[i]; + ret =3D cros_ec_check_result(ec_dev, msg); + KUNIT_EXPECT_EQ(test, ret, 0); + } + + msg->result =3D EC_RES_IN_PROGRESS; + ret =3D cros_ec_check_result(ec_dev, msg); + KUNIT_EXPECT_EQ(test, ret, -EAGAIN); +} + static int cros_ec_proto_test_init(struct kunit *test) { struct cros_ec_proto_test_priv *priv; @@ -159,6 +199,7 @@ static struct kunit_case cros_ec_proto_test_cases[] =3D= { 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), {} }; =20 --=20 2.36.0.550.gb090851708-goog