xref: /rk3399_rockchip-uboot/board/armltd/integrator/lowlevel_init.S (revision 576afd4faeba1519bcb8c0083c3e4d45e5643a48)
1*576afd4fSJean-Christophe PLAGNIOL-VILLARD/*
2*576afd4fSJean-Christophe PLAGNIOL-VILLARD * Board specific setup info
3*576afd4fSJean-Christophe PLAGNIOL-VILLARD *
4*576afd4fSJean-Christophe PLAGNIOL-VILLARD * (C) Copyright 2004, ARM Ltd.
5*576afd4fSJean-Christophe PLAGNIOL-VILLARD * Philippe Robin, <philippe.robin@arm.com>
6*576afd4fSJean-Christophe PLAGNIOL-VILLARD *
7*576afd4fSJean-Christophe PLAGNIOL-VILLARD * See file CREDITS for list of people who contributed to this
8*576afd4fSJean-Christophe PLAGNIOL-VILLARD * project.
9*576afd4fSJean-Christophe PLAGNIOL-VILLARD *
10*576afd4fSJean-Christophe PLAGNIOL-VILLARD * This program is free software; you can redistribute it and/or
11*576afd4fSJean-Christophe PLAGNIOL-VILLARD * modify it under the terms of the GNU General Public License as
12*576afd4fSJean-Christophe PLAGNIOL-VILLARD * published by the Free Software Foundation; either version 2 of
13*576afd4fSJean-Christophe PLAGNIOL-VILLARD * the License, or (at your option) any later version.
14*576afd4fSJean-Christophe PLAGNIOL-VILLARD *
15*576afd4fSJean-Christophe PLAGNIOL-VILLARD * This program is distributed in the hope that it will be useful,
16*576afd4fSJean-Christophe PLAGNIOL-VILLARD * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*576afd4fSJean-Christophe PLAGNIOL-VILLARD * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
18*576afd4fSJean-Christophe PLAGNIOL-VILLARD * GNU General Public License for more details.
19*576afd4fSJean-Christophe PLAGNIOL-VILLARD *
20*576afd4fSJean-Christophe PLAGNIOL-VILLARD * You should have received a copy of the GNU General Public License
21*576afd4fSJean-Christophe PLAGNIOL-VILLARD * along with this program; if not, write to the Free Software
22*576afd4fSJean-Christophe PLAGNIOL-VILLARD * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
23*576afd4fSJean-Christophe PLAGNIOL-VILLARD * MA 02111-1307 USA
24*576afd4fSJean-Christophe PLAGNIOL-VILLARD */
25*576afd4fSJean-Christophe PLAGNIOL-VILLARD
26*576afd4fSJean-Christophe PLAGNIOL-VILLARD#include <config.h>
27*576afd4fSJean-Christophe PLAGNIOL-VILLARD#include <version.h>
28*576afd4fSJean-Christophe PLAGNIOL-VILLARD
29*576afd4fSJean-Christophe PLAGNIOL-VILLARD	/* Reset using CM control register */
30*576afd4fSJean-Christophe PLAGNIOL-VILLARD.global reset_cpu
31*576afd4fSJean-Christophe PLAGNIOL-VILLARDreset_cpu:
32*576afd4fSJean-Christophe PLAGNIOL-VILLARD	mov	r0, #CM_BASE
33*576afd4fSJean-Christophe PLAGNIOL-VILLARD	ldr	r1,[r0,#OS_CTRL]
34*576afd4fSJean-Christophe PLAGNIOL-VILLARD	orr	r1,r1,#CMMASK_RESET
35*576afd4fSJean-Christophe PLAGNIOL-VILLARD	str	r1,[r0,#OS_CTRL]
36*576afd4fSJean-Christophe PLAGNIOL-VILLARD
37*576afd4fSJean-Christophe PLAGNIOL-VILLARDreset_failed:
38*576afd4fSJean-Christophe PLAGNIOL-VILLARD	b	reset_failed
39*576afd4fSJean-Christophe PLAGNIOL-VILLARD
40*576afd4fSJean-Christophe PLAGNIOL-VILLARD/* Set up the platform, once the cpu has been initialized */
41*576afd4fSJean-Christophe PLAGNIOL-VILLARD.globl lowlevel_init
42*576afd4fSJean-Christophe PLAGNIOL-VILLARDlowlevel_init:
43*576afd4fSJean-Christophe PLAGNIOL-VILLARD	/* If U-Boot has been run after the ARM boot monitor
44*576afd4fSJean-Christophe PLAGNIOL-VILLARD	 * then all the necessary actions have been done
45*576afd4fSJean-Christophe PLAGNIOL-VILLARD	 * otherwise we are running from user flash mapped to 0x00000000
46*576afd4fSJean-Christophe PLAGNIOL-VILLARD	 * --- DO NOT REMAP BEFORE THE CODE HAS BEEN RELOCATED --
47*576afd4fSJean-Christophe PLAGNIOL-VILLARD	 * Changes to the (possibly soft) reset defaults of the processor
48*576afd4fSJean-Christophe PLAGNIOL-VILLARD	 * itself should be performed in cpu/arm<>/start.S
49*576afd4fSJean-Christophe PLAGNIOL-VILLARD	 * This function affects only the core module or board settings
50*576afd4fSJean-Christophe PLAGNIOL-VILLARD	 */
51*576afd4fSJean-Christophe PLAGNIOL-VILLARD
52*576afd4fSJean-Christophe PLAGNIOL-VILLARD#ifdef CONFIG_CM_INIT
53*576afd4fSJean-Christophe PLAGNIOL-VILLARD	/* CM has an initialization register
54*576afd4fSJean-Christophe PLAGNIOL-VILLARD	 * - bits in it are wired into test-chip pins to force
55*576afd4fSJean-Christophe PLAGNIOL-VILLARD	 *   reset defaults
56*576afd4fSJean-Christophe PLAGNIOL-VILLARD	 * - may need to change its contents for U-Boot
57*576afd4fSJean-Christophe PLAGNIOL-VILLARD	 */
58*576afd4fSJean-Christophe PLAGNIOL-VILLARD
59*576afd4fSJean-Christophe PLAGNIOL-VILLARD	/* set the desired CM specific value */
60*576afd4fSJean-Christophe PLAGNIOL-VILLARD	mov	r2,#CMMASK_LOWVEC	/* Vectors at 0x00000000 for all */
61*576afd4fSJean-Christophe PLAGNIOL-VILLARD
62*576afd4fSJean-Christophe PLAGNIOL-VILLARD#if defined (CONFIG_CM10200E) || defined (CONFIG_CM10220E)
63*576afd4fSJean-Christophe PLAGNIOL-VILLARD	orr	r2,r2,#CMMASK_INIT_102
64*576afd4fSJean-Christophe PLAGNIOL-VILLARD#else
65*576afd4fSJean-Christophe PLAGNIOL-VILLARD
66*576afd4fSJean-Christophe PLAGNIOL-VILLARD#if !defined (CONFIG_CM920T) && !defined (CONFIG_CM920T_ETM) && \
67*576afd4fSJean-Christophe PLAGNIOL-VILLARD     !defined (CONFIG_CM940T)
68*576afd4fSJean-Christophe PLAGNIOL-VILLARD
69*576afd4fSJean-Christophe PLAGNIOL-VILLARD#ifdef	CONFIG_CM_MULTIPLE_SSRAM
70*576afd4fSJean-Christophe PLAGNIOL-VILLARD	/* set simple mapping			*/
71*576afd4fSJean-Christophe PLAGNIOL-VILLARD	and	r2,r2,#CMMASK_MAP_SIMPLE
72*576afd4fSJean-Christophe PLAGNIOL-VILLARD#endif /* #ifdef CONFIG_CM_MULTIPLE_SSRAM	*/
73*576afd4fSJean-Christophe PLAGNIOL-VILLARD
74*576afd4fSJean-Christophe PLAGNIOL-VILLARD#ifdef	CONFIG_CM_TCRAM
75*576afd4fSJean-Christophe PLAGNIOL-VILLARD	/* disable TCRAM			*/
76*576afd4fSJean-Christophe PLAGNIOL-VILLARD	and	r2,r2,#CMMASK_TCRAM_DISABLE
77*576afd4fSJean-Christophe PLAGNIOL-VILLARD#endif /* #ifdef CONFIG_CM_TCRAM		*/
78*576afd4fSJean-Christophe PLAGNIOL-VILLARD
79*576afd4fSJean-Christophe PLAGNIOL-VILLARD#if defined (CONFIG_CM926EJ_S) || defined (CONFIG_CM1026EJ_S) || \
80*576afd4fSJean-Christophe PLAGNIOL-VILLARD     defined (CONFIG_CM1136JF_S)
81*576afd4fSJean-Christophe PLAGNIOL-VILLARD
82*576afd4fSJean-Christophe PLAGNIOL-VILLARD	and	r2,r2,#CMMASK_LE
83*576afd4fSJean-Christophe PLAGNIOL-VILLARD
84*576afd4fSJean-Christophe PLAGNIOL-VILLARD#endif /* cpu with little endian initialization */
85*576afd4fSJean-Christophe PLAGNIOL-VILLARD
86*576afd4fSJean-Christophe PLAGNIOL-VILLARD	orr	r2,r2,#CMMASK_CMxx6_COMMON
87*576afd4fSJean-Christophe PLAGNIOL-VILLARD
88*576afd4fSJean-Christophe PLAGNIOL-VILLARD#endif /* CMxx6 code */
89*576afd4fSJean-Christophe PLAGNIOL-VILLARD
90*576afd4fSJean-Christophe PLAGNIOL-VILLARD#endif /* ARM102xxE value */
91*576afd4fSJean-Christophe PLAGNIOL-VILLARD
92*576afd4fSJean-Christophe PLAGNIOL-VILLARD	/* read CM_INIT		 */
93*576afd4fSJean-Christophe PLAGNIOL-VILLARD	mov	r0, #CM_BASE
94*576afd4fSJean-Christophe PLAGNIOL-VILLARD	ldr	r1, [r0, #OS_INIT]
95*576afd4fSJean-Christophe PLAGNIOL-VILLARD	/* check against desired bit setting */
96*576afd4fSJean-Christophe PLAGNIOL-VILLARD	and	r3,r1,r2
97*576afd4fSJean-Christophe PLAGNIOL-VILLARD	cmp	r3,r2
98*576afd4fSJean-Christophe PLAGNIOL-VILLARD	beq	init_reg_OK
99*576afd4fSJean-Christophe PLAGNIOL-VILLARD
100*576afd4fSJean-Christophe PLAGNIOL-VILLARD	/* lock for change */
101*576afd4fSJean-Christophe PLAGNIOL-VILLARD	mov	r3, #CMVAL_LOCK1
102*576afd4fSJean-Christophe PLAGNIOL-VILLARD	add	r3,r3,#CMVAL_LOCK2
103*576afd4fSJean-Christophe PLAGNIOL-VILLARD	str	r3, [r0, #OS_LOCK]
104*576afd4fSJean-Christophe PLAGNIOL-VILLARD	/* set desired value */
105*576afd4fSJean-Christophe PLAGNIOL-VILLARD	orr	r1,r1,r2
106*576afd4fSJean-Christophe PLAGNIOL-VILLARD	/* write & relock CM_INIT */
107*576afd4fSJean-Christophe PLAGNIOL-VILLARD	str	r1, [r0, #OS_INIT]
108*576afd4fSJean-Christophe PLAGNIOL-VILLARD	mov	r1, #CMVAL_UNLOCK
109*576afd4fSJean-Christophe PLAGNIOL-VILLARD	str	r1, [r0, #OS_LOCK]
110*576afd4fSJean-Christophe PLAGNIOL-VILLARD
111*576afd4fSJean-Christophe PLAGNIOL-VILLARD	/* soft reset so new values used */
112*576afd4fSJean-Christophe PLAGNIOL-VILLARD	b	reset_cpu
113*576afd4fSJean-Christophe PLAGNIOL-VILLARD
114*576afd4fSJean-Christophe PLAGNIOL-VILLARDinit_reg_OK:
115*576afd4fSJean-Christophe PLAGNIOL-VILLARD
116*576afd4fSJean-Christophe PLAGNIOL-VILLARD#endif /* CONFIG_CM_INIT */
117*576afd4fSJean-Christophe PLAGNIOL-VILLARD
118*576afd4fSJean-Christophe PLAGNIOL-VILLARD	mov	pc, lr
119*576afd4fSJean-Christophe PLAGNIOL-VILLARD
120*576afd4fSJean-Christophe PLAGNIOL-VILLARD#ifdef	CONFIG_CM_SPD_DETECT
121*576afd4fSJean-Christophe PLAGNIOL-VILLARD	/* Fast memory is available for the DRAM data
122*576afd4fSJean-Christophe PLAGNIOL-VILLARD	 * - ensure it has been transferred, then summarize the data
123*576afd4fSJean-Christophe PLAGNIOL-VILLARD	 *   into a CM register
124*576afd4fSJean-Christophe PLAGNIOL-VILLARD	 */
125*576afd4fSJean-Christophe PLAGNIOL-VILLARD.globl dram_query
126*576afd4fSJean-Christophe PLAGNIOL-VILLARDdram_query:
127*576afd4fSJean-Christophe PLAGNIOL-VILLARD	stmfd	r13!,{r4-r6,lr}
128*576afd4fSJean-Christophe PLAGNIOL-VILLARD	/* set up SDRAM info					*/
129*576afd4fSJean-Christophe PLAGNIOL-VILLARD	/* - based on example code from the CM User Guide */
130*576afd4fSJean-Christophe PLAGNIOL-VILLARD	mov	r0, #CM_BASE
131*576afd4fSJean-Christophe PLAGNIOL-VILLARD
132*576afd4fSJean-Christophe PLAGNIOL-VILLARDreadspdbit:
133*576afd4fSJean-Christophe PLAGNIOL-VILLARD	ldr	r1, [r0, #OS_SDRAM]	/* read the SDRAM register	*/
134*576afd4fSJean-Christophe PLAGNIOL-VILLARD	and	r1, r1, #0x20		/* mask SPD bit (5)		*/
135*576afd4fSJean-Christophe PLAGNIOL-VILLARD	cmp	r1, #0x20		/* test if set			*/
136*576afd4fSJean-Christophe PLAGNIOL-VILLARD	bne	readspdbit
137*576afd4fSJean-Christophe PLAGNIOL-VILLARD
138*576afd4fSJean-Christophe PLAGNIOL-VILLARDsetupsdram:
139*576afd4fSJean-Christophe PLAGNIOL-VILLARD	add	r0, r0, #OS_SPD		/* address the copy of the SDP data	*/
140*576afd4fSJean-Christophe PLAGNIOL-VILLARD	ldrb	r1, [r0, #3]		/* number of row address lines		*/
141*576afd4fSJean-Christophe PLAGNIOL-VILLARD	ldrb	r2, [r0, #4]		/* number of column address lines	*/
142*576afd4fSJean-Christophe PLAGNIOL-VILLARD	ldrb	r3, [r0, #5]		/* number of banks			*/
143*576afd4fSJean-Christophe PLAGNIOL-VILLARD	ldrb	r4, [r0, #31]		/* module bank density			*/
144*576afd4fSJean-Christophe PLAGNIOL-VILLARD	mul	r5, r4, r3		/* size of SDRAM (MB divided by 4)	*/
145*576afd4fSJean-Christophe PLAGNIOL-VILLARD	mov	r5, r5, ASL#2		/* size in MB				*/
146*576afd4fSJean-Christophe PLAGNIOL-VILLARD	mov	r0, #CM_BASE		/* reload for later code		*/
147*576afd4fSJean-Christophe PLAGNIOL-VILLARD	cmp	r5, #0x10		/* is it 16MB?				*/
148*576afd4fSJean-Christophe PLAGNIOL-VILLARD	bne	not16
149*576afd4fSJean-Christophe PLAGNIOL-VILLARD	mov	r6, #0x2		/* store size and CAS latency of 2	*/
150*576afd4fSJean-Christophe PLAGNIOL-VILLARD	b	writesize
151*576afd4fSJean-Christophe PLAGNIOL-VILLARD
152*576afd4fSJean-Christophe PLAGNIOL-VILLARDnot16:
153*576afd4fSJean-Christophe PLAGNIOL-VILLARD	cmp	r5, #0x20		/* is it  32MB? */
154*576afd4fSJean-Christophe PLAGNIOL-VILLARD	bne	not32
155*576afd4fSJean-Christophe PLAGNIOL-VILLARD	mov	r6, #0x6
156*576afd4fSJean-Christophe PLAGNIOL-VILLARD	b	writesize
157*576afd4fSJean-Christophe PLAGNIOL-VILLARD
158*576afd4fSJean-Christophe PLAGNIOL-VILLARDnot32:
159*576afd4fSJean-Christophe PLAGNIOL-VILLARD	cmp	r5, #0x40		/* is it  64MB? */
160*576afd4fSJean-Christophe PLAGNIOL-VILLARD	bne	not64
161*576afd4fSJean-Christophe PLAGNIOL-VILLARD	mov	r6, #0xa
162*576afd4fSJean-Christophe PLAGNIOL-VILLARD	b	writesize
163*576afd4fSJean-Christophe PLAGNIOL-VILLARD
164*576afd4fSJean-Christophe PLAGNIOL-VILLARDnot64:
165*576afd4fSJean-Christophe PLAGNIOL-VILLARD	cmp	r5, #0x80		/* is it 128MB? */
166*576afd4fSJean-Christophe PLAGNIOL-VILLARD	bne	not128
167*576afd4fSJean-Christophe PLAGNIOL-VILLARD	mov	r6, #0xe
168*576afd4fSJean-Christophe PLAGNIOL-VILLARD	b	writesize
169*576afd4fSJean-Christophe PLAGNIOL-VILLARD
170*576afd4fSJean-Christophe PLAGNIOL-VILLARDnot128:
171*576afd4fSJean-Christophe PLAGNIOL-VILLARD	/* if it is none of these sizes then it is either 256MB, or
172*576afd4fSJean-Christophe PLAGNIOL-VILLARD	 * there is no SDRAM fitted so default to 256MB
173*576afd4fSJean-Christophe PLAGNIOL-VILLARD	 */
174*576afd4fSJean-Christophe PLAGNIOL-VILLARD	mov	r6, #0x12
175*576afd4fSJean-Christophe PLAGNIOL-VILLARD
176*576afd4fSJean-Christophe PLAGNIOL-VILLARDwritesize:
177*576afd4fSJean-Christophe PLAGNIOL-VILLARD	mov	r1, r1, ASL#8		/* row addr lines from SDRAM reg */
178*576afd4fSJean-Christophe PLAGNIOL-VILLARD	orr	r2, r1, r2, ASL#12	/* OR in column address lines	 */
179*576afd4fSJean-Christophe PLAGNIOL-VILLARD	orr	r3, r2, r3, ASL#16	/* OR in number of banks	 */
180*576afd4fSJean-Christophe PLAGNIOL-VILLARD	orr	r6, r6, r3		/* OR in size and CAS latency	 */
181*576afd4fSJean-Christophe PLAGNIOL-VILLARD	str	r6, [r0, #OS_SDRAM]	/* store SDRAM parameters	 */
182*576afd4fSJean-Christophe PLAGNIOL-VILLARD
183*576afd4fSJean-Christophe PLAGNIOL-VILLARD#endif /* #ifdef CONFIG_CM_SPD_DETECT */
184*576afd4fSJean-Christophe PLAGNIOL-VILLARD
185*576afd4fSJean-Christophe PLAGNIOL-VILLARD	ldmfd	r13!,{r4-r6,pc}			/* back to caller */
186*576afd4fSJean-Christophe PLAGNIOL-VILLARD
187*576afd4fSJean-Christophe PLAGNIOL-VILLARD#ifdef	CONFIG_CM_REMAP
188*576afd4fSJean-Christophe PLAGNIOL-VILLARD	/* CM remap bit is operational
189*576afd4fSJean-Christophe PLAGNIOL-VILLARD	 * - use it to map writeable memory at 0x00000000, in place of flash
190*576afd4fSJean-Christophe PLAGNIOL-VILLARD	 */
191*576afd4fSJean-Christophe PLAGNIOL-VILLARD.globl cm_remap
192*576afd4fSJean-Christophe PLAGNIOL-VILLARDcm_remap:
193*576afd4fSJean-Christophe PLAGNIOL-VILLARD	stmfd	r13!,{r4-r10,lr}
194*576afd4fSJean-Christophe PLAGNIOL-VILLARD
195*576afd4fSJean-Christophe PLAGNIOL-VILLARD	mov	r0, #CM_BASE
196*576afd4fSJean-Christophe PLAGNIOL-VILLARD	ldr	r1, [r0, #OS_CTRL]
197*576afd4fSJean-Christophe PLAGNIOL-VILLARD	orr	r1, r1, #CMMASK_REMAP	/* set remap and led bits */
198*576afd4fSJean-Christophe PLAGNIOL-VILLARD	str	r1, [r0, #OS_CTRL]
199*576afd4fSJean-Christophe PLAGNIOL-VILLARD
200*576afd4fSJean-Christophe PLAGNIOL-VILLARD	/* Now 0x00000000 is writeable, replace the vectors	*/
201*576afd4fSJean-Christophe PLAGNIOL-VILLARD	ldr	r0, =_start	/* r0 <- start of vectors	*/
202*576afd4fSJean-Christophe PLAGNIOL-VILLARD	ldr	r2, =_armboot_start	/* r2 <- past vectors	*/
203*576afd4fSJean-Christophe PLAGNIOL-VILLARD	sub	r1,r1,r1		/* destination 0x00000000	*/
204*576afd4fSJean-Christophe PLAGNIOL-VILLARD
205*576afd4fSJean-Christophe PLAGNIOL-VILLARDcopy_vec:
206*576afd4fSJean-Christophe PLAGNIOL-VILLARD	ldmia	r0!, {r3-r10}		/* copy from source address [r0]	*/
207*576afd4fSJean-Christophe PLAGNIOL-VILLARD	stmia	r1!, {r3-r10}		/* copy to	 target address [r1]	*/
208*576afd4fSJean-Christophe PLAGNIOL-VILLARD	cmp	r0, r2			/* until source end address [r2]	*/
209*576afd4fSJean-Christophe PLAGNIOL-VILLARD	ble	copy_vec
210*576afd4fSJean-Christophe PLAGNIOL-VILLARD
211*576afd4fSJean-Christophe PLAGNIOL-VILLARD	ldmfd	r13!,{r4-r10,pc}	/* back to caller			*/
212*576afd4fSJean-Christophe PLAGNIOL-VILLARD
213*576afd4fSJean-Christophe PLAGNIOL-VILLARD#endif /* #ifdef CONFIG_CM_REMAP */
214