xref: /openbmc/u-boot/arch/arm/mach-versal/mp.c (revision d391c13c99a2b48c98cef6df4479247cd4e62f9d)
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