]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - board/freescale/mx35_3stack/lowlevel_init.S
imported Ka-Ro specific additions to U-Boot 2009.08 for TX28
[karo-tx-uboot.git] / board / freescale / mx35_3stack / lowlevel_init.S
1 /*
2  * Copyright (C) 2007, Guennadi Liakhovetski <lg@denx.de>
3  *
4  * (C) Copyright 2008-2010 Freescale Semiconductor, Inc.
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License as
8  * published by the Free Software Foundation; either version 2 of
9  * the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
19  * MA 02111-1307 USA
20  */
21
22 #include <config.h>
23 #include <asm/arch/mx35.h>
24 #include "board-mx35_3stack.h"
25
26 /*
27  * return soc version
28  *      0x10:  TO1
29  *      0x20:  TO2
30  *      0x30:  TO3
31  */
32 .macro check_soc_version ret, tmp
33         ldr \tmp, =IIM_BASE_ADDR
34         ldr \ret, [\tmp, #IIM_SREV]
35         cmp \ret, #0x00
36         moveq \tmp, #ROMPATCH_REV
37         ldreq \ret, [\tmp]
38         moveq \ret, \ret, lsl #4
39         addne \ret, \ret, #0x10
40 .endm
41
42 /*
43  * L2CC Cache setup/invalidation/disable
44  */
45 .macro init_l2cc
46     /* Disable L2 cache first */
47     mov r0, #L2CC_BASE_ADDR
48     ldr r1, [r0, #L2_CACHE_CTL_REG]
49     bic r1, r1, #0x1
50     str r1, [r0, #L2_CACHE_CTL_REG]
51
52     /*
53      * Configure L2 Cache:
54      * - 128k size(16k way)
55      * - 8-way associativity
56      * - 0 ws TAG/VALID/DIRTY
57      * - 4 ws DATA R/W
58      */
59     ldr r1, [r0, #L2_CACHE_AUX_CTL_REG]
60     and r1, r1, #0xFE000000
61     ldr r2, =L2CC_AUX_CTL_CONFIG
62     orr r1, r1, r2
63     str r1, [r0, #L2_CACHE_AUX_CTL_REG]
64
65     /* Workaournd for TO1 DDR issue:WT*/
66     check_soc_version r1, r2
67     cmp r1, #CHIP_REV_2_0
68     ldrlo r1, [r0, #L2_CACHE_DBG_CTL_REG]
69     orrlo r1, r1, #2
70     strlo r1, [r0, #L2_CACHE_DBG_CTL_REG]
71
72    /* Invalidate L2 */
73     mov r1, #0x000000FF
74     str r1, [r0, #L2_CACHE_INV_WAY_REG]
75 1:
76     /* Poll Invalidate By Way register */
77     ldr r2, [r0, #L2_CACHE_INV_WAY_REG]
78     cmp r2, #0
79     bne 1b
80 .endm /* init_l2cc */
81
82 /* AIPS setup - Only setup MPROTx registers.
83  * The PACR default values are good.*/
84 .macro init_aips
85         /*
86          * Set all MPROTx to be non-bufferable, trusted for R/W,
87          * not forced to user-mode.
88          */
89         ldr r0, =AIPS1_BASE_ADDR
90         ldr r1, =AIPS_MPR_CONFIG
91         str r1, [r0, #0x00]
92         str r1, [r0, #0x04]
93         ldr r0, =AIPS2_BASE_ADDR
94         str r1, [r0, #0x00]
95         str r1, [r0, #0x04]
96
97         /*
98          * Clear the on and off peripheral modules Supervisor Protect bit
99          * for SDMA to access them. Did not change the AIPS control registers
100          * (offset 0x20) access type
101          */
102         ldr r0, =AIPS1_BASE_ADDR
103         ldr r1, =AIPS_OPACR_CONFIG
104         str r1, [r0, #0x40]
105         str r1, [r0, #0x44]
106         str r1, [r0, #0x48]
107         str r1, [r0, #0x4C]
108         str r1, [r0, #0x50]
109         ldr r0, =AIPS2_BASE_ADDR
110         str r1, [r0, #0x40]
111         str r1, [r0, #0x44]
112         str r1, [r0, #0x48]
113         str r1, [r0, #0x4C]
114         str r1, [r0, #0x50]
115 .endm /* init_aips */
116
117 /* MAX (Multi-Layer AHB Crossbar Switch) setup */
118 .macro init_max
119         ldr r0, =MAX_BASE_ADDR
120         /* MPR - priority is M4 > M2 > M3 > M5 > M0 > M1 */
121         ldr r1, =MAX_MPR_CONFIG
122         str r1, [r0, #0x000]        /* for S0 */
123         str r1, [r0, #0x100]        /* for S1 */
124         str r1, [r0, #0x200]        /* for S2 */
125         str r1, [r0, #0x300]        /* for S3 */
126         str r1, [r0, #0x400]        /* for S4 */
127         /* SGPCR - always park on last master */
128         ldr r1, =MAX_SGPCR_CONFIG
129         str r1, [r0, #0x010]        /* for S0 */
130         str r1, [r0, #0x110]        /* for S1 */
131         str r1, [r0, #0x210]        /* for S2 */
132         str r1, [r0, #0x310]        /* for S3 */
133         str r1, [r0, #0x410]        /* for S4 */
134         /* MGPCR - restore default values */
135         ldr r1, =MAX_MGPCR_CONFIG
136         str r1, [r0, #0x800]        /* for M0 */
137         str r1, [r0, #0x900]        /* for M1 */
138         str r1, [r0, #0xA00]        /* for M2 */
139         str r1, [r0, #0xB00]        /* for M3 */
140         str r1, [r0, #0xC00]        /* for M4 */
141         str r1, [r0, #0xD00]        /* for M5 */
142 .endm /* init_max */
143
144 /* M3IF setup */
145 .macro init_m3if
146         /* Configure M3IF registers */
147         ldr r1, =M3IF_BASE_ADDR
148         /*
149         * M3IF Control Register (M3IFCTL)
150         * MRRP[0] = L2CC0 not on priority list (0 << 0) = 0x00000000
151         * MRRP[1] = L2CC1 not on priority list (0 << 0) = 0x00000000
152         * MRRP[2] = MBX not on priority list (0 << 0)   = 0x00000000
153         * MRRP[3] = MAX1 not on priority list (0 << 0)  = 0x00000000
154         * MRRP[4] = SDMA not on priority list (0 << 0)  = 0x00000000
155         * MRRP[5] = MPEG4 not on priority list (0 << 0) = 0x00000000
156         * MRRP[6] = IPU1 on priority list (1 << 6)      = 0x00000040
157         * MRRP[7] = IPU2 not on priority list (0 << 0)  = 0x00000000
158         *                                               ------------
159         *                                                 0x00000040
160         */
161         ldr r0, =M3IF_CONFIG
162         str r0, [r1]  /* M3IF control reg */
163 .endm /* init_m3if */
164
165 /* To support 133MHz DDR */
166 .macro  init_drive_strength
167 /*
168         mov r0, #0x2
169         ldr r1, =IOMUXC_BASE_ADDR
170         add r1, r1, #0x368
171         add r2, r1, #0x4C8 - 0x368
172 1:      str r0, [r1], #4
173         cmp r1, r2
174         ble 1b
175 */
176 .endm /* init_drive_strength */
177
178 /* CPLD on CS5 setup */
179 .macro init_debug_board
180         ldr r0, =DBG_BASE_ADDR
181         ldr r1, =DBG_CSCR_U_CONFIG
182         str r1, [r0, #0x00]
183         ldr r1, =DBG_CSCR_L_CONFIG
184         str r1, [r0, #0x04]
185         ldr r1, =DBG_CSCR_A_CONFIG
186         str r1, [r0, #0x08]
187 .endm /* init_debug_board */
188
189 /* clock setup */
190 .macro init_clock
191         ldr r0, =CCM_BASE_ADDR
192
193         /* default CLKO to 1/32 of the ARM core*/
194         ldr r1, [r0, #CLKCTL_COSR]
195         bic r1, r1, #0x00000FF00
196         bic r1, r1, #0x0000000FF
197         mov r2, #0x00006C00
198         add r2, r2, #0x67
199         orr r1, r1, r2
200         str r1, [r0, #CLKCTL_COSR]
201
202         ldr r2, =CCM_CCMR_CONFIG
203         str r2, [r0, #CLKCTL_CCMR]
204
205         check_soc_version r1, r2
206         cmp r1, #CHIP_REV_2_0
207         ldrhs r3, =CCM_MPLL_532_HZ
208         bhs 1f
209         ldr r2, [r0, #CLKCTL_PDR0]
210         tst r2, #CLKMODE_CONSUMER
211         ldrne r3, =CCM_MPLL_532_HZ  /* consumer path*/
212         ldreq r3, =CCM_MPLL_399_HZ  /* auto path*/
213 1:
214         str r3, [r0, #CLKCTL_MPCTL]
215
216         ldr r1, =CCM_PPLL_300_HZ
217         str r1, [r0, #CLKCTL_PPCTL]
218
219         ldr r1, =CCM_PDR0_CONFIG
220         bic r1, r1, #0x800000
221         str r1, [r0, #CLKCTL_PDR0]
222
223         ldr r1, [r0, #CLKCTL_CGR0]
224         orr r1, r1, #0x0C300000
225         str r1, [r0, #CLKCTL_CGR0]
226
227         ldr r1, [r0, #CLKCTL_CGR1]
228         orr r1, r1, #0x00000C00
229         orr r1, r1, #0x00000003
230         str r1, [r0, #CLKCTL_CGR1]
231 .endm /* init_clock */
232
233 .macro setup_sdram
234         ldr r0, =ESDCTL_BASE_ADDR
235         mov r3, #0x2000
236         str r3, [r0, #0x0]
237         str r3, [r0, #0x8]
238
239         /*ip(r12) has used to save lr register in upper calling*/
240         mov fp, lr
241
242         mov r5, #0x00
243         mov r2, #0x00
244         mov r1, #CSD0_BASE_ADDR
245         bl setup_sdram_bank
246         cmp r3, #0x0
247         orreq r5, r5, #1
248         eorne r2, r2, #0x1
249         blne setup_sdram_bank
250
251         mov lr, fp
252
253         check_soc_version r3, r4
254         cmp r1, #CHIP_REV_2_0
255         bhs 1f
256         cmp r5, #0
257         movne r3, #L2CC_BASE_ADDR
258         ldrne r4, [r3, #L2_CACHE_AUX_CTL_REG]
259         orrne r4, r4, #0x1000
260         strne r4, [r3, #L2_CACHE_AUX_CTL_REG]
261 1:
262         ldr r3, =ESDCTL_DELAY_LINE5
263         str r3, [r0, #0x30]
264 .endm /* setup_sdram */
265
266 .section ".text.init", "x"
267
268 .globl lowlevel_init
269 lowlevel_init:
270         /* Platform CHIP level init*/
271 #ifdef TURN_OFF_IMPRECISE_ABORT
272         mrs r0, cpsr
273         bic r0, r0, #0x100
274         msr cpsr, r0
275 #endif
276
277         mrc 15, 0, r1, c1, c0, 0
278
279 #ifndef BRANCH_PREDICTION_ENABLE
280         mrc 15, 0, r0, c1, c0, 1
281         bic r0, r0, #7
282         mcr 15, 0, r0, c1, c0, 1
283 #else
284         mrc 15, 0, r0, c1, c0, 1
285         orr r0, r0, #7
286         mcr 15, 0, r0, c1, c0, 1
287         orr r1, r1, #(1<<11)
288 #endif
289
290 #ifdef UNALIGNED_ACCESS_ENABLE
291         orr r1, r1, #(1<<22)
292 #endif
293
294 #ifdef LOW_INT_LATENCY_ENABLE
295         orr r1, r1, #(1<<21)
296 #endif
297         mcr 15, 0, r1, c1, c0, 0
298
299         mov r0, #0
300 #ifdef BRANCH_PREDICTION_ENABLE
301         mcr 15, 0, r0, c15, c2, 4
302 #endif
303         mcr 15, 0, r0, c7, c7, 0        /* invalidate I cache and D cache */
304         mcr 15, 0, r0, c8, c7, 0        /* invalidate TLBs */
305         mcr 15, 0, r0, c7, c10, 4       /* Drain the write buffer */
306
307         /* initializes very early AIPS, what for?
308          * Then it also initializes Multi-Layer AHB Crossbar Switch,
309          * M3IF */
310         /* Also setup the Peripheral Port Remap register inside the core */
311         ldr r0, =0x40000015        /* start from AIPS 2GB region */
312         mcr p15, 0, r0, c15, c2, 4
313
314         init_l2cc
315
316         init_aips
317
318         init_max
319
320         init_m3if
321
322         init_drive_strength
323
324         init_clock
325         init_debug_board
326
327         cmp pc, #PHYS_SDRAM_1
328         blo init_sdram_start
329         cmp pc, #(PHYS_SDRAM_1 + PHYS_SDRAM_1_SIZE)
330         blo skip_sdram_setup
331
332 init_sdram_start:
333         /*init_sdram*/
334         setup_sdram
335 skip_sdram_setup:
336         mov r0, #NFC_BASE_ADDR
337         add r1, r0, #NFC_BUF_SIZE
338         cmp pc, r0
339         movlo pc, lr
340         cmp pc, r1
341         movhi pc, lr
342         /* return from mxc_nand_load */
343         /* r12 saved upper lr*/
344         b mxc_nand_load
345
346 /*
347  * r0: ESDCTL control base, r1: sdram slot base
348  * r2: DDR type(0:DDR2, 1:MDDR) r3, r4:working base
349  */
350 setup_sdram_bank:
351         mov r3, #0xE /*0xA + 0x4*/
352         tst r2, #0x1
353         orreq r3, r3, #0x300 /*DDR2*/
354         str r3, [r0, #0x10]
355         bic r3, r3, #0x00A
356         str r3, [r0, #0x10]
357         beq 2f
358
359         mov r3, #0x20000
360 1:      subs r3, r3, #1
361         bne 1b
362
363 2:      tst r2, #0x1
364         ldreq r3, =ESDCTL_DDR2_CONFIG
365         ldrne r3, =ESDCTL_MDDR_CONFIG
366         cmp r1, #CSD1_BASE_ADDR
367         strlo r3, [r0, #0x4]
368         strhs r3, [r0, #0xC]
369
370         ldr r3, =ESDCTL_0x92220000
371         strlo r3, [r0, #0x0]
372         strhs r3, [r0, #0x8]
373         mov r3, #0xDA
374         ldr r4, =ESDCTL_PRECHARGE
375         strb r3, [r1, r4]
376
377         tst r2, #0x1
378         bne skip_set_mode
379
380         cmp r1, #CSD1_BASE_ADDR
381         ldr r3, =ESDCTL_0xB2220000
382         strlo r3, [r0, #0x0]
383         strhs r3, [r0, #0x8]
384         mov r3, #0xDA
385         ldr r4, =ESDCTL_DDR2_EMR2
386         strb r3, [r1, r4]
387         ldr r4, =ESDCTL_DDR2_EMR3
388         strb r3, [r1, r4]
389         ldr r4, =ESDCTL_DDR2_EN_DLL
390         strb r3, [r1, r4]
391         ldr r4, =ESDCTL_DDR2_RESET_DLL
392         strb r3, [r1, r4]
393
394         ldr r3, =ESDCTL_0x92220000
395         strlo r3, [r0, #0x0]
396         strhs r3, [r0, #0x8]
397         mov r3, #0xDA
398         ldr r4, =ESDCTL_PRECHARGE
399         strb r3, [r1, r4]
400
401 skip_set_mode:
402         cmp r1, #CSD1_BASE_ADDR
403         ldr r3, =ESDCTL_0xA2220000
404         strlo r3, [r0, #0x0]
405         strhs r3, [r0, #0x8]
406         mov r3, #0xDA
407         strb r3, [r1]
408         strb r3, [r1]
409
410         ldr r3, =ESDCTL_0xB2220000
411         strlo r3, [r0, #0x0]
412         strhs r3, [r0, #0x8]
413         tst r2, #0x1
414         ldreq r4, =ESDCTL_DDR2_MR
415         ldrne r4, =ESDCTL_MDDR_MR
416         mov r3, #0xDA
417         strb r3, [r1, r4]
418         ldreq r4, =ESDCTL_DDR2_OCD_DEFAULT
419         streqb r3, [r1, r4]
420         ldreq r4, =ESDCTL_DDR2_EN_DLL
421         ldrne r4, =ESDCTL_MDDR_EMR
422         strb r3, [r1, r4]
423
424         cmp r1, #CSD1_BASE_ADDR
425         ldr r3, =ESDCTL_0x82228080
426         strlo r3, [r0, #0x0]
427         strhs r3, [r0, #0x8]
428
429         tst r2, #0x1
430         moveq r4, #0x20000
431         movne r4, #0x200
432 1:      subs r4, r4, #1
433         bne 1b
434
435         str r3, [r1, #0x100]
436         ldr r4, [r1, #0x100]
437         cmp r3, r4
438         movne r3, #1
439         moveq r3, #0
440
441         mov pc, lr