1f1cf4b79SSumit Garg // SPDX-License-Identifier: BSD-2-Clause
2f1cf4b79SSumit Garg /*
3f1cf4b79SSumit Garg * Copyright (c) 2017, Schneider Electric
4f1cf4b79SSumit Garg * Copyright (c) 2020, Linaro Limited
5f1cf4b79SSumit Garg */
6f1cf4b79SSumit Garg
7f1cf4b79SSumit Garg #include <arm.h>
8f1cf4b79SSumit Garg #include <io.h>
9f1cf4b79SSumit Garg #include <kernel/boot.h>
10f1cf4b79SSumit Garg #include <kernel/misc.h>
11f1cf4b79SSumit Garg #include <mm/core_memprot.h>
12f1cf4b79SSumit Garg #include <platform_config.h>
13f1cf4b79SSumit Garg #include <sm/psci.h>
14f1cf4b79SSumit Garg #include <sm/std_smc.h>
15f1cf4b79SSumit Garg
16f1cf4b79SSumit Garg #define SYSCTRL_REG_RSTEN (SYSCTRL_BASE + 0x120)
17f1cf4b79SSumit Garg #define SYSCTRL_REG_RSTCTRL (SYSCTRL_BASE + 0x198)
18f1cf4b79SSumit Garg #define SYSCTRL_BOOTADDR_REG (SYSCTRL_BASE + 0x204)
19f1cf4b79SSumit Garg
20f1cf4b79SSumit Garg #define SYSCTRL_REG_RSTEN_MRESET_EN BIT(0)
21f1cf4b79SSumit Garg #define SYSCTRL_REG_RSTEN_SWRST_EN BIT(6)
22f1cf4b79SSumit Garg #define SYSCTRL_REG_RSTCTRL_SWRST_REQ BIT(6)
23f1cf4b79SSumit Garg
psci_features(uint32_t psci_fid)24f1cf4b79SSumit Garg int psci_features(uint32_t psci_fid)
25f1cf4b79SSumit Garg {
26f1cf4b79SSumit Garg switch (psci_fid) {
27f1cf4b79SSumit Garg case PSCI_PSCI_FEATURES:
28f1cf4b79SSumit Garg case PSCI_VERSION:
29f1cf4b79SSumit Garg case PSCI_CPU_ON:
30f1cf4b79SSumit Garg case PSCI_CPU_OFF:
31f1cf4b79SSumit Garg case PSCI_SYSTEM_RESET:
32f1cf4b79SSumit Garg return PSCI_RET_SUCCESS;
33f1cf4b79SSumit Garg default:
34f1cf4b79SSumit Garg return PSCI_RET_NOT_SUPPORTED;
35f1cf4b79SSumit Garg }
36f1cf4b79SSumit Garg }
37f1cf4b79SSumit Garg
psci_version(void)38f1cf4b79SSumit Garg uint32_t psci_version(void)
39f1cf4b79SSumit Garg {
40f1cf4b79SSumit Garg return PSCI_VERSION_1_0;
41f1cf4b79SSumit Garg }
42f1cf4b79SSumit Garg
psci_cpu_on(uint32_t core_id,uint32_t entry,uint32_t context_id)43f1cf4b79SSumit Garg int psci_cpu_on(uint32_t core_id, uint32_t entry, uint32_t context_id)
44f1cf4b79SSumit Garg {
45f1cf4b79SSumit Garg vaddr_t sctl_va = core_mmu_get_va(SYSCTRL_BOOTADDR_REG,
46*c2e4eb43SAnton Rybakov MEM_AREA_IO_SEC,
47*c2e4eb43SAnton Rybakov sizeof(uint32_t));
48f1cf4b79SSumit Garg
49f1cf4b79SSumit Garg if (core_id == 0 || core_id >= CFG_TEE_CORE_NB_CORE)
50f1cf4b79SSumit Garg return PSCI_RET_INVALID_PARAMETERS;
51f1cf4b79SSumit Garg
52f1cf4b79SSumit Garg DMSG("core_id: %" PRIu32, core_id);
53f1cf4b79SSumit Garg
54f1cf4b79SSumit Garg boot_set_core_ns_entry(core_id, entry, context_id);
55f1cf4b79SSumit Garg io_write32(sctl_va, TEE_LOAD_ADDR);
56f1cf4b79SSumit Garg
57f1cf4b79SSumit Garg dsb();
58f1cf4b79SSumit Garg sev();
59f1cf4b79SSumit Garg
60f1cf4b79SSumit Garg return PSCI_RET_SUCCESS;
61f1cf4b79SSumit Garg }
62f1cf4b79SSumit Garg
psci_cpu_off(void)63f1cf4b79SSumit Garg int __noreturn psci_cpu_off(void)
64f1cf4b79SSumit Garg {
65f1cf4b79SSumit Garg DMSG("core_id: %" PRIu32, get_core_pos());
66f1cf4b79SSumit Garg
67f1cf4b79SSumit Garg psci_armv7_cpu_off();
68f1cf4b79SSumit Garg
69f1cf4b79SSumit Garg thread_mask_exceptions(THREAD_EXCP_ALL);
70f1cf4b79SSumit Garg
71f1cf4b79SSumit Garg while (1)
72f1cf4b79SSumit Garg wfi();
73f1cf4b79SSumit Garg }
74f1cf4b79SSumit Garg
psci_system_reset(void)75f1cf4b79SSumit Garg void psci_system_reset(void)
76f1cf4b79SSumit Garg {
77f1cf4b79SSumit Garg /* Enable software reset */
78*c2e4eb43SAnton Rybakov io_setbits32(core_mmu_get_va(SYSCTRL_REG_RSTEN, MEM_AREA_IO_SEC,
79*c2e4eb43SAnton Rybakov sizeof(uint32_t)),
80f1cf4b79SSumit Garg SYSCTRL_REG_RSTEN_SWRST_EN | SYSCTRL_REG_RSTEN_MRESET_EN);
81f1cf4b79SSumit Garg
82f1cf4b79SSumit Garg /* Trigger software reset */
83*c2e4eb43SAnton Rybakov io_setbits32(core_mmu_get_va(SYSCTRL_REG_RSTCTRL, MEM_AREA_IO_SEC,
84*c2e4eb43SAnton Rybakov sizeof(uint32_t)),
85f1cf4b79SSumit Garg SYSCTRL_REG_RSTCTRL_SWRST_REQ);
86f1cf4b79SSumit Garg
87f1cf4b79SSumit Garg dsb();
88f1cf4b79SSumit Garg }
89