]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - arch/arm/cpu/armv7/omap3/lowlevel_init.S
zynq: Enable axi ethernet and emaclite driver initialization
[karo-tx-uboot.git] / arch / arm / cpu / armv7 / omap3 / lowlevel_init.S
1 /*
2  * Board specific setup info
3  *
4  * (C) Copyright 2008
5  * Texas Instruments, <www.ti.com>
6  *
7  * Initial Code by:
8  * Richard Woodruff <r-woodruff2@ti.com>
9  * Syed Mohammed Khasim <khasim@ti.com>
10  *
11  * SPDX-License-Identifier:     GPL-2.0+
12  */
13
14 #include <config.h>
15 #include <version.h>
16 #include <asm/arch/mem.h>
17 #include <asm/arch/clocks_omap3.h>
18 #include <linux/linkage.h>
19
20 _TEXT_BASE:
21         .word   CONFIG_SYS_TEXT_BASE    /* sdram load addr from config.mk */
22
23 #ifdef CONFIG_SPL_BUILD
24 ENTRY(save_boot_params)
25         ldr     r4, =omap3_boot_device
26         ldr     r5, [r0, #0x4]
27         and     r5, r5, #0xff
28         str     r5, [r4]
29         bx      lr
30 ENDPROC(save_boot_params)
31 #endif
32
33 ENTRY(omap3_gp_romcode_call)
34         PUSH {r4-r12, lr} @ Save all registers from ROM code!
35         MOV r12, r0     @ Copy the Service ID in R12
36         MOV r0, r1      @ Copy parameter to R0
37         mcr     p15, 0, r0, c7, c10, 4  @ DSB
38         mcr     p15, 0, r0, c7, c10, 5  @ DMB
39         .word   0xe1600070      @ SMC #0 to enter monitor - hand assembled
40                                 @ because we use -march=armv5
41         POP {r4-r12, pc}
42 ENDPROC(omap3_gp_romcode_call)
43
44 /*
45  * Funtion for making PPA HAL API calls in secure devices
46  * Input:
47  *      R0 - Service ID
48  *      R1 - paramer list
49  */
50 ENTRY(do_omap3_emu_romcode_call)
51         PUSH {r4-r12, lr} @ Save all registers from ROM code!
52         MOV r12, r0     @ Copy the Secure Service ID in R12
53         MOV r3, r1      @ Copy the pointer to va_list in R3
54         MOV r1, #0      @ Process ID - 0
55         MOV r2, #OMAP3_EMU_HAL_START_HAL_CRITICAL       @ Copy the pointer
56                                                         @ to va_list in R3
57         MOV r6, #0xFF   @ Indicate new Task call
58         mcr     p15, 0, r0, c7, c10, 4  @ DSB
59         mcr     p15, 0, r0, c7, c10, 5  @ DMB
60         .word   0xe1600071      @ SMC #1 to call PPA service - hand assembled
61                                 @ because we use -march=armv5
62         POP {r4-r12, pc}
63 ENDPROC(do_omap3_emu_romcode_call)
64
65 #if !defined(CONFIG_SYS_NAND_BOOT) && !defined(CONFIG_SYS_NAND_BOOT)
66 /**************************************************************************
67  * cpy_clk_code: relocates clock code into SRAM where its safer to execute
68  * R1 = SRAM destination address.
69  *************************************************************************/
70 ENTRY(cpy_clk_code)
71         /* Copy DPLL code into SRAM */
72         adr     r0, go_to_speed         /* get addr of clock setting code */
73         mov     r2, #384                /* r2 size to copy (div by 32 bytes) */
74         mov     r1, r1                  /* r1 <- dest address (passed in) */
75         add     r2, r2, r0              /* r2 <- source end address */
76 next2:
77         ldmia   r0!, {r3 - r10}         /* copy from source address [r0] */
78         stmia   r1!, {r3 - r10}         /* copy to   target address [r1] */
79         cmp     r0, r2                  /* until source end address [r2] */
80         bne     next2
81         mov     pc, lr                  /* back to caller */
82 ENDPROC(cpy_clk_code)
83
84 /* ***************************************************************************
85  *  go_to_speed: -Moves to bypass, -Commits clock dividers, -puts dpll at speed
86  *               -executed from SRAM.
87  *  R0 = CM_CLKEN_PLL-bypass value
88  *  R1 = CM_CLKSEL1_PLL-m, n, and divider values
89  *  R2 = CM_CLKSEL_CORE-divider values
90  *  R3 = CM_IDLEST_CKGEN - addr dpll lock wait
91  *
92  *  Note: If core unlocks/relocks and SDRAM is running fast already it gets
93  *        confused.  A reset of the controller gets it back.  Taking away its
94  *        L3 when its not in self refresh seems bad for it.  Normally, this
95  *        code runs from flash before SDR is init so that should be ok.
96  ****************************************************************************/
97 ENTRY(go_to_speed)
98         stmfd sp!, {r4 - r6}
99
100         /* move into fast relock bypass */
101         ldr     r4, pll_ctl_add
102         str     r0, [r4]
103 wait1:
104         ldr     r5, [r3]                /* get status */
105         and     r5, r5, #0x1            /* isolate core status */
106         cmp     r5, #0x1                /* still locked? */
107         beq     wait1                   /* if lock, loop */
108
109         /* set new dpll dividers _after_ in bypass */
110         ldr     r5, pll_div_add1
111         str     r1, [r5]                /* set m, n, m2 */
112         ldr     r5, pll_div_add2
113         str     r2, [r5]                /* set l3/l4/.. dividers*/
114         ldr     r5, pll_div_add3        /* wkup */
115         ldr     r2, pll_div_val3        /* rsm val */
116         str     r2, [r5]
117         ldr     r5, pll_div_add4        /* gfx */
118         ldr     r2, pll_div_val4
119         str     r2, [r5]
120         ldr     r5, pll_div_add5        /* emu */
121         ldr     r2, pll_div_val5
122         str     r2, [r5]
123
124         /* now prepare GPMC (flash) for new dpll speed */
125         /* flash needs to be stable when we jump back to it */
126         ldr     r5, flash_cfg3_addr
127         ldr     r2, flash_cfg3_val
128         str     r2, [r5]
129         ldr     r5, flash_cfg4_addr
130         ldr     r2, flash_cfg4_val
131         str     r2, [r5]
132         ldr     r5, flash_cfg5_addr
133         ldr     r2, flash_cfg5_val
134         str     r2, [r5]
135         ldr     r5, flash_cfg1_addr
136         ldr     r2, [r5]
137         orr     r2, r2, #0x3            /* up gpmc divider */
138         str     r2, [r5]
139
140         /* lock DPLL3 and wait a bit */
141         orr     r0, r0, #0x7    /* set up for lock mode */
142         str     r0, [r4]        /* lock */
143         nop                     /* ARM slow at this point working at sys_clk */
144         nop
145         nop
146         nop
147 wait2:
148         ldr     r5, [r3]        /* get status */
149         and     r5, r5, #0x1    /* isolate core status */
150         cmp     r5, #0x1        /* still locked? */
151         bne     wait2           /* if lock, loop */
152         nop
153         nop
154         nop
155         nop
156         ldmfd   sp!, {r4 - r6}
157         mov     pc, lr          /* back to caller, locked */
158 ENDPROC(go_to_speed)
159
160 _go_to_speed: .word go_to_speed
161
162 /* these constants need to be close for PIC code */
163 /* The Nor has to be in the Flash Base CS0 for this condition to happen */
164 flash_cfg1_addr:
165         .word (GPMC_CONFIG_CS0_BASE + GPMC_CONFIG1)
166 flash_cfg3_addr:
167         .word (GPMC_CONFIG_CS0_BASE + GPMC_CONFIG3)
168 flash_cfg3_val:
169         .word STNOR_GPMC_CONFIG3
170 flash_cfg4_addr:
171         .word (GPMC_CONFIG_CS0_BASE + GPMC_CONFIG4)
172 flash_cfg4_val:
173         .word STNOR_GPMC_CONFIG4
174 flash_cfg5_val:
175         .word STNOR_GPMC_CONFIG5
176 flash_cfg5_addr:
177         .word (GPMC_CONFIG_CS0_BASE + GPMC_CONFIG5)
178 pll_ctl_add:
179         .word CM_CLKEN_PLL
180 pll_div_add1:
181         .word CM_CLKSEL1_PLL
182 pll_div_add2:
183         .word CM_CLKSEL_CORE
184 pll_div_add3:
185         .word CM_CLKSEL_WKUP
186 pll_div_val3:
187         .word (WKUP_RSM << 1)
188 pll_div_add4:
189         .word CM_CLKSEL_GFX
190 pll_div_val4:
191         .word (GFX_DIV << 0)
192 pll_div_add5:
193         .word CM_CLKSEL1_EMU
194 pll_div_val5:
195         .word CLSEL1_EMU_VAL
196
197 #endif
198
199 ENTRY(lowlevel_init)
200         ldr     sp, SRAM_STACK
201         str     ip, [sp]        /* stash ip register */
202         mov     ip, lr          /* save link reg across call */
203 #if !defined(CONFIG_SYS_NAND_BOOT) && !defined(CONFIG_SYS_ONENAND_BOOT)
204 /*
205  * No need to copy/exec the clock code - DPLL adjust already done
206  * in NAND/oneNAND Boot.
207  */
208         ldr     r1, =SRAM_CLK_CODE
209         bl      cpy_clk_code
210 #endif /* NAND Boot */
211         mov     lr, ip          /* restore link reg */
212         ldr     ip, [sp]        /* restore save ip */
213         /* tail-call s_init to setup pll, mux, memory */
214         b       s_init
215
216 ENDPROC(lowlevel_init)
217
218         /* the literal pools origin */
219         .ltorg
220
221 REG_CONTROL_STATUS:
222         .word CONTROL_STATUS
223 SRAM_STACK:
224         .word LOW_LEVEL_SRAM_STACK
225
226 /* DPLL(1-4) PARAM TABLES */
227
228 /*
229  * Each of the tables has M, N, FREQSEL, M2 values defined for nominal
230  * OPP (1.2V). The fields are defined according to dpll_param struct (clock.c).
231  * The values are defined for all possible sysclk and for ES1 and ES2.
232  */
233
234 mpu_dpll_param:
235 /* 12MHz */
236 /* ES1 */
237 .word MPU_M_12_ES1, MPU_N_12_ES1, MPU_FSEL_12_ES1, MPU_M2_12_ES1
238 /* ES2 */
239 .word MPU_M_12_ES2, MPU_N_12_ES2, MPU_FSEL_12_ES2, MPU_M2_ES2
240 /* 3410 */
241 .word MPU_M_12, MPU_N_12, MPU_FSEL_12, MPU_M2_12
242
243 /* 13MHz */
244 /* ES1 */
245 .word MPU_M_13_ES1, MPU_N_13_ES1, MPU_FSEL_13_ES1, MPU_M2_13_ES1
246 /* ES2 */
247 .word MPU_M_13_ES2, MPU_N_13_ES2, MPU_FSEL_13_ES2, MPU_M2_13_ES2
248 /* 3410 */
249 .word MPU_M_13, MPU_N_13, MPU_FSEL_13, MPU_M2_13
250
251 /* 19.2MHz */
252 /* ES1 */
253 .word MPU_M_19P2_ES1, MPU_N_19P2_ES1, MPU_FSEL_19P2_ES1, MPU_M2_19P2_ES1
254 /* ES2 */
255 .word MPU_M_19P2_ES2, MPU_N_19P2_ES2, MPU_FSEL_19P2_ES2, MPU_M2_19P2_ES2
256 /* 3410 */
257 .word MPU_M_19P2, MPU_N_19P2, MPU_FSEL_19P2, MPU_M2_19P2
258
259 /* 26MHz */
260 /* ES1 */
261 .word MPU_M_26_ES1, MPU_N_26_ES1, MPU_FSEL_26_ES1, MPU_M2_26_ES1
262 /* ES2 */
263 .word MPU_M_26_ES2, MPU_N_26_ES2, MPU_FSEL_26_ES2, MPU_M2_26_ES2
264 /* 3410 */
265 .word MPU_M_26, MPU_N_26, MPU_FSEL_26, MPU_M2_26
266
267 /* 38.4MHz */
268 /* ES1 */
269 .word MPU_M_38P4_ES1, MPU_N_38P4_ES1, MPU_FSEL_38P4_ES1, MPU_M2_38P4_ES1
270 /* ES2 */
271 .word MPU_M_38P4_ES2, MPU_N_38P4_ES2, MPU_FSEL_38P4_ES2, MPU_M2_38P4_ES2
272 /* 3410 */
273 .word MPU_M_38P4, MPU_N_38P4, MPU_FSEL_38P4, MPU_M2_38P4
274
275
276 .globl get_mpu_dpll_param
277 get_mpu_dpll_param:
278         adr     r0, mpu_dpll_param
279         mov     pc, lr
280
281 iva_dpll_param:
282 /* 12MHz */
283 /* ES1 */
284 .word IVA_M_12_ES1, IVA_N_12_ES1, IVA_FSEL_12_ES1, IVA_M2_12_ES1
285 /* ES2 */
286 .word IVA_M_12_ES2, IVA_N_12_ES2, IVA_FSEL_12_ES2, IVA_M2_12_ES2
287 /* 3410 */
288 .word IVA_M_12, IVA_N_12, IVA_FSEL_12, IVA_M2_12
289
290 /* 13MHz */
291 /* ES1 */
292 .word IVA_M_13_ES1, IVA_N_13_ES1, IVA_FSEL_13_ES1, IVA_M2_13_ES1
293 /* ES2 */
294 .word IVA_M_13_ES2, IVA_N_13_ES2,  IVA_FSEL_13_ES2, IVA_M2_13_ES2
295 /* 3410 */
296 .word IVA_M_13, IVA_N_13, IVA_FSEL_13, IVA_M2_13
297
298 /* 19.2MHz */
299 /* ES1 */
300 .word IVA_M_19P2_ES1, IVA_N_19P2_ES1, IVA_FSEL_19P2_ES1, IVA_M2_19P2_ES1
301 /* ES2 */
302 .word IVA_M_19P2_ES2, IVA_N_19P2_ES2, IVA_FSEL_19P2_ES2, IVA_M2_19P2_ES2
303 /* 3410 */
304 .word IVA_M_19P2, IVA_N_19P2, IVA_FSEL_19P2, IVA_M2_19P2
305
306 /* 26MHz */
307 /* ES1 */
308 .word IVA_M_26_ES1, IVA_N_26_ES1, IVA_FSEL_26_ES1, IVA_M2_26_ES1
309 /* ES2 */
310 .word IVA_M_26_ES2, IVA_N_26_ES2, IVA_FSEL_26_ES2, IVA_M2_26_ES2
311 /* 3410 */
312 .word IVA_M_26, IVA_N_26, IVA_FSEL_26, IVA_M2_26
313
314 /* 38.4MHz */
315 /* ES1 */
316 .word IVA_M_38P4_ES1, IVA_N_38P4_ES1, IVA_FSEL_38P4_ES1, IVA_M2_38P4_ES1
317 /* ES2 */
318 .word IVA_M_38P4_ES2, IVA_N_38P4_ES2, IVA_FSEL_38P4_ES2, IVA_M2_38P4_ES2
319 /* 3410 */
320 .word IVA_M_38P4, IVA_N_38P4, IVA_FSEL_38P4, IVA_M2_38P4
321
322
323 .globl get_iva_dpll_param
324 get_iva_dpll_param:
325         adr     r0, iva_dpll_param
326         mov     pc, lr
327
328 /* Core DPLL targets for L3 at 166 & L133 */
329 core_dpll_param:
330 /* 12MHz */
331 /* ES1 */
332 .word CORE_M_12_ES1, CORE_N_12_ES1, CORE_FSL_12_ES1, CORE_M2_12_ES1
333 /* ES2 */
334 .word CORE_M_12, CORE_N_12, CORE_FSEL_12, CORE_M2_12
335 /* 3410 */
336 .word CORE_M_12, CORE_N_12, CORE_FSEL_12, CORE_M2_12
337
338 /* 13MHz */
339 /* ES1 */
340 .word CORE_M_13_ES1, CORE_N_13_ES1, CORE_FSL_13_ES1, CORE_M2_13_ES1
341 /* ES2 */
342 .word CORE_M_13, CORE_N_13, CORE_FSEL_13, CORE_M2_13
343 /* 3410 */
344 .word CORE_M_13, CORE_N_13, CORE_FSEL_13, CORE_M2_13
345
346 /* 19.2MHz */
347 /* ES1 */
348 .word CORE_M_19P2_ES1, CORE_N_19P2_ES1, CORE_FSL_19P2_ES1, CORE_M2_19P2_ES1
349 /* ES2 */
350 .word CORE_M_19P2, CORE_N_19P2, CORE_FSEL_19P2, CORE_M2_19P2
351 /* 3410 */
352 .word CORE_M_19P2, CORE_N_19P2, CORE_FSEL_19P2, CORE_M2_19P2
353
354 /* 26MHz */
355 /* ES1 */
356 .word CORE_M_26_ES1, CORE_N_26_ES1, CORE_FSL_26_ES1, CORE_M2_26_ES1
357 /* ES2 */
358 .word CORE_M_26, CORE_N_26, CORE_FSEL_26, CORE_M2_26
359 /* 3410 */
360 .word CORE_M_26, CORE_N_26, CORE_FSEL_26, CORE_M2_26
361
362 /* 38.4MHz */
363 /* ES1 */
364 .word CORE_M_38P4_ES1, CORE_N_38P4_ES1, CORE_FSL_38P4_ES1, CORE_M2_38P4_ES1
365 /* ES2 */
366 .word CORE_M_38P4, CORE_N_38P4, CORE_FSEL_38P4, CORE_M2_38P4
367 /* 3410 */
368 .word CORE_M_38P4, CORE_N_38P4, CORE_FSEL_38P4, CORE_M2_38P4
369
370 .globl get_core_dpll_param
371 get_core_dpll_param:
372         adr     r0, core_dpll_param
373         mov     pc, lr
374
375 /* PER DPLL values are same for both ES1 and ES2 */
376 per_dpll_param:
377 /* 12MHz */
378 .word PER_M_12, PER_N_12, PER_FSEL_12, PER_M2_12
379
380 /* 13MHz */
381 .word PER_M_13, PER_N_13, PER_FSEL_13, PER_M2_13
382
383 /* 19.2MHz */
384 .word PER_M_19P2, PER_N_19P2, PER_FSEL_19P2, PER_M2_19P2
385
386 /* 26MHz */
387 .word PER_M_26, PER_N_26, PER_FSEL_26, PER_M2_26
388
389 /* 38.4MHz */
390 .word PER_M_38P4, PER_N_38P4, PER_FSEL_38P4, PER_M2_38P4
391
392 .globl get_per_dpll_param
393 get_per_dpll_param:
394         adr     r0, per_dpll_param
395         mov     pc, lr
396
397 /* PER2 DPLL values */
398 per2_dpll_param:
399 /* 12MHz */
400 .word PER2_M_12, PER2_N_12, PER2_FSEL_12, PER2_M2_12
401
402 /* 13MHz */
403 .word PER2_M_13, PER2_N_13, PER2_FSEL_13, PER2_M2_13
404
405 /* 19.2MHz */
406 .word PER2_M_19P2, PER2_N_19P2, PER2_FSEL_19P2, PER2_M2_19P2
407
408 /* 26MHz */
409 .word PER2_M_26, PER2_N_26, PER2_FSEL_26, PER2_M2_26
410
411 /* 38.4MHz */
412 .word PER2_M_38P4, PER2_N_38P4, PER2_FSEL_38P4, PER2_M2_38P4
413
414 .globl get_per2_dpll_param
415 get_per2_dpll_param:
416         adr     r0, per2_dpll_param
417         mov     pc, lr
418
419 /*
420  * Tables for 36XX/37XX devices
421  *
422  */
423 mpu_36x_dpll_param:
424 /* 12MHz */
425 .word 50, 0, 0, 1
426 /* 13MHz */
427 .word 600, 12, 0, 1
428 /* 19.2MHz */
429 .word 125, 3, 0, 1
430 /* 26MHz */
431 .word 300, 12, 0, 1
432 /* 38.4MHz */
433 .word 125, 7, 0, 1
434
435 iva_36x_dpll_param:
436 /* 12MHz */
437 .word 130, 2, 0, 1
438 /* 13MHz */
439 .word 20, 0, 0, 1
440 /* 19.2MHz */
441 .word 325, 11, 0, 1
442 /* 26MHz */
443 .word 10, 0, 0, 1
444 /* 38.4MHz */
445 .word 325, 23, 0, 1
446
447 core_36x_dpll_param:
448 /* 12MHz */
449 .word 100, 2, 0, 1
450 /* 13MHz */
451 .word 400, 12, 0, 1
452 /* 19.2MHz */
453 .word 375, 17, 0, 1
454 /* 26MHz */
455 .word 200, 12, 0, 1
456 /* 38.4MHz */
457 .word 375, 35, 0, 1
458
459 per_36x_dpll_param:
460 /*    SYSCLK    M       N      M2      M3      M4     M5      M6      m2DIV */
461 .word 12000,    360,    4,     9,      16,     5,     4,      3,      1
462 .word 13000,    864,   12,     9,      16,     9,     4,      3,      1
463 .word 19200,    360,    7,     9,      16,     5,     4,      3,      1
464 .word 26000,    432,   12,     9,      16,     9,     4,      3,      1
465 .word 38400,    360,   15,     9,      16,     5,     4,      3,      1
466
467 ENTRY(get_36x_mpu_dpll_param)
468         adr     r0, mpu_36x_dpll_param
469         mov     pc, lr
470 ENDPROC(get_36x_mpu_dpll_param)
471
472 ENTRY(get_36x_iva_dpll_param)
473         adr     r0, iva_36x_dpll_param
474         mov     pc, lr
475 ENDPROC(get_36x_iva_dpll_param)
476
477 ENTRY(get_36x_core_dpll_param)
478         adr     r0, core_36x_dpll_param
479         mov     pc, lr
480 ENDPROC(get_36x_core_dpll_param)
481
482 ENTRY(get_36x_per_dpll_param)
483         adr     r0, per_36x_dpll_param
484         mov     pc, lr
485 ENDPROC(get_36x_per_dpll_param)