blob: 548ff516862567eb0aea10ee5a16e90e4ce270ac [file] [log] [blame]
Marek BehĂșn19d85782021-01-05 14:01:05 +01001/*
2 * Copyright (C) 2020 Marek Behun, CZ.NIC
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 * https://spdx.org/licenses
6 */
7
8#include <stdbool.h>
9
10#include <common/debug.h>
11#include <drivers/delay_timer.h>
12#include <lib/mmio.h>
13
14#include <mvebu_def.h>
15
16/* Cortex-M3 Secure Processor Mailbox Registers */
17#define MVEBU_RWTM_PARAM0_REG (MVEBU_RWTM_REG_BASE)
18#define MVEBU_RWTM_CMD_REG (MVEBU_RWTM_REG_BASE + 0x40)
19#define MVEBU_RWTM_HOST_INT_RESET_REG (MVEBU_RWTM_REG_BASE + 0xC8)
20#define MVEBU_RWTM_HOST_INT_MASK_REG (MVEBU_RWTM_REG_BASE + 0xCC)
21#define MVEBU_RWTM_HOST_INT_SP_COMPLETE BIT(0)
22
23#define MVEBU_RWTM_REBOOT_CMD 0x0009
24#define MVEBU_RWTM_REBOOT_MAGIC 0xDEADBEEF
25
26static inline bool rwtm_completed(void)
27{
28 return (mmio_read_32(MVEBU_RWTM_HOST_INT_RESET_REG) &
29 MVEBU_RWTM_HOST_INT_SP_COMPLETE) != 0;
30}
31
32static bool rwtm_wait(int ms)
33{
34 while (ms && !rwtm_completed()) {
35 mdelay(1);
36 --ms;
37 }
38
39 return rwtm_completed();
40}
41
42void cm3_system_reset(void)
43{
44 int tries = 5;
45
46 for (; tries > 0; --tries) {
47 mmio_clrbits_32(MVEBU_RWTM_HOST_INT_RESET_REG,
48 MVEBU_RWTM_HOST_INT_SP_COMPLETE);
49
50 mmio_write_32(MVEBU_RWTM_PARAM0_REG, MVEBU_RWTM_REBOOT_MAGIC);
51 mmio_write_32(MVEBU_RWTM_CMD_REG, MVEBU_RWTM_REBOOT_CMD);
52
53 if (rwtm_wait(10)) {
54 break;
55 }
56
57 mdelay(100);
58 }
59
60 /* If we reach here, the command is not implemented. */
61 ERROR("System reset command not implemented in WTMI firmware!\n");
62}