xref: /optee_os/core/drivers/pm/imx/src.c (revision c16aaf42a4b10dabc6770e1e1284ad8776c99d2c)
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