* [PATCH v3 01/17] firmware: turris-mox-rwtm: Do not complete if there are no waiters
2024-06-17 14:45 [PATCH v3 00/17] Updates for turris-mox-rwtm driver Marek Behún
@ 2024-06-17 14:45 ` Marek Behún
2024-06-17 19:42 ` Andy Shevchenko
2024-06-17 14:45 ` [PATCH v3 02/17] firmware: turris-mox-rwtm: Fix checking return value of wait_for_completion_timeout() Marek Behún
` (16 subsequent siblings)
17 siblings, 1 reply; 27+ messages in thread
From: Marek Behún @ 2024-06-17 14:45 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>
---
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] 27+ messages in thread* Re: [PATCH v3 01/17] firmware: turris-mox-rwtm: Do not complete if there are no waiters
2024-06-17 14:45 ` [PATCH v3 01/17] firmware: turris-mox-rwtm: Do not complete if there are no waiters Marek Behún
@ 2024-06-17 19:42 ` Andy Shevchenko
0 siblings, 0 replies; 27+ messages in thread
From: Andy Shevchenko @ 2024-06-17 19:42 UTC (permalink / raw)
To: Marek Behún
Cc: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede, Ilpo Järvinen
On Mon, Jun 17, 2024 at 4:45 PM Marek Behún <kabel@kernel.org> wrote:
>
> Do not complete the command done completion if there are no waiters.
"command done"
(perhaps in double quotes, since it's a kind of a name)
> This can happen if a wait_for_completion timed out or was interrupted.
wait_for_completion()
...
In case you need a new version, no need to resend because of the above
nit-picks.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH v3 02/17] firmware: turris-mox-rwtm: Fix checking return value of wait_for_completion_timeout()
2024-06-17 14:45 [PATCH v3 00/17] Updates for turris-mox-rwtm driver Marek Behún
2024-06-17 14:45 ` [PATCH v3 01/17] firmware: turris-mox-rwtm: Do not complete if there are no waiters Marek Behún
@ 2024-06-17 14:45 ` Marek Behún
2024-06-17 14:45 ` [PATCH v3 03/17] firmware: turris-mox-rwtm: Use macro constant instead of hardcoded 4096 Marek Behún
` (15 subsequent siblings)
17 siblings, 0 replies; 27+ messages in thread
From: Marek Behún @ 2024-06-17 14:45 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>
---
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] 27+ messages in thread* [PATCH v3 03/17] firmware: turris-mox-rwtm: Use macro constant instead of hardcoded 4096
2024-06-17 14:45 [PATCH v3 00/17] Updates for turris-mox-rwtm driver Marek Behún
2024-06-17 14:45 ` [PATCH v3 01/17] firmware: turris-mox-rwtm: Do not complete if there are no waiters Marek Behún
2024-06-17 14:45 ` [PATCH v3 02/17] firmware: turris-mox-rwtm: Fix checking return value of wait_for_completion_timeout() Marek Behún
@ 2024-06-17 14:45 ` Marek Behún
2024-06-17 14:45 ` [PATCH v3 04/17] firmware: turris-mox-rwtm: Use ETH_ALEN instead of hardcoded 6 Marek Behún
` (14 subsequent siblings)
17 siblings, 0 replies; 27+ messages in thread
From: Marek Behún @ 2024-06-17 14:45 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>
---
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] 27+ messages in thread* [PATCH v3 04/17] firmware: turris-mox-rwtm: Use ETH_ALEN instead of hardcoded 6
2024-06-17 14:45 [PATCH v3 00/17] Updates for turris-mox-rwtm driver Marek Behún
` (2 preceding siblings ...)
2024-06-17 14:45 ` [PATCH v3 03/17] firmware: turris-mox-rwtm: Use macro constant instead of hardcoded 4096 Marek Behún
@ 2024-06-17 14:45 ` Marek Behún
2024-06-17 14:45 ` [PATCH v3 05/17] firmware: turris-mox-rwtm: Use the boolean type where appropriate Marek Behún
` (13 subsequent siblings)
17 siblings, 0 replies; 27+ messages in thread
From: Marek Behún @ 2024-06-17 14:45 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>
---
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] 27+ messages in thread* [PATCH v3 05/17] firmware: turris-mox-rwtm: Use the boolean type where appropriate
2024-06-17 14:45 [PATCH v3 00/17] Updates for turris-mox-rwtm driver Marek Behún
` (3 preceding siblings ...)
2024-06-17 14:45 ` [PATCH v3 04/17] firmware: turris-mox-rwtm: Use ETH_ALEN instead of hardcoded 6 Marek Behún
@ 2024-06-17 14:45 ` Marek Behún
2024-06-17 19:46 ` Andy Shevchenko
2024-06-17 14:45 ` [PATCH v3 06/17] firmware: turris-mox-rwtm: Hide signature related constants behind macros Marek Behún
` (12 subsequent siblings)
17 siblings, 1 reply; 27+ messages in thread
From: Marek Behún @ 2024-06-17 14:45 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>
---
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] 27+ messages in thread* Re: [PATCH v3 05/17] firmware: turris-mox-rwtm: Use the boolean type where appropriate
2024-06-17 14:45 ` [PATCH v3 05/17] firmware: turris-mox-rwtm: Use the boolean type where appropriate Marek Behún
@ 2024-06-17 19:46 ` Andy Shevchenko
0 siblings, 0 replies; 27+ messages in thread
From: Andy Shevchenko @ 2024-06-17 19:46 UTC (permalink / raw)
To: Marek Behún
Cc: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede, Ilpo Järvinen
On Mon, Jun 17, 2024 at 4:45 PM Marek Behún <kabel@kernel.org> wrote:
>
> Use the boolean type for has_board_info, has_pubkey and last_sig_done
> members of the driver's private structure.
...
> @@ -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
> };
A side note: At some point it might make sense to look at the
structure layout with help of `pahole` tool and maybe compress it a
bit to save a few bytes (it might be feasible after this change).
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH v3 06/17] firmware: turris-mox-rwtm: Hide signature related constants behind macros
2024-06-17 14:45 [PATCH v3 00/17] Updates for turris-mox-rwtm driver Marek Behún
` (4 preceding siblings ...)
2024-06-17 14:45 ` [PATCH v3 05/17] firmware: turris-mox-rwtm: Use the boolean type where appropriate Marek Behún
@ 2024-06-17 14:45 ` Marek Behún
2024-06-17 19:52 ` Andy Shevchenko
2024-06-17 14:45 ` [PATCH v3 07/17] firmware: turris-mox-rwtm: Fix driver includes Marek Behún
` (11 subsequent siblings)
17 siblings, 1 reply; 27+ messages in thread
From: Marek Behún @ 2024-06-17 14:45 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>
---
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 5ed480ac5146..59bb9245e04f 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,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)
@@ -85,7 +92,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
};
@@ -345,14 +352,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;
@@ -367,8 +375,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 +396,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 +425,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);
--
2.44.2
^ permalink raw reply related [flat|nested] 27+ messages in thread* Re: [PATCH v3 06/17] firmware: turris-mox-rwtm: Hide signature related constants behind macros
2024-06-17 14:45 ` [PATCH v3 06/17] firmware: turris-mox-rwtm: Hide signature related constants behind macros Marek Behún
@ 2024-06-17 19:52 ` Andy Shevchenko
0 siblings, 0 replies; 27+ messages in thread
From: Andy Shevchenko @ 2024-06-17 19:52 UTC (permalink / raw)
To: Marek Behún
Cc: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede, Ilpo Järvinen
On Mon, Jun 17, 2024 at 4:45 PM Marek Behún <kabel@kernel.org> wrote:
>
> 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.
...
> /* 2 arrays of 17 32-bit words are 136 bytes */
Hmm... Comment now is a bit too precise. But okay :-)
> - 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);
I think sizeof() here is more robust.
No need to resend due to this.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH v3 07/17] firmware: turris-mox-rwtm: Fix driver includes
2024-06-17 14:45 [PATCH v3 00/17] Updates for turris-mox-rwtm driver Marek Behún
` (5 preceding siblings ...)
2024-06-17 14:45 ` [PATCH v3 06/17] firmware: turris-mox-rwtm: Hide signature related constants behind macros Marek Behún
@ 2024-06-17 14:45 ` Marek Behún
2024-06-17 14:45 ` [PATCH v3 08/17] firmware: turris-mox-rwtm: Don't create own kobject type Marek Behún
` (10 subsequent siblings)
17 siblings, 0 replies; 27+ messages in thread
From: Marek Behún @ 2024-06-17 14:45 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>
---
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 59bb9245e04f..9c66bda2f976 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] 27+ messages in thread* [PATCH v3 08/17] firmware: turris-mox-rwtm: Don't create own kobject type
2024-06-17 14:45 [PATCH v3 00/17] Updates for turris-mox-rwtm driver Marek Behún
` (6 preceding siblings ...)
2024-06-17 14:45 ` [PATCH v3 07/17] firmware: turris-mox-rwtm: Fix driver includes Marek Behún
@ 2024-06-17 14:45 ` Marek Behún
2024-06-17 19:57 ` Andy Shevchenko
2024-06-17 14:45 ` [PATCH v3 09/17] firmware: turris-mox-rwtm: Simplify debugfs code Marek Behún
` (9 subsequent siblings)
17 siblings, 1 reply; 27+ messages in thread
From: Marek Behún @ 2024-06-17 14:45 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>
---
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 9c66bda2f976..9c857ba427d0 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>
@@ -62,13 +61,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;
@@ -102,59 +98,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);
@@ -163,6 +117,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)
@@ -177,16 +142,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);
@@ -488,6 +443,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;
@@ -504,18 +464,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);
@@ -529,7 +477,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);
@@ -563,14 +511,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;
}
@@ -579,8 +532,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);
}
@@ -598,6 +549,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] 27+ messages in thread* Re: [PATCH v3 08/17] firmware: turris-mox-rwtm: Don't create own kobject type
2024-06-17 14:45 ` [PATCH v3 08/17] firmware: turris-mox-rwtm: Don't create own kobject type Marek Behún
@ 2024-06-17 19:57 ` Andy Shevchenko
0 siblings, 0 replies; 27+ messages in thread
From: Andy Shevchenko @ 2024-06-17 19:57 UTC (permalink / raw)
To: Marek Behún
Cc: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede, Ilpo Järvinen
On Mon, Jun 17, 2024 at 4:45 PM Marek Behún <kabel@kernel.org> wrote:
>
> 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.
...
> #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); \
At some point this should be replaced with sysfs_emit()
> } \
> -static struct kobj_attribute mox_attr_##name = __ATTR_RO(name)
> +static DEVICE_ATTR_RO(name)
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH v3 09/17] firmware: turris-mox-rwtm: Simplify debugfs code
2024-06-17 14:45 [PATCH v3 00/17] Updates for turris-mox-rwtm driver Marek Behún
` (7 preceding siblings ...)
2024-06-17 14:45 ` [PATCH v3 08/17] firmware: turris-mox-rwtm: Don't create own kobject type Marek Behún
@ 2024-06-17 14:45 ` Marek Behún
2024-06-17 20:22 ` Andy Shevchenko
2024-06-17 14:45 ` [PATCH v3 10/17] firmware: turris-mox-rwtm: Convert rest to devm_* and get rid of driver .remove() Marek Behún
` (8 subsequent siblings)
17 siblings, 1 reply; 27+ messages in thread
From: Marek Behún @ 2024-06-17 14:45 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>
---
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 9c857ba427d0..77fdd5c66971 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -92,7 +92,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
@@ -406,39 +405,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
@@ -503,11 +486,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");
@@ -531,7 +510,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] 27+ messages in thread* Re: [PATCH v3 09/17] firmware: turris-mox-rwtm: Simplify debugfs code
2024-06-17 14:45 ` [PATCH v3 09/17] firmware: turris-mox-rwtm: Simplify debugfs code Marek Behún
@ 2024-06-17 20:22 ` Andy Shevchenko
2024-07-12 13:16 ` Marek Behún
0 siblings, 1 reply; 27+ messages in thread
From: Andy Shevchenko @ 2024-06-17 20:22 UTC (permalink / raw)
To: Marek Behún
Cc: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede, Ilpo Järvinen
On Mon, Jun 17, 2024 at 4:46 PM Marek Behún <kabel@kernel.org> wrote:
>
> Simplify debugfs code: do not check for errors, as debugfs errors should
> be ignored, and use devm action for dropping the debugfs directory.
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.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v3 09/17] firmware: turris-mox-rwtm: Simplify debugfs code
2024-06-17 20:22 ` Andy Shevchenko
@ 2024-07-12 13:16 ` Marek Behún
0 siblings, 0 replies; 27+ messages in thread
From: Marek Behún @ 2024-07-12 13:16 UTC (permalink / raw)
To: Andy Shevchenko
Cc: Marek Behún, Gregory CLEMENT, Andrew Lunn, Arnd Bergmann,
soc, arm, Andy Shevchenko, Hans de Goede, Ilpo Järvinen
On Mon, Jun 17, 2024 at 10:22:47PM +0200, Andy Shevchenko wrote:
> On Mon, Jun 17, 2024 at 4:46 PM Marek Behún <kabel@kernel.org> wrote:
> >
> > Simplify debugfs code: do not check for errors, as debugfs errors should
> > be ignored, and use devm action for dropping the debugfs directory.
>
> 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.
But I want to get rid of driver .remove() method altogehter in a subsequent
patch. How can I use debugfs_lookup_and_remove() that way without devm?
Marek
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH v3 10/17] firmware: turris-mox-rwtm: Convert rest to devm_* and get rid of driver .remove()
2024-06-17 14:45 [PATCH v3 00/17] Updates for turris-mox-rwtm driver Marek Behún
` (8 preceding siblings ...)
2024-06-17 14:45 ` [PATCH v3 09/17] firmware: turris-mox-rwtm: Simplify debugfs code Marek Behún
@ 2024-06-17 14:45 ` Marek Behún
2024-06-17 14:45 ` [PATCH v3 11/17] firmware: turris-mox-rwtm: Use dev_err_probe() where possible Marek Behún
` (7 subsequent siblings)
17 siblings, 0 replies; 27+ messages in thread
From: Marek Behún @ 2024-06-17 14:45 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>
---
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 77fdd5c66971..9a68784a9619 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -426,6 +426,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);
@@ -463,6 +468,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);
@@ -473,7 +482,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";
@@ -483,7 +492,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);
@@ -500,17 +509,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[] = {
@@ -523,7 +521,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] 27+ messages in thread* [PATCH v3 11/17] firmware: turris-mox-rwtm: Use dev_err_probe() where possible
2024-06-17 14:45 [PATCH v3 00/17] Updates for turris-mox-rwtm driver Marek Behún
` (9 preceding siblings ...)
2024-06-17 14:45 ` [PATCH v3 10/17] firmware: turris-mox-rwtm: Convert rest to devm_* and get rid of driver .remove() Marek Behún
@ 2024-06-17 14:45 ` Marek Behún
2024-06-17 14:45 ` [PATCH v3 12/17] firmware: turris-mox-rwtm: Initialize completion before mailbox Marek Behún
` (6 subsequent siblings)
17 siblings, 0 replies; 27+ messages in thread
From: Marek Behún @ 2024-06-17 14:45 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>
---
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 9a68784a9619..397175fafbe0 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -460,13 +460,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)
@@ -490,10 +486,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] 27+ messages in thread* [PATCH v3 12/17] firmware: turris-mox-rwtm: Initialize completion before mailbox
2024-06-17 14:45 [PATCH v3 00/17] Updates for turris-mox-rwtm driver Marek Behún
` (10 preceding siblings ...)
2024-06-17 14:45 ` [PATCH v3 11/17] firmware: turris-mox-rwtm: Use dev_err_probe() where possible Marek Behún
@ 2024-06-17 14:45 ` Marek Behún
2024-06-17 14:45 ` [PATCH v3 13/17] firmware: turris-mox-rwtm: Drop redundant device pointer Marek Behún
` (5 subsequent siblings)
17 siblings, 0 replies; 27+ messages in thread
From: Marek Behún @ 2024-06-17 14:45 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>
---
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 397175fafbe0..2c43af69783c 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -455,6 +455,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;
@@ -468,8 +469,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] 27+ messages in thread* [PATCH v3 13/17] firmware: turris-mox-rwtm: Drop redundant device pointer
2024-06-17 14:45 [PATCH v3 00/17] Updates for turris-mox-rwtm driver Marek Behún
` (11 preceding siblings ...)
2024-06-17 14:45 ` [PATCH v3 12/17] firmware: turris-mox-rwtm: Initialize completion before mailbox Marek Behún
@ 2024-06-17 14:45 ` Marek Behún
2024-06-17 14:45 ` [PATCH v3 14/17] firmware: turris-mox-rwtm: Use devm_mutex_init() instead of mutex_init() Marek Behún
` (4 subsequent siblings)
17 siblings, 0 replies; 27+ messages in thread
From: Marek Behún @ 2024-06-17 14:45 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>
---
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 2c43af69783c..0b93040167b6 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -62,7 +62,6 @@ enum mbox_cmd {
};
struct mox_rwtm {
- struct device *dev;
struct mbox_client mbox_client;
struct mbox_chan *mbox;
struct hwrng hwrng;
@@ -97,6 +96,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, \
@@ -165,6 +169,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;
@@ -179,10 +184,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;
@@ -214,9 +219,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;
@@ -418,7 +423,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)
@@ -446,7 +451,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] 27+ messages in thread* [PATCH v3 14/17] firmware: turris-mox-rwtm: Use devm_mutex_init() instead of mutex_init()
2024-06-17 14:45 [PATCH v3 00/17] Updates for turris-mox-rwtm driver Marek Behún
` (12 preceding siblings ...)
2024-06-17 14:45 ` [PATCH v3 13/17] firmware: turris-mox-rwtm: Drop redundant device pointer Marek Behún
@ 2024-06-17 14:45 ` Marek Behún
2024-06-17 14:45 ` [PATCH v3 15/17] firmware: turris-mox-rwtm: Use container_of() instead of hwrng .priv member Marek Behún
` (3 subsequent siblings)
17 siblings, 0 replies; 27+ messages in thread
From: Marek Behún @ 2024-06-17 14:45 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>
---
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 0b93040167b6..5a850dc27fe3 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -458,7 +458,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] 27+ messages in thread* [PATCH v3 15/17] firmware: turris-mox-rwtm: Use container_of() instead of hwrng .priv member
2024-06-17 14:45 [PATCH v3 00/17] Updates for turris-mox-rwtm driver Marek Behún
` (13 preceding siblings ...)
2024-06-17 14:45 ` [PATCH v3 14/17] firmware: turris-mox-rwtm: Use devm_mutex_init() instead of mutex_init() Marek Behún
@ 2024-06-17 14:45 ` Marek Behún
2024-06-17 20:27 ` Andy Shevchenko
2024-06-17 14:45 ` [PATCH v3 16/17] firmware: turris-mox-rwtm: Use EOPNOTSUPP instead of ENOSYS Marek Behún
` (2 subsequent siblings)
17 siblings, 1 reply; 27+ messages in thread
From: Marek Behún @ 2024-06-17 14:45 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 [1].
[1] https://lore.kernel.org/soc/ZmLhQBdmg613KdET@gondor.apana.org.au/
Signed-off-by: Marek Behún <kabel@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 5a850dc27fe3..135adfa9fb1f 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -260,7 +260,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;
@@ -489,7 +489,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] 27+ messages in thread* Re: [PATCH v3 15/17] firmware: turris-mox-rwtm: Use container_of() instead of hwrng .priv member
2024-06-17 14:45 ` [PATCH v3 15/17] firmware: turris-mox-rwtm: Use container_of() instead of hwrng .priv member Marek Behún
@ 2024-06-17 20:27 ` Andy Shevchenko
0 siblings, 0 replies; 27+ messages in thread
From: Andy Shevchenko @ 2024-06-17 20:27 UTC (permalink / raw)
To: Marek Behún
Cc: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede, Ilpo Järvinen
On Mon, Jun 17, 2024 at 4:46 PM Marek Behún <kabel@kernel.org> wrote:
>
> 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/
>
You can make this to be a Link tag.
Link: ...URL... [1]
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH v3 16/17] firmware: turris-mox-rwtm: Use EOPNOTSUPP instead of ENOSYS
2024-06-17 14:45 [PATCH v3 00/17] Updates for turris-mox-rwtm driver Marek Behún
` (14 preceding siblings ...)
2024-06-17 14:45 ` [PATCH v3 15/17] firmware: turris-mox-rwtm: Use container_of() instead of hwrng .priv member Marek Behún
@ 2024-06-17 14:45 ` Marek Behún
2024-06-17 14:45 ` [PATCH v3 17/17] firmware: turris-mox-rwtm: Deduplicate command execution code Marek Behún
2024-06-17 20:31 ` [PATCH v3 00/17] Updates for turris-mox-rwtm driver Andy Shevchenko
17 siblings, 0 replies; 27+ messages in thread
From: Marek Behún @ 2024-06-17 14:45 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>
---
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 135adfa9fb1f..9197e0549c6d 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -138,7 +138,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
@@ -186,7 +186,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) {
@@ -220,7 +220,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] 27+ messages in thread* [PATCH v3 17/17] firmware: turris-mox-rwtm: Deduplicate command execution code
2024-06-17 14:45 [PATCH v3 00/17] Updates for turris-mox-rwtm driver Marek Behún
` (15 preceding siblings ...)
2024-06-17 14:45 ` [PATCH v3 16/17] firmware: turris-mox-rwtm: Use EOPNOTSUPP instead of ENOSYS Marek Behún
@ 2024-06-17 14:45 ` Marek Behún
2024-06-17 20:29 ` Andy Shevchenko
2024-06-17 20:31 ` [PATCH v3 00/17] Updates for turris-mox-rwtm driver Andy Shevchenko
17 siblings, 1 reply; 27+ messages in thread
From: Marek Behún @ 2024-06-17 14:45 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>
---
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 9197e0549c6d..52e5cc1cf48f 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, (max + 3) & ~3 },
+ };
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] = (max + 3) & ~3;
-
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;
@@ -334,7 +323,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;
@@ -367,23 +355,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] 27+ messages in thread* Re: [PATCH v3 17/17] firmware: turris-mox-rwtm: Deduplicate command execution code
2024-06-17 14:45 ` [PATCH v3 17/17] firmware: turris-mox-rwtm: Deduplicate command execution code Marek Behún
@ 2024-06-17 20:29 ` Andy Shevchenko
0 siblings, 0 replies; 27+ messages in thread
From: Andy Shevchenko @ 2024-06-17 20:29 UTC (permalink / raw)
To: Marek Behún
Cc: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede, Ilpo Järvinen
On Mon, Jun 17, 2024 at 4:46 PM Marek Behún <kabel@kernel.org> wrote:
>
> Deduplicate rWTM command execution calls
> mbox_send_message()
> wait_for_completion()
> mox_get_status()
> to one function
> mox_rwtm_exec()
...
> + struct armada_37xx_rwtm_tx_msg msg = {
> + .args = { 1, rwtm->buf_phys, (max + 3) & ~3 },
I see that's in the original code, but perhaps later you want to
switch this to use ALIGN() macro.
> + };
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v3 00/17] Updates for turris-mox-rwtm driver
2024-06-17 14:45 [PATCH v3 00/17] Updates for turris-mox-rwtm driver Marek Behún
` (16 preceding siblings ...)
2024-06-17 14:45 ` [PATCH v3 17/17] firmware: turris-mox-rwtm: Deduplicate command execution code Marek Behún
@ 2024-06-17 20:31 ` Andy Shevchenko
17 siblings, 0 replies; 27+ messages in thread
From: Andy Shevchenko @ 2024-06-17 20:31 UTC (permalink / raw)
To: Marek Behún
Cc: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede, Ilpo Järvinen
On Mon, Jun 17, 2024 at 4:45 PM Marek Behún <kabel@kernel.org> wrote:
>
> Hi Gregory, Arnd, Andy et al.
>
> this is v3 of series of fixes, refactors and cleanups for the
> turris-mox-rwtm driver.
As far as I'm concerned this looks good enough to proceed.
FWIW,
Reviewed-by: Andy Shevchenko <andy@kernel.org>
In case of a new version, please address a few nit-picks.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 27+ messages in thread