From patchwork Thu Jun 13 16:10:29 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marek_Beh=C3=BAn?= X-Patchwork-Id: 13697090 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 smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id B9533C27C6E for ; Thu, 13 Jun 2024 16:10:53 +0000 (UTC) Received: by smtp.kernel.org (Postfix) id 76C60C32789; Thu, 13 Jun 2024 16:10:53 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4D145C2BBFC; Thu, 13 Jun 2024 16:10:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1718295053; bh=qNQKeKVAjEgxOQBenmNAc0eVUtJC4/u8mbQTNzE9vLQ=; h=From:List-Id:To:Cc:Subject:Date:In-Reply-To:References:From; b=jdqIO/PmL9jOMvZGmFuRYwspC610CGXAewad/mkQkvFOHYVGxmEf3zZ7asGZyFHfs 3k0FgYAvd0D17WN3wKVVQHrhbDn+XrTeTXFZxya44fsX5YmxpDlrQGmYBFfz71/r6o ISszswYUJcFOSRiB7dZppnxQb98LB3JK6kqFe556kWXIVjF0GN9kud1g3lgnaVycCo xmop9Z4V+rAQWOUp9ksPFe+cD+2gnwhZroooQRlZVOqMa0cVtPFaXte6E1tCLiJ1WK tNOPXdDgE7pMwT7HVLeBPf77EN8uX06+b4y9WqUIxydYCiOhCWxBacuhsBw/N8wYpM 4QZKWLOnwDZUA== From: =?utf-8?q?Marek_Beh=C3=BAn?= List-Id: To: Gregory CLEMENT , Andrew Lunn , Arnd Bergmann , soc@kernel.org, arm@kernel.org, Andy Shevchenko , Hans de Goede , =?utf-8?q?Ilpo_J=C3=A4rvinen?= Cc: =?utf-8?q?Marek_Beh=C3=BAn?= Subject: [PATCH v2 01/17] firmware: turris-mox-rwtm: Do not complete if there are no waiters Date: Thu, 13 Jun 2024 18:10:29 +0200 Message-ID: <20240613161045.29606-2-kabel@kernel.org> X-Mailer: git-send-email 2.44.2 In-Reply-To: <20240613161045.29606-1-kabel@kernel.org> References: <20240613161045.29606-1-kabel@kernel.org> MIME-Version: 1.0 Do not complete the command done completion if there are no waiters. This can happen if a wait_for_completion timed out or was interrupted. Fixes: 389711b37493 ("firmware: Add Turris Mox rWTM firmware driver") Signed-off-by: Marek Behún --- drivers/firmware/turris-mox-rwtm.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c index 31d962cdd6eb..f1f9160c4195 100644 --- a/drivers/firmware/turris-mox-rwtm.c +++ b/drivers/firmware/turris-mox-rwtm.c @@ -2,7 +2,7 @@ /* * Turris Mox rWTM firmware driver * - * Copyright (C) 2019 Marek Behún + * Copyright (C) 2019, 2024 Marek Behún */ #include @@ -174,6 +174,9 @@ static void mox_rwtm_rx_callback(struct mbox_client *cl, void *data) struct mox_rwtm *rwtm = dev_get_drvdata(cl->dev); struct armada_37xx_rwtm_rx_msg *msg = data; + if (completion_done(&rwtm->cmd_done)) + return; + rwtm->reply = *msg; complete(&rwtm->cmd_done); } From patchwork Thu Jun 13 16:10:30 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marek_Beh=C3=BAn?= X-Patchwork-Id: 13697091 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 smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 1B11EC27C4F for ; Thu, 13 Jun 2024 16:10:56 +0000 (UTC) Received: by smtp.kernel.org (Postfix) id 09FEDC4AF4D; Thu, 13 Jun 2024 16:10:56 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id D42EDC2BBFC; Thu, 13 Jun 2024 16:10:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1718295055; bh=sc7EudhJ+/Cu2fPeZrbVPk1U0HTdb44HVHOPZKReBEY=; h=From:List-Id:To:Cc:Subject:Date:In-Reply-To:References:From; b=PbyN/+DDmkIpKK8pL7DyTGNSaM4+zrArnMZCo4QDpGDpaCqjoB8lJudvSlX2VzsAx vEhwbOfGyos/+T5szD2s/Q33gWswH/X2mO57+YhVClPRWDjENK57uPlKHq62D9JD1e ejdCvFa7A32GUmKDZbg7ZvBvSNNCxdlnwh2zYp1QUJ1nU/l21zwQBrjizBTTIzgqxG p+9/bHo9uBxxDL2KTKQWhF3cQhuz4BD4DaJ1MpZRHJgj0+OaKRD5oy4q2W4Fq/q2He SB8rllQP7kUIuESiQetdKvA5vYvO3zRsO0rlLzjG27eE5hVMvyGUxLYFVYF8jJfTNi 65Pmz5qBE3Uqg== From: =?utf-8?q?Marek_Beh=C3=BAn?= List-Id: To: Gregory CLEMENT , Andrew Lunn , Arnd Bergmann , soc@kernel.org, arm@kernel.org, Andy Shevchenko , Hans de Goede , =?utf-8?q?Ilpo_J=C3=A4rvinen?= Cc: =?utf-8?q?Marek_Beh=C3=BAn?= Subject: [PATCH v2 02/17] firmware: turris-mox-rwtm: Fix checking return value of wait_for_completion_timeout() Date: Thu, 13 Jun 2024 18:10:30 +0200 Message-ID: <20240613161045.29606-3-kabel@kernel.org> X-Mailer: git-send-email 2.44.2 In-Reply-To: <20240613161045.29606-1-kabel@kernel.org> References: <20240613161045.29606-1-kabel@kernel.org> MIME-Version: 1.0 The wait_for_completion_timeout() function returns 0 if timed out, and a positive value if completed. Fix the usage of this function. Fixes: 389711b37493 ("firmware: Add Turris Mox rWTM firmware driver") Fixes: 2eab59cf0d20 ("firmware: turris-mox-rwtm: fail probing when firmware does not support hwrng") Signed-off-by: Marek Behún Reviewed-by: Ilpo Järvinen --- drivers/firmware/turris-mox-rwtm.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c index f1f9160c4195..3f4758e03c81 100644 --- a/drivers/firmware/turris-mox-rwtm.c +++ b/drivers/firmware/turris-mox-rwtm.c @@ -202,9 +202,8 @@ static int mox_get_board_info(struct mox_rwtm *rwtm) if (ret < 0) return ret; - ret = wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2); - if (ret < 0) - return ret; + if (!wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2)) + return -ETIMEDOUT; ret = mox_get_status(MBOX_CMD_BOARD_INFO, reply->retval); if (ret == -ENODATA) { @@ -238,9 +237,8 @@ static int mox_get_board_info(struct mox_rwtm *rwtm) if (ret < 0) return ret; - ret = wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2); - if (ret < 0) - return ret; + if (!wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2)) + return -ETIMEDOUT; ret = mox_get_status(MBOX_CMD_ECDSA_PUB_KEY, reply->retval); if (ret == -ENODATA) { @@ -277,9 +275,8 @@ static int check_get_random_support(struct mox_rwtm *rwtm) if (ret < 0) return ret; - ret = wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2); - if (ret < 0) - return ret; + if (!wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2)) + return -ETIMEDOUT; return mox_get_status(MBOX_CMD_GET_RANDOM, rwtm->reply.retval); } From patchwork Thu Jun 13 16:10:31 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marek_Beh=C3=BAn?= X-Patchwork-Id: 13697092 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 smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id B2981C27C4F for ; Thu, 13 Jun 2024 16:10:58 +0000 (UTC) Received: by smtp.kernel.org (Postfix) id 97D43C4AF1D; Thu, 13 Jun 2024 16:10:58 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6A5A7C2BBFC; Thu, 13 Jun 2024 16:10:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1718295058; bh=hAxG7fxH+1ivyfex6hZATKBA6MlX0OKPE/iu6xwVFFE=; h=From:List-Id:To:Cc:Subject:Date:In-Reply-To:References:From; b=FgjyqJWHmh/xZk3kM6B0cKl2MJXgCf8byG1++HJzYKzTriVkp2lFmgoRXGgar/L9i 9MDKmcLBNwN52a72lpZnT5GfPVCnllNHI9cSQoU2tkN73QYkuKs16MpiN0WwP4iDC0 fJxbi8NRanLFQHwrfhQh9k+J2byAELVby+hJJ2Esi1OUiqVLlSQ3bXcEyy//1Tm5Vw 8/ELupwKEJ8E+ROFOUk0X+1Y7ckmzJP//sKd8ELKti71z68YLMV/1mf9v0/pi22ok5 k0VvAIecAgijtfLyfk7dfYl2H3Ejuj3UqDUiKHykaNADdvoeoxVP6NSjZtkDnXzryN I5TyjmkctEjVg== From: =?utf-8?q?Marek_Beh=C3=BAn?= List-Id: To: Gregory CLEMENT , Andrew Lunn , Arnd Bergmann , soc@kernel.org, arm@kernel.org, Andy Shevchenko , Hans de Goede , =?utf-8?q?Ilpo_J=C3=A4rvinen?= Cc: =?utf-8?q?Marek_Beh=C3=BAn?= Subject: [PATCH v2 03/17] firmware: turris-mox-rwtm: Use macro constant instead of hardcoded 4096 Date: Thu, 13 Jun 2024 18:10:31 +0200 Message-ID: <20240613161045.29606-4-kabel@kernel.org> X-Mailer: git-send-email 2.44.2 In-Reply-To: <20240613161045.29606-1-kabel@kernel.org> References: <20240613161045.29606-1-kabel@kernel.org> MIME-Version: 1.0 The 4096 bytes limit in mox_hwrng_read() is due to the DMA buffer being allocated to one PAGE_SIZE bytes. Use new local macro constant RWTM_DMA_BUFFER_SIZE at allocation time and when used in mox_hwrng_read(). Signed-off-by: Marek Behún Reviewed-by: Ilpo Järvinen --- drivers/firmware/turris-mox-rwtm.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c index 3f4758e03c81..b8deb13aed98 100644 --- a/drivers/firmware/turris-mox-rwtm.c +++ b/drivers/firmware/turris-mox-rwtm.c @@ -19,6 +19,8 @@ #define DRIVER_NAME "turris-mox-rwtm" +#define RWTM_DMA_BUFFER_SIZE PAGE_SIZE + /* * The macros and constants below come from Turris Mox's rWTM firmware code. * This firmware is open source and it's sources can be found at @@ -287,8 +289,8 @@ static int mox_hwrng_read(struct hwrng *rng, void *data, size_t max, bool wait) struct armada_37xx_rwtm_tx_msg msg; int ret; - if (max > 4096) - max = 4096; + if (max > RWTM_DMA_BUFFER_SIZE) + max = RWTM_DMA_BUFFER_SIZE; msg.command = MBOX_CMD_GET_RANDOM; msg.args[0] = 1; @@ -479,8 +481,8 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev) return -ENOMEM; rwtm->dev = dev; - rwtm->buf = dmam_alloc_coherent(dev, PAGE_SIZE, &rwtm->buf_phys, - GFP_KERNEL); + rwtm->buf = dmam_alloc_coherent(dev, RWTM_DMA_BUFFER_SIZE, + &rwtm->buf_phys, GFP_KERNEL); if (!rwtm->buf) return -ENOMEM; From patchwork Thu Jun 13 16:10:32 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marek_Beh=C3=BAn?= X-Patchwork-Id: 13697093 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 smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 50550C27C6E for ; Thu, 13 Jun 2024 16:11:01 +0000 (UTC) Received: by smtp.kernel.org (Postfix) id 31346C4AF1C; Thu, 13 Jun 2024 16:11:01 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 05BE9C32789; Thu, 13 Jun 2024 16:10:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1718295061; bh=tZFkMyom4LPKKn0vPNlYjH1EaU3wiJwuxLlWGg5cu0Q=; h=From:List-Id:To:Cc:Subject:Date:In-Reply-To:References:From; b=GMzgJT8k8W/XxVzInGajoljT+da+MeMxYQs1L/HI9ziCo2SKLtv4s0bpflDJQw3ZW aPhHXvTeBhWM3Qslq/TYYaGIJ4q2dQtDwZHmMnZtKXXBCI4ATgLUhpivJx0poNF2Da R0ces267EyXviQrooXW3PVRcQNgmEJeaUp+LDehzEsVzRjNhYHvb11cHhh4dS3QwgU KUJywEdTzQmvogKyMeEBP8CJyGXp6z7Bd6ZY0nYHDSbpybMDHcmBXYz3lLp2YrwaVz LVs9OgbxS9DyzvkO4R910PWYmI15LS48dgiBl98yqoEytxP6V2tMfB+JEKuaD+k5fA jCPkF8a73WhQQ== From: =?utf-8?q?Marek_Beh=C3=BAn?= List-Id: To: Gregory CLEMENT , Andrew Lunn , Arnd Bergmann , soc@kernel.org, arm@kernel.org, Andy Shevchenko , Hans de Goede , =?utf-8?q?Ilpo_J=C3=A4rvinen?= Cc: =?utf-8?q?Marek_Beh=C3=BAn?= Subject: [PATCH v2 04/17] firmware: turris-mox-rwtm: Use ETH_ALEN instead of hardcoded 6 Date: Thu, 13 Jun 2024 18:10:32 +0200 Message-ID: <20240613161045.29606-5-kabel@kernel.org> X-Mailer: git-send-email 2.44.2 In-Reply-To: <20240613161045.29606-1-kabel@kernel.org> References: <20240613161045.29606-1-kabel@kernel.org> MIME-Version: 1.0 Use the ETH_ALEN macro instead of hardcoded 6 for MAC address length. Signed-off-by: Marek Behún Reviewed-by: Ilpo Järvinen --- drivers/firmware/turris-mox-rwtm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c index b8deb13aed98..3a7969d15d27 100644 --- a/drivers/firmware/turris-mox-rwtm.c +++ b/drivers/firmware/turris-mox-rwtm.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -67,7 +68,7 @@ struct mox_rwtm { int has_board_info; u64 serial_number; int board_version, ram_size; - u8 mac_address1[6], mac_address2[6]; + u8 mac_address1[ETH_ALEN], mac_address2[ETH_ALEN]; /* public key burned in eFuse */ int has_pubkey; From patchwork Thu Jun 13 16:10:33 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marek_Beh=C3=BAn?= X-Patchwork-Id: 13697094 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 smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id CFDCCC27C4F for ; Thu, 13 Jun 2024 16:11:03 +0000 (UTC) Received: by smtp.kernel.org (Postfix) id C1835C32789; Thu, 13 Jun 2024 16:11:03 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 93405C2BBFC; Thu, 13 Jun 2024 16:11:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1718295063; bh=c/FIgLy7vTlW+cKH3iunrz6w4aWB8+uhMsclcdHnxJU=; h=From:List-Id:To:Cc:Subject:Date:In-Reply-To:References:From; b=E8c2hYLGbeGqHJVv6kagMjg3sDldJOMZNUrPrwAwRW0fluwOhWOUJe8MOpoGEZBFi KKr2XWFfuz0UMc5dJo97BiFK12v4ne7mSf6CizE4r1CCnrnZKws6xxBSbxdoGBmQuN OCKuGw5Tci6bSqr8Cduv4i0MYuXEyjIyVtHxAsC26c+KxtK7n3ulZ/RDcMjLTp741U os9KAClM/qr3/t43B76FXvljnDCTAYPRYVdxIhCE3H1q/T99ztko4ShDcEIfru5+Zg hbWoOsz+pBbHUMw0k/2Eq3ykOE8pYm6/xX5nVAqmgyonncMkJ8poam9mnd/vlUKv6X zNfVjPqFOumog== From: =?utf-8?q?Marek_Beh=C3=BAn?= List-Id: To: Gregory CLEMENT , Andrew Lunn , Arnd Bergmann , soc@kernel.org, arm@kernel.org, Andy Shevchenko , Hans de Goede , =?utf-8?q?Ilpo_J=C3=A4rvinen?= Cc: =?utf-8?q?Marek_Beh=C3=BAn?= Subject: [PATCH v2 05/17] firmware: turris-mox-rwtm: Use the boolean type where appropriate Date: Thu, 13 Jun 2024 18:10:33 +0200 Message-ID: <20240613161045.29606-6-kabel@kernel.org> X-Mailer: git-send-email 2.44.2 In-Reply-To: <20240613161045.29606-1-kabel@kernel.org> References: <20240613161045.29606-1-kabel@kernel.org> MIME-Version: 1.0 Use the boolean type for has_board_info, has_pubkey and last_sig_done members of the driver's private structure. Signed-off-by: Marek Behún --- drivers/firmware/turris-mox-rwtm.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c index 3a7969d15d27..703b05c404e4 100644 --- a/drivers/firmware/turris-mox-rwtm.c +++ b/drivers/firmware/turris-mox-rwtm.c @@ -17,6 +17,7 @@ #include #include #include +#include #define DRIVER_NAME "turris-mox-rwtm" @@ -65,13 +66,13 @@ struct mox_rwtm { struct completion cmd_done; /* board information */ - int has_board_info; + bool has_board_info; u64 serial_number; int board_version, ram_size; u8 mac_address1[ETH_ALEN], mac_address2[ETH_ALEN]; /* public key burned in eFuse */ - int has_pubkey; + bool has_pubkey; u8 pubkey[135]; #ifdef CONFIG_DEBUG_FS @@ -83,7 +84,7 @@ struct mox_rwtm { */ struct dentry *debugfs_root; u32 last_sig[34]; - int last_sig_done; + bool last_sig_done; #endif }; @@ -227,7 +228,7 @@ static int mox_get_board_info(struct mox_rwtm *rwtm) reply->status[5]); reply_to_mac_addr(rwtm->mac_address2, reply->status[6], reply->status[7]); - rwtm->has_board_info = 1; + rwtm->has_board_info = true; pr_info("Turris Mox serial number %016llX\n", rwtm->serial_number); @@ -254,7 +255,7 @@ static int mox_get_board_info(struct mox_rwtm *rwtm) } else { u32 *s = reply->status; - rwtm->has_pubkey = 1; + rwtm->has_pubkey = true; sprintf(rwtm->pubkey, "%06x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x", ret, s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], @@ -351,7 +352,7 @@ static ssize_t do_sign_read(struct file *file, char __user *buf, size_t len, /* 2 arrays of 17 32-bit words are 136 bytes */ ret = simple_read_from_buffer(buf, len, ppos, rwtm->last_sig, 136); - rwtm->last_sig_done = 0; + rwtm->last_sig_done = false; return ret; } @@ -417,7 +418,7 @@ static ssize_t do_sign_write(struct file *file, const char __user *buf, */ memcpy(rwtm->last_sig, rwtm->buf + 68, 136); cpu_to_be32_array(rwtm->last_sig, rwtm->last_sig, 34); - rwtm->last_sig_done = 1; + rwtm->last_sig_done = true; mutex_unlock(&rwtm->busy); return len; From patchwork Thu Jun 13 16:10:34 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marek_Beh=C3=BAn?= X-Patchwork-Id: 13697095 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 smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 6A496C27C78 for ; Thu, 13 Jun 2024 16:11:06 +0000 (UTC) Received: by smtp.kernel.org (Postfix) id 5A073C4AF1D; Thu, 13 Jun 2024 16:11:06 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2EF42C2BBFC; Thu, 13 Jun 2024 16:11:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1718295066; bh=5sUhV6nX9Vo/EEV46JLBxRD5cr/cO4CJxi1KWGIAUio=; h=From:List-Id:To:Cc:Subject:Date:In-Reply-To:References:From; b=qeL1ZLR9HIi725BCO0+aYNAL2cjdFbksx2OOU85LjnIPx2FSJlL+2SgJpgirwRc4G ydZ3GZb0Tw7DZL4O77YwFSz+ZBHOard39VlulHMNCwYRe5wVfD2pzYzYM54F9aRXv0 1w6EH3J+D+m7xvT/RltNQ7CNCXLnLtr5sAe68sgz2ZpwCoEIMDLzI5Ev/qu8Cpl6SR zrLLEhMa++fZ8VhwVoGz5tZs0GhxPTK0R+hLQoHzMnyLyHOTErHzA7yUy+TJss524S GD5oQvZ8zqVx9UvXWHKHcesh8T/im6eqtSt7oidKyLmy01gJGF2TgAc5ZTaLNIkVVX 6nRtoibevZT9w== From: =?utf-8?q?Marek_Beh=C3=BAn?= List-Id: To: Gregory CLEMENT , Andrew Lunn , Arnd Bergmann , soc@kernel.org, arm@kernel.org, Andy Shevchenko , Hans de Goede , =?utf-8?q?Ilpo_J=C3=A4rvinen?= Cc: =?utf-8?q?Marek_Beh=C3=BAn?= Subject: [PATCH v2 06/17] firmware: turris-mox-rwtm: Hide signature related constants behind macros Date: Thu, 13 Jun 2024 18:10:34 +0200 Message-ID: <20240613161045.29606-7-kabel@kernel.org> X-Mailer: git-send-email 2.44.2 In-Reply-To: <20240613161045.29606-1-kabel@kernel.org> References: <20240613161045.29606-1-kabel@kernel.org> MIME-Version: 1.0 Hide signature generation related constants behind macros instead of hardcoding the values. Use SHA512_DIGEST_SIZE from crypto/sha2.h instead of hardcoded 64 as the message size. Signed-off-by: Marek Behún --- drivers/firmware/turris-mox-rwtm.c | 34 +++++++++++++++++++----------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c index 703b05c404e4..fb263f9bbab9 100644 --- a/drivers/firmware/turris-mox-rwtm.c +++ b/drivers/firmware/turris-mox-rwtm.c @@ -5,6 +5,7 @@ * Copyright (C) 2019, 2024 Marek Behún */ +#include #include #include #include @@ -29,6 +30,12 @@ * https://gitlab.labs.nic.cz/turris/mox-boot-builder/tree/master/wtmi. */ +#define MOX_ECC_NUMBER_WORDS 17 +#define MOX_ECC_NUMBER_LEN (MOX_ECC_NUMBER_WORDS * sizeof(u32)) + +#define MOX_ECC_SIGNATURE_WORDS (2 * MOX_ECC_NUMBER_WORDS) +#define MOX_ECC_SIGNATURE_LEN (MOX_ECC_NUMBER_WORDS * sizeof(u32)) + #define MBOX_STS_SUCCESS (0 << 30) #define MBOX_STS_FAIL (1 << 30) #define MBOX_STS_BADCMD (2 << 30) @@ -83,7 +90,7 @@ struct mox_rwtm { * from userspace. */ struct dentry *debugfs_root; - u32 last_sig[34]; + u32 last_sig[MOX_ECC_SIGNATURE_WORDS]; bool last_sig_done; #endif }; @@ -344,14 +351,15 @@ static ssize_t do_sign_read(struct file *file, char __user *buf, size_t len, if (*ppos != 0) return 0; - if (len < 136) + if (len < MOX_ECC_SIGNATURE_LEN) return -EINVAL; if (!rwtm->last_sig_done) return -ENODATA; /* 2 arrays of 17 32-bit words are 136 bytes */ - ret = simple_read_from_buffer(buf, len, ppos, rwtm->last_sig, 136); + ret = simple_read_from_buffer(buf, len, ppos, rwtm->last_sig, + MOX_ECC_SIGNATURE_LEN); rwtm->last_sig_done = false; return ret; @@ -366,8 +374,7 @@ static ssize_t do_sign_write(struct file *file, const char __user *buf, loff_t dummy = 0; ssize_t ret; - /* the input is a SHA-512 hash, so exactly 64 bytes have to be read */ - if (len != 64) + if (len != SHA512_DIGEST_SIZE) return -EINVAL; /* if last result is not zero user has not read that information yet */ @@ -388,17 +395,18 @@ static ssize_t do_sign_write(struct file *file, const char __user *buf, * 3. Address of the buffer where ECDSA signature value S shall be * stored by the rWTM firmware. */ - memset(rwtm->buf, 0, 4); - ret = simple_write_to_buffer(rwtm->buf + 4, 64, &dummy, buf, len); + memset(rwtm->buf, 0, sizeof(u32)); + ret = simple_write_to_buffer(rwtm->buf + sizeof(u32), + SHA512_DIGEST_SIZE, &dummy, buf, len); if (ret < 0) goto unlock_mutex; - be32_to_cpu_array(rwtm->buf, rwtm->buf, 17); + be32_to_cpu_array(rwtm->buf, rwtm->buf, MOX_ECC_NUMBER_WORDS); msg.command = MBOX_CMD_SIGN; msg.args[0] = 1; msg.args[1] = rwtm->buf_phys; - msg.args[2] = rwtm->buf_phys + 68; - msg.args[3] = rwtm->buf_phys + 2 * 68; + msg.args[2] = rwtm->buf_phys + MOX_ECC_NUMBER_LEN; + msg.args[3] = rwtm->buf_phys + 2 * MOX_ECC_NUMBER_LEN; ret = mbox_send_message(rwtm->mbox, &msg); if (ret < 0) goto unlock_mutex; @@ -416,8 +424,10 @@ static ssize_t do_sign_write(struct file *file, const char __user *buf, * computed by the rWTM firmware and convert their words from * LE to BE. */ - memcpy(rwtm->last_sig, rwtm->buf + 68, 136); - cpu_to_be32_array(rwtm->last_sig, rwtm->last_sig, 34); + memcpy(rwtm->last_sig, rwtm->buf + MOX_ECC_NUMBER_LEN, + MOX_ECC_SIGNATURE_LEN); + cpu_to_be32_array(rwtm->last_sig, rwtm->last_sig, + MOX_ECC_SIGNATURE_WORDS); rwtm->last_sig_done = true; mutex_unlock(&rwtm->busy); From patchwork Thu Jun 13 16:10:35 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marek_Beh=C3=BAn?= X-Patchwork-Id: 13697096 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 smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id F2EDDC27C75 for ; Thu, 13 Jun 2024 16:11:08 +0000 (UTC) Received: by smtp.kernel.org (Postfix) id E3538C32786; Thu, 13 Jun 2024 16:11:08 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id BAC81C2BBFC; Thu, 13 Jun 2024 16:11:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1718295068; bh=z0DqfcNoX5A2/L3klTRARsHnyz5IqXkJ715WfadhAAA=; h=From:List-Id:To:Cc:Subject:Date:In-Reply-To:References:From; b=hFBiyNW90RGvHka9zleDUBoZCw1fV9YVj+Aeb19DNZsDxDrdpS6z4jJpx6nx0ag+5 UdSj1Wjh/DDrAtSQvZAJeSCBYv5jmp2pHzdAfEkOkBOmmO4H5yc4CLeVT6JLtNJ2ok gYqsMGmuHrztShhN93F0J1sfqSYCErIlAPbVqWXv954GbE9VeXPOX7NFv5wokQPJEB h6sG++UZGI4b7A95DbcCHaYpQudQh1WSQb28eC5Mnt942Yzzu8mVcVCY/4Wg06QpGI 9tbVwaXhaaFjKdl2DD5u2BPATCN5tJHJ35Ms/I8/+Az90oMI4nC3u+VU+umqOXEDKH 9kJsLvGCqksdg== From: =?utf-8?q?Marek_Beh=C3=BAn?= List-Id: To: Gregory CLEMENT , Andrew Lunn , Arnd Bergmann , soc@kernel.org, arm@kernel.org, Andy Shevchenko , Hans de Goede , =?utf-8?q?Ilpo_J=C3=A4rvinen?= Cc: =?utf-8?q?Marek_Beh=C3=BAn?= Subject: [PATCH v2 07/17] firmware: turris-mox-rwtm: Fix driver includes Date: Thu, 13 Jun 2024 18:10:35 +0200 Message-ID: <20240613161045.29606-8-kabel@kernel.org> X-Mailer: git-send-email 2.44.2 In-Reply-To: <20240613161045.29606-1-kabel@kernel.org> References: <20240613161045.29606-1-kabel@kernel.org> MIME-Version: 1.0 Drop including of.h, include several other headers that are used but not included directly. Signed-off-by: Marek Behún --- drivers/firmware/turris-mox-rwtm.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c index fb263f9bbab9..75a98386a2b0 100644 --- a/drivers/firmware/turris-mox-rwtm.c +++ b/drivers/firmware/turris-mox-rwtm.c @@ -8,16 +8,21 @@ #include #include #include +#include #include +#include #include +#include +#include #include #include +#include #include #include #include -#include #include #include +#include #include #define DRIVER_NAME "turris-mox-rwtm" From patchwork Thu Jun 13 16:10:36 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marek_Beh=C3=BAn?= X-Patchwork-Id: 13697097 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 smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 85E82C27C4F for ; Thu, 13 Jun 2024 16:11:11 +0000 (UTC) Received: by smtp.kernel.org (Postfix) id 74485C4AF1C; Thu, 13 Jun 2024 16:11:11 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4C54BC2BBFC; Thu, 13 Jun 2024 16:11:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1718295071; bh=9/WZbj8983D0x6MQPaHQJlTwlSm2JZIHAhXGHR1+U0Q=; h=From:List-Id:To:Cc:Subject:Date:In-Reply-To:References:From; b=oh819a7uc7RqhGrJ2D0iNHJRzFlDHscLcDnlqseav/JpgUA21OLZn4l2ezWCC45WP //yOC3nvQzyjpDAGBdXC68g+mkB+WfCbRNDmh5cpGoHRGu5pwFwfZhXDmMXksMNEey VlQ2qrOVKdjAbSBLtbi/l51sRz4qRJ/B+MvjHZ0LEv6CdSrzU/EedALeqvOb6K2QB2 5HwzvyqpRw5kzM1VBplPMPhluw/ZqHgZxXxaRqKoPnDwk4hb6LhVkpO2volYjbTUGM 372+dhO3lsQn9//7Jh09LQKGLxaC5RAI6F2uePZcwBbkB3K52mPMW7TGOWFlXCy6fc 0vjx8hjN0ilHw== From: =?utf-8?q?Marek_Beh=C3=BAn?= List-Id: To: Gregory CLEMENT , Andrew Lunn , Arnd Bergmann , soc@kernel.org, arm@kernel.org, Andy Shevchenko , Hans de Goede , =?utf-8?q?Ilpo_J=C3=A4rvinen?= Cc: =?utf-8?q?Marek_Beh=C3=BAn?= Subject: [PATCH v2 08/17] firmware: turris-mox-rwtm: Don't create own kobject type Date: Thu, 13 Jun 2024 18:10:36 +0200 Message-ID: <20240613161045.29606-9-kabel@kernel.org> X-Mailer: git-send-email 2.44.2 In-Reply-To: <20240613161045.29606-1-kabel@kernel.org> References: <20240613161045.29606-1-kabel@kernel.org> MIME-Version: 1.0 In order to create attribute files in /sys/firmware/turris-mox-rwtm, this driver creates it's own kobject type. Simplify this by dropping this own kobject creation, and instead creating standard device attribute files. For backwards compatibility with sysfs ABI, create a symlink /sys/firmware/turris-mox-rwtm, pointing to this device's sysfs directory. Signed-off-by: Marek Behún Reviewed-by: Ilpo Järvinen --- drivers/firmware/turris-mox-rwtm.c | 107 ++++++++--------------------- 1 file changed, 29 insertions(+), 78 deletions(-) diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c index 75a98386a2b0..d17dc0679439 100644 --- a/drivers/firmware/turris-mox-rwtm.c +++ b/drivers/firmware/turris-mox-rwtm.c @@ -21,7 +21,6 @@ #include #include #include -#include #include #include @@ -60,13 +59,10 @@ enum mbox_cmd { MBOX_CMD_OTP_WRITE = 8, }; -struct mox_kobject; - struct mox_rwtm { struct device *dev; struct mbox_client mbox_client; struct mbox_chan *mbox; - struct mox_kobject *kobj; struct hwrng hwrng; struct armada_37xx_rwtm_rx_msg reply; @@ -100,59 +96,17 @@ struct mox_rwtm { #endif }; -struct mox_kobject { - struct kobject kobj; - struct mox_rwtm *rwtm; -}; - -static inline struct kobject *rwtm_to_kobj(struct mox_rwtm *rwtm) -{ - return &rwtm->kobj->kobj; -} - -static inline struct mox_rwtm *to_rwtm(struct kobject *kobj) -{ - return container_of(kobj, struct mox_kobject, kobj)->rwtm; -} - -static void mox_kobj_release(struct kobject *kobj) -{ - kfree(to_rwtm(kobj)->kobj); -} - -static const struct kobj_type mox_kobj_ktype = { - .release = mox_kobj_release, - .sysfs_ops = &kobj_sysfs_ops, -}; - -static int mox_kobj_create(struct mox_rwtm *rwtm) -{ - rwtm->kobj = kzalloc(sizeof(*rwtm->kobj), GFP_KERNEL); - if (!rwtm->kobj) - return -ENOMEM; - - kobject_init(rwtm_to_kobj(rwtm), &mox_kobj_ktype); - if (kobject_add(rwtm_to_kobj(rwtm), firmware_kobj, "turris-mox-rwtm")) { - kobject_put(rwtm_to_kobj(rwtm)); - return -ENXIO; - } - - rwtm->kobj->rwtm = rwtm; - - return 0; -} - #define MOX_ATTR_RO(name, format, cat) \ static ssize_t \ -name##_show(struct kobject *kobj, struct kobj_attribute *a, \ +name##_show(struct device *dev, struct device_attribute *a, \ char *buf) \ { \ - struct mox_rwtm *rwtm = to_rwtm(kobj); \ + struct mox_rwtm *rwtm = dev_get_drvdata(dev); \ if (!rwtm->has_##cat) \ return -ENODATA; \ return sprintf(buf, format, rwtm->name); \ } \ -static struct kobj_attribute mox_attr_##name = __ATTR_RO(name) +static DEVICE_ATTR_RO(name) MOX_ATTR_RO(serial_number, "%016llX\n", board_info); MOX_ATTR_RO(board_version, "%i\n", board_info); @@ -161,6 +115,17 @@ MOX_ATTR_RO(mac_address1, "%pM\n", board_info); MOX_ATTR_RO(mac_address2, "%pM\n", board_info); MOX_ATTR_RO(pubkey, "%s\n", pubkey); +static struct attribute *turris_mox_rwtm_attrs[] = { + &dev_attr_serial_number.attr, + &dev_attr_board_version.attr, + &dev_attr_ram_size.attr, + &dev_attr_mac_address1.attr, + &dev_attr_mac_address2.attr, + &dev_attr_pubkey.attr, + NULL +}; +ATTRIBUTE_GROUPS(turris_mox_rwtm); + static int mox_get_status(enum mbox_cmd cmd, u32 retval) { if (MBOX_STS_CMD(retval) != cmd) @@ -175,16 +140,6 @@ static int mox_get_status(enum mbox_cmd cmd, u32 retval) return MBOX_STS_VALUE(retval); } -static const struct attribute *mox_rwtm_attrs[] = { - &mox_attr_serial_number.attr, - &mox_attr_board_version.attr, - &mox_attr_ram_size.attr, - &mox_attr_mac_address1.attr, - &mox_attr_mac_address2.attr, - &mox_attr_pubkey.attr, - NULL -}; - static void mox_rwtm_rx_callback(struct mbox_client *cl, void *data) { struct mox_rwtm *rwtm = dev_get_drvdata(cl->dev); @@ -487,6 +442,11 @@ static inline void rwtm_unregister_debugfs(struct mox_rwtm *rwtm) } #endif +static void rwtm_firmware_symlink_drop(void *) +{ + sysfs_remove_link(firmware_kobj, DRIVER_NAME); +} + static int turris_mox_rwtm_probe(struct platform_device *pdev) { struct mox_rwtm *rwtm; @@ -503,18 +463,6 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev) if (!rwtm->buf) return -ENOMEM; - ret = mox_kobj_create(rwtm); - if (ret < 0) { - dev_err(dev, "Cannot create turris-mox-rwtm kobject!\n"); - return ret; - } - - ret = sysfs_create_files(rwtm_to_kobj(rwtm), mox_rwtm_attrs); - if (ret < 0) { - dev_err(dev, "Cannot create sysfs files!\n"); - goto put_kobj; - } - platform_set_drvdata(pdev, rwtm); mutex_init(&rwtm->busy); @@ -528,7 +476,7 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev) if (ret != -EPROBE_DEFER) dev_err(dev, "Cannot request mailbox channel: %i\n", ret); - goto remove_files; + return ret; } init_completion(&rwtm->cmd_done); @@ -562,14 +510,18 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev) dev_info(dev, "HWRNG successfully registered\n"); + /* + * For sysfs ABI compatibility, create symlink + * /sys/firmware/turris-mox-rwtm to this device's sysfs directory. + */ + ret = sysfs_create_link(firmware_kobj, &dev->kobj, DRIVER_NAME); + if (!ret) + devm_add_action_or_reset(dev, rwtm_firmware_symlink_drop, NULL); + return 0; free_channel: mbox_free_channel(rwtm->mbox); -remove_files: - sysfs_remove_files(rwtm_to_kobj(rwtm), mox_rwtm_attrs); -put_kobj: - kobject_put(rwtm_to_kobj(rwtm)); return ret; } @@ -578,8 +530,6 @@ static void turris_mox_rwtm_remove(struct platform_device *pdev) struct mox_rwtm *rwtm = platform_get_drvdata(pdev); rwtm_unregister_debugfs(rwtm); - sysfs_remove_files(rwtm_to_kobj(rwtm), mox_rwtm_attrs); - kobject_put(rwtm_to_kobj(rwtm)); mbox_free_channel(rwtm->mbox); } @@ -597,6 +547,7 @@ static struct platform_driver turris_mox_rwtm_driver = { .driver = { .name = DRIVER_NAME, .of_match_table = turris_mox_rwtm_match, + .dev_groups = turris_mox_rwtm_groups, }, }; module_platform_driver(turris_mox_rwtm_driver); From patchwork Thu Jun 13 16:10:37 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marek_Beh=C3=BAn?= X-Patchwork-Id: 13697098 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 smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 12771C27C75 for ; Thu, 13 Jun 2024 16:11:14 +0000 (UTC) Received: by smtp.kernel.org (Postfix) id 0534AC4AF1C; Thu, 13 Jun 2024 16:11:14 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id D17B8C2BBFC; Thu, 13 Jun 2024 16:11:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1718295073; bh=UgUZg6hUDfFLzxpWFcFCweGPS+bRnUGd3mlfull7wAM=; h=From:List-Id:To:Cc:Subject:Date:In-Reply-To:References:From; b=SybQh8uUEA9IcPljA5R7nV6vAOnXePeO6TIBGv2QULu+pv5hHoELHeZSwwbkNPyRv hDsZSCZ4WQhl7rn75+cj4/SpXHju0kPq2M3z3/iioFek7kjl56YZmMPD5KgAW4mG5Z VYJvcstRl6oxA9Ldwp+qYUJQywGuqP5Gl8ZX2FXM2dhgvOvIu9IviR5R3Gkj0YDuOL ijNoNtGGrckxDwGdKKuGbQgeJI95v6OZeuK2P7ozrpNNYaMSyt02k4HBRw+RroIkR6 giBMhtmqpOLqiJoBjfQSwWVUAqKAYOOEhYsW2JVPFAlEKE2sM4oMMgNwP29EHZxcuo ArkIqe2X/aCdw== From: =?utf-8?q?Marek_Beh=C3=BAn?= List-Id: To: Gregory CLEMENT , Andrew Lunn , Arnd Bergmann , soc@kernel.org, arm@kernel.org, Andy Shevchenko , Hans de Goede , =?utf-8?q?Ilpo_J=C3=A4rvinen?= Cc: =?utf-8?q?Marek_Beh=C3=BAn?= Subject: [PATCH v2 09/17] firmware: turris-mox-rwtm: Simplify debugfs code Date: Thu, 13 Jun 2024 18:10:37 +0200 Message-ID: <20240613161045.29606-10-kabel@kernel.org> X-Mailer: git-send-email 2.44.2 In-Reply-To: <20240613161045.29606-1-kabel@kernel.org> References: <20240613161045.29606-1-kabel@kernel.org> MIME-Version: 1.0 Simplify debugfs code: do not check for errors, as debugfs errors should be ignored, and use devm action for dropping the debugfs directory. Signed-off-by: Marek Behún --- drivers/firmware/turris-mox-rwtm.c | 44 ++++++++---------------------- 1 file changed, 11 insertions(+), 33 deletions(-) diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c index d17dc0679439..a536c9c461a7 100644 --- a/drivers/firmware/turris-mox-rwtm.c +++ b/drivers/firmware/turris-mox-rwtm.c @@ -90,7 +90,6 @@ struct mox_rwtm { * It should be rewritten via crypto API once akcipher API is available * from userspace. */ - struct dentry *debugfs_root; u32 last_sig[MOX_ECC_SIGNATURE_WORDS]; bool last_sig_done; #endif @@ -405,39 +404,23 @@ static const struct file_operations do_sign_fops = { .llseek = no_llseek, }; -static int rwtm_register_debugfs(struct mox_rwtm *rwtm) +static void rwtm_debugfs_release(void *root) { - struct dentry *root, *entry; - - root = debugfs_create_dir("turris-mox-rwtm", NULL); - - if (IS_ERR(root)) - return PTR_ERR(root); - - entry = debugfs_create_file_unsafe("do_sign", 0600, root, rwtm, - &do_sign_fops); - if (IS_ERR(entry)) - goto err_remove; - - rwtm->debugfs_root = root; - - return 0; -err_remove: debugfs_remove_recursive(root); - return PTR_ERR(entry); } -static void rwtm_unregister_debugfs(struct mox_rwtm *rwtm) +static void rwtm_register_debugfs(struct mox_rwtm *rwtm) { - debugfs_remove_recursive(rwtm->debugfs_root); + struct dentry *root; + + root = debugfs_create_dir("turris-mox-rwtm", NULL); + + devm_add_action_or_reset(rwtm->dev, rwtm_debugfs_release, root); + + debugfs_create_file_unsafe("do_sign", 0600, root, rwtm, &do_sign_fops); } #else -static inline int rwtm_register_debugfs(struct mox_rwtm *rwtm) -{ - return 0; -} - -static inline void rwtm_unregister_debugfs(struct mox_rwtm *rwtm) +static inline void rwtm_register_debugfs(struct mox_rwtm *rwtm) { } #endif @@ -502,11 +485,7 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev) goto free_channel; } - ret = rwtm_register_debugfs(rwtm); - if (ret < 0) { - dev_err(dev, "Failed creating debugfs entries: %i\n", ret); - goto free_channel; - } + rwtm_register_debugfs(rwtm); dev_info(dev, "HWRNG successfully registered\n"); @@ -529,7 +508,6 @@ static void turris_mox_rwtm_remove(struct platform_device *pdev) { struct mox_rwtm *rwtm = platform_get_drvdata(pdev); - rwtm_unregister_debugfs(rwtm); mbox_free_channel(rwtm->mbox); } From patchwork Thu Jun 13 16:10:38 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marek_Beh=C3=BAn?= X-Patchwork-Id: 13697099 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 smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 97EB4C27C6E for ; Thu, 13 Jun 2024 16:11:16 +0000 (UTC) Received: by smtp.kernel.org (Postfix) id 8A106C4AF1D; Thu, 13 Jun 2024 16:11:16 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 62664C4AF4D; Thu, 13 Jun 2024 16:11:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1718295076; bh=bP6xkK3kiVLTNVMY36qFiS9LEgByfxrnF733kZQYIY4=; h=From:List-Id:To:Cc:Subject:Date:In-Reply-To:References:From; b=ANglOerz1lrjITZz/HSm3TzZ0DcCsbxBJ5mfmwA1K5J20Eqb9B/IqAsruUE9JqhUK YsYvHITjO2+EnGA0s2XHvw3D1gk82SyNCKApMBkvz5+IfhNodKAxW9PKY9WENgWilg +0aAxZIEylK6HPbmYQvQisryZtX24IfvVucT0DUKKIv+R86VpPftYuV+TKglNLSKGZ iMsXaE4VDqlWqjj+LdFGKGcLfL6zV4xeE9ifzxONoaCDqmJSVq4xpZwgfmSrtbYCXu Yr8REmfLkcSe6piJojrmKVpTV/96Z43nZWQSEZhNUuCA+6Jj/5ADU3+9+P0TeMYSit bq6OtUm8ll5iA== From: =?utf-8?q?Marek_Beh=C3=BAn?= List-Id: To: Gregory CLEMENT , Andrew Lunn , Arnd Bergmann , soc@kernel.org, arm@kernel.org, Andy Shevchenko , Hans de Goede , =?utf-8?q?Ilpo_J=C3=A4rvinen?= Cc: =?utf-8?q?Marek_Beh=C3=BAn?= Subject: [PATCH v2 10/17] firmware: turris-mox-rwtm: Convert rest to devm_* and get rid of driver .remove() Date: Thu, 13 Jun 2024 18:10:38 +0200 Message-ID: <20240613161045.29606-11-kabel@kernel.org> X-Mailer: git-send-email 2.44.2 In-Reply-To: <20240613161045.29606-1-kabel@kernel.org> References: <20240613161045.29606-1-kabel@kernel.org> MIME-Version: 1.0 Use devm resource management for driver's mailbox. This allows us to get rid of driver's .remove() method and gotos in .probe(). Signed-off-by: Marek Behún --- drivers/firmware/turris-mox-rwtm.c | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c index a536c9c461a7..3017a8c19005 100644 --- a/drivers/firmware/turris-mox-rwtm.c +++ b/drivers/firmware/turris-mox-rwtm.c @@ -425,6 +425,11 @@ static inline void rwtm_register_debugfs(struct mox_rwtm *rwtm) } #endif +static void rwtm_devm_mbox_release(void *mbox) +{ + mbox_free_channel(mbox); +} + static void rwtm_firmware_symlink_drop(void *) { sysfs_remove_link(firmware_kobj, DRIVER_NAME); @@ -462,6 +467,10 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev) return ret; } + ret = devm_add_action_or_reset(dev, rwtm_devm_mbox_release, rwtm->mbox); + if (ret < 0) + return ret; + init_completion(&rwtm->cmd_done); ret = mox_get_board_info(rwtm); @@ -472,7 +481,7 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev) if (ret < 0) { dev_notice(dev, "Firmware does not support the GET_RANDOM command\n"); - goto free_channel; + return ret; } rwtm->hwrng.name = DRIVER_NAME "_hwrng"; @@ -482,7 +491,7 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev) ret = devm_hwrng_register(dev, &rwtm->hwrng); if (ret < 0) { dev_err(dev, "Cannot register HWRNG: %i\n", ret); - goto free_channel; + return ret; } rwtm_register_debugfs(rwtm); @@ -498,17 +507,6 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev) devm_add_action_or_reset(dev, rwtm_firmware_symlink_drop, NULL); return 0; - -free_channel: - mbox_free_channel(rwtm->mbox); - return ret; -} - -static void turris_mox_rwtm_remove(struct platform_device *pdev) -{ - struct mox_rwtm *rwtm = platform_get_drvdata(pdev); - - mbox_free_channel(rwtm->mbox); } static const struct of_device_id turris_mox_rwtm_match[] = { @@ -521,7 +519,6 @@ MODULE_DEVICE_TABLE(of, turris_mox_rwtm_match); static struct platform_driver turris_mox_rwtm_driver = { .probe = turris_mox_rwtm_probe, - .remove_new = turris_mox_rwtm_remove, .driver = { .name = DRIVER_NAME, .of_match_table = turris_mox_rwtm_match, From patchwork Thu Jun 13 16:10:39 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marek_Beh=C3=BAn?= X-Patchwork-Id: 13697100 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 smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 4E4FDC27C4F for ; Thu, 13 Jun 2024 16:11:19 +0000 (UTC) Received: by smtp.kernel.org (Postfix) id 1AC56C4AF1C; Thu, 13 Jun 2024 16:11:19 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id E7340C32789; Thu, 13 Jun 2024 16:11:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1718295079; bh=MLwvK/C/JclmC0UMosPEx3nJi7odhdUQRtSCpsaanJY=; h=From:List-Id:To:Cc:Subject:Date:In-Reply-To:References:From; b=qLzVDONs2VokIl8UaSreRKS+ySvGuNdZfwdUYQMrUPFI+hqJ4MXcOzGuUXv4NpHBZ rcE+cEy0zXnHYcHGwFt71Y0/XrHjyOmeD5jqHF4ViKFo3lL+WPWY7sYm+qNgY45H6x uH/TT68amg1JiOdg6xj7Z3GtE3MxkrS+rnoNnft4eP2l+37kLEBj7f/eu4waZWDhGD atdHucOtgo481a/bJ0Hxe06llfvpknqncY7sGw30kd52buD+7DlEMY7+mKbRd/nGr+ DkcYNkKChn5dmYtgPxAV2XjZGH5RO0D7WjLdRuO2gDRBMnftowl00Vd3mOKP/mMABp SMcrBIs6dCujA== From: =?utf-8?q?Marek_Beh=C3=BAn?= List-Id: To: Gregory CLEMENT , Andrew Lunn , Arnd Bergmann , soc@kernel.org, arm@kernel.org, Andy Shevchenko , Hans de Goede , =?utf-8?q?Ilpo_J=C3=A4rvinen?= Cc: =?utf-8?q?Marek_Beh=C3=BAn?= Subject: [PATCH v2 11/17] firmware: turris-mox-rwtm: Use dev_err_probe() where possible Date: Thu, 13 Jun 2024 18:10:39 +0200 Message-ID: <20240613161045.29606-12-kabel@kernel.org> X-Mailer: git-send-email 2.44.2 In-Reply-To: <20240613161045.29606-1-kabel@kernel.org> References: <20240613161045.29606-1-kabel@kernel.org> MIME-Version: 1.0 Use dev_err_probe() where possible in the driver's .probe() method. Signed-off-by: Marek Behún --- drivers/firmware/turris-mox-rwtm.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c index 3017a8c19005..81a82b1ef515 100644 --- a/drivers/firmware/turris-mox-rwtm.c +++ b/drivers/firmware/turris-mox-rwtm.c @@ -461,10 +461,11 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev) rwtm->mbox = mbox_request_channel(&rwtm->mbox_client, 0); if (IS_ERR(rwtm->mbox)) { ret = PTR_ERR(rwtm->mbox); - if (ret != -EPROBE_DEFER) - dev_err(dev, "Cannot request mailbox channel: %i\n", - ret); - return ret; + if (ret == -EPROBE_DEFER) + return ret; + + return dev_err_probe(dev, ret, + "Cannot request mailbox channel!\n"); } ret = devm_add_action_or_reset(dev, rwtm_devm_mbox_release, rwtm->mbox); @@ -489,10 +490,8 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev) rwtm->hwrng.priv = (unsigned long) rwtm; ret = devm_hwrng_register(dev, &rwtm->hwrng); - if (ret < 0) { - dev_err(dev, "Cannot register HWRNG: %i\n", ret); - return ret; - } + if (ret < 0) + return dev_err_probe(dev, ret, "Cannot register HWRNG!\n"); rwtm_register_debugfs(rwtm); From patchwork Thu Jun 13 16:10:40 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marek_Beh=C3=BAn?= X-Patchwork-Id: 13697101 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 smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id AD599C41513 for ; Thu, 13 Jun 2024 16:11:21 +0000 (UTC) Received: by smtp.kernel.org (Postfix) id A00A4C32786; Thu, 13 Jun 2024 16:11:21 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 77C28C4AF49; Thu, 13 Jun 2024 16:11:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1718295081; bh=Zwaj3fK3W0vC4aI0OZ43ek2Pcu3wpD5VEZbxj73a0ts=; h=From:List-Id:To:Cc:Subject:Date:In-Reply-To:References:From; b=MrBzZEZn13Hu4TVmwp7Dtd4bQVQ+zPce4eVq+bUoSmSPAPXk3LkEcYa7ZpLgnh4Me Y7ORoiYO7fKX1KId/md5oOTqMO0nabeced/od6/pi4ahhX++f3mstTZgyL/nQe/fEo mi1oO4GjEMAw8qFunqQLnD73kbyi1fvRdgtH3laUaVrk2RM0zQTYGUezHf2YEwr9nG pnOGxqyx8xa+sPTNT0JHDix5Ry6EHvesTDDlSp3AvkMUeLUZIbzZonYCLxzZ/64P50 HO/+rjX6eG6zFk/oj8zzSrCJftB61GJfKsPCXyggpoFNNwpOnTKlmM9PMtlx2N+8dp P3dGNq3b3G1OA== From: =?utf-8?q?Marek_Beh=C3=BAn?= List-Id: To: Gregory CLEMENT , Andrew Lunn , Arnd Bergmann , soc@kernel.org, arm@kernel.org, Andy Shevchenko , Hans de Goede , =?utf-8?q?Ilpo_J=C3=A4rvinen?= Cc: =?utf-8?q?Marek_Beh=C3=BAn?= Subject: [PATCH v2 12/17] firmware: turris-mox-rwtm: Initialize completion before mailbox Date: Thu, 13 Jun 2024 18:10:40 +0200 Message-ID: <20240613161045.29606-13-kabel@kernel.org> X-Mailer: git-send-email 2.44.2 In-Reply-To: <20240613161045.29606-1-kabel@kernel.org> References: <20240613161045.29606-1-kabel@kernel.org> MIME-Version: 1.0 Initialize the completion before the mailbox channel is requested. Signed-off-by: Marek Behún --- drivers/firmware/turris-mox-rwtm.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c index 81a82b1ef515..35c2a899caab 100644 --- a/drivers/firmware/turris-mox-rwtm.c +++ b/drivers/firmware/turris-mox-rwtm.c @@ -454,6 +454,7 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev) platform_set_drvdata(pdev, rwtm); mutex_init(&rwtm->busy); + init_completion(&rwtm->cmd_done); rwtm->mbox_client.dev = dev; rwtm->mbox_client.rx_callback = mox_rwtm_rx_callback; @@ -472,8 +473,6 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev) if (ret < 0) return ret; - init_completion(&rwtm->cmd_done); - ret = mox_get_board_info(rwtm); if (ret < 0) dev_warn(dev, "Cannot read board information: %i\n", ret); From patchwork Thu Jun 13 16:10:41 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marek_Beh=C3=BAn?= X-Patchwork-Id: 13697102 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 smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 41D7EC27C4F for ; Thu, 13 Jun 2024 16:11:24 +0000 (UTC) Received: by smtp.kernel.org (Postfix) id 3161DC32789; Thu, 13 Jun 2024 16:11:24 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 09418C2BBFC; Thu, 13 Jun 2024 16:11:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1718295084; bh=55GghQejX7nb7g6k/8wT9vG0nONR5JYBKQRC3HvgmJY=; h=From:List-Id:To:Cc:Subject:Date:In-Reply-To:References:From; b=ZYrf1ro4fIumOK3z5EpxQ8yr8bFyVWvnhoc50qCZHL0BhcVK+4h8VofDZJNGKJNlY f3VtWCHummIIW3rdnWjHHjeBpCLK5LsggXaU71zDCCQL2+8Z1vpsupJ9WuH5RAr3qA Vw+rmgg42bQTSDAbQ8GqqfBqeQYbajCK7y6c1v3Vv7Oy6SJpcvlJuRNIRKXXyDJA/1 yNWmehTu37jxrts8L6XDHfF439hIJVe+2XhydzsVkvbcqRzvjGLqbYD48dfq1YUcdI 8TfI8FyoRjDoAcZOQacevdPprJlLEvVkTmhDUmy80xeaJIXOkGR6kYcRsfXk5fiDBC N7DcrjCBRuV3A== From: =?utf-8?q?Marek_Beh=C3=BAn?= List-Id: To: Gregory CLEMENT , Andrew Lunn , Arnd Bergmann , soc@kernel.org, arm@kernel.org, Andy Shevchenko , Hans de Goede , =?utf-8?q?Ilpo_J=C3=A4rvinen?= Cc: =?utf-8?q?Marek_Beh=C3=BAn?= Subject: [PATCH v2 13/17] firmware: turris-mox-rwtm: Drop redundant device pointer Date: Thu, 13 Jun 2024 18:10:41 +0200 Message-ID: <20240613161045.29606-14-kabel@kernel.org> X-Mailer: git-send-email 2.44.2 In-Reply-To: <20240613161045.29606-1-kabel@kernel.org> References: <20240613161045.29606-1-kabel@kernel.org> MIME-Version: 1.0 Drop redundant device pointer from driver's private structure. Signed-off-by: Marek Behún --- drivers/firmware/turris-mox-rwtm.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c index 35c2a899caab..e1142083186c 100644 --- a/drivers/firmware/turris-mox-rwtm.c +++ b/drivers/firmware/turris-mox-rwtm.c @@ -60,7 +60,6 @@ enum mbox_cmd { }; struct mox_rwtm { - struct device *dev; struct mbox_client mbox_client; struct mbox_chan *mbox; struct hwrng hwrng; @@ -95,6 +94,11 @@ struct mox_rwtm { #endif }; +static inline struct device *rwtm_dev(struct mox_rwtm *rwtm) +{ + return rwtm->mbox_client.dev; +} + #define MOX_ATTR_RO(name, format, cat) \ static ssize_t \ name##_show(struct device *dev, struct device_attribute *a, \ @@ -163,6 +167,7 @@ static void reply_to_mac_addr(u8 *mac, u32 t1, u32 t2) static int mox_get_board_info(struct mox_rwtm *rwtm) { + struct device *dev = rwtm_dev(rwtm); struct armada_37xx_rwtm_tx_msg msg; struct armada_37xx_rwtm_rx_msg *reply = &rwtm->reply; int ret; @@ -177,10 +182,10 @@ static int mox_get_board_info(struct mox_rwtm *rwtm) ret = mox_get_status(MBOX_CMD_BOARD_INFO, reply->retval); if (ret == -ENODATA) { - dev_warn(rwtm->dev, + dev_warn(dev, "Board does not have manufacturing information burned!\n"); } else if (ret == -ENOSYS) { - dev_notice(rwtm->dev, + dev_notice(dev, "Firmware does not support the BOARD_INFO command\n"); } else if (ret < 0) { return ret; @@ -212,9 +217,9 @@ static int mox_get_board_info(struct mox_rwtm *rwtm) ret = mox_get_status(MBOX_CMD_ECDSA_PUB_KEY, reply->retval); if (ret == -ENODATA) { - dev_warn(rwtm->dev, "Board has no public key burned!\n"); + dev_warn(dev, "Board has no public key burned!\n"); } else if (ret == -ENOSYS) { - dev_notice(rwtm->dev, + dev_notice(dev, "Firmware does not support the ECDSA_PUB_KEY command\n"); } else if (ret < 0) { return ret; @@ -415,7 +420,7 @@ static void rwtm_register_debugfs(struct mox_rwtm *rwtm) root = debugfs_create_dir("turris-mox-rwtm", NULL); - devm_add_action_or_reset(rwtm->dev, rwtm_debugfs_release, root); + devm_add_action_or_reset(rwtm_dev(rwtm), rwtm_debugfs_release, root); debugfs_create_file_unsafe("do_sign", 0600, root, rwtm, &do_sign_fops); } @@ -445,7 +450,6 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev) if (!rwtm) return -ENOMEM; - rwtm->dev = dev; rwtm->buf = dmam_alloc_coherent(dev, RWTM_DMA_BUFFER_SIZE, &rwtm->buf_phys, GFP_KERNEL); if (!rwtm->buf) From patchwork Thu Jun 13 16:10:42 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marek_Beh=C3=BAn?= X-Patchwork-Id: 13697103 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 smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id CC9DAC27C6E for ; Thu, 13 Jun 2024 16:11:26 +0000 (UTC) Received: by smtp.kernel.org (Postfix) id C0040C32786; Thu, 13 Jun 2024 16:11:26 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8E698C4AF1C; Thu, 13 Jun 2024 16:11:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1718295086; bh=QEGoB8CzMe7NS8dh1+fRNJrdwOf+prPSvjUFmajjOjA=; h=From:List-Id:To:Cc:Subject:Date:In-Reply-To:References:From; b=EJAKQ/Xh/mAYNdb07SzPBnOdcK7FDqBB7oHunfTer4em85RqlN09cUiSF05F433xw DistD0NzeKbFdW3ktg7kswVbvkUOHK3OcmNifvO2KXGB5sRqa63nELbis5BiDHoiU+ 3fG03Poz5wFO7KQSbTI8rrMnTM5yuEQ6knYKWuplCjFiptEycxjMBQMpZhCARUQpbV gkc+Ejtc7MxsQrEmCOJ3k4s1zXUH5nXPFK3W0YEN1qRDbUkZJwFgjU6R0dWxcB3n19 zJiR3KEBpIWE6TFr6GxDy2iOdUmxZC1CGujQnj+zxbHFEw5bG0KK8K471ecx2CZlYy RgS5PMBjGPe8Q== From: =?utf-8?q?Marek_Beh=C3=BAn?= List-Id: To: Gregory CLEMENT , Andrew Lunn , Arnd Bergmann , soc@kernel.org, arm@kernel.org, Andy Shevchenko , Hans de Goede , =?utf-8?q?Ilpo_J=C3=A4rvinen?= Cc: =?utf-8?q?Marek_Beh=C3=BAn?= Subject: [PATCH v2 14/17] firmware: turris-mox-rwtm: Use devm_mutex_init() instead of mutex_init() Date: Thu, 13 Jun 2024 18:10:42 +0200 Message-ID: <20240613161045.29606-15-kabel@kernel.org> X-Mailer: git-send-email 2.44.2 In-Reply-To: <20240613161045.29606-1-kabel@kernel.org> References: <20240613161045.29606-1-kabel@kernel.org> MIME-Version: 1.0 Use devm_mutex_init() instead of mutex_init(), to properly call mutex_destroy() on probe failure / driver unbind. Signed-off-by: Marek Behún --- drivers/firmware/turris-mox-rwtm.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c index e1142083186c..a9a3a189ea47 100644 --- a/drivers/firmware/turris-mox-rwtm.c +++ b/drivers/firmware/turris-mox-rwtm.c @@ -457,7 +457,10 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev) platform_set_drvdata(pdev, rwtm); - mutex_init(&rwtm->busy); + ret = devm_mutex_init(dev, &rwtm->busy); + if (ret < 0) + return ret; + init_completion(&rwtm->cmd_done); rwtm->mbox_client.dev = dev; From patchwork Thu Jun 13 16:10:43 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marek_Beh=C3=BAn?= X-Patchwork-Id: 13697104 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 smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 5F528C27C4F for ; Thu, 13 Jun 2024 16:11:29 +0000 (UTC) Received: by smtp.kernel.org (Postfix) id 51700C2BBFC; Thu, 13 Jun 2024 16:11:29 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 298B4C32789; Thu, 13 Jun 2024 16:11:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1718295089; bh=mH1F/suc/waIrIyGrYdyRdS7WMaQZnGhIjfiC/hOZRQ=; h=From:List-Id:To:Cc:Subject:Date:In-Reply-To:References:From; b=ouFb2KUu318ZvhlylFHxsDCJR5FvMdCJvjIL0Ca9QmmciM8SfyMq8NOY29g1Z2YhE VC6nBRETmed/jEagT77R+D5LSQz9spB+fJGn6xPVKt58CSvCsu9yZzPqEkEKpRRWoN sntYhBl7R0oYfSj4ufhi9Dq1gV3g+L5VLkoJKXFGRRMHsp/qCNTKs4yDrkFxoSNYIt ipSS6vXYb0jicFHxVKsj9RiYPTTjDqoUh4QJ5g5cDdAL42Ep3aa0wT+ffXdKKa7H2y VOBHWxXfbWgm4GhGpaQ8Rf6oqVWDlpDFcZRWOhlZWU8Cw/btsX2r5mpXVk0P/IUsqC 4IXfhNi/mzKZQ== From: =?utf-8?q?Marek_Beh=C3=BAn?= List-Id: To: Gregory CLEMENT , Andrew Lunn , Arnd Bergmann , soc@kernel.org, arm@kernel.org, Andy Shevchenko , Hans de Goede , =?utf-8?q?Ilpo_J=C3=A4rvinen?= Cc: =?utf-8?q?Marek_Beh=C3=BAn?= Subject: [PATCH v2 15/17] firmware: turris-mox-rwtm: Use container_of() instead of hwrng .priv member Date: Thu, 13 Jun 2024 18:10:43 +0200 Message-ID: <20240613161045.29606-16-kabel@kernel.org> X-Mailer: git-send-email 2.44.2 In-Reply-To: <20240613161045.29606-1-kabel@kernel.org> References: <20240613161045.29606-1-kabel@kernel.org> MIME-Version: 1.0 Use container_of() to get driver private structure from hwnrg structure, instead of the hwrng's .priv member, as suggested by Herbert for another driver [1]. [1] https://lore.kernel.org/soc/ZmLhQBdmg613KdET@gondor.apana.org.au/ Signed-off-by: Marek Behún --- drivers/firmware/turris-mox-rwtm.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c index a9a3a189ea47..4c445f6b8140 100644 --- a/drivers/firmware/turris-mox-rwtm.c +++ b/drivers/firmware/turris-mox-rwtm.c @@ -258,7 +258,7 @@ static int check_get_random_support(struct mox_rwtm *rwtm) static int mox_hwrng_read(struct hwrng *rng, void *data, size_t max, bool wait) { - struct mox_rwtm *rwtm = (struct mox_rwtm *) rng->priv; + struct mox_rwtm *rwtm = container_of(rng, struct mox_rwtm, hwrng); struct armada_37xx_rwtm_tx_msg msg; int ret; @@ -493,7 +493,6 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev) rwtm->hwrng.name = DRIVER_NAME "_hwrng"; rwtm->hwrng.read = mox_hwrng_read; - rwtm->hwrng.priv = (unsigned long) rwtm; ret = devm_hwrng_register(dev, &rwtm->hwrng); if (ret < 0) From patchwork Thu Jun 13 16:10:44 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marek_Beh=C3=BAn?= X-Patchwork-Id: 13697105 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 smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id E3E2EC27C4F for ; Thu, 13 Jun 2024 16:11:31 +0000 (UTC) Received: by smtp.kernel.org (Postfix) id D6379C4AF1C; Thu, 13 Jun 2024 16:11:31 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id AEABDC2BBFC; Thu, 13 Jun 2024 16:11:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1718295091; bh=Df/Dkob1b0VVO8dg7dYO2hLQ98+FMH0QNMv3Kp2BTEI=; h=From:List-Id:To:Cc:Subject:Date:In-Reply-To:References:From; b=fKcn7nzBMaM1tbwlkXLF7h+cCPQuwgPi3zn0U+1y6rEJ8Z3XvmoPwUd0c9VHYpeh4 jvPdjNM0MoMYgeYLM30iGvjdax7o3BxclRtKEXK067QF+Ady34Hvz7Wz57jbGlmlS5 kqddJU0x3XjU+zHPBNxianQNUkIj5kovHbQuNbHjjUVb5xJQPOHKicebx3hZ4EAGDl IBr4iko1bLfJaIF/pHGvUVdRuaGNwp98kvgY0euBUwCsFj2vvT3uyhnk7jjRdaDU1V zqOaKfdkpy6xz92t4bd+nCiTezrCOZglC8MiIvSHPoR2vd0xgBo9LGmfCk4fA1h1/S rVKJ3LAXA/zOg== From: =?utf-8?q?Marek_Beh=C3=BAn?= List-Id: To: Gregory CLEMENT , Andrew Lunn , Arnd Bergmann , soc@kernel.org, arm@kernel.org, Andy Shevchenko , Hans de Goede , =?utf-8?q?Ilpo_J=C3=A4rvinen?= Cc: =?utf-8?q?Marek_Beh=C3=BAn?= Subject: [PATCH v2 16/17] firmware: turris-mox-rwtm: Use EOPNOTSUPP instead of ENOSYS Date: Thu, 13 Jun 2024 18:10:44 +0200 Message-ID: <20240613161045.29606-17-kabel@kernel.org> X-Mailer: git-send-email 2.44.2 In-Reply-To: <20240613161045.29606-1-kabel@kernel.org> References: <20240613161045.29606-1-kabel@kernel.org> MIME-Version: 1.0 Checkpatch warns agains -ENOSYS: WARNING: ENOSYS means 'invalid syscall nr' and nothing else Use EOPNOTSUPP instead. Signed-off-by: Marek Behún --- drivers/firmware/turris-mox-rwtm.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c index 4c445f6b8140..2ea378fec414 100644 --- a/drivers/firmware/turris-mox-rwtm.c +++ b/drivers/firmware/turris-mox-rwtm.c @@ -136,7 +136,7 @@ static int mox_get_status(enum mbox_cmd cmd, u32 retval) else if (MBOX_STS_ERROR(retval) == MBOX_STS_FAIL) return -(int)MBOX_STS_VALUE(retval); else if (MBOX_STS_ERROR(retval) == MBOX_STS_BADCMD) - return -ENOSYS; + return -EOPNOTSUPP; else if (MBOX_STS_ERROR(retval) != MBOX_STS_SUCCESS) return -EIO; else @@ -184,7 +184,7 @@ static int mox_get_board_info(struct mox_rwtm *rwtm) if (ret == -ENODATA) { dev_warn(dev, "Board does not have manufacturing information burned!\n"); - } else if (ret == -ENOSYS) { + } else if (ret == -EOPNOTSUPP) { dev_notice(dev, "Firmware does not support the BOARD_INFO command\n"); } else if (ret < 0) { @@ -218,7 +218,7 @@ static int mox_get_board_info(struct mox_rwtm *rwtm) ret = mox_get_status(MBOX_CMD_ECDSA_PUB_KEY, reply->retval); if (ret == -ENODATA) { dev_warn(dev, "Board has no public key burned!\n"); - } else if (ret == -ENOSYS) { + } else if (ret == -EOPNOTSUPP) { dev_notice(dev, "Firmware does not support the ECDSA_PUB_KEY command\n"); } else if (ret < 0) { From patchwork Thu Jun 13 16:10:45 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marek_Beh=C3=BAn?= X-Patchwork-Id: 13697106 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 smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 75020C27C4F for ; Thu, 13 Jun 2024 16:11:34 +0000 (UTC) Received: by smtp.kernel.org (Postfix) id 6752BC32786; Thu, 13 Jun 2024 16:11:34 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3FC83C4AF1D; Thu, 13 Jun 2024 16:11:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1718295094; bh=Ww3HGnKCM86jdzMNBVsrT6ByEqZ6pgam5Qc83CSDQFM=; h=From:List-Id:To:Cc:Subject:Date:In-Reply-To:References:From; b=sWKd3jkpyMbEwabAfiZmaXVeT3Z9hrelQ7eXVn+sJ29HNZ9+uIB3kyb9dDNqbT0aV 0uMkUO1kpuqKjXTn/sxz/BedpQ0ArhS0Wgjmeb8HN646hDYVe0maTbqHCI1DoNxvOQ JPacfBxk6Ez+9UbaT3FfL/cuDBEAXnQxgIRdEqMJjw8gUGwZdbGfIx8oJqNpOfXLfi lCiNRTDvLDBoiunYL4Z4+HQYUBLjR1eKX6dVx1dqj3mvReGoqYn9Muxa3jLzN3VzcD IdxLOnJ/gprFs7fhlwL4isnV9WK7PVWr13yjRUhsCKJkxZ6S7r/t/aTiBf/cYjVUTx cdGQu20mymnWg== From: =?utf-8?q?Marek_Beh=C3=BAn?= List-Id: To: Gregory CLEMENT , Andrew Lunn , Arnd Bergmann , soc@kernel.org, arm@kernel.org, Andy Shevchenko , Hans de Goede , =?utf-8?q?Ilpo_J=C3=A4rvinen?= Cc: =?utf-8?q?Marek_Beh=C3=BAn?= Subject: [PATCH v2 17/17] firmware: turris-mox-rwtm: Deduplicate command execution code Date: Thu, 13 Jun 2024 18:10:45 +0200 Message-ID: <20240613161045.29606-18-kabel@kernel.org> X-Mailer: git-send-email 2.44.2 In-Reply-To: <20240613161045.29606-1-kabel@kernel.org> References: <20240613161045.29606-1-kabel@kernel.org> MIME-Version: 1.0 Deduplicate rWTM command execution calls mbox_send_message() wait_for_completion() mox_get_status() to one function mox_rwtm_exec() Signed-off-by: Marek Behún --- drivers/firmware/turris-mox-rwtm.c | 98 ++++++++++++------------------ 1 file changed, 39 insertions(+), 59 deletions(-) diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c index 2ea378fec414..f4b56269f507 100644 --- a/drivers/firmware/turris-mox-rwtm.c +++ b/drivers/firmware/turris-mox-rwtm.c @@ -155,6 +155,34 @@ static void mox_rwtm_rx_callback(struct mbox_client *cl, void *data) complete(&rwtm->cmd_done); } +static int mox_rwtm_exec(struct mox_rwtm *rwtm, enum mbox_cmd cmd, + struct armada_37xx_rwtm_tx_msg *msg, + bool interruptible) +{ + struct armada_37xx_rwtm_tx_msg _msg = {}; + int ret; + + if (!msg) + msg = &_msg; + + msg->command = cmd; + + ret = mbox_send_message(rwtm->mbox, msg); + if (ret < 0) + return ret; + + if (interruptible) { + ret = wait_for_completion_interruptible(&rwtm->cmd_done); + if (ret < 0) + return ret; + } else { + if (!wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2)) + return -ETIMEDOUT; + } + + return mox_get_status(cmd, rwtm->reply.retval); +} + static void reply_to_mac_addr(u8 *mac, u32 t1, u32 t2) { mac[0] = t1 >> 8; @@ -168,19 +196,10 @@ static void reply_to_mac_addr(u8 *mac, u32 t1, u32 t2) static int mox_get_board_info(struct mox_rwtm *rwtm) { struct device *dev = rwtm_dev(rwtm); - struct armada_37xx_rwtm_tx_msg msg; struct armada_37xx_rwtm_rx_msg *reply = &rwtm->reply; int ret; - msg.command = MBOX_CMD_BOARD_INFO; - ret = mbox_send_message(rwtm->mbox, &msg); - if (ret < 0) - return ret; - - if (!wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2)) - return -ETIMEDOUT; - - ret = mox_get_status(MBOX_CMD_BOARD_INFO, reply->retval); + ret = mox_rwtm_exec(rwtm, MBOX_CMD_BOARD_INFO, NULL, false); if (ret == -ENODATA) { dev_warn(dev, "Board does not have manufacturing information burned!\n"); @@ -207,15 +226,7 @@ static int mox_get_board_info(struct mox_rwtm *rwtm) pr_info(" burned RAM size %i MiB\n", rwtm->ram_size); } - msg.command = MBOX_CMD_ECDSA_PUB_KEY; - ret = mbox_send_message(rwtm->mbox, &msg); - if (ret < 0) - return ret; - - if (!wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2)) - return -ETIMEDOUT; - - ret = mox_get_status(MBOX_CMD_ECDSA_PUB_KEY, reply->retval); + ret = mox_rwtm_exec(rwtm, MBOX_CMD_ECDSA_PUB_KEY, NULL, false); if (ret == -ENODATA) { dev_warn(dev, "Board has no public key burned!\n"); } else if (ret == -EOPNOTSUPP) { @@ -238,38 +249,24 @@ static int mox_get_board_info(struct mox_rwtm *rwtm) static int check_get_random_support(struct mox_rwtm *rwtm) { - struct armada_37xx_rwtm_tx_msg msg; - int ret; - - msg.command = MBOX_CMD_GET_RANDOM; - msg.args[0] = 1; - msg.args[1] = rwtm->buf_phys; - msg.args[2] = 4; - - ret = mbox_send_message(rwtm->mbox, &msg); - if (ret < 0) - return ret; - - if (!wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2)) - return -ETIMEDOUT; + struct armada_37xx_rwtm_tx_msg msg = { + .args = { 1, rwtm->buf_phys, 4 }, + }; - return mox_get_status(MBOX_CMD_GET_RANDOM, rwtm->reply.retval); + return mox_rwtm_exec(rwtm, MBOX_CMD_GET_RANDOM, &msg, false); } static int mox_hwrng_read(struct hwrng *rng, void *data, size_t max, bool wait) { struct mox_rwtm *rwtm = container_of(rng, struct mox_rwtm, hwrng); - struct armada_37xx_rwtm_tx_msg msg; + struct armada_37xx_rwtm_tx_msg msg = { + .args = { 1, rwtm->buf_phys, (max + 3) & ~3 }, + }; int ret; if (max > RWTM_DMA_BUFFER_SIZE) max = RWTM_DMA_BUFFER_SIZE; - msg.command = MBOX_CMD_GET_RANDOM; - msg.args[0] = 1; - msg.args[1] = rwtm->buf_phys; - msg.args[2] = (max + 3) & ~3; - if (!wait) { if (!mutex_trylock(&rwtm->busy)) return -EBUSY; @@ -277,15 +274,7 @@ static int mox_hwrng_read(struct hwrng *rng, void *data, size_t max, bool wait) mutex_lock(&rwtm->busy); } - ret = mbox_send_message(rwtm->mbox, &msg); - if (ret < 0) - goto unlock_mutex; - - ret = wait_for_completion_interruptible(&rwtm->cmd_done); - if (ret < 0) - goto unlock_mutex; - - ret = mox_get_status(MBOX_CMD_GET_RANDOM, rwtm->reply.retval); + ret = mox_rwtm_exec(rwtm, MBOX_CMD_GET_RANDOM, &msg, true); if (ret < 0) goto unlock_mutex; @@ -333,7 +322,6 @@ static ssize_t do_sign_write(struct file *file, const char __user *buf, size_t len, loff_t *ppos) { struct mox_rwtm *rwtm = file->private_data; - struct armada_37xx_rwtm_rx_msg *reply = &rwtm->reply; struct armada_37xx_rwtm_tx_msg msg; loff_t dummy = 0; ssize_t ret; @@ -366,23 +354,15 @@ static ssize_t do_sign_write(struct file *file, const char __user *buf, goto unlock_mutex; be32_to_cpu_array(rwtm->buf, rwtm->buf, MOX_ECC_NUMBER_WORDS); - msg.command = MBOX_CMD_SIGN; msg.args[0] = 1; msg.args[1] = rwtm->buf_phys; msg.args[2] = rwtm->buf_phys + MOX_ECC_NUMBER_LEN; msg.args[3] = rwtm->buf_phys + 2 * MOX_ECC_NUMBER_LEN; - ret = mbox_send_message(rwtm->mbox, &msg); - if (ret < 0) - goto unlock_mutex; - ret = wait_for_completion_interruptible(&rwtm->cmd_done); + ret = mox_rwtm_exec(rwtm, MBOX_CMD_SIGN, &msg, true); if (ret < 0) goto unlock_mutex; - ret = MBOX_STS_VALUE(reply->retval); - if (MBOX_STS_ERROR(reply->retval) != MBOX_STS_SUCCESS) - goto unlock_mutex; - /* * Here we read the R and S values of the ECDSA signature * computed by the rWTM firmware and convert their words from