Commit d9243f26 authored by Marek Behún's avatar Marek Behún
Browse files

plat: marvell: armada: a3k: support doing system reset via CM3 secure coprocessor



Introduce a new build option CM3_SYSTEM_RESET for A3700 platform, which,
when enabled, adds code to the PSCI reset handler to try to do system
reset by the WTMI firmware running on the Cortex-M3 secure coprocessor.
(This function is exposed via the mailbox interface.)

The reason is that the Turris MOX board has a HW bug which causes reset
to hang unpredictably. This issue can be solved by putting the board in
a specific state before reset.
Signed-off-by: default avatarMarek Behún <marek.behun@nic.cz>
Change-Id: I3f60b9f244f334adcd33d6db6a361fbc8b8d209f
parent 0b18d5a5
...@@ -86,6 +86,20 @@ There are several build options: ...@@ -86,6 +86,20 @@ There are several build options:
There is no reason to enable this feature if OP-TEE OS built with CFG_WITH_PAGER=n. There is no reason to enable this feature if OP-TEE OS built with CFG_WITH_PAGER=n.
Only set LLC_SRAM=1 if OP-TEE OS is built with CFG_WITH_PAGER=y. Only set LLC_SRAM=1 if OP-TEE OS is built with CFG_WITH_PAGER=y.
- CM3_SYSTEM_RESET
For Armada37x0 only, when ``CM3_SYSTEM_RESET=1``, the Cortex-M3 secure coprocessor will
be used for system reset.
TF-A will send command 0x0009 with a magic value via the rWTM mailbox interface to the
Cortex-M3 secure coprocessor.
The firmware running in the coprocessor must either implement this functionality or
ignore the 0x0009 command (which is true for the firmware from A3700-utils-marvell
repository). If this option is enabled but the firmware does not support this command,
an error message will be printed prior trying to reboot via the usual way.
This option is needed on Turris MOX as a workaround to a HW bug which causes reset to
sometime hang the board.
- MARVELL_SECURE_BOOT - MARVELL_SECURE_BOOT
Build trusted(=1)/non trusted(=0) image, default is non trusted. Build trusted(=1)/non trusted(=0) image, default is non trusted.
...@@ -209,7 +223,8 @@ To build just TF-A without WTMI image (useful for A3720 Turris MOX board), run f ...@@ -209,7 +223,8 @@ To build just TF-A without WTMI image (useful for A3720 Turris MOX board), run f
.. code:: shell .. code:: shell
> make USE_COHERENT_MEM=0 PLAT=a3700 BL33=/path/to/u-boot.bin CROSS_COMPILE=aarch64-linux-gnu- mrvl_bootimage > make USE_COHERENT_MEM=0 PLAT=a3700 CM3_SYSTEM_RESET=1 BL33=/path/to/u-boot.bin \
CROSS_COMPILE=aarch64-linux-gnu- mrvl_bootimage
Supported MARVELL_PLATFORM are: Supported MARVELL_PLATFORM are:
- a3700 (for both A3720 DB and EspressoBin) - a3700 (for both A3720 DB and EspressoBin)
......
# #
# Copyright (C) 2018 Marvell International Ltd. # Copyright (C) 2018-2020 Marvell International Ltd.
# #
# SPDX-License-Identifier: BSD-3-Clause # SPDX-License-Identifier: BSD-3-Clause
# https://spdx.org/licenses # https://spdx.org/licenses
...@@ -64,6 +64,10 @@ BL31_SOURCES += lib/cpus/aarch64/cortex_a53.S \ ...@@ -64,6 +64,10 @@ BL31_SOURCES += lib/cpus/aarch64/cortex_a53.S \
$(PLAT_COMMON_BASE)/a3700_sip_svc.c \ $(PLAT_COMMON_BASE)/a3700_sip_svc.c \
$(MARVELL_DRV) $(MARVELL_DRV)
ifeq ($(CM3_SYSTEM_RESET),1)
BL31_SOURCES += $(PLAT_COMMON_BASE)/cm3_system_reset.c
endif
ifdef WTP ifdef WTP
DOIMAGEPATH := $(WTP) DOIMAGEPATH := $(WTP)
......
/*
* Copyright (C) 2020 Marek Behun, CZ.NIC
*
* SPDX-License-Identifier: BSD-3-Clause
* https://spdx.org/licenses
*/
#include <stdbool.h>
#include <common/debug.h>
#include <drivers/delay_timer.h>
#include <lib/mmio.h>
#include <mvebu_def.h>
/* Cortex-M3 Secure Processor Mailbox Registers */
#define MVEBU_RWTM_PARAM0_REG (MVEBU_RWTM_REG_BASE)
#define MVEBU_RWTM_CMD_REG (MVEBU_RWTM_REG_BASE + 0x40)
#define MVEBU_RWTM_HOST_INT_RESET_REG (MVEBU_RWTM_REG_BASE + 0xC8)
#define MVEBU_RWTM_HOST_INT_MASK_REG (MVEBU_RWTM_REG_BASE + 0xCC)
#define MVEBU_RWTM_HOST_INT_SP_COMPLETE BIT(0)
#define MVEBU_RWTM_REBOOT_CMD 0x0009
#define MVEBU_RWTM_REBOOT_MAGIC 0xDEADBEEF
static inline bool rwtm_completed(void)
{
return (mmio_read_32(MVEBU_RWTM_HOST_INT_RESET_REG) &
MVEBU_RWTM_HOST_INT_SP_COMPLETE) != 0;
}
static bool rwtm_wait(int ms)
{
while (ms && !rwtm_completed()) {
mdelay(1);
--ms;
}
return rwtm_completed();
}
void cm3_system_reset(void)
{
int tries = 5;
for (; tries > 0; --tries) {
mmio_clrbits_32(MVEBU_RWTM_HOST_INT_RESET_REG,
MVEBU_RWTM_HOST_INT_SP_COMPLETE);
mmio_write_32(MVEBU_RWTM_PARAM0_REG, MVEBU_RWTM_REBOOT_MAGIC);
mmio_write_32(MVEBU_RWTM_CMD_REG, MVEBU_RWTM_REBOOT_CMD);
if (rwtm_wait(10)) {
break;
}
mdelay(100);
}
/* If we reach here, the command is not implemented. */
ERROR("System reset command not implemented in WTMI firmware!\n");
}
/* /*
* Copyright (C) 2018 Marvell International Ltd. * Copyright (C) 2018-2020 Marvell International Ltd.
* *
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
* https://spdx.org/licenses * https://spdx.org/licenses
...@@ -119,4 +119,10 @@ ...@@ -119,4 +119,10 @@
*/ */
#define MVEBU_COMPHY_REG_BASE (MVEBU_REGS_BASE + 0x18300) #define MVEBU_COMPHY_REG_BASE (MVEBU_REGS_BASE + 0x18300)
/*****************************************************************************
* Cortex-M3 Secure Processor Mailbox constants
*****************************************************************************
*/
#define MVEBU_RWTM_REG_BASE (MVEBU_REGS_BASE + 0xB0000)
#endif /* A3700_PLAT_DEF_H */ #endif /* A3700_PLAT_DEF_H */
/* /*
* Copyright (C) 2016 Marvell International Ltd. * Copyright (C) 2016-2020 Marvell International Ltd.
* *
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
* https://spdx.org/licenses * https://spdx.org/licenses
...@@ -48,4 +48,6 @@ struct pm_wake_up_src_config { ...@@ -48,4 +48,6 @@ struct pm_wake_up_src_config {
struct pm_wake_up_src_config *mv_wake_up_src_config_get(void); struct pm_wake_up_src_config *mv_wake_up_src_config_get(void);
void cm3_system_reset(void);
#endif /* A3700_PM_H */ #endif /* A3700_PM_H */
/* /*
* Copyright (C) 2018 Marvell International Ltd. * Copyright (C) 2018-2020 Marvell International Ltd.
* *
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
* https://spdx.org/licenses * https://spdx.org/licenses
...@@ -763,6 +763,11 @@ static void __dead2 a3700_system_off(void) ...@@ -763,6 +763,11 @@ static void __dead2 a3700_system_off(void)
panic(); panic();
} }
#pragma weak cm3_system_reset
void cm3_system_reset(void)
{
}
/***************************************************************************** /*****************************************************************************
* A3700 handlers to reset the system * A3700 handlers to reset the system
***************************************************************************** *****************************************************************************
...@@ -780,6 +785,9 @@ static void __dead2 a3700_system_reset(void) ...@@ -780,6 +785,9 @@ static void __dead2 a3700_system_reset(void)
2 * sizeof(uint64_t)); 2 * sizeof(uint64_t));
#endif #endif
/* Use Cortex-M3 secure coprocessor for system reset */
cm3_system_reset();
/* Trigger the warm reset */ /* Trigger the warm reset */
mmio_write_32(MVEBU_WARM_RESET_REG, MVEBU_WARM_RESET_MAGIC); mmio_write_32(MVEBU_WARM_RESET_REG, MVEBU_WARM_RESET_MAGIC);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment