1*4244f2b7SSiva Durga Prasad Paladugu // SPDX-License-Identifier: GPL-2.0
2*4244f2b7SSiva Durga Prasad Paladugu /*
3*4244f2b7SSiva Durga Prasad Paladugu * (C) Copyright 2019 Xilinx, Inc.
4*4244f2b7SSiva Durga Prasad Paladugu * Siva Durga Prasad <siva.durga.paladugu@xilinx.com>
5*4244f2b7SSiva Durga Prasad Paladugu */
6*4244f2b7SSiva Durga Prasad Paladugu
7*4244f2b7SSiva Durga Prasad Paladugu #include <common.h>
8*4244f2b7SSiva Durga Prasad Paladugu #include <asm/io.h>
9*4244f2b7SSiva Durga Prasad Paladugu #include <asm/arch/hardware.h>
10*4244f2b7SSiva Durga Prasad Paladugu #include <asm/arch/sys_proto.h>
11*4244f2b7SSiva Durga Prasad Paladugu
12*4244f2b7SSiva Durga Prasad Paladugu DECLARE_GLOBAL_DATA_PTR;
13*4244f2b7SSiva Durga Prasad Paladugu
14*4244f2b7SSiva Durga Prasad Paladugu #define HALT 0
15*4244f2b7SSiva Durga Prasad Paladugu #define RELEASE 1
16*4244f2b7SSiva Durga Prasad Paladugu
17*4244f2b7SSiva Durga Prasad Paladugu #define VERSAL_RPU_CFG_CPU_HALT_MASK 0x01
18*4244f2b7SSiva Durga Prasad Paladugu #define VERSAL_RPU_GLBL_CTRL_SPLIT_LOCK_MASK 0x08
19*4244f2b7SSiva Durga Prasad Paladugu #define VERSAL_RPU_GLBL_CTRL_TCM_COMB_MASK 0x40
20*4244f2b7SSiva Durga Prasad Paladugu #define VERSAL_RPU_GLBL_CTRL_SLCLAMP_MASK 0x10
21*4244f2b7SSiva Durga Prasad Paladugu
22*4244f2b7SSiva Durga Prasad Paladugu #define VERSAL_CRLAPB_RST_LPD_AMBA_RST_MASK 0x04
23*4244f2b7SSiva Durga Prasad Paladugu #define VERSAL_CRLAPB_RST_LPD_R50_RST_MASK 0x01
24*4244f2b7SSiva Durga Prasad Paladugu #define VERSAL_CRLAPB_RST_LPD_R51_RST_MASK 0x02
25*4244f2b7SSiva Durga Prasad Paladugu #define VERSAL_CRL_RST_CPU_R5_RESET_PGE_MASK 0x10
26*4244f2b7SSiva Durga Prasad Paladugu #define VERSAL_CRLAPB_CPU_R5_CTRL_CLKACT_MASK 0x1000000
27*4244f2b7SSiva Durga Prasad Paladugu
set_r5_halt_mode(u8 halt,u8 mode)28*4244f2b7SSiva Durga Prasad Paladugu void set_r5_halt_mode(u8 halt, u8 mode)
29*4244f2b7SSiva Durga Prasad Paladugu {
30*4244f2b7SSiva Durga Prasad Paladugu u32 tmp;
31*4244f2b7SSiva Durga Prasad Paladugu
32*4244f2b7SSiva Durga Prasad Paladugu tmp = readl(&rpu_base->rpu0_cfg);
33*4244f2b7SSiva Durga Prasad Paladugu if (halt == HALT)
34*4244f2b7SSiva Durga Prasad Paladugu tmp &= ~VERSAL_RPU_CFG_CPU_HALT_MASK;
35*4244f2b7SSiva Durga Prasad Paladugu else
36*4244f2b7SSiva Durga Prasad Paladugu tmp |= VERSAL_RPU_CFG_CPU_HALT_MASK;
37*4244f2b7SSiva Durga Prasad Paladugu writel(tmp, &rpu_base->rpu0_cfg);
38*4244f2b7SSiva Durga Prasad Paladugu
39*4244f2b7SSiva Durga Prasad Paladugu if (mode == TCM_LOCK) {
40*4244f2b7SSiva Durga Prasad Paladugu tmp = readl(&rpu_base->rpu1_cfg);
41*4244f2b7SSiva Durga Prasad Paladugu if (halt == HALT)
42*4244f2b7SSiva Durga Prasad Paladugu tmp &= ~VERSAL_RPU_CFG_CPU_HALT_MASK;
43*4244f2b7SSiva Durga Prasad Paladugu else
44*4244f2b7SSiva Durga Prasad Paladugu tmp |= VERSAL_RPU_CFG_CPU_HALT_MASK;
45*4244f2b7SSiva Durga Prasad Paladugu writel(tmp, &rpu_base->rpu1_cfg);
46*4244f2b7SSiva Durga Prasad Paladugu }
47*4244f2b7SSiva Durga Prasad Paladugu }
48*4244f2b7SSiva Durga Prasad Paladugu
set_r5_tcm_mode(u8 mode)49*4244f2b7SSiva Durga Prasad Paladugu void set_r5_tcm_mode(u8 mode)
50*4244f2b7SSiva Durga Prasad Paladugu {
51*4244f2b7SSiva Durga Prasad Paladugu u32 tmp;
52*4244f2b7SSiva Durga Prasad Paladugu
53*4244f2b7SSiva Durga Prasad Paladugu tmp = readl(&rpu_base->rpu_glbl_ctrl);
54*4244f2b7SSiva Durga Prasad Paladugu if (mode == TCM_LOCK) {
55*4244f2b7SSiva Durga Prasad Paladugu tmp &= ~VERSAL_RPU_GLBL_CTRL_SPLIT_LOCK_MASK;
56*4244f2b7SSiva Durga Prasad Paladugu tmp |= VERSAL_RPU_GLBL_CTRL_TCM_COMB_MASK |
57*4244f2b7SSiva Durga Prasad Paladugu VERSAL_RPU_GLBL_CTRL_SLCLAMP_MASK;
58*4244f2b7SSiva Durga Prasad Paladugu } else {
59*4244f2b7SSiva Durga Prasad Paladugu tmp |= VERSAL_RPU_GLBL_CTRL_SPLIT_LOCK_MASK;
60*4244f2b7SSiva Durga Prasad Paladugu tmp &= ~(VERSAL_RPU_GLBL_CTRL_TCM_COMB_MASK |
61*4244f2b7SSiva Durga Prasad Paladugu VERSAL_RPU_GLBL_CTRL_SLCLAMP_MASK);
62*4244f2b7SSiva Durga Prasad Paladugu }
63*4244f2b7SSiva Durga Prasad Paladugu
64*4244f2b7SSiva Durga Prasad Paladugu writel(tmp, &rpu_base->rpu_glbl_ctrl);
65*4244f2b7SSiva Durga Prasad Paladugu }
66*4244f2b7SSiva Durga Prasad Paladugu
release_r5_reset(u8 mode)67*4244f2b7SSiva Durga Prasad Paladugu void release_r5_reset(u8 mode)
68*4244f2b7SSiva Durga Prasad Paladugu {
69*4244f2b7SSiva Durga Prasad Paladugu u32 tmp;
70*4244f2b7SSiva Durga Prasad Paladugu
71*4244f2b7SSiva Durga Prasad Paladugu tmp = readl(&crlapb_base->rst_cpu_r5);
72*4244f2b7SSiva Durga Prasad Paladugu tmp &= ~(VERSAL_CRLAPB_RST_LPD_AMBA_RST_MASK |
73*4244f2b7SSiva Durga Prasad Paladugu VERSAL_CRLAPB_RST_LPD_R50_RST_MASK |
74*4244f2b7SSiva Durga Prasad Paladugu VERSAL_CRL_RST_CPU_R5_RESET_PGE_MASK);
75*4244f2b7SSiva Durga Prasad Paladugu
76*4244f2b7SSiva Durga Prasad Paladugu if (mode == TCM_LOCK)
77*4244f2b7SSiva Durga Prasad Paladugu tmp &= ~VERSAL_CRLAPB_RST_LPD_R51_RST_MASK;
78*4244f2b7SSiva Durga Prasad Paladugu
79*4244f2b7SSiva Durga Prasad Paladugu writel(tmp, &crlapb_base->rst_cpu_r5);
80*4244f2b7SSiva Durga Prasad Paladugu }
81*4244f2b7SSiva Durga Prasad Paladugu
enable_clock_r5(void)82*4244f2b7SSiva Durga Prasad Paladugu void enable_clock_r5(void)
83*4244f2b7SSiva Durga Prasad Paladugu {
84*4244f2b7SSiva Durga Prasad Paladugu u32 tmp;
85*4244f2b7SSiva Durga Prasad Paladugu
86*4244f2b7SSiva Durga Prasad Paladugu tmp = readl(&crlapb_base->cpu_r5_ctrl);
87*4244f2b7SSiva Durga Prasad Paladugu tmp |= VERSAL_CRLAPB_CPU_R5_CTRL_CLKACT_MASK;
88*4244f2b7SSiva Durga Prasad Paladugu writel(tmp, &crlapb_base->cpu_r5_ctrl);
89*4244f2b7SSiva Durga Prasad Paladugu }
90*4244f2b7SSiva Durga Prasad Paladugu
initialize_tcm(bool mode)91*4244f2b7SSiva Durga Prasad Paladugu void initialize_tcm(bool mode)
92*4244f2b7SSiva Durga Prasad Paladugu {
93*4244f2b7SSiva Durga Prasad Paladugu if (!mode) {
94*4244f2b7SSiva Durga Prasad Paladugu set_r5_tcm_mode(TCM_LOCK);
95*4244f2b7SSiva Durga Prasad Paladugu set_r5_halt_mode(HALT, TCM_LOCK);
96*4244f2b7SSiva Durga Prasad Paladugu enable_clock_r5();
97*4244f2b7SSiva Durga Prasad Paladugu release_r5_reset(TCM_LOCK);
98*4244f2b7SSiva Durga Prasad Paladugu } else {
99*4244f2b7SSiva Durga Prasad Paladugu set_r5_tcm_mode(TCM_SPLIT);
100*4244f2b7SSiva Durga Prasad Paladugu set_r5_halt_mode(HALT, TCM_SPLIT);
101*4244f2b7SSiva Durga Prasad Paladugu enable_clock_r5();
102*4244f2b7SSiva Durga Prasad Paladugu release_r5_reset(TCM_SPLIT);
103*4244f2b7SSiva Durga Prasad Paladugu }
104*4244f2b7SSiva Durga Prasad Paladugu }
105*4244f2b7SSiva Durga Prasad Paladugu
tcm_init(u8 mode)106*4244f2b7SSiva Durga Prasad Paladugu void tcm_init(u8 mode)
107*4244f2b7SSiva Durga Prasad Paladugu {
108*4244f2b7SSiva Durga Prasad Paladugu puts("WARNING: Initializing TCM overwrites TCM content\n");
109*4244f2b7SSiva Durga Prasad Paladugu initialize_tcm(mode);
110*4244f2b7SSiva Durga Prasad Paladugu memset((void *)VERSAL_TCM_BASE_ADDR, 0, VERSAL_TCM_SIZE);
111*4244f2b7SSiva Durga Prasad Paladugu }
112