Linux SOC development
 help / color / mirror / Atom feed
* [PATCH v4 00/19] Updates for turris-mox-rwtm driver
@ 2024-07-15 10:47 Marek Behún
  2024-07-15 10:47 ` [PATCH v4 01/19] firmware: turris-mox-rwtm: Do not complete if there are no waiters Marek Behún
                   ` (20 more replies)
  0 siblings, 21 replies; 22+ messages in thread
From: Marek Behún @ 2024-07-15 10:47 UTC (permalink / raw)
  To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
	Andy Shevchenko, Hans de Goede, Ilpo Järvinen
  Cc: Marek Behún

Hi Arnd, Andy, Gregory et al.

this is v4 of series of fixes, refactors and cleanups for the
turris-mox-rwtm driver.

Changes since v3:
- addressed Andy's recommendations. Some of them resulted in 2 new
  patches (08/19 and 18/19). Im patch 10/19 I did not address Andy's
  comment
    "Actually you may do that without devm. There is a lookup method
     or so in debugfs APIs that can be used. Can be amended later on,
     though."
  since I do not see how to use the debugfs_lookup_and_remove()
  function without devm and get rid of the driver's .remove() method
  at the same time...

v1 - v3 can be found at:
  https://patchwork.kernel.org/project/linux-soc/list/?series=861215
  https://patchwork.kernel.org/project/linux-soc/list/?series=861716
  https://patchwork.kernel.org/project/linux-soc/list/?series=862643

Marek Behún (19):
  firmware: turris-mox-rwtm: Do not complete if there are no waiters
  firmware: turris-mox-rwtm: Fix checking return value of
    wait_for_completion_timeout()
  firmware: turris-mox-rwtm: Use macro constant instead of hardcoded
    4096
  firmware: turris-mox-rwtm: Use ETH_ALEN instead of hardcoded 6
  firmware: turris-mox-rwtm: Use the boolean type where appropriate
  firmware: turris-mox-rwtm: Hide signature related constants behind
    macros
  firmware: turris-mox-rwtm: Fix driver includes
  firmware: turris-mox-rwtm: Use sysfs_emit() instead of sprintf()
  firmware: turris-mox-rwtm: Don't create own kobject type
  firmware: turris-mox-rwtm: Simplify debugfs code
  firmware: turris-mox-rwtm: Convert rest to devm_* and get rid of
    driver .remove()
  firmware: turris-mox-rwtm: Use dev_err_probe() where possible
  firmware: turris-mox-rwtm: Initialize completion before mailbox
  firmware: turris-mox-rwtm: Drop redundant device pointer
  firmware: turris-mox-rwtm: Use devm_mutex_init() instead of
    mutex_init()
  firmware: turris-mox-rwtm: Use container_of() instead of hwrng .priv
    member
  firmware: turris-mox-rwtm: Use EOPNOTSUPP instead of ENOSYS
  firmware: turris-mox-rwtm: Use ALIGN() instead of hardcoding
  firmware: turris-mox-rwtm: Deduplicate command execution code

 drivers/firmware/turris-mox-rwtm.c | 389 ++++++++++++-----------------
 1 file changed, 157 insertions(+), 232 deletions(-)

-- 
2.44.2


^ permalink raw reply	[flat|nested] 22+ messages in thread

* [PATCH v4 01/19] firmware: turris-mox-rwtm: Do not complete if there are no waiters
  2024-07-15 10:47 [PATCH v4 00/19] Updates for turris-mox-rwtm driver Marek Behún
@ 2024-07-15 10:47 ` Marek Behún
  2024-07-15 10:47 ` [PATCH v4 02/19] firmware: turris-mox-rwtm: Fix checking return value of wait_for_completion_timeout() Marek Behún
                   ` (19 subsequent siblings)
  20 siblings, 0 replies; 22+ messages in thread
From: Marek Behún @ 2024-07-15 10:47 UTC (permalink / raw)
  To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
	Andy Shevchenko, Hans de Goede, Ilpo Järvinen
  Cc: Marek Behún

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 <kabel@kernel.org>
Reviewed-by: Andy Shevchenko <andy@kernel.org>
---
 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 <kabel@kernel.org>
+ * Copyright (C) 2019, 2024 Marek Behún <kabel@kernel.org>
  */
 
 #include <linux/armada-37xx-rwtm-mailbox.h>
@@ -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);
 }
-- 
2.44.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v4 02/19] firmware: turris-mox-rwtm: Fix checking return value of wait_for_completion_timeout()
  2024-07-15 10:47 [PATCH v4 00/19] Updates for turris-mox-rwtm driver Marek Behún
  2024-07-15 10:47 ` [PATCH v4 01/19] firmware: turris-mox-rwtm: Do not complete if there are no waiters Marek Behún
@ 2024-07-15 10:47 ` Marek Behún
  2024-07-15 10:47 ` [PATCH v4 03/19] firmware: turris-mox-rwtm: Use macro constant instead of hardcoded 4096 Marek Behún
                   ` (18 subsequent siblings)
  20 siblings, 0 replies; 22+ messages in thread
From: Marek Behún @ 2024-07-15 10:47 UTC (permalink / raw)
  To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
	Andy Shevchenko, Hans de Goede, Ilpo Järvinen
  Cc: Marek Behún

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 <kabel@kernel.org>
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Reviewed-by: Andy Shevchenko <andy@kernel.org>
---
 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);
 }
-- 
2.44.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v4 03/19] firmware: turris-mox-rwtm: Use macro constant instead of hardcoded 4096
  2024-07-15 10:47 [PATCH v4 00/19] Updates for turris-mox-rwtm driver Marek Behún
  2024-07-15 10:47 ` [PATCH v4 01/19] firmware: turris-mox-rwtm: Do not complete if there are no waiters Marek Behún
  2024-07-15 10:47 ` [PATCH v4 02/19] firmware: turris-mox-rwtm: Fix checking return value of wait_for_completion_timeout() Marek Behún
@ 2024-07-15 10:47 ` Marek Behún
  2024-07-15 10:47 ` [PATCH v4 04/19] firmware: turris-mox-rwtm: Use ETH_ALEN instead of hardcoded 6 Marek Behún
                   ` (17 subsequent siblings)
  20 siblings, 0 replies; 22+ messages in thread
From: Marek Behún @ 2024-07-15 10:47 UTC (permalink / raw)
  To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
	Andy Shevchenko, Hans de Goede, Ilpo Järvinen
  Cc: Marek Behún

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().

Use SZ_4K instead of PAGE_SIZE. Although PAGE_SIZE is never set to a
larger value on Armada 3720, it theoretically could, and this would be a
waste of space.

Signed-off-by: Marek Behún <kabel@kernel.org>
Reviewed-by: Andy Shevchenko <andy@kernel.org>
---
 drivers/firmware/turris-mox-rwtm.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
index 3f4758e03c81..aafd747543f6 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -11,14 +11,18 @@
 #include <linux/dma-mapping.h>
 #include <linux/hw_random.h>
 #include <linux/mailbox_client.h>
+#include <linux/minmax.h>
 #include <linux/module.h>
 #include <linux/mutex.h>
 #include <linux/of.h>
 #include <linux/platform_device.h>
+#include <linux/sizes.h>
 #include <linux/slab.h>
 
 #define DRIVER_NAME		"turris-mox-rwtm"
 
+#define RWTM_DMA_BUFFER_SIZE	SZ_4K
+
 /*
  * 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 +291,7 @@ 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;
+	max = min(max, RWTM_DMA_BUFFER_SIZE);
 
 	msg.command = MBOX_CMD_GET_RANDOM;
 	msg.args[0] = 1;
@@ -479,8 +482,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;
 
-- 
2.44.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v4 04/19] firmware: turris-mox-rwtm: Use ETH_ALEN instead of hardcoded 6
  2024-07-15 10:47 [PATCH v4 00/19] Updates for turris-mox-rwtm driver Marek Behún
                   ` (2 preceding siblings ...)
  2024-07-15 10:47 ` [PATCH v4 03/19] firmware: turris-mox-rwtm: Use macro constant instead of hardcoded 4096 Marek Behún
@ 2024-07-15 10:47 ` Marek Behún
  2024-07-15 10:47 ` [PATCH v4 05/19] firmware: turris-mox-rwtm: Use the boolean type where appropriate Marek Behún
                   ` (16 subsequent siblings)
  20 siblings, 0 replies; 22+ messages in thread
From: Marek Behún @ 2024-07-15 10:47 UTC (permalink / raw)
  To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
	Andy Shevchenko, Hans de Goede, Ilpo Järvinen
  Cc: Marek Behún

Use the ETH_ALEN macro instead of hardcoded 6 for MAC address length.

Signed-off-by: Marek Behún <kabel@kernel.org>
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Reviewed-by: Andy Shevchenko <andy@kernel.org>
---
 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 aafd747543f6..f7f9859b8f61 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -10,6 +10,7 @@
 #include <linux/debugfs.h>
 #include <linux/dma-mapping.h>
 #include <linux/hw_random.h>
+#include <linux/if_ether.h>
 #include <linux/mailbox_client.h>
 #include <linux/minmax.h>
 #include <linux/module.h>
@@ -69,7 +70,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;
-- 
2.44.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v4 05/19] firmware: turris-mox-rwtm: Use the boolean type where appropriate
  2024-07-15 10:47 [PATCH v4 00/19] Updates for turris-mox-rwtm driver Marek Behún
                   ` (3 preceding siblings ...)
  2024-07-15 10:47 ` [PATCH v4 04/19] firmware: turris-mox-rwtm: Use ETH_ALEN instead of hardcoded 6 Marek Behún
@ 2024-07-15 10:47 ` Marek Behún
  2024-07-15 10:47 ` [PATCH v4 06/19] firmware: turris-mox-rwtm: Hide signature related constants behind macros Marek Behún
                   ` (15 subsequent siblings)
  20 siblings, 0 replies; 22+ messages in thread
From: Marek Behún @ 2024-07-15 10:47 UTC (permalink / raw)
  To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
	Andy Shevchenko, Hans de Goede, Ilpo Järvinen
  Cc: Marek Behún

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 <kabel@kernel.org>
Reviewed-by: Andy Shevchenko <andy@kernel.org>
---
 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 f7f9859b8f61..5ed480ac5146 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -19,6 +19,7 @@
 #include <linux/platform_device.h>
 #include <linux/sizes.h>
 #include <linux/slab.h>
+#include <linux/types.h>
 
 #define DRIVER_NAME		"turris-mox-rwtm"
 
@@ -67,13 +68,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
@@ -85,7 +86,7 @@ struct mox_rwtm {
 	 */
 	struct dentry *debugfs_root;
 	u32 last_sig[34];
-	int last_sig_done;
+	bool last_sig_done;
 #endif
 };
 
@@ -229,7 +230,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);
@@ -256,7 +257,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],
@@ -352,7 +353,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;
 }
@@ -418,7 +419,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;
-- 
2.44.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v4 06/19] firmware: turris-mox-rwtm: Hide signature related constants behind macros
  2024-07-15 10:47 [PATCH v4 00/19] Updates for turris-mox-rwtm driver Marek Behún
                   ` (4 preceding siblings ...)
  2024-07-15 10:47 ` [PATCH v4 05/19] firmware: turris-mox-rwtm: Use the boolean type where appropriate Marek Behún
@ 2024-07-15 10:47 ` Marek Behún
  2024-07-15 10:47 ` [PATCH v4 07/19] firmware: turris-mox-rwtm: Fix driver includes Marek Behún
                   ` (14 subsequent siblings)
  20 siblings, 0 replies; 22+ messages in thread
From: Marek Behún @ 2024-07-15 10:47 UTC (permalink / raw)
  To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
	Andy Shevchenko, Hans de Goede, Ilpo Järvinen
  Cc: Marek Behún

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 <kabel@kernel.org>
Reviewed-by: Andy Shevchenko <andy@kernel.org>
---
 drivers/firmware/turris-mox-rwtm.c | 36 ++++++++++++++++++------------
 1 file changed, 22 insertions(+), 14 deletions(-)

diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
index 5ed480ac5146..0ae5b2086113 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 <kabel@kernel.org>
  */
 
+#include <crypto/sha2.h>
 #include <linux/armada-37xx-rwtm-mailbox.h>
 #include <linux/completion.h>
 #include <linux/debugfs.h>
@@ -31,6 +32,11 @@
  * 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 MBOX_STS_SUCCESS	(0 << 30)
 #define MBOX_STS_FAIL		(1 << 30)
 #define MBOX_STS_BADCMD		(2 << 30)
@@ -85,7 +91,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
 };
@@ -341,18 +347,18 @@ static ssize_t do_sign_read(struct file *file, char __user *buf, size_t len,
 	struct mox_rwtm *rwtm = file->private_data;
 	ssize_t ret;
 
-	/* only allow one read, of 136 bytes, from position 0 */
+	/* only allow one read, of whole signature, from position 0 */
 	if (*ppos != 0)
 		return 0;
 
-	if (len < 136)
+	if (len < sizeof(rwtm->last_sig))
 		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,
+				      sizeof(rwtm->last_sig));
 	rwtm->last_sig_done = false;
 
 	return ret;
@@ -367,8 +373,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 */
@@ -389,17 +394,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;
@@ -417,8 +423,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,
+	       sizeof(rwtm->last_sig));
+	cpu_to_be32_array(rwtm->last_sig, rwtm->last_sig,
+			  MOX_ECC_SIGNATURE_WORDS);
 	rwtm->last_sig_done = true;
 
 	mutex_unlock(&rwtm->busy);
-- 
2.44.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v4 07/19] firmware: turris-mox-rwtm: Fix driver includes
  2024-07-15 10:47 [PATCH v4 00/19] Updates for turris-mox-rwtm driver Marek Behún
                   ` (5 preceding siblings ...)
  2024-07-15 10:47 ` [PATCH v4 06/19] firmware: turris-mox-rwtm: Hide signature related constants behind macros Marek Behún
@ 2024-07-15 10:47 ` Marek Behún
  2024-07-15 10:47 ` [PATCH v4 08/19] firmware: turris-mox-rwtm: Use sysfs_emit() instead of sprintf() Marek Behún
                   ` (13 subsequent siblings)
  20 siblings, 0 replies; 22+ messages in thread
From: Marek Behún @ 2024-07-15 10:47 UTC (permalink / raw)
  To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
	Andy Shevchenko, Hans de Goede, Ilpo Järvinen
  Cc: Marek Behún

Drop including of.h, include several other headers that are used but not
included directly.

Signed-off-by: Marek Behún <kabel@kernel.org>
Reviewed-by: Andy Shevchenko <andy@kernel.org>
---
 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 0ae5b2086113..0da40f55c750 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -8,18 +8,23 @@
 #include <crypto/sha2.h>
 #include <linux/armada-37xx-rwtm-mailbox.h>
 #include <linux/completion.h>
+#include <linux/container_of.h>
 #include <linux/debugfs.h>
+#include <linux/device.h>
 #include <linux/dma-mapping.h>
+#include <linux/err.h>
+#include <linux/fs.h>
 #include <linux/hw_random.h>
 #include <linux/if_ether.h>
+#include <linux/kobject.h>
 #include <linux/mailbox_client.h>
 #include <linux/minmax.h>
 #include <linux/module.h>
 #include <linux/mutex.h>
-#include <linux/of.h>
 #include <linux/platform_device.h>
 #include <linux/sizes.h>
 #include <linux/slab.h>
+#include <linux/sysfs.h>
 #include <linux/types.h>
 
 #define DRIVER_NAME		"turris-mox-rwtm"
-- 
2.44.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v4 08/19] firmware: turris-mox-rwtm: Use sysfs_emit() instead of sprintf()
  2024-07-15 10:47 [PATCH v4 00/19] Updates for turris-mox-rwtm driver Marek Behún
                   ` (6 preceding siblings ...)
  2024-07-15 10:47 ` [PATCH v4 07/19] firmware: turris-mox-rwtm: Fix driver includes Marek Behún
@ 2024-07-15 10:47 ` Marek Behún
  2024-07-15 10:47 ` [PATCH v4 09/19] firmware: turris-mox-rwtm: Don't create own kobject type Marek Behún
                   ` (12 subsequent siblings)
  20 siblings, 0 replies; 22+ messages in thread
From: Marek Behún @ 2024-07-15 10:47 UTC (permalink / raw)
  To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
	Andy Shevchenko, Hans de Goede, Ilpo Järvinen
  Cc: Marek Behún

Use sysfs_emit() instead of sprintf() in sysfs attribute .show()
method.

Signed-off-by: Marek Behún <kabel@kernel.org>
---
 drivers/firmware/turris-mox-rwtm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
index 0da40f55c750..e3e209247e68 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -151,7 +151,7 @@ name##_show(struct kobject *kobj, struct kobj_attribute *a,	\
 	struct mox_rwtm *rwtm = to_rwtm(kobj);	\
 	if (!rwtm->has_##cat)					\
 		return -ENODATA;				\
-	return sprintf(buf, format, rwtm->name);		\
+	return sysfs_emit(buf, format, rwtm->name);		\
 }								\
 static struct kobj_attribute mox_attr_##name = __ATTR_RO(name)
 
-- 
2.44.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v4 09/19] firmware: turris-mox-rwtm: Don't create own kobject type
  2024-07-15 10:47 [PATCH v4 00/19] Updates for turris-mox-rwtm driver Marek Behún
                   ` (7 preceding siblings ...)
  2024-07-15 10:47 ` [PATCH v4 08/19] firmware: turris-mox-rwtm: Use sysfs_emit() instead of sprintf() Marek Behún
@ 2024-07-15 10:47 ` Marek Behún
  2024-07-15 10:47 ` [PATCH v4 10/19] firmware: turris-mox-rwtm: Simplify debugfs code Marek Behún
                   ` (11 subsequent siblings)
  20 siblings, 0 replies; 22+ messages in thread
From: Marek Behún @ 2024-07-15 10:47 UTC (permalink / raw)
  To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
	Andy Shevchenko, Hans de Goede, Ilpo Järvinen
  Cc: Marek Behún

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 <kabel@kernel.org>
Reviewed-by: Andy Shevchenko <andy@kernel.org>
---
 drivers/firmware/turris-mox-rwtm.c | 108 ++++++++---------------------
 1 file changed, 30 insertions(+), 78 deletions(-)

diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
index e3e209247e68..ca70a07b4dee 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -23,7 +23,6 @@
 #include <linux/mutex.h>
 #include <linux/platform_device.h>
 #include <linux/sizes.h>
-#include <linux/slab.h>
 #include <linux/sysfs.h>
 #include <linux/types.h>
 
@@ -61,13 +60,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;
@@ -101,59 +97,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 sysfs_emit(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);
@@ -162,6 +116,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)
@@ -176,16 +141,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);
@@ -486,6 +441,11 @@ static inline void rwtm_unregister_debugfs(struct mox_rwtm *rwtm)
 }
 #endif
 
+static void rwtm_firmware_symlink_drop(void *parent)
+{
+	sysfs_remove_link(parent, DRIVER_NAME);
+}
+
 static int turris_mox_rwtm_probe(struct platform_device *pdev)
 {
 	struct mox_rwtm *rwtm;
@@ -502,18 +462,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);
@@ -527,7 +475,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);
@@ -561,14 +509,19 @@ 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,
+					 firmware_kobj);
+
 	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;
 }
 
@@ -577,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);
 }
 
@@ -596,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);
-- 
2.44.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v4 10/19] firmware: turris-mox-rwtm: Simplify debugfs code
  2024-07-15 10:47 [PATCH v4 00/19] Updates for turris-mox-rwtm driver Marek Behún
                   ` (8 preceding siblings ...)
  2024-07-15 10:47 ` [PATCH v4 09/19] firmware: turris-mox-rwtm: Don't create own kobject type Marek Behún
@ 2024-07-15 10:47 ` Marek Behún
  2024-07-15 10:47 ` [PATCH v4 11/19] firmware: turris-mox-rwtm: Convert rest to devm_* and get rid of driver .remove() Marek Behún
                   ` (10 subsequent siblings)
  20 siblings, 0 replies; 22+ messages in thread
From: Marek Behún @ 2024-07-15 10:47 UTC (permalink / raw)
  To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
	Andy Shevchenko, Hans de Goede, Ilpo Järvinen
  Cc: Marek Behún

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 <kabel@kernel.org>
Reviewed-by: Andy Shevchenko <andy@kernel.org>
---
 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 ca70a07b4dee..f95e77cc4716 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -91,7 +91,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
@@ -404,39 +403,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);
+
+	debugfs_create_file_unsafe("do_sign", 0600, root, rwtm, &do_sign_fops);
+
+	devm_add_action_or_reset(rwtm->dev, rwtm_debugfs_release, root);
 }
 #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
@@ -501,11 +484,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);
 }
 
-- 
2.44.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v4 11/19] firmware: turris-mox-rwtm: Convert rest to devm_* and get rid of driver .remove()
  2024-07-15 10:47 [PATCH v4 00/19] Updates for turris-mox-rwtm driver Marek Behún
                   ` (9 preceding siblings ...)
  2024-07-15 10:47 ` [PATCH v4 10/19] firmware: turris-mox-rwtm: Simplify debugfs code Marek Behún
@ 2024-07-15 10:47 ` Marek Behún
  2024-07-15 10:47 ` [PATCH v4 12/19] firmware: turris-mox-rwtm: Use dev_err_probe() where possible Marek Behún
                   ` (9 subsequent siblings)
  20 siblings, 0 replies; 22+ messages in thread
From: Marek Behún @ 2024-07-15 10:47 UTC (permalink / raw)
  To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
	Andy Shevchenko, Hans de Goede, Ilpo Järvinen
  Cc: Marek Behún

Use devm resource management for driver's mailbox. This allows us to get
rid of the driver's .remove() method and the gotos in .probe().

Signed-off-by: Marek Behún <kabel@kernel.org>
Reviewed-by: Andy Shevchenko <andy@kernel.org>
---
 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 f95e77cc4716..5f44fece33f2 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -424,6 +424,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 *parent)
 {
 	sysfs_remove_link(parent, DRIVER_NAME);
@@ -461,6 +466,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)
+		return ret;
+
 	init_completion(&rwtm->cmd_done);
 
 	ret = mox_get_board_info(rwtm);
@@ -471,7 +480,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";
@@ -481,7 +490,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)
 					 firmware_kobj);
 
 	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,
-- 
2.44.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v4 12/19] firmware: turris-mox-rwtm: Use dev_err_probe() where possible
  2024-07-15 10:47 [PATCH v4 00/19] Updates for turris-mox-rwtm driver Marek Behún
                   ` (10 preceding siblings ...)
  2024-07-15 10:47 ` [PATCH v4 11/19] firmware: turris-mox-rwtm: Convert rest to devm_* and get rid of driver .remove() Marek Behún
@ 2024-07-15 10:47 ` Marek Behún
  2024-07-15 10:47 ` [PATCH v4 13/19] firmware: turris-mox-rwtm: Initialize completion before mailbox Marek Behún
                   ` (8 subsequent siblings)
  20 siblings, 0 replies; 22+ messages in thread
From: Marek Behún @ 2024-07-15 10:47 UTC (permalink / raw)
  To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
	Andy Shevchenko, Hans de Goede, Ilpo Järvinen
  Cc: Marek Behún

Use dev_err_probe() where possible in the driver's .probe() method.

Signed-off-by: Marek Behún <kabel@kernel.org>
Reviewed-by: Andy Shevchenko <andy@kernel.org>
---
 drivers/firmware/turris-mox-rwtm.c | 16 +++++-----------
 1 file changed, 5 insertions(+), 11 deletions(-)

diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
index 5f44fece33f2..30c124e664d9 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -458,13 +458,9 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev)
 	rwtm->mbox_client.rx_callback = mox_rwtm_rx_callback;
 
 	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 (IS_ERR(rwtm->mbox))
+		return dev_err_probe(dev, PTR_ERR(rwtm->mbox),
+				     "Cannot request mailbox channel!\n");
 
 	ret = devm_add_action_or_reset(dev, rwtm_devm_mbox_release, rwtm->mbox);
 	if (ret)
@@ -488,10 +484,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)
+		return dev_err_probe(dev, ret, "Cannot register HWRNG!\n");
 
 	rwtm_register_debugfs(rwtm);
 
-- 
2.44.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v4 13/19] firmware: turris-mox-rwtm: Initialize completion before mailbox
  2024-07-15 10:47 [PATCH v4 00/19] Updates for turris-mox-rwtm driver Marek Behún
                   ` (11 preceding siblings ...)
  2024-07-15 10:47 ` [PATCH v4 12/19] firmware: turris-mox-rwtm: Use dev_err_probe() where possible Marek Behún
@ 2024-07-15 10:47 ` Marek Behún
  2024-07-15 10:47 ` [PATCH v4 14/19] firmware: turris-mox-rwtm: Drop redundant device pointer Marek Behún
                   ` (7 subsequent siblings)
  20 siblings, 0 replies; 22+ messages in thread
From: Marek Behún @ 2024-07-15 10:47 UTC (permalink / raw)
  To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
	Andy Shevchenko, Hans de Goede, Ilpo Järvinen
  Cc: Marek Behún

Initialize the completion before the mailbox channel is requested.

Fixes: 389711b37493 ("firmware: Add Turris Mox rWTM firmware driver")
Signed-off-by: Marek Behún <kabel@kernel.org>
Reviewed-by: Andy Shevchenko <andy@kernel.org>
---
 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 30c124e664d9..f291df9a72ff 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -453,6 +453,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;
@@ -466,8 +467,6 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev)
 	if (ret)
 		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);
-- 
2.44.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v4 14/19] firmware: turris-mox-rwtm: Drop redundant device pointer
  2024-07-15 10:47 [PATCH v4 00/19] Updates for turris-mox-rwtm driver Marek Behún
                   ` (12 preceding siblings ...)
  2024-07-15 10:47 ` [PATCH v4 13/19] firmware: turris-mox-rwtm: Initialize completion before mailbox Marek Behún
@ 2024-07-15 10:47 ` Marek Behún
  2024-07-15 10:47 ` [PATCH v4 15/19] firmware: turris-mox-rwtm: Use devm_mutex_init() instead of mutex_init() Marek Behún
                   ` (6 subsequent siblings)
  20 siblings, 0 replies; 22+ messages in thread
From: Marek Behún @ 2024-07-15 10:47 UTC (permalink / raw)
  To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
	Andy Shevchenko, Hans de Goede, Ilpo Järvinen
  Cc: Marek Behún

Drop redundant device pointer from driver's private structure.

Signed-off-by: Marek Behún <kabel@kernel.org>
Reviewed-by: Andy Shevchenko <andy@kernel.org>
---
 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 f291df9a72ff..d12e29625022 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -61,7 +61,6 @@ enum mbox_cmd {
 };
 
 struct mox_rwtm {
-	struct device *dev;
 	struct mbox_client mbox_client;
 	struct mbox_chan *mbox;
 	struct hwrng hwrng;
@@ -96,6 +95,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,	\
@@ -164,6 +168,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;
@@ -178,10 +183,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;
@@ -213,9 +218,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;
@@ -416,7 +421,7 @@ static void rwtm_register_debugfs(struct mox_rwtm *rwtm)
 
 	debugfs_create_file_unsafe("do_sign", 0600, root, rwtm, &do_sign_fops);
 
-	devm_add_action_or_reset(rwtm->dev, rwtm_debugfs_release, root);
+	devm_add_action_or_reset(rwtm_dev(rwtm), rwtm_debugfs_release, root);
 }
 #else
 static inline void rwtm_register_debugfs(struct mox_rwtm *rwtm)
@@ -444,7 +449,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)
-- 
2.44.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v4 15/19] firmware: turris-mox-rwtm: Use devm_mutex_init() instead of mutex_init()
  2024-07-15 10:47 [PATCH v4 00/19] Updates for turris-mox-rwtm driver Marek Behún
                   ` (13 preceding siblings ...)
  2024-07-15 10:47 ` [PATCH v4 14/19] firmware: turris-mox-rwtm: Drop redundant device pointer Marek Behún
@ 2024-07-15 10:47 ` Marek Behún
  2024-07-15 10:47 ` [PATCH v4 16/19] firmware: turris-mox-rwtm: Use container_of() instead of hwrng .priv member Marek Behún
                   ` (5 subsequent siblings)
  20 siblings, 0 replies; 22+ messages in thread
From: Marek Behún @ 2024-07-15 10:47 UTC (permalink / raw)
  To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
	Andy Shevchenko, Hans de Goede, Ilpo Järvinen
  Cc: Marek Behún

Use devm_mutex_init() instead of mutex_init(), to properly call
mutex_destroy() on probe failure / driver unbind.

Signed-off-by: Marek Behún <kabel@kernel.org>
Reviewed-by: Andy Shevchenko <andy@kernel.org>
---
 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 d12e29625022..9f6bda969943 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -456,7 +456,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)
+		return ret;
+
 	init_completion(&rwtm->cmd_done);
 
 	rwtm->mbox_client.dev = dev;
-- 
2.44.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v4 16/19] firmware: turris-mox-rwtm: Use container_of() instead of hwrng .priv member
  2024-07-15 10:47 [PATCH v4 00/19] Updates for turris-mox-rwtm driver Marek Behún
                   ` (14 preceding siblings ...)
  2024-07-15 10:47 ` [PATCH v4 15/19] firmware: turris-mox-rwtm: Use devm_mutex_init() instead of mutex_init() Marek Behún
@ 2024-07-15 10:47 ` Marek Behún
  2024-07-15 10:47 ` [PATCH v4 17/19] firmware: turris-mox-rwtm: Use EOPNOTSUPP instead of ENOSYS Marek Behún
                   ` (4 subsequent siblings)
  20 siblings, 0 replies; 22+ messages in thread
From: Marek Behún @ 2024-07-15 10:47 UTC (permalink / raw)
  To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
	Andy Shevchenko, Hans de Goede, Ilpo Järvinen
  Cc: Marek Behún

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.

Link: https://lore.kernel.org/soc/ZmLhQBdmg613KdET@gondor.apana.org.au/
Signed-off-by: Marek Behún <kabel@kernel.org>
Reviewed-by: Andy Shevchenko <andy@kernel.org>
---
 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 9f6bda969943..52f97235c3a6 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -259,7 +259,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;
 
@@ -487,7 +487,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)
-- 
2.44.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v4 17/19] firmware: turris-mox-rwtm: Use EOPNOTSUPP instead of ENOSYS
  2024-07-15 10:47 [PATCH v4 00/19] Updates for turris-mox-rwtm driver Marek Behún
                   ` (15 preceding siblings ...)
  2024-07-15 10:47 ` [PATCH v4 16/19] firmware: turris-mox-rwtm: Use container_of() instead of hwrng .priv member Marek Behún
@ 2024-07-15 10:47 ` Marek Behún
  2024-07-15 10:47 ` [PATCH v4 18/19] firmware: turris-mox-rwtm: Use ALIGN() instead of hardcoding Marek Behún
                   ` (3 subsequent siblings)
  20 siblings, 0 replies; 22+ messages in thread
From: Marek Behún @ 2024-07-15 10:47 UTC (permalink / raw)
  To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
	Andy Shevchenko, Hans de Goede, Ilpo Järvinen
  Cc: Marek Behún

Checkpatch warns agains -ENOSYS:
  WARNING: ENOSYS means 'invalid syscall nr' and nothing else
Use EOPNOTSUPP instead.

Signed-off-by: Marek Behún <kabel@kernel.org>
Reviewed-by: Andy Shevchenko <andy@kernel.org>
---
 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 52f97235c3a6..a9391705f5b4 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -137,7 +137,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
@@ -185,7 +185,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) {
@@ -219,7 +219,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) {
-- 
2.44.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v4 18/19] firmware: turris-mox-rwtm: Use ALIGN() instead of hardcoding
  2024-07-15 10:47 [PATCH v4 00/19] Updates for turris-mox-rwtm driver Marek Behún
                   ` (16 preceding siblings ...)
  2024-07-15 10:47 ` [PATCH v4 17/19] firmware: turris-mox-rwtm: Use EOPNOTSUPP instead of ENOSYS Marek Behún
@ 2024-07-15 10:47 ` Marek Behún
  2024-07-15 10:47 ` [PATCH v4 19/19] firmware: turris-mox-rwtm: Deduplicate command execution code Marek Behún
                   ` (2 subsequent siblings)
  20 siblings, 0 replies; 22+ messages in thread
From: Marek Behún @ 2024-07-15 10:47 UTC (permalink / raw)
  To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
	Andy Shevchenko, Hans de Goede, Ilpo Järvinen
  Cc: Marek Behún

Use ALIGN(max, 4) instead of hardcoding ((max + 3) & ~3).

Signed-off-by: Marek Behún <kabel@kernel.org>
---
 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 a9391705f5b4..0c7d8c96ea17 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -6,6 +6,7 @@
  */
 
 #include <crypto/sha2.h>
+#include <linux/align.h>
 #include <linux/armada-37xx-rwtm-mailbox.h>
 #include <linux/completion.h>
 #include <linux/container_of.h>
@@ -268,7 +269,7 @@ static int mox_hwrng_read(struct hwrng *rng, void *data, size_t max, bool wait)
 	msg.command = MBOX_CMD_GET_RANDOM;
 	msg.args[0] = 1;
 	msg.args[1] = rwtm->buf_phys;
-	msg.args[2] = (max + 3) & ~3;
+	msg.args[2] = ALIGN(max, 4);
 
 	if (!wait) {
 		if (!mutex_trylock(&rwtm->busy))
-- 
2.44.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v4 19/19] firmware: turris-mox-rwtm: Deduplicate command execution code
  2024-07-15 10:47 [PATCH v4 00/19] Updates for turris-mox-rwtm driver Marek Behún
                   ` (17 preceding siblings ...)
  2024-07-15 10:47 ` [PATCH v4 18/19] firmware: turris-mox-rwtm: Use ALIGN() instead of hardcoding Marek Behún
@ 2024-07-15 10:47 ` Marek Behún
  2024-07-15 11:11 ` [PATCH v4 00/19] Updates for turris-mox-rwtm driver Arnd Bergmann
  2024-08-06 20:08 ` patchwork-bot+linux-soc
  20 siblings, 0 replies; 22+ messages in thread
From: Marek Behún @ 2024-07-15 10:47 UTC (permalink / raw)
  To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
	Andy Shevchenko, Hans de Goede, Ilpo Järvinen
  Cc: Marek Behún

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 <kabel@kernel.org>
Reviewed-by: Andy Shevchenko <andy@kernel.org>
---
 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 0c7d8c96ea17..525ebdc7ded5 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -157,6 +157,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;
@@ -170,19 +198,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");
@@ -209,15 +228,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) {
@@ -240,37 +251,23 @@ 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, ALIGN(max, 4) },
+	};
 	int ret;
 
 	max = min(max, RWTM_DMA_BUFFER_SIZE);
 
-	msg.command = MBOX_CMD_GET_RANDOM;
-	msg.args[0] = 1;
-	msg.args[1] = rwtm->buf_phys;
-	msg.args[2] = ALIGN(max, 4);
-
 	if (!wait) {
 		if (!mutex_trylock(&rwtm->busy))
 			return -EBUSY;
@@ -278,15 +275,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
-- 
2.44.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* Re: [PATCH v4 00/19] Updates for turris-mox-rwtm driver
  2024-07-15 10:47 [PATCH v4 00/19] Updates for turris-mox-rwtm driver Marek Behún
                   ` (18 preceding siblings ...)
  2024-07-15 10:47 ` [PATCH v4 19/19] firmware: turris-mox-rwtm: Deduplicate command execution code Marek Behún
@ 2024-07-15 11:11 ` Arnd Bergmann
  2024-08-06 20:08 ` patchwork-bot+linux-soc
  20 siblings, 0 replies; 22+ messages in thread
From: Arnd Bergmann @ 2024-07-15 11:11 UTC (permalink / raw)
  To: Marek Behún, Gregory Clement, Andrew Lunn, soc, arm,
	Andy Shevchenko, Hans de Goede, Ilpo Järvinen

On Mon, Jul 15, 2024, at 12:47, Marek Behún wrote:
> Hi Arnd, Andy, Gregory et al.
>
> this is v4 of series of fixes, refactors and cleanups for the
> turris-mox-rwtm driver.
>
> Changes since v3:
> - addressed Andy's recommendations. Some of them resulted in 2 new
>   patches (08/19 and 18/19). Im patch 10/19 I did not address Andy's
>   comment
>     "Actually you may do that without devm. There is a lookup method
>      or so in debugfs APIs that can be used. Can be amended later on,
>      though."
>   since I do not see how to use the debugfs_lookup_and_remove()
>   function without devm and get rid of the driver's .remove() method
>   at the same time...
>

Hi Marek,

The 6.11 merge window is now open, so I am not applying the
cleanup and refactoring patches for this release.

Can you separate the two and resend just the bugfixes so I can
apply them into a branch for 6.11-rc1? After -rc1 is out
with those fixes, please rebase the rest and send that got
inclusion in 6.12.

     Arnd

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH v4 00/19] Updates for turris-mox-rwtm driver
  2024-07-15 10:47 [PATCH v4 00/19] Updates for turris-mox-rwtm driver Marek Behún
                   ` (19 preceding siblings ...)
  2024-07-15 11:11 ` [PATCH v4 00/19] Updates for turris-mox-rwtm driver Arnd Bergmann
@ 2024-08-06 20:08 ` patchwork-bot+linux-soc
  20 siblings, 0 replies; 22+ messages in thread
From: patchwork-bot+linux-soc @ 2024-08-06 20:08 UTC (permalink / raw)
  To: =?utf-8?q?Marek_Beh=C3=BAn_=3Ckabel=40kernel=2Eorg=3E?=; +Cc: soc

Hello:

This series was applied to soc/soc.git (arm/fixes)
by Arnd Bergmann <arnd@arndb.de>:

On Mon, 15 Jul 2024 12:47:04 +0200 you wrote:
> Hi Arnd, Andy, Gregory et al.
> 
> this is v4 of series of fixes, refactors and cleanups for the
> turris-mox-rwtm driver.
> 
> Changes since v3:
> - addressed Andy's recommendations. Some of them resulted in 2 new
>   patches (08/19 and 18/19). Im patch 10/19 I did not address Andy's
>   comment
>     "Actually you may do that without devm. There is a lookup method
>      or so in debugfs APIs that can be used. Can be amended later on,
>      though."
>   since I do not see how to use the debugfs_lookup_and_remove()
>   function without devm and get rid of the driver's .remove() method
>   at the same time...
> 
> [...]

Here is the summary with links:
  - [v4,01/19] firmware: turris-mox-rwtm: Do not complete if there are no waiters
    https://git.kernel.org/soc/soc/c/0bafb172b111
  - [v4,02/19] firmware: turris-mox-rwtm: Fix checking return value of wait_for_completion_timeout()
    https://git.kernel.org/soc/soc/c/8467cfe821ac
  - [v4,03/19] firmware: turris-mox-rwtm: Use macro constant instead of hardcoded 4096
    (no matching commit)
  - [v4,04/19] firmware: turris-mox-rwtm: Use ETH_ALEN instead of hardcoded 6
    (no matching commit)
  - [v4,05/19] firmware: turris-mox-rwtm: Use the boolean type where appropriate
    (no matching commit)
  - [v4,06/19] firmware: turris-mox-rwtm: Hide signature related constants behind macros
    (no matching commit)
  - [v4,07/19] firmware: turris-mox-rwtm: Fix driver includes
    (no matching commit)
  - [v4,08/19] firmware: turris-mox-rwtm: Use sysfs_emit() instead of sprintf()
    (no matching commit)
  - [v4,09/19] firmware: turris-mox-rwtm: Don't create own kobject type
    (no matching commit)
  - [v4,10/19] firmware: turris-mox-rwtm: Simplify debugfs code
    (no matching commit)
  - [v4,11/19] firmware: turris-mox-rwtm: Convert rest to devm_* and get rid of driver .remove()
    (no matching commit)
  - [v4,12/19] firmware: turris-mox-rwtm: Use dev_err_probe() where possible
    (no matching commit)
  - [v4,13/19] firmware: turris-mox-rwtm: Initialize completion before mailbox
    (no matching commit)
  - [v4,14/19] firmware: turris-mox-rwtm: Drop redundant device pointer
    (no matching commit)
  - [v4,15/19] firmware: turris-mox-rwtm: Use devm_mutex_init() instead of mutex_init()
    (no matching commit)
  - [v4,16/19] firmware: turris-mox-rwtm: Use container_of() instead of hwrng .priv member
    (no matching commit)
  - [v4,17/19] firmware: turris-mox-rwtm: Use EOPNOTSUPP instead of ENOSYS
    (no matching commit)
  - [v4,18/19] firmware: turris-mox-rwtm: Use ALIGN() instead of hardcoding
    (no matching commit)
  - [v4,19/19] firmware: turris-mox-rwtm: Deduplicate command execution code
    (no matching commit)

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



^ permalink raw reply	[flat|nested] 22+ messages in thread

end of thread, other threads:[~2024-08-06 20:08 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-07-15 10:47 [PATCH v4 00/19] Updates for turris-mox-rwtm driver Marek Behún
2024-07-15 10:47 ` [PATCH v4 01/19] firmware: turris-mox-rwtm: Do not complete if there are no waiters Marek Behún
2024-07-15 10:47 ` [PATCH v4 02/19] firmware: turris-mox-rwtm: Fix checking return value of wait_for_completion_timeout() Marek Behún
2024-07-15 10:47 ` [PATCH v4 03/19] firmware: turris-mox-rwtm: Use macro constant instead of hardcoded 4096 Marek Behún
2024-07-15 10:47 ` [PATCH v4 04/19] firmware: turris-mox-rwtm: Use ETH_ALEN instead of hardcoded 6 Marek Behún
2024-07-15 10:47 ` [PATCH v4 05/19] firmware: turris-mox-rwtm: Use the boolean type where appropriate Marek Behún
2024-07-15 10:47 ` [PATCH v4 06/19] firmware: turris-mox-rwtm: Hide signature related constants behind macros Marek Behún
2024-07-15 10:47 ` [PATCH v4 07/19] firmware: turris-mox-rwtm: Fix driver includes Marek Behún
2024-07-15 10:47 ` [PATCH v4 08/19] firmware: turris-mox-rwtm: Use sysfs_emit() instead of sprintf() Marek Behún
2024-07-15 10:47 ` [PATCH v4 09/19] firmware: turris-mox-rwtm: Don't create own kobject type Marek Behún
2024-07-15 10:47 ` [PATCH v4 10/19] firmware: turris-mox-rwtm: Simplify debugfs code Marek Behún
2024-07-15 10:47 ` [PATCH v4 11/19] firmware: turris-mox-rwtm: Convert rest to devm_* and get rid of driver .remove() Marek Behún
2024-07-15 10:47 ` [PATCH v4 12/19] firmware: turris-mox-rwtm: Use dev_err_probe() where possible Marek Behún
2024-07-15 10:47 ` [PATCH v4 13/19] firmware: turris-mox-rwtm: Initialize completion before mailbox Marek Behún
2024-07-15 10:47 ` [PATCH v4 14/19] firmware: turris-mox-rwtm: Drop redundant device pointer Marek Behún
2024-07-15 10:47 ` [PATCH v4 15/19] firmware: turris-mox-rwtm: Use devm_mutex_init() instead of mutex_init() Marek Behún
2024-07-15 10:47 ` [PATCH v4 16/19] firmware: turris-mox-rwtm: Use container_of() instead of hwrng .priv member Marek Behún
2024-07-15 10:47 ` [PATCH v4 17/19] firmware: turris-mox-rwtm: Use EOPNOTSUPP instead of ENOSYS Marek Behún
2024-07-15 10:47 ` [PATCH v4 18/19] firmware: turris-mox-rwtm: Use ALIGN() instead of hardcoding Marek Behún
2024-07-15 10:47 ` [PATCH v4 19/19] firmware: turris-mox-rwtm: Deduplicate command execution code Marek Behún
2024-07-15 11:11 ` [PATCH v4 00/19] Updates for turris-mox-rwtm driver Arnd Bergmann
2024-08-06 20:08 ` patchwork-bot+linux-soc

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox