xref: /rk3399_rockchip-uboot/board/freescale/mx35pdk/lowlevel_init.S (revision a4814a69d3bca6ee05f4bfc4c4e965e8fcd544e6)
1eae4988bSStefano Babic/*
2eae4988bSStefano Babic * Copyright (C) 2007, Guennadi Liakhovetski <lg@denx.de>
3eae4988bSStefano Babic *
4eae4988bSStefano Babic * (C) Copyright 2008-2010 Freescale Semiconductor, Inc.
5eae4988bSStefano Babic *
6eae4988bSStefano Babic * This program is free software; you can redistribute it and/or
7eae4988bSStefano Babic * modify it under the terms of the GNU General Public License as
8eae4988bSStefano Babic * published by the Free Software Foundation; either version 2 of
9eae4988bSStefano Babic * the License, or (at your option) any later version.
10eae4988bSStefano Babic *
11eae4988bSStefano Babic * This program is distributed in the hope that it will be useful,
12eae4988bSStefano Babic * but WITHOUT ANY WARRANTY; without even the implied warranty of
13eae4988bSStefano Babic * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14eae4988bSStefano Babic * GNU General Public License for more details.
15eae4988bSStefano Babic *
16eae4988bSStefano Babic * You should have received a copy of the GNU General Public License
17eae4988bSStefano Babic * along with this program; if not, write to the Free Software
18eae4988bSStefano Babic * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
19eae4988bSStefano Babic * MA 02111-1307 USA
20eae4988bSStefano Babic */
21eae4988bSStefano Babic
22eae4988bSStefano Babic#include <config.h>
23eae4988bSStefano Babic#include <asm/arch/imx-regs.h>
24*a4814a69SStefano Babic#include <generated/asm-offsets.h>
25eae4988bSStefano Babic#include "mx35pdk.h"
26eae4988bSStefano Babic
27eae4988bSStefano Babic/*
28eae4988bSStefano Babic * return soc version
29eae4988bSStefano Babic * 	0x10:  TO1
30eae4988bSStefano Babic *	0x20:  TO2
31eae4988bSStefano Babic *	0x30:  TO3
32eae4988bSStefano Babic */
33eae4988bSStefano Babic.macro check_soc_version ret, tmp
34eae4988bSStefano Babic	ldr \tmp, =IIM_BASE_ADDR
35eae4988bSStefano Babic	ldr \ret, [\tmp, #IIM_SREV]
36eae4988bSStefano Babic	cmp \ret, #0x00
37eae4988bSStefano Babic	moveq \tmp, #ROMPATCH_REV
38eae4988bSStefano Babic	ldreq \ret, [\tmp]
39eae4988bSStefano Babic	moveq \ret, \ret, lsl #4
40eae4988bSStefano Babic	addne \ret, \ret, #0x10
41eae4988bSStefano Babic.endm
42eae4988bSStefano Babic
43eae4988bSStefano Babic/*
44eae4988bSStefano Babic * AIPS setup - Only setup MPROTx registers.
45eae4988bSStefano Babic * The PACR default values are good.
46eae4988bSStefano Babic */
47eae4988bSStefano Babic.macro init_aips
48eae4988bSStefano Babic	/*
49eae4988bSStefano Babic	 * Set all MPROTx to be non-bufferable, trusted for R/W,
50eae4988bSStefano Babic	 * not forced to user-mode.
51eae4988bSStefano Babic	 */
52eae4988bSStefano Babic	ldr r0, =AIPS1_BASE_ADDR
53eae4988bSStefano Babic	ldr r1, =AIPS_MPR_CONFIG
54eae4988bSStefano Babic	str r1, [r0, #0x00]
55eae4988bSStefano Babic	str r1, [r0, #0x04]
56eae4988bSStefano Babic	ldr r0, =AIPS2_BASE_ADDR
57eae4988bSStefano Babic	str r1, [r0, #0x00]
58eae4988bSStefano Babic	str r1, [r0, #0x04]
59eae4988bSStefano Babic
60eae4988bSStefano Babic	/*
61eae4988bSStefano Babic	 * Clear the on and off peripheral modules Supervisor Protect bit
62eae4988bSStefano Babic	 * for SDMA to access them. Did not change the AIPS control registers
63eae4988bSStefano Babic	 * (offset 0x20) access type
64eae4988bSStefano Babic	 */
65eae4988bSStefano Babic	ldr r0, =AIPS1_BASE_ADDR
66eae4988bSStefano Babic	ldr r1, =AIPS_OPACR_CONFIG
67eae4988bSStefano Babic	str r1, [r0, #0x40]
68eae4988bSStefano Babic	str r1, [r0, #0x44]
69eae4988bSStefano Babic	str r1, [r0, #0x48]
70eae4988bSStefano Babic	str r1, [r0, #0x4C]
71eae4988bSStefano Babic	str r1, [r0, #0x50]
72eae4988bSStefano Babic	ldr r0, =AIPS2_BASE_ADDR
73eae4988bSStefano Babic	str r1, [r0, #0x40]
74eae4988bSStefano Babic	str r1, [r0, #0x44]
75eae4988bSStefano Babic	str r1, [r0, #0x48]
76eae4988bSStefano Babic	str r1, [r0, #0x4C]
77eae4988bSStefano Babic	str r1, [r0, #0x50]
78eae4988bSStefano Babic.endm
79eae4988bSStefano Babic
80eae4988bSStefano Babic/* MAX (Multi-Layer AHB Crossbar Switch) setup */
81eae4988bSStefano Babic.macro init_max
82eae4988bSStefano Babic	ldr r0, =MAX_BASE_ADDR
83eae4988bSStefano Babic	/* MPR - priority is M4 > M2 > M3 > M5 > M0 > M1 */
84eae4988bSStefano Babic	ldr r1, =MAX_MPR_CONFIG
85eae4988bSStefano Babic	str r1, [r0, #0x000]        /* for S0 */
86eae4988bSStefano Babic	str r1, [r0, #0x100]        /* for S1 */
87eae4988bSStefano Babic	str r1, [r0, #0x200]        /* for S2 */
88eae4988bSStefano Babic	str r1, [r0, #0x300]        /* for S3 */
89eae4988bSStefano Babic	str r1, [r0, #0x400]        /* for S4 */
90eae4988bSStefano Babic	/* SGPCR - always park on last master */
91eae4988bSStefano Babic	ldr r1, =MAX_SGPCR_CONFIG
92eae4988bSStefano Babic	str r1, [r0, #0x010]        /* for S0 */
93eae4988bSStefano Babic	str r1, [r0, #0x110]        /* for S1 */
94eae4988bSStefano Babic	str r1, [r0, #0x210]        /* for S2 */
95eae4988bSStefano Babic	str r1, [r0, #0x310]        /* for S3 */
96eae4988bSStefano Babic	str r1, [r0, #0x410]        /* for S4 */
97eae4988bSStefano Babic	/* MGPCR - restore default values */
98eae4988bSStefano Babic	ldr r1, =MAX_MGPCR_CONFIG
99eae4988bSStefano Babic	str r1, [r0, #0x800]        /* for M0 */
100eae4988bSStefano Babic	str r1, [r0, #0x900]        /* for M1 */
101eae4988bSStefano Babic	str r1, [r0, #0xA00]        /* for M2 */
102eae4988bSStefano Babic	str r1, [r0, #0xB00]        /* for M3 */
103eae4988bSStefano Babic	str r1, [r0, #0xC00]        /* for M4 */
104eae4988bSStefano Babic	str r1, [r0, #0xD00]        /* for M5 */
105eae4988bSStefano Babic.endm
106eae4988bSStefano Babic
107eae4988bSStefano Babic/* M3IF setup */
108eae4988bSStefano Babic.macro init_m3if
109eae4988bSStefano Babic	/* Configure M3IF registers */
110eae4988bSStefano Babic	ldr r1, =M3IF_BASE_ADDR
111eae4988bSStefano Babic	/*
112eae4988bSStefano Babic	* M3IF Control Register (M3IFCTL)
113eae4988bSStefano Babic	* MRRP[0] = L2CC0 not on priority list (0 << 0)	= 0x00000000
114eae4988bSStefano Babic	* MRRP[1] = L2CC1 not on priority list (0 << 0)	= 0x00000000
115eae4988bSStefano Babic	* MRRP[2] = MBX not on priority list (0 << 0)	= 0x00000000
116eae4988bSStefano Babic	* MRRP[3] = MAX1 not on priority list (0 << 0)	= 0x00000000
117eae4988bSStefano Babic	* MRRP[4] = SDMA not on priority list (0 << 0)	= 0x00000000
118eae4988bSStefano Babic	* MRRP[5] = MPEG4 not on priority list (0 << 0)	= 0x00000000
119eae4988bSStefano Babic	* MRRP[6] = IPU1 on priority list (1 << 6)	= 0x00000040
120eae4988bSStefano Babic	* MRRP[7] = IPU2 not on priority list (0 << 0)	= 0x00000000
121eae4988bSStefano Babic	*						------------
122eae4988bSStefano Babic	*						  0x00000040
123eae4988bSStefano Babic	*/
124eae4988bSStefano Babic	ldr r0, =M3IF_CONFIG
125eae4988bSStefano Babic	str r0, [r1]  /* M3IF control reg */
126eae4988bSStefano Babic.endm
127eae4988bSStefano Babic
128eae4988bSStefano Babic/* CPLD on CS5 setup */
129eae4988bSStefano Babic.macro init_debug_board
130eae4988bSStefano Babic	ldr r0, =DBG_BASE_ADDR
131eae4988bSStefano Babic	ldr r1, =DBG_CSCR_U_CONFIG
132eae4988bSStefano Babic	str r1, [r0, #0x00]
133eae4988bSStefano Babic	ldr r1, =DBG_CSCR_L_CONFIG
134eae4988bSStefano Babic	str r1, [r0, #0x04]
135eae4988bSStefano Babic	ldr r1, =DBG_CSCR_A_CONFIG
136eae4988bSStefano Babic	str r1, [r0, #0x08]
137eae4988bSStefano Babic.endm
138eae4988bSStefano Babic
139eae4988bSStefano Babic/* clock setup */
140eae4988bSStefano Babic.macro init_clock
141eae4988bSStefano Babic	ldr r0, =CCM_BASE_ADDR
142eae4988bSStefano Babic
143eae4988bSStefano Babic	/* default CLKO to 1/32 of the ARM core*/
144eae4988bSStefano Babic	ldr r1, [r0, #CLKCTL_COSR]
145eae4988bSStefano Babic	bic r1, r1, #0x00000FF00
146eae4988bSStefano Babic	bic r1, r1, #0x0000000FF
147eae4988bSStefano Babic	mov r2, #0x00006C00
148eae4988bSStefano Babic	add r2, r2, #0x67
149eae4988bSStefano Babic	orr r1, r1, r2
150eae4988bSStefano Babic	str r1, [r0, #CLKCTL_COSR]
151eae4988bSStefano Babic
152eae4988bSStefano Babic	ldr r2, =CCM_CCMR_CONFIG
153eae4988bSStefano Babic	str r2, [r0, #CLKCTL_CCMR]
154eae4988bSStefano Babic
155eae4988bSStefano Babic	check_soc_version r1, r2
156eae4988bSStefano Babic	cmp r1, #CHIP_REV_2_0
157eae4988bSStefano Babic	ldrhs r3, =CCM_MPLL_532_HZ
158eae4988bSStefano Babic	bhs 1f
159eae4988bSStefano Babic	ldr r2, [r0, #CLKCTL_PDR0]
160eae4988bSStefano Babic	tst r2, #CLKMODE_CONSUMER
161eae4988bSStefano Babic	ldrne r3, =CCM_MPLL_532_HZ  /* consumer path*/
162eae4988bSStefano Babic	ldreq r3, =CCM_MPLL_399_HZ  /* auto path*/
163eae4988bSStefano Babic1:
164eae4988bSStefano Babic	str r3, [r0, #CLKCTL_MPCTL]
165eae4988bSStefano Babic
166eae4988bSStefano Babic	ldr r1, =CCM_PPLL_300_HZ
167eae4988bSStefano Babic	str r1, [r0, #CLKCTL_PPCTL]
168eae4988bSStefano Babic
169eae4988bSStefano Babic	ldr r1, =CCM_PDR0_CONFIG
170eae4988bSStefano Babic	bic r1, r1, #0x800000
171eae4988bSStefano Babic	str r1, [r0, #CLKCTL_PDR0]
172eae4988bSStefano Babic
173eae4988bSStefano Babic	ldr r1, [r0, #CLKCTL_CGR0]
174eae4988bSStefano Babic	orr r1, r1, #0x0C300000
175eae4988bSStefano Babic	str r1, [r0, #CLKCTL_CGR0]
176eae4988bSStefano Babic
177eae4988bSStefano Babic	ldr r1, [r0, #CLKCTL_CGR1]
178eae4988bSStefano Babic	orr r1, r1, #0x00000C00
179eae4988bSStefano Babic	orr r1, r1, #0x00000003
180eae4988bSStefano Babic	str r1, [r0, #CLKCTL_CGR1]
181eae4988bSStefano Babic.endm
182eae4988bSStefano Babic
183eae4988bSStefano Babic.macro setup_sdram
184eae4988bSStefano Babic	ldr r0, =ESDCTL_BASE_ADDR
185eae4988bSStefano Babic	mov r3, #0x2000
186eae4988bSStefano Babic	str r3, [r0, #0x0]
187eae4988bSStefano Babic	str r3, [r0, #0x8]
188eae4988bSStefano Babic
189eae4988bSStefano Babic	/*ip(r12) has used to save lr register in upper calling*/
190eae4988bSStefano Babic	mov fp, lr
191eae4988bSStefano Babic
192eae4988bSStefano Babic	mov r5, #0x00
193eae4988bSStefano Babic	mov r2, #0x00
194eae4988bSStefano Babic	mov r1, #CSD0_BASE_ADDR
195eae4988bSStefano Babic	bl setup_sdram_bank
1966b5acfc1SStefano Babic
1976b5acfc1SStefano Babic	mov r5, #0x00
1986b5acfc1SStefano Babic	mov r2, #0x00
1996b5acfc1SStefano Babic	mov r1, #CSD1_BASE_ADDR
2006b5acfc1SStefano Babic	bl setup_sdram_bank
201eae4988bSStefano Babic
202eae4988bSStefano Babic	mov lr, fp
203eae4988bSStefano Babic
204eae4988bSStefano Babic1:
205eae4988bSStefano Babic	ldr r3, =ESDCTL_DELAY_LINE5
206eae4988bSStefano Babic	str r3, [r0, #0x30]
207eae4988bSStefano Babic.endm
208eae4988bSStefano Babic
209eae4988bSStefano Babic.globl lowlevel_init
210eae4988bSStefano Babiclowlevel_init:
211eae4988bSStefano Babic	mov r10, lr
212eae4988bSStefano Babic
213eae4988bSStefano Babic	mrc 15, 0, r1, c1, c0, 0
214eae4988bSStefano Babic
215eae4988bSStefano Babic	mrc 15, 0, r0, c1, c0, 1
216eae4988bSStefano Babic	orr r0, r0, #7
217eae4988bSStefano Babic	mcr 15, 0, r0, c1, c0, 1
218eae4988bSStefano Babic	orr r1, r1, #(1<<11)
219eae4988bSStefano Babic
220eae4988bSStefano Babic	/* Set unaligned access enable */
221eae4988bSStefano Babic	orr r1, r1, #(1<<22)
222eae4988bSStefano Babic
223eae4988bSStefano Babic	/* Set low int latency enable */
224eae4988bSStefano Babic	orr r1, r1, #(1<<21)
225eae4988bSStefano Babic
226eae4988bSStefano Babic	mcr 15, 0, r1, c1, c0, 0
227eae4988bSStefano Babic
228eae4988bSStefano Babic	mov r0, #0
229eae4988bSStefano Babic
230eae4988bSStefano Babic	/* Set branch prediction enable */
231eae4988bSStefano Babic	mcr 15, 0, r0, c15, c2, 4
232eae4988bSStefano Babic
233eae4988bSStefano Babic	mcr 15, 0, r0, c7, c7, 0        /* invalidate I cache and D cache */
234eae4988bSStefano Babic	mcr 15, 0, r0, c8, c7, 0        /* invalidate TLBs */
235eae4988bSStefano Babic	mcr 15, 0, r0, c7, c10, 4       /* Drain the write buffer */
236eae4988bSStefano Babic
237eae4988bSStefano Babic	/*
238eae4988bSStefano Babic	 * initializes very early AIPS
239eae4988bSStefano Babic	 * Then it also initializes Multi-Layer AHB Crossbar Switch,
240eae4988bSStefano Babic	 * M3IF
241eae4988bSStefano Babic	 * Also setup the Peripheral Port Remap register inside the core
242eae4988bSStefano Babic	 */
243eae4988bSStefano Babic	ldr r0, =0x40000015        /* start from AIPS 2GB region */
244eae4988bSStefano Babic	mcr p15, 0, r0, c15, c2, 4
245eae4988bSStefano Babic
246eae4988bSStefano Babic	init_aips
247eae4988bSStefano Babic
248eae4988bSStefano Babic	init_max
249eae4988bSStefano Babic
250eae4988bSStefano Babic	init_m3if
251eae4988bSStefano Babic
252eae4988bSStefano Babic	init_clock
253eae4988bSStefano Babic	init_debug_board
254eae4988bSStefano Babic
255eae4988bSStefano Babic	cmp pc, #PHYS_SDRAM_1
256eae4988bSStefano Babic	blo init_sdram_start
257eae4988bSStefano Babic	cmp pc, #(PHYS_SDRAM_1 + PHYS_SDRAM_1_SIZE)
258eae4988bSStefano Babic	blo skip_sdram_setup
259eae4988bSStefano Babic
260eae4988bSStefano Babicinit_sdram_start:
261eae4988bSStefano Babic	/*init_sdram*/
262eae4988bSStefano Babic	setup_sdram
263eae4988bSStefano Babic
264eae4988bSStefano Babicskip_sdram_setup:
265eae4988bSStefano Babic	mov lr, r10
266eae4988bSStefano Babic	mov pc, lr
267eae4988bSStefano Babic
268eae4988bSStefano Babic
269eae4988bSStefano Babic/*
270eae4988bSStefano Babic * r0: ESDCTL control base, r1: sdram slot base
271eae4988bSStefano Babic * r2: DDR type(0:DDR2, 1:MDDR) r3, r4:working base
272eae4988bSStefano Babic */
273eae4988bSStefano Babicsetup_sdram_bank:
274eae4988bSStefano Babic	mov r3, #0xE
275eae4988bSStefano Babic	tst r2, #0x1
276eae4988bSStefano Babic	orreq r3, r3, #0x300 /*DDR2*/
277eae4988bSStefano Babic	str r3, [r0, #0x10]
278eae4988bSStefano Babic	bic r3, r3, #0x00A
279eae4988bSStefano Babic	str r3, [r0, #0x10]
280eae4988bSStefano Babic	beq 2f
281eae4988bSStefano Babic
282eae4988bSStefano Babic	mov r3, #0x20000
283eae4988bSStefano Babic1:      subs r3, r3, #1
284eae4988bSStefano Babic	bne 1b
285eae4988bSStefano Babic
286eae4988bSStefano Babic2:      tst r2, #0x1
287eae4988bSStefano Babic	ldreq r3, =ESDCTL_DDR2_CONFIG
288eae4988bSStefano Babic	ldrne r3, =ESDCTL_MDDR_CONFIG
289eae4988bSStefano Babic	cmp r1, #CSD1_BASE_ADDR
290eae4988bSStefano Babic	strlo r3, [r0, #0x4]
291eae4988bSStefano Babic	strhs r3, [r0, #0xC]
292eae4988bSStefano Babic
293eae4988bSStefano Babic	ldr r3, =ESDCTL_0x92220000
294eae4988bSStefano Babic	strlo r3, [r0, #0x0]
295eae4988bSStefano Babic	strhs r3, [r0, #0x8]
296eae4988bSStefano Babic	mov r3, #0xDA
297eae4988bSStefano Babic	ldr r4, =ESDCTL_PRECHARGE
298eae4988bSStefano Babic	strb r3, [r1, r4]
299eae4988bSStefano Babic
300eae4988bSStefano Babic	tst r2, #0x1
301eae4988bSStefano Babic	bne skip_set_mode
302eae4988bSStefano Babic
303eae4988bSStefano Babic	cmp r1, #CSD1_BASE_ADDR
304eae4988bSStefano Babic	ldr r3, =ESDCTL_0xB2220000
305eae4988bSStefano Babic	strlo r3, [r0, #0x0]
306eae4988bSStefano Babic	strhs r3, [r0, #0x8]
307eae4988bSStefano Babic	mov r3, #0xDA
308eae4988bSStefano Babic	ldr r4, =ESDCTL_DDR2_EMR2
309eae4988bSStefano Babic	strb r3, [r1, r4]
310eae4988bSStefano Babic	ldr r4, =ESDCTL_DDR2_EMR3
311eae4988bSStefano Babic	strb r3, [r1, r4]
312eae4988bSStefano Babic	ldr r4, =ESDCTL_DDR2_EN_DLL
313eae4988bSStefano Babic	strb r3, [r1, r4]
314eae4988bSStefano Babic	ldr r4, =ESDCTL_DDR2_RESET_DLL
315eae4988bSStefano Babic	strb r3, [r1, r4]
316eae4988bSStefano Babic
317eae4988bSStefano Babic	ldr r3, =ESDCTL_0x92220000
318eae4988bSStefano Babic	strlo r3, [r0, #0x0]
319eae4988bSStefano Babic	strhs r3, [r0, #0x8]
320eae4988bSStefano Babic	mov r3, #0xDA
321eae4988bSStefano Babic	ldr r4, =ESDCTL_PRECHARGE
322eae4988bSStefano Babic	strb r3, [r1, r4]
323eae4988bSStefano Babic
324eae4988bSStefano Babicskip_set_mode:
325eae4988bSStefano Babic	cmp r1, #CSD1_BASE_ADDR
326eae4988bSStefano Babic	ldr r3, =ESDCTL_0xA2220000
327eae4988bSStefano Babic	strlo r3, [r0, #0x0]
328eae4988bSStefano Babic	strhs r3, [r0, #0x8]
329eae4988bSStefano Babic	mov r3, #0xDA
330eae4988bSStefano Babic	strb r3, [r1]
331eae4988bSStefano Babic	strb r3, [r1]
332eae4988bSStefano Babic
333eae4988bSStefano Babic	ldr r3, =ESDCTL_0xB2220000
334eae4988bSStefano Babic	strlo r3, [r0, #0x0]
335eae4988bSStefano Babic	strhs r3, [r0, #0x8]
336eae4988bSStefano Babic	tst r2, #0x1
337eae4988bSStefano Babic	ldreq r4, =ESDCTL_DDR2_MR
338eae4988bSStefano Babic	ldrne r4, =ESDCTL_MDDR_MR
339eae4988bSStefano Babic	mov r3, #0xDA
340eae4988bSStefano Babic	strb r3, [r1, r4]
341eae4988bSStefano Babic	ldreq r4, =ESDCTL_DDR2_OCD_DEFAULT
342eae4988bSStefano Babic	streqb r3, [r1, r4]
343eae4988bSStefano Babic	ldreq r4, =ESDCTL_DDR2_EN_DLL
344eae4988bSStefano Babic	ldrne r4, =ESDCTL_MDDR_EMR
345eae4988bSStefano Babic	strb r3, [r1, r4]
346eae4988bSStefano Babic
347eae4988bSStefano Babic	cmp r1, #CSD1_BASE_ADDR
348eae4988bSStefano Babic	ldr r3, =ESDCTL_0x82228080
349eae4988bSStefano Babic	strlo r3, [r0, #0x0]
350eae4988bSStefano Babic	strhs r3, [r0, #0x8]
351eae4988bSStefano Babic
352eae4988bSStefano Babic	tst r2, #0x1
353eae4988bSStefano Babic	moveq r4, #0x20000
354eae4988bSStefano Babic	movne r4, #0x200
355eae4988bSStefano Babic1:      subs r4, r4, #1
356eae4988bSStefano Babic	bne 1b
357eae4988bSStefano Babic
358eae4988bSStefano Babic	str r3, [r1, #0x100]
359eae4988bSStefano Babic	ldr r4, [r1, #0x100]
360eae4988bSStefano Babic	cmp r3, r4
361eae4988bSStefano Babic	movne r3, #1
362eae4988bSStefano Babic	moveq r3, #0
363eae4988bSStefano Babic
364eae4988bSStefano Babic	mov pc, lr
365