[PATCH u-boot-mvebu v2 4/5] arm: mvebu: a37xx: Extend mbox_do_cmd() code

Stefan Roese sr at denx.de
Fri Feb 18 15:16:07 CET 2022


On 2/17/22 19:50, Pali Rohár wrote:
> Allow to specify input parameters, define all available mbox commands
> supported by CZ.NIC's secure firmware and also Marvell's fuse.bin firmware
> and fix parsing response from Marvell OTP commands.
> 
> Signed-off-by: Pali Rohár <pali at kernel.org>
> Reviewed-by: Marek Behún <marek.behun at nic.cz>

Reviewed-by: Stefan Roese <sr at denx.de>

Thanks,
Stefan

> ---
>   arch/arm/mach-mvebu/armada3700/mbox.c   | 20 ++++++++++++++++++--
>   arch/arm/mach-mvebu/include/mach/mbox.h | 19 ++++++++++++++++++-
>   board/CZ.NIC/turris_mox/mox_sp.c        |  4 ++--
>   3 files changed, 38 insertions(+), 5 deletions(-)
> 
> diff --git a/arch/arm/mach-mvebu/armada3700/mbox.c b/arch/arm/mach-mvebu/armada3700/mbox.c
> index cb86b967c2eb..eb1f82845f0f 100644
> --- a/arch/arm/mach-mvebu/armada3700/mbox.c
> +++ b/arch/arm/mach-mvebu/armada3700/mbox.c
> @@ -1,6 +1,7 @@
>   // SPDX-License-Identifier: GPL-2.0+
>   /*
>    * Copyright (C) 2018 Marek Behun <marek.behun at nic.cz>
> + * Copyright (C) 2021 Pali Rohár <pali at kernel.org>
>    */
>   
>   #include <common.h>
> @@ -15,6 +16,7 @@
>   #define RWTM_CMD		(RWTM_BASE + 0x40)
>   #define RWTM_CMD_RETSTATUS	(RWTM_BASE + 0x80)
>   #define RWTM_CMD_STATUS(i)	(size_t)(RWTM_BASE + 0x84 + (i) * 4)
> +#define MAX_ARGS		16
>   
>   #define RWTM_HOST_INT_RESET	(RWTM_BASE + 0xc8)
>   #define RWTM_HOST_INT_MASK	(RWTM_BASE + 0xcc)
> @@ -27,15 +29,27 @@
>   #define MBOX_STS_ERROR(s)		((s) & (3 << 30))
>   #define MBOX_STS_VALUE(s)		(((s) >> 10) & 0xfffff)
>   #define MBOX_STS_CMD(s)			((s) & 0x3ff)
> +#define MBOX_STS_MARVELL_ERROR(s)	((s) == 0 ? 0         : \
> +					 (s) == 2 ? ETIMEDOUT : \
> +					 (s) == 3 ? EINVAL    : \
> +					 (s) == 4 ? ENOSYS    : \
> +					            EIO)
>   
> -int mbox_do_cmd(enum mbox_cmd cmd, u32 *out, int nout)
> +int mbox_do_cmd(enum mbox_cmd cmd, u32 *in, int nin, u32 *out, int nout)
>   {
>   	const int tries = 50;
>   	int i;
>   	u32 status;
>   
> +	if (nin > MAX_ARGS || nout > MAX_ARGS)
> +		return -EINVAL;
> +
>   	clrbits_le32(RWTM_HOST_INT_MASK, SP_CMD_COMPLETE);
>   
> +	for (i = 0; i < nin; i++)
> +		writel(in[i], RWTM_CMD_PARAM(i));
> +	for (; i < MAX_ARGS; i++)
> +		writel(0x0, RWTM_CMD_PARAM(i));
>   	writel(cmd, RWTM_CMD);
>   
>   	for (i = 0; i < tries; ++i) {
> @@ -57,9 +71,11 @@ int mbox_do_cmd(enum mbox_cmd cmd, u32 *out, int nout)
>   	setbits_le32(RWTM_HOST_INT_RESET, SP_CMD_COMPLETE);
>   
>   	if (MBOX_STS_CMD(status) != cmd)
> -		return -EIO;
> +		return -MBOX_STS_MARVELL_ERROR(status);
>   	else if (MBOX_STS_ERROR(status) == MBOX_STS_FAIL)
>   		return -(int)MBOX_STS_VALUE(status);
> +	else if (MBOX_STS_ERROR(status) == MBOX_STS_BADCMD)
> +		return -ENOSYS;
>   	else if (MBOX_STS_ERROR(status) != MBOX_STS_SUCCESS)
>   		return -EIO;
>   	else
> diff --git a/arch/arm/mach-mvebu/include/mach/mbox.h b/arch/arm/mach-mvebu/include/mach/mbox.h
> index 981204935832..f1cb55f2bfe7 100644
> --- a/arch/arm/mach-mvebu/include/mach/mbox.h
> +++ b/arch/arm/mach-mvebu/include/mach/mbox.h
> @@ -1,6 +1,7 @@
>   /* SPDX-License-Identifier: GPL-2.0+ */
>   /*
>    * Copyright (C) 2018 Marek Behun <marek.behun at nic.cz>
> + * Copyright (C) 2021 Pali Rohár <pali at kernel.org>
>    */
>   
>   #ifndef _MVEBU_MBOX_H
> @@ -16,8 +17,24 @@ enum mbox_cmd {
>   
>   	MBOX_CMD_OTP_READ,
>   	MBOX_CMD_OTP_WRITE,
> +
> +	MBOX_CMD_REBOOT,
> +
> +	/* OTP read commands supported by Marvell fuse.bin firmware */
> +	MBOX_CMD_OTP_READ_1B	= 257,
> +	MBOX_CMD_OTP_READ_8B,
> +	MBOX_CMD_OTP_READ_32B,
> +	MBOX_CMD_OTP_READ_64B,
> +	MBOX_CMD_OTP_READ_256B,
> +
> +	/* OTP write commands supported by Marvell fuse.bin firmware */
> +	MBOX_CMD_OTP_WRITE_1B	= 513,
> +	MBOX_CMD_OTP_WRITE_8B,
> +	MBOX_CMD_OTP_WRITE_32B,
> +	MBOX_CMD_OTP_WRITE_64B,
> +	MBOX_CMD_OTP_WRITE_256B,
>   };
>   
> -int mbox_do_cmd(enum mbox_cmd cmd, u32 *in, int nout);
> +int mbox_do_cmd(enum mbox_cmd cmd, u32 *in, int nin, u32 *out, int nout);
>   
>   #endif
> diff --git a/board/CZ.NIC/turris_mox/mox_sp.c b/board/CZ.NIC/turris_mox/mox_sp.c
> index 4de067bbebbb..93e96b014fca 100644
> --- a/board/CZ.NIC/turris_mox/mox_sp.c
> +++ b/board/CZ.NIC/turris_mox/mox_sp.c
> @@ -19,7 +19,7 @@ const char *mox_sp_get_ecdsa_public_key(void)
>   	if (public_key[0])
>   		return public_key;
>   
> -	res = mbox_do_cmd(MBOX_CMD_ECDSA_PUB_KEY, out, 16);
> +	res = mbox_do_cmd(MBOX_CMD_ECDSA_PUB_KEY, NULL, 0, out, 16);
>   	if (res < 0)
>   		return NULL;
>   
> @@ -47,7 +47,7 @@ int mbox_sp_get_board_info(u64 *sn, u8 *mac1, u8 *mac2, int *bv, int *ram)
>   	u32 out[8];
>   	int res;
>   
> -	res = mbox_do_cmd(MBOX_CMD_BOARD_INFO, out, 8);
> +	res = mbox_do_cmd(MBOX_CMD_BOARD_INFO, NULL, 0, out, 8);
>   	if (res < 0)
>   		return res;
>   

Viele Grüße,
Stefan Roese

-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: sr at denx.de


More information about the U-Boot mailing list