1*c16aaf42SClement Faure // SPDX-License-Identifier: BSD-2-Clause
2*c16aaf42SClement Faure /*
3*c16aaf42SClement Faure * Copyright 2019, 2023 NXP
4*c16aaf42SClement Faure */
5*c16aaf42SClement Faure
6*c16aaf42SClement Faure #include <imx.h>
7*c16aaf42SClement Faure #include <io.h>
8*c16aaf42SClement Faure #include <mm/core_mmu.h>
9*c16aaf42SClement Faure #include <mm/core_memprot.h>
10*c16aaf42SClement Faure
11*c16aaf42SClement Faure #include "local.h"
12*c16aaf42SClement Faure
13*c16aaf42SClement Faure #define SRC_SCR 0x000
14*c16aaf42SClement Faure #define SRC_A7RCR0 0x004
15*c16aaf42SClement Faure #define SRC_A7RCR1 0x008
16*c16aaf42SClement Faure #if defined(CFG_MX7)
17*c16aaf42SClement Faure #define SRC_GPR1 0x074
18*c16aaf42SClement Faure #else
19*c16aaf42SClement Faure #define SRC_GPR1 0x020
20*c16aaf42SClement Faure #endif
21*c16aaf42SClement Faure
22*c16aaf42SClement Faure #define SRC_SCR_CORE1_RST_BIT(_cpu) BIT32(14 + (_cpu) - 1)
23*c16aaf42SClement Faure #define SRC_SCR_CORE1_ENABLE_BIT(_cpu) BIT32(22 + (_cpu) - 1)
24*c16aaf42SClement Faure #define SRC_A7RCR0_A7_CORE_RESET0_BIT(_cpu) BIT32((_cpu) - 1)
25*c16aaf42SClement Faure #define SRC_A7RCR1_A7_CORE1_ENABLE_BIT(_cpu) BIT32(1 + (_cpu) - 1)
26*c16aaf42SClement Faure
27*c16aaf42SClement Faure #define ENTRY_OFFSET(_cpu) ((_cpu) * 8)
28*c16aaf42SClement Faure #define ARG_OFFSET(_cpu) (ENTRY_OFFSET(_cpu) + 4)
29*c16aaf42SClement Faure
30*c16aaf42SClement Faure register_phys_mem(MEM_AREA_IO_SEC, SRC_BASE, SRC_SIZE);
31*c16aaf42SClement Faure
imx_get_src_gpr_arg(unsigned int cpu)32*c16aaf42SClement Faure uint32_t imx_get_src_gpr_arg(unsigned int cpu)
33*c16aaf42SClement Faure {
34*c16aaf42SClement Faure vaddr_t va = core_mmu_get_va(SRC_BASE, MEM_AREA_IO_SEC, SRC_SIZE);
35*c16aaf42SClement Faure
36*c16aaf42SClement Faure return io_read32(va + SRC_GPR1 + ARG_OFFSET(cpu));
37*c16aaf42SClement Faure }
38*c16aaf42SClement Faure
imx_set_src_gpr_arg(unsigned int cpu,uint32_t val)39*c16aaf42SClement Faure void imx_set_src_gpr_arg(unsigned int cpu, uint32_t val)
40*c16aaf42SClement Faure {
41*c16aaf42SClement Faure vaddr_t va = core_mmu_get_va(SRC_BASE, MEM_AREA_IO_SEC, SRC_SIZE);
42*c16aaf42SClement Faure
43*c16aaf42SClement Faure io_write32(va + SRC_GPR1 + ARG_OFFSET(cpu), val);
44*c16aaf42SClement Faure }
45*c16aaf42SClement Faure
imx_get_src_gpr_entry(unsigned int cpu)46*c16aaf42SClement Faure uint32_t imx_get_src_gpr_entry(unsigned int cpu)
47*c16aaf42SClement Faure {
48*c16aaf42SClement Faure vaddr_t va = core_mmu_get_va(SRC_BASE, MEM_AREA_IO_SEC, SRC_SIZE);
49*c16aaf42SClement Faure
50*c16aaf42SClement Faure return io_read32(va + SRC_GPR1 + ENTRY_OFFSET(cpu));
51*c16aaf42SClement Faure }
52*c16aaf42SClement Faure
imx_set_src_gpr_entry(unsigned int cpu,uint32_t val)53*c16aaf42SClement Faure void imx_set_src_gpr_entry(unsigned int cpu, uint32_t val)
54*c16aaf42SClement Faure {
55*c16aaf42SClement Faure vaddr_t va = core_mmu_get_va(SRC_BASE, MEM_AREA_IO_SEC, SRC_SIZE);
56*c16aaf42SClement Faure
57*c16aaf42SClement Faure io_write32(va + SRC_GPR1 + ENTRY_OFFSET(cpu), val);
58*c16aaf42SClement Faure }
59*c16aaf42SClement Faure
imx_src_release_secondary_core(unsigned int cpu)60*c16aaf42SClement Faure void imx_src_release_secondary_core(unsigned int cpu)
61*c16aaf42SClement Faure {
62*c16aaf42SClement Faure vaddr_t va = core_mmu_get_va(SRC_BASE, MEM_AREA_IO_SEC, SRC_SIZE);
63*c16aaf42SClement Faure
64*c16aaf42SClement Faure if (soc_is_imx7ds())
65*c16aaf42SClement Faure io_setbits32(va + SRC_A7RCR1,
66*c16aaf42SClement Faure SRC_A7RCR1_A7_CORE1_ENABLE_BIT(cpu));
67*c16aaf42SClement Faure else
68*c16aaf42SClement Faure io_setbits32(va + SRC_SCR, SRC_SCR_CORE1_ENABLE_BIT(cpu) |
69*c16aaf42SClement Faure SRC_SCR_CORE1_RST_BIT(cpu));
70*c16aaf42SClement Faure }
71*c16aaf42SClement Faure
imx_src_shutdown_core(unsigned int cpu)72*c16aaf42SClement Faure void imx_src_shutdown_core(unsigned int cpu)
73*c16aaf42SClement Faure {
74*c16aaf42SClement Faure vaddr_t va = core_mmu_get_va(SRC_BASE, MEM_AREA_IO_SEC, SRC_SIZE);
75*c16aaf42SClement Faure
76*c16aaf42SClement Faure if (soc_is_imx7ds()) {
77*c16aaf42SClement Faure io_clrbits32(va + SRC_A7RCR1,
78*c16aaf42SClement Faure SRC_A7RCR1_A7_CORE1_ENABLE_BIT(cpu));
79*c16aaf42SClement Faure } else {
80*c16aaf42SClement Faure uint32_t mask = io_read32(va + SRC_SCR);
81*c16aaf42SClement Faure
82*c16aaf42SClement Faure mask &= ~SRC_SCR_CORE1_ENABLE_BIT(cpu);
83*c16aaf42SClement Faure mask |= SRC_SCR_CORE1_RST_BIT(cpu);
84*c16aaf42SClement Faure io_write32(va + SRC_SCR, mask);
85*c16aaf42SClement Faure }
86*c16aaf42SClement Faure }
87