unified MX27, MX25, MX37 trees
[karo-tx-redboot.git] / packages / hal / arm / mx37 / karo / v1_0 / include / hal_platform_setup.h
1 #ifndef CYGONCE_HAL_PLATFORM_SETUP_H
2 #define CYGONCE_HAL_PLATFORM_SETUP_H
3
4 //=============================================================================
5 //
6 //      hal_platform_setup.h
7 //
8 //      Platform specific support for HAL (assembly code)
9 //
10 //=============================================================================
11 //####ECOSGPLCOPYRIGHTBEGIN####
12 // -------------------------------------------
13 // This file is part of eCos, the Embedded Configurable Operating System.
14 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
15 //
16 // eCos is free software; you can redistribute it and/or modify it under
17 // the terms of the GNU General Public License as published by the Free
18 // Software Foundation; either version 2 or (at your option) any later version.
19 //
20 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
21 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
22 // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
23 // for more details.
24 //
25 // You should have received a copy of the GNU General Public License along
26 // with eCos; if not, write to the Free Software Foundation, Inc.,
27 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
28 //
29 // As a special exception, if other files instantiate templates or use macros
30 // or inline functions from this file, or you compile this file and link it
31 // with other works to produce a work based on this file, this file does not
32 // by itself cause the resulting work to be covered by the GNU General Public
33 // License. However the source code for this file must still be made available
34 // in accordance with section (3) of the GNU General Public License.
35 //
36 // This exception does not invalidate any other reasons why a work based on
37 // this file might be covered by the GNU General Public License.
38 //
39 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
40 // at http://sources.redhat.com/ecos/ecos-license/
41 // -------------------------------------------
42 //####ECOSGPLCOPYRIGHTEND####
43 //===========================================================================
44
45 #include <pkgconf/system.h>             // System-wide configuration info
46 #include CYGBLD_HAL_VARIANT_H           // Variant specific configuration
47 #include CYGBLD_HAL_PLATFORM_H          // Platform specific configuration
48 #include <cyg/hal/hal_soc.h>            // Variant specific hardware definitions
49 #include <cyg/hal/hal_mmu.h>            // MMU definitions
50 #include <cyg/hal/karo_tx37.h>          // Platform specific hardware definitions
51
52 #if defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_ROMRAM)
53 #define PLATFORM_SETUP1 _platform_setup1
54 #define CYGHWR_HAL_ARM_HAS_MMU
55
56 #ifdef CYG_HAL_STARTUP_ROMRAM
57 #define CYGSEM_HAL_ROM_RESET_USES_JUMP
58 #endif
59
60 //#define NFC_2K_BI_SWAP
61 #define SDRAM_FULL_PAGE_BIT     0x100
62 #define SDRAM_FULL_PAGE_MODE    0x37
63 #define SDRAM_BURST_MODE        0x33
64
65 #define CYGHWR_HAL_ROM_VADDR    0x0
66
67 #if 0
68 #define UNALIGNED_ACCESS_ENABLE
69 #define SET_T_BIT_DISABLE
70 #define BRANCH_PREDICTION_ENABLE
71 #endif
72
73
74 #define TX37_NAND_PAGE_SIZE      2048
75 #define TX37_NAND_BLKS_PER_PAGE  64
76
77 #ifndef CYGOPT_HAL_ARM_TX37_DEBUG
78         .macro  LED_CTRL,val
79         .endm
80         .macro  LED_BLINK,val
81         .endm
82 #define DELAY
83 #else
84 #define CYGHWR_LED_MACRO    LED_BLINK #\x
85         .macro  DELAY,ms
86         ldr     r10, =\ms
87 111:
88         subs    r10, r10, #1
89         bmi     113f
90         ldr     r9, =3000
91 112:
92         subs    r9, r9, #1
93         bne     112b
94         b       111b
95         .ltorg
96 113:
97         .endm
98
99         .macro LED_CTRL,val
100         // switch user LED (GPIO2_19) on STK5
101         ldr     r10, GPIO2_BASE_ADDR_W
102         mov     r9, #\val
103         cmp     r9, #0
104         movne   r9, #(1 << 19)  // LED ON
105         moveq   r9, #0  // LED OFF
106         str     r9, [r10, #0x00]        @ GPIO_DR
107         .endm
108
109         .macro LED_BLINK,val
110         mov     r2, \val
111 211:
112         subs    r2, r2, #1
113         bmi     212f
114         LED_CTRL 1
115         DELAY   200
116         LED_CTRL 0
117         DELAY   300
118         b       211b
119 212:
120         DELAY   1000
121         .endm
122 #endif
123
124         .macro LED_INIT
125         // initialize GPIO2[19] for LED on STK5
126         ldr     r10, IOMUXC_BASE_ADDR_W
127         @ AUD5_RXC = ALT4 (GPIO2[19])
128         mov     r9,     #4
129         str     r9,     [r10, #0x120]
130         ldr     r10,    GPIO2_BASE_ADDR_W
131
132         mov     r9,     #(1 << 19)
133         str     r9,     [r10, #0x00]    @ GPIO_DR
134
135         mov     r9,     #(1 << 19)
136         str     r9,     [r10, #0x04]    @ GPIO_GDIR
137         .endm
138
139 //#define ENABLE_IMPRECISE_ABORT
140
141 /*
142 #define PLATFORM_PREAMBLE flash_header
143
144 //flash header & DCD @ 0x400
145 .macro flash_header
146         b       reset_vector
147 .org 0x400
148 app_code_jump_v: .long  reset_vector
149 app_code_barker: .long  0xB1
150 app_code_csf:    .long  0
151 dcd_ptr_ptr:     .long  dcd_ptr
152 super_root_key:  .long  0
153 dcd_ptr:         .long  dcd_data
154 app_dest_ptr:    .long  CYGMEM_REGION_rom - REDBOOT_OFFSET
155
156 dcd_data:       .long   0xB17219E9
157 dcd_len:        .long   (49 * 12)
158
159 //DCD
160 //iomux 1
161 // KEY_ROW0 -> EMI_DRAM_D[16]
162 .long 4
163 .long 0xc3fa8008
164 .long 0x1
165 // 2
166 // KEY_ROW1 -> EMI_DRAM_D[17]
167 .long 4
168 .long 0xc3fa800c
169 .long 0x1
170 // 3
171 // KEY_ROW2 -> EMI_DRAM_D[18]
172 .long 4
173 .long 0xc3fa8010
174 .long 0x1
175 // 4
176 // KEY_ROW3 -> EMI_DRAM_D[19]
177 .long 4
178 .long 0xc3fa8014
179 .long 0x1
180 //5
181 // KEY_ROW4 -> EMI_DRAM_D[20]
182 .long 4
183 .long 0xc3fa8018
184 .long 0x1
185 //6
186 // KEY_ROW5 -> EMI_DRAM_D[21]
187 .long 4
188 .long 0xc3fa801c
189 .long 0x1
190 // 7
191 // KEY_ROW6 -> EMI_DRAM_D[22]
192 .long 4
193 .long 0xc3fa8020
194 .long 0x1
195 // 8
196 // KEY_ROW7 -> EMI_DRAM_D[23]
197 .long 4
198 .long 0xc3fa8024
199 .long 0x1
200 // 9
201 // KEY_ROW7
202 // IETM_D0 -> EMI_DRAM_D[24]
203 .long 4
204 .long 0xc3fa8028
205 .long 0x1
206
207 //10
208 // IETM_D1 -> EMI_DRAM_D[25]
209 .long 4
210 .long 0xc3fa802c
211 .long 0x1
212
213 // 11
214 // IETM_D2 -> EMI_DRAM_D[26]
215 .long 4
216 .long 0xc3fa8030
217 .long 0x1
218
219 // 12
220 // IETM_D3 -> EMI_DRAM_D[27]
221 .long 4
222 .long 0xc3fa8034
223 .long 0x1
224
225 // 13
226 // IETM_D4 -> EMI_DRAM_D[28]
227 .long 4
228 .long 0xc3fa8038
229 .long 0x1
230
231 // 14
232 // IETM_D5 -> EMI_DRAM_D[29]
233 .long 4
234 .long 0xc3fa803c
235 .long 0x1
236
237 // 15
238 // IETM_D6 -> EMI_DRAM_D[30]
239 .long 4
240 .long 0xc3fa8040
241 .long 0x1
242
243 // 16
244 // IETM_D7 -> EMI_DRAM_D[31]
245 .long 4
246 .long 0xc3fa8044
247 .long 0x1
248
249 // 17
250 // EIM_EB0 -> DRAM_DQM[2]
251 .long 4
252 .long 0xc3fa8048
253 .long 0x1
254
255 // 18
256 // EIM_EB1 -> DRAM_DQM[3]
257 .long 4
258 .long 0xc3fa804c
259 .long 0x1
260
261 // 19
262 // EIM_ECB -> DRAM_SDQS[2]
263 .long 4
264 .long 0xc3fa805c
265 .long 0x1
266
267 // 20
268 // SW_PAD_CTL_PAD_EIM_ECB -> DDR input type / Pull/Keeper Enabled / Pull /  100KOhm Pull Down / High Drive Strength
269 .long 4
270 .long 0xc3fa82bc
271 .long 0x02c4
272
273 // 21
274 // EIM_LBA -> DRAM_SDQS[3]
275 .long 4
276 .long 0xc3fa8060
277 .long 0x1
278
279 // 22
280 // SW_PAD_CTL_PAD_EIM_LBA -> DDR input type / Pull/Keeper Enabled / Pull /  100KOhm Pull Down / High Drive Strength
281 .long 4
282 .long 0xc3fa82c0
283 .long 0x02c4
284
285 // 23
286 // SW_PAD_CTL_GRP_S7 -> Medium Drive Strength
287 .long 4
288 .long 0xc3fa84a8
289 .long 0x2
290
291 // 24
292 // SW_PAD_CTL_GRP_S8  -> Medium Drive Strength
293 .long 4
294 .long 0xc3fa84b0
295 .long 0x2
296
297 // 25
298 // SW_PAD_CTL_GRP_S9  -> Medium Drive Strength
299 .long 4
300 .long 0xc3fa84b4
301 .long 0x2
302
303 // 26
304 // SW_PAD_CTL_GRP_S10  -> Medium Drive Strength
305 .long 4
306 .long 0xc3fa84e0
307 .long 0x2
308
309 // 27
310 // SW_PAD_CTL_PAD_DRAM_DQM0 -> Medium Drive Strength
311 .long 4
312 .long 0xc3fa8278
313 .long 0x2
314
315 // 28
316 // SW_PAD_CTL_PAD_DRAM_DQM1 -> Medium Drive Strength
317 .long 4
318 .long 0xc3fa827c
319 .long 0x2
320
321 // 29
322 // DRAM_SDQS0  -> Medium Drive Strength
323 .long 4
324 .long 0xc3fa8298
325 .long 0x2
326
327 // 30
328 // DRAM_SDQS1  -> Medium Drive Strength
329 .long 4
330 .long 0xc3fa829c
331 .long 0x2
332
333 // 31
334 // SW_PAD_CTL_GRP_S3  -> Medium Drive Strength
335 .long 4
336 .long 0xc3fa84fc
337 .long 0x2
338
339 // 32
340 // SW_PAD_CTL_GRP_S4  -> Medium Drive Strength
341 .long 4
342 .long 0xc3fa8504
343 .long 0x2
344
345 // 33
346 // SW_PAD_CTL_GRP_S5  -> Medium Drive Strength
347 .long 4
348 .long 0xc3fa848c
349 .long 0x2
350
351 // 34
352 // SW_PAD_CTL_GRP_S6  -> Medium Drive Strength
353 .long 4
354 .long 0xc3fa849c
355 .long 0x2
356
357 // 35
358 // DRAM_SDCLK  -> Medium Drive Strength
359 .long 4
360 .long 0xc3fa8294
361 .long 0x2
362
363 // 36
364 // SW_PAD_CTL_PAD_DRAM_RAS  -> Medium Drive Strength
365 .long 4
366 .long 0xc3fa8280
367 .long 0x2
368
369 // 37
370 // SW_PAD_CTL_PAD_DRAM_CAS  -> Medium Drive Strength
371 .long 4
372 .long 0xc3fa8284
373 .long 0x2
374
375 // 38
376 // SW_PAD_CTL_PAD_DRAM_SDWE -> Medium Drive Strength
377 .long 4
378 .long 0xc3fa8288
379 .long 0x2
380
381 // 39
382 // SW_PAD_CTL_PAD_DRAM_SDCKE0  -> Medium Drive Strength
383 .long 4
384 .long 0xc3fa828c
385 .long 0x2
386
387 // 40
388 // SW_PAD_CTL_PAD_DRAM_SDCKE1  -> Medium Drive Strength
389 .long 4
390 .long 0xc3fa8290
391 .long 0x2
392
393 // set CSD0 1
394 // 41
395 .long 4
396 .long 0xe3fd9000
397 .long 0x80000000
398
399 // Precharge command  2
400 // 42
401 .long 4
402 .long 0xe3fd9014
403 .long 0x04008008
404 // refresh commands 3
405 // 43
406 .long 4
407 .long 0xe3fd9014
408 .long 0x00008010
409
410 // 44
411 .long 4
412 .long 0xe3fd9014
413 .long 0x00008010
414 // LMR with CAS=3 BL=3  5
415 // 45
416 .long 4
417 .long 0xe3fd9014
418 .long 0x00338018
419
420 // 13row 9 col 32 bit sref=4 micro model  6
421 // 46
422 .long 4
423 .long 0xe3fd9000
424 .long 0xB2120000
425
426 // timing parameter 7
427 // 47
428 .long 4
429 .long 0xe3fd9004
430 .long 0x70395729
431
432 // mddr enable RLAT=2  8
433 // 48
434 .long 4
435 .long 0xe3fd9010
436 .long 0x000A0084
437
438 // Normal mode  9
439 // 49
440 .long 4
441 .long 0xe3fd9014
442 .long 0x00000000
443
444 image_len:          .long REDBOOT_IMAGE_SIZE
445 .endm
446 */
447
448 // This macro represents the initial startup code for the platform
449         .macro  _platform_setup1
450 KARO_TX37_SETUP_START:
451 /*
452  *      ARM1136 init
453  *      - invalidate I/D cache/TLB and drain write buffer;
454  *      - invalidate L2 cache
455  *      - unaligned access
456  *      - branch predictions
457  */
458         // mrc p15, 0, r0, c1, c1, 0 // Read Secure Configuration Register data. Why doesn't work???
459         // mcr p15, 0, <Rd>, c1, c1, 0 ; Write Secure Configuration Register data
460 #ifdef ENABLE_IMPRECISE_ABORT
461         mrs     r1, spsr            // save old spsr
462         mrs     r0, cpsr            // read out the cpsr
463         bic     r0, r0, #0x100      // clear the A bit
464         msr     spsr, r0            // update spsr
465         add     lr, pc, #0x8        // update lr
466         movs    pc, lr              // update cpsr
467         nop
468         nop
469         nop
470         nop
471         msr     spsr, r1            // restore old spsr
472 #endif
473         mov     r0, #0
474         mcr     15, 0, r0, c7, c7, 0        /* invalidate I cache and D cache */
475         mcr     15, 0, r0, c8, c7, 0        /* invalidate TLBs */
476         mcr     15, 0, r0, c7, c10, 4       /* Data write barrier */
477
478         /* Also setup the Peripheral Port Remap register inside the core */
479         ldr     r0, ARM_PPMRR       /* start from AIPS 2GB region */
480         mcr     p15, 0, r0, c15, c2, 4
481 #ifdef L2CC_ENABLED
482         cmp     pc, #SDRAM_BASE_ADDR
483         blo     1f
484         cmp     pc, #(SDRAM_BASE_ADDR + SDRAM_SIZE)
485         blo     skip_l2
486
487         /*** L2 Cache setup/invalidation/disable ***/
488         /* Disable L2 cache first */
489         mov     r0, #L2CC_BASE_ADDR
490         mov     r2, #0
491         str     r2, [r0, #L2_CACHE_CTL_REG]
492         /*
493         * Configure L2 Cache:
494         * - 128k size(16k way)
495         * - 8-way associativity
496         * - 0 ws TAG/VALID/DIRTY
497         * - 4 ws DATA R/W
498         */
499         mov     r2, #0xFF000000
500         add     r2, r2, #0x00F00000
501         ldr     r1, [r0, #L2_CACHE_AUX_CTL_REG]
502         and     r1, r1, r2
503         ldr     r2, L2CACHE_PARAM
504         orr     r1, r1, r2
505         str     r1, [r0, #L2_CACHE_AUX_CTL_REG]
506
507         /* Invalidate L2 */
508         mov     r1, #0xFF
509         str     r1, [r0, #L2_CACHE_INV_WAY_REG]
510 L2_loop:
511         /* Poll Invalidate By Way register */
512         ldr     r2, [r0, #L2_CACHE_INV_WAY_REG]
513         ands    r2, r2, #0xFF
514         bne     L2_loop
515         /*** End of L2 operations ***/
516 skip_l2:
517 #endif
518
519 /*
520  * End of ARM1136 init
521  */
522 init_spba_start:
523         init_spba
524 init_aips_start:
525         init_aips
526 init_max_start:
527         init_max
528 init_m4if_start:
529         init_m4if
530 init_iomux_start:
531         init_iomux
532
533         LED_INIT
534         LED_CTRL 0
535
536         // disable wdog
537         mov     r0, #0x30
538         ldr     r1, WDOG1_BASE_W
539         strh    r0, [r1]
540
541         /* If SDRAM has been setup, bypass clock/WEIM setup */
542         cmp     pc, #SDRAM_BASE_ADDR
543         blo     external_boot_cont
544         cmp     pc, #(SDRAM_BASE_ADDR + SDRAM_SIZE)
545         blo     internal_boot_cont
546
547 external_boot_cont:
548 init_sdram_start:
549         setup_sdram
550
551 internal_boot_cont:
552 init_clock_start:
553         init_clock
554
555 HWInitialise_skip_SDRAM_setup:
556         ldr     r0, NFC_BASE_W
557         add     r2, r0, #0x1000     // 4K window
558         cmp     pc, r0
559         blo     Normal_Boot_Continue
560         cmp     pc, r2
561         bhs     Normal_Boot_Continue
562
563 NAND_Boot_Start:
564         /* Copy image from flash to SDRAM first */
565         ldr     r1, MXC_REDBOOT_RAM_START
566 1:
567         ldmia   r0!, {r3-r10}
568         stmia   r1!, {r3-r10}
569         cmp     r0, r2
570         blo     1b
571
572         /* Jump to SDRAM */
573         ldr     r1, CONST_0x0FFF
574         and     r0, pc, r1  /* offset of pc */
575         ldr     r1, MXC_REDBOOT_RAM_START
576         add     r1, r1, #0x8
577         add     pc, r0, r1
578         nop
579
580 Now_in_SDRAM:
581 NAND_Copy_Main:
582         // Check if x16/2kb page
583         //      ldr r7, CCM_BASE_ADDR_W
584         //      ldr r7, [r7, #0xC]
585         //      ands r7, r7, #(1 << 30)
586         ldr     r0, NFC_BASE_W                  //r0: nfc base. Reloaded after each page copying
587         mov     r1, #TX37_NAND_PAGE_SIZE        //r1: starting flash addr to be copied. Updated constantly
588                                 // ???? should be dynamic based on the page size kevin todo
589         add     r2, r0, #TX37_NAND_PAGE_SIZE    //r2: end of 3rd RAM buf. Doesn't change ?? dynamic
590
591         ldr     r11, NFC_IP_BASE_W              //r11: NFC IP register base. Doesn't change
592         add     r12, r0, #0x1E00                //r12: NFC AXI register base. Doesn't change
593         ldr     r14, MXC_REDBOOT_RAM_START
594         add     r13, r14, #REDBOOT_IMAGE_SIZE   //r13: end of SDRAM address for copying. Doesn't change
595         add     r14, r14, r1                    //r14: starting SDRAM address for copying. Updated constantly
596
597         //unlock internal buffer
598         mov     r3, #0xFF000000
599         add     r3, r3, #0x00FF0000
600         str     r3, [r11, #0x4]
601         str     r3, [r11, #0x8]
602         str     r3, [r11, #0xC]
603         str     r3, [r11, #0x10]
604         mov     r3, #0x20000        // BLS = 2 -> Buffer Lock Set = unlocked
605         add     r3, r3, #0x4        // WPC = 4 -> write protection command = unlock blocks
606         str     r3, [r11, #0x0]     // kevin - revist for multiple CS ??
607         mov     r3, #0
608         str     r3, [r11, #0x18]
609
610 Nfc_Read_Page:
611         mov     r3, #0x0
612         str     r3, [r12, #0x0]
613         mov     r3, #NAND_LAUNCH_FCMD
614         str     r3, [r12, #0xC]
615         do_wait_op_done
616
617 //  start_nfc_addr_ops(ADDRESS_INPUT_READ_PAGE, addr, nflash_dev_info->base_mask);
618         mov     r4, r1
619         mov     r3, #0
620         do_addr_input   //1st addr cycle
621
622         mov     r3, #0
623         do_addr_input   //2nd addr cycle
624
625         mov     r3, r4, lsr #11
626         and     r3, r3, #0xFF
627         mov     r3, r3, lsl #16
628         do_addr_input   //3rd addr cycle
629
630         mov     r3, r4, lsr #19
631         and     r3, r3, #0xFF
632         mov     r3, r3, lsl #16
633         do_addr_input   //4th addr cycle
634
635         mov     r3, #0x30
636         str     r3, [r12, #0x0]
637         mov     r3, #NAND_LAUNCH_FCMD
638         str     r3, [r12, #0xC]
639         do_wait_op_done
640
641 // write RBA=0 to NFC_CONFIGURATION1
642         mov     r3, #0
643         str     r3, [r12, #0x4]
644
645 //  writel(mode & 0xFF, NAND_LAUNCH_REG)
646         mov     r3, #0x8
647         str     r3, [r12, #0xC]
648         do_wait_op_done
649
650 Copy_Good_Blk:
651         @ copy page
652 1:
653         ldmia   r0!, {r3-r10}
654         stmia   r14!, {r3-r10}
655         cmp     r0, r2
656         blo     1b
657         cmp     r14, r13
658         bge     NAND_Copy_Main_done
659         add     r1, r1, #TX37_NAND_PAGE_SIZE
660         ldr     r0, NFC_BASE_W
661         b       Nfc_Read_Page
662
663 NAND_Copy_Main_done:
664
665 Normal_Boot_Continue:
666 #ifdef CYG_HAL_STARTUP_ROMRAM   /* enable running from RAM */
667         /* Copy image from flash to SDRAM first */
668         ldr     r0, SDRAM_ADDR_MASK
669         and     r0, r0, pc
670         ldr     r1, MXC_REDBOOT_RAM_START
671         cmp     r0, r1
672         beq     HWInitialise_skip_SDRAM_copy
673
674         add     r2, r0, #REDBOOT_IMAGE_SIZE
675 1:
676         ldmia   r0!, {r3-r10}
677         stmia   r1!, {r3-r10}
678         cmp     r0, r2
679         ble     1b
680
681         bl      jump_to_sdram
682 #endif /* CYG_HAL_STARTUP_ROMRAM */
683
684 HWInitialise_skip_SDRAM_copy:
685 /*
686  * Note:
687  *  IOMUX/PBC setup is done in C function plf_hardware_init() for simplicity
688  */
689 STACK_Setup:
690         // Set up a stack [for calling C code]
691         ldr     r1, =__startup_stack
692         ldr     r2, =RAM_BANK0_BASE
693         orr     sp, r1, r2
694
695         // Create MMU tables
696         bl      hal_mmu_init
697
698         // Enable MMU
699         ldr     r2, =10f
700         mrc     MMU_CP, 0, r1, MMU_Control, c0      // get c1 value to r1 first
701         orr     r1, r1, #7                          // enable MMU bit
702         orr     r1, r1, #0x800                      // enable z bit
703         b       9f
704         .align  5
705 9:
706         mcr     MMU_CP, 0, r1, MMU_Control, c0
707         mov     pc,r2   /* Change address spaces */
708         nop
709 10:
710         .endm                   // _platform_setup1
711
712 jump_to_sdram:
713         ldr     r0, SDRAM_ADDR_MASK
714         ldr     r1, MXC_REDBOOT_RAM_START
715         and     r0, lr, r0
716         sub     r0, r1, r0
717         add     lr, lr, r0
718         mov     pc, lr
719
720 #else // defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_ROMRAM)
721 #define PLATFORM_SETUP1
722 #endif
723         /* Do nothing */
724         .macro  init_spba
725         .endm  /* init_spba */
726
727         /* AIPS setup - Only setup MPROTx registers. The PACR default values are good.*/
728         .macro init_aips
729         /*
730         * Set all MPROTx to be non-bufferable, trusted for R/W,
731         * not forced to user-mode.
732         */
733         ldr     r0, AIPS1_CTRL_BASE_ADDR_W
734         ldr     r1, AIPS1_PARAM_W
735         str     r1, [r0, #0x00]
736         str     r1, [r0, #0x04]
737         ldr     r0, AIPS2_CTRL_BASE_ADDR_W
738         str     r1, [r0, #0x00]
739         str     r1, [r0, #0x04]
740         .endm /* init_aips */
741
742         /* MAX (Multi-Layer AHB Crossbar Switch) setup */
743         .macro init_max
744         ldr     r0, MAX_BASE_ADDR_W
745 #if 0
746         /* MPR - priority is M4 > M2 > M3 > M5 > M0 > M1 */
747         ldr     r1, MAX_PARAM1
748         str     r1, [r0, #0x000]        /* for S0 */
749         str     r1, [r0, #0x100]        /* for S1 */
750         str     r1, [r0, #0x200]        /* for S2 */
751         str     r1, [r0, #0x300]        /* for S3 */
752         str     r1, [r0, #0x400]        /* for S4 */
753         /* SGPCR - always park on last master */
754         ldr     r1, =0x10
755         str     r1, [r0, #0x010]        /* for S0 */
756         str     r1, [r0, #0x110]        /* for S1 */
757         str     r1, [r0, #0x210]        /* for S2 */
758         str     r1, [r0, #0x310]        /* for S3 */
759         str     r1, [r0, #0x410]        /* for S4 */
760         /* MGPCR - restore default values */
761         ldr     r1, =0x0
762         str     r1, [r0, #0x800]        /* for M0 */
763         str     r1, [r0, #0x900]        /* for M1 */
764         str     r1, [r0, #0xA00]        /* for M2 */
765         str     r1, [r0, #0xB00]        /* for M3 */
766         str     r1, [r0, #0xC00]        /* for M4 */
767         str     r1, [r0, #0xD00]        /* for M5 */
768 #endif
769         .endm /* init_max */
770
771         .macro  init_clock
772         /*
773         * Clock setup
774         * After this step,
775
776         Module      Freq (MHz)
777         ===========================
778         ARM core    532         ap_clk
779         AHB         133         ahb_clk
780         IP          66.5        ipg_clk
781         EMI         133         ddr_clk
782
783         * All other clocks can be figured out based on this.
784         */
785         /*
786         * Step 1: Switch to step clock
787         */
788         ldr     r0, CCM_BASE_ADDR_W
789         mov     r1, #0x00000104
790         str     r1, [r0, #CLKCTL_CCSR]
791
792         /* Step 2: Setup PLL's */
793         /* Set PLL1 to be 532MHz */
794         ldr     r0, PLL1_BASE_ADDR_W
795
796         ldr     r2, PLL_1_2_VAL
797         str     r2, [r0, #PLL_DP_CTL]   /* Set DPLL ON (set UPEN bit); BRMO=1 */
798         mov     r1, #0x2
799         str     r1, [r0, #PLL_DP_CONFIG]  /* Enable auto-restart AREN bit */
800
801         mov     r1, #0x50
802         str     r1, [r0, #PLL_DP_OP]
803         mov     r1, #23
804         str     r1, [r0, #PLL_DP_MFD]
805         mov     r1, #13
806         str     r1, [r0, #PLL_DP_MFN]
807
808         mov     r1, #0x50
809         str     r1, [r0, #PLL_DP_HFS_OP]
810         mov     r1, #23
811         str     r1, [r0, #PLL_DP_HFS_MFD]
812         mov     r1, #13
813         str     r1, [r0, #PLL_DP_HFS_MFN]
814
815         /* Now restart PLL 1 */
816         orr     r1, r2, #0x10
817         str     r1, [r0, #PLL_DP_CTL]
818 1:
819         ldr     r1, [r0, #PLL_DP_CTL]
820         ands    r1, r1, #0x1
821         beq     1b
822
823         /*
824         * Step 2: Setup PLL2 to 665 MHz.
825         */
826         ldr     r0, PLL2_BASE_ADDR_W
827
828         ldr     r2, PLL_1_2_VAL
829         str     r2, [r0, #PLL_DP_CTL]   /* Set DPLL ON (set UPEN bit); BRMO=1 */
830         mov     r1, #0x2
831         str     r1, [r0, #PLL_DP_CONFIG]        /* Enable auto-restart AREN bit */
832
833         mov     r1, #0x60
834         str     r1, [r0, #PLL_DP_OP]
835         mov     r1, #95
836         str     r1, [r0, #PLL_DP_MFD]
837         mov     r1, #89
838         str     r1, [r0, #PLL_DP_MFN]
839
840         mov     r1, #0x60
841         str     r1, [r0, #PLL_DP_HFS_OP]
842         mov     r1, #95
843         str     r1, [r0, #PLL_DP_HFS_MFD]
844         mov     r1, #89
845         str     r1, [r0, #PLL_DP_HFS_MFN]
846
847         /* Now restart PLL 2 */
848         orr     r1, r2, #0x10
849         str     r1, [r0, #PLL_DP_CTL]
850 1:
851         ldr     r1, [r0, #PLL_DP_CTL]
852         ands    r1, r1, #0x1
853         beq     1b
854
855         /*
856         * Set PLL 3 to 216MHz
857         */
858         ldr     r0, PLL3_BASE_ADDR_W
859
860         ldr     r2, PLL_3_VAL
861         str     r2, [r0, #PLL_DP_CTL]   /* Set DPLL ON (set UPEN bit); BRMO=1 */
862         mov     r1, #0x2
863         str     r1, [r0, #PLL_DP_CONFIG] /* Enable auto-restart AREN bit */
864
865         mov     r1, #0x92
866         str     r1, [r0, #PLL_DP_OP]
867         mov     r1, #0x0
868         str     r1, [r0, #PLL_DP_MFD]
869         mov     r1, #0x0
870         str     r1, [r0, #PLL_DP_MFN]
871
872         mov     r1, #0x91
873         str     r1, [r0, #PLL_DP_HFS_OP]
874         mov     r1, #0x0
875         str     r1, [r0, #PLL_DP_HFS_MFD]
876         mov     r1, #0x0
877         str     r1, [r0, #PLL_DP_HFS_MFN]
878
879         /* Now restart PLL 3 */
880         orr     r1, r2, #0x10
881         str     r1, [r0, #PLL_DP_CTL]
882 1:
883         ldr     r1, [r0, #PLL_DP_CTL]
884         ands    r1, r1, #0x1
885         beq     1b
886         /* End of PLL 3 setup */
887
888         /* Setup the ARM platform clock dividers */
889         ldr     r0, PLATFORM_BASE_ADDR_W
890         ldr     r1, PLATFORM_CLOCK_DIV_W
891         str     r1, [r0, #0x18]
892
893         /*
894         * Step 3: switching to PLL 1 and restore default register values.
895         */
896         ldr     r0, CCM_BASE_ADDR_W
897         mov     r1, #0x00000100
898         str     r1, [r0, #CLKCTL_CCSR]
899
900         mov     r1, #0x000A0000
901         add     r1, r1, #0x00000F0
902         str     r1, [r0, #CLKCTL_CCOSR]
903         /* Use 133MHz for DDR clock */
904         mov     r1, #0x1C00
905         str     r1, [r0, #CLKCTL_CAMR]
906         /* Use PLL 2 for UART's, get 66.5MHz from it */
907         ldr     r1, CCM_CSCMR1_VAL
908         str     r1, [r0, #CLKCTL_CSCMR1]
909         ldr     r1, CCM_CSCDR1_VAL
910         str     r1, [r0, #CLKCTL_CSCDR1]
911
912         mov     r1, #0x1C
913         str     r1, [r0, #CLKCTL_CBCDR7]
914         mov     r1, #1
915         str     r1, [r0, #4]
916         .endm /* init_clock */
917
918         /* M4IF setup */
919         .macro init_m4if
920         /* Configure M4IF registers, VPU and IPU given higher priority (=0x4)
921         IPU accesses with ID=0x1 given highest priority (=0xA) */
922         ldr     r1, M4IF_BASE_W
923         ldr     r0, M4IF_0x00000a01
924         str     r0, [r1, #M4IF_FIDBP]
925
926         ldr     r0, M4IF_0x00000404
927         str     r0, [r1, #M4IF_FBPM0]
928         .endm /* init_m4if */
929
930         .macro setup_sdram
931         ldr     r0, ESDCTL_BASE_W
932         /* Set CSD0 */
933         mov     r1, #0x80000000
934         str     r1, [r0, #ESDCTL_ESDCTL0]
935 1:
936         @ wait for SDRAM ready
937         ldr     r2, [r0, #ESDCTL_ESDMISC]
938         and     r2, r2, r1
939         beq     1b
940
941         /* Precharge command */
942         ldr     r1, SDRAM_CMD_PRECHG
943         str     r1, [r0, #ESDCTL_ESDSCR]
944
945         /* 2 refresh commands */
946         ldr     r1, SDRAM_CMD_SLFRFSH
947         .rept   2
948         str     r1, [r0, #ESDCTL_ESDSCR]
949         .endr
950
951         /* LMR with CAS Latency=3 and BurstLength=3->8words */
952         ldr     r1, SDRAM_CMD_MODEREG
953         str     r1, [r0, #ESDCTL_ESDSCR]
954
955         /* 13 ROW, 9 COL, 32Bit, SREF=4 */
956         ldr     r1, SDRAM_ESDCTL0_VAL
957         str     r1, [r0, #ESDCTL_ESDCTL0]
958
959         /* Timing parameters */
960         ldr     r1, SDRAM_ESDCFG0_VAL
961         str     r1, [r0, #ESDCTL_ESDCFG0]
962
963         /* MDDR enable, RALAT=1 */
964         ldr     r1, SDRAM_ESDMISC_VAL
965         str     r1, [r0, #ESDCTL_ESDMISC]
966
967         /* Normal mode */
968         mov     r1, #0x00000000
969         str     r1, [r0, #ESDCTL_ESDSCR]
970         .endm
971
972         .macro do_wait_op_done
973 1:
974         ldr     r3, [r11, #0x18]
975         ands    r3, r3, #NFC_IPC_INT
976         beq     1b
977         mov     r3, #0x0
978         str     r3, [r11, #0x18]
979         .endm   // do_wait_op_done
980
981         .macro do_addr_input
982         str     r3, [r12, #0x0]
983         mov     r3, #NAND_LAUNCH_FADD
984         str     r3, [r12, #0xC]
985         do_wait_op_done
986         .endm   // do_addr_input
987
988         /* To support 133MHz DDR */
989         .macro  init_iomux
990         ldr     r0, IOMUXC_BASE_ADDR_W
991
992         // DDR signal setup for D16-D31 and drive strength
993         mov     r8, #0x1
994         add     r1, r0, #8
995         add     r2, r0, #0x4C
996 1:
997         stmia   r1!, {r8}
998         cmp     r1, r2
999         bls     1b
1000
1001         str     r8, [r0, #0x5C]
1002         str     r8, [r0, #0x60]
1003
1004         add     r2, r0, #0x200
1005         mov     r8, #0x2C4
1006         str     r8, [r2, #0xBC]
1007         str     r8, [r2, #0xC0]
1008
1009         mov     r8, #0x2
1010         str     r8, [r0, #0x4A8]
1011         str     r8, [r0, #0x4B0]
1012         str     r8, [r0, #0x4B4]
1013         str     r8, [r0, #0x4E0]
1014         str     r8, [r0, #0x4FC]
1015         str     r8, [r0, #0x504]
1016         str     r8, [r0, #0x48C]
1017         str     r8, [r0, #0x49C]
1018
1019         add     r1, r0, #0x278
1020         add     r2, r0, #0x29C
1021 2:
1022         stmia   r1!, {r8}
1023         cmp     r1, r2
1024         bls     2b
1025         .endm /* init_iomux */
1026
1027 #define PLATFORM_VECTORS        _platform_vectors
1028         .macro  _platform_vectors
1029         .globl  _KARO_MAGIC
1030 _KARO_MAGIC:
1031         .ascii  "KARO_CE6"
1032         .globl  _KARO_STRUCT_SIZE
1033 _KARO_STRUCT_SIZE:
1034         .word   0       // reserve space structure length
1035
1036         .globl  _KARO_CECFG_START
1037 _KARO_CECFG_START:
1038         .rept   1024/4
1039         .word   0       // reserve space for CE configuration
1040         .endr
1041
1042         .globl  _KARO_CECFG_END
1043 _KARO_CECFG_END:
1044         .endm
1045
1046 KaRo_MSG:               .asciz  "KARO TX37 " __DATE__ " " __TIME__ "\n"
1047 ARM_PPMRR:              .word   0x80000016
1048 L2CACHE_PARAM:          .word   0x0003001B
1049 WDOG1_BASE_W:           .word   WDOG1_BASE_ADDR
1050 IIM_SREV_REG_VAL:       .word   IIM_BASE_ADDR + IIM_SREV_OFF
1051 AIPS1_CTRL_BASE_ADDR_W: .word   AIPS1_CTRL_BASE_ADDR
1052 AIPS2_CTRL_BASE_ADDR_W: .word   AIPS2_CTRL_BASE_ADDR
1053 AIPS1_PARAM_W:          .word   0x77777777
1054 MAX_BASE_ADDR_W:        .word   MAX_BASE_ADDR
1055 MAX_PARAM1:             .word   0x00302154
1056 ESDCTL_BASE_W:          .word   ESDCTL_BASE
1057 M4IF_BASE_W:            .word   M4IF_BASE
1058 M4IF_0x00000a01:        .word   0x00000a01
1059 M4IF_0x00000404:        .word   0x00000404
1060 NFC_BASE_W:             .word   NFC_BASE
1061 NFC_IP_BASE_W:          .word   NFC_IP_BASE
1062 SDRAM_CMD_PRECHG:       .word   0x04008008
1063 SDRAM_CMD_SLFRFSH:      .word   0x00008010
1064 SDRAM_CMD_MODEREG:      .word   0x00338018
1065 #if SDRAM_SIZE > SZ_64M
1066 SDRAM_ESDCTL0_VAL:      .word   0xB2220000
1067 #else
1068 SDRAM_ESDCTL0_VAL:      .word   0xB2120000
1069 #endif
1070 SDRAM_ESDCFG0_VAL:      .word   0x70395729
1071 SDRAM_ESDMISC_VAL:      .word   0x000A0084
1072 IOMUXC_BASE_ADDR_W:     .word   IOMUXC_BASE_ADDR
1073 GPIO2_BASE_ADDR_W:      .word   GPIO2_BASE_ADDR
1074 MXC_REDBOOT_RAM_START:  .word   SDRAM_BASE_ADDR + SDRAM_SIZE - REDBOOT_OFFSET
1075 SDRAM_ADDR_MASK:        .word   0xFFFFF000
1076 CONST_0x0FFF:           .word   0x0FFF
1077 CCM_BASE_ADDR_W:        .word   CCM_BASE_ADDR
1078 PLATFORM_BASE_ADDR_W:   .word   PLATFORM_BASE_ADDR
1079 PLATFORM_CLOCK_DIV_W:   .word   0x00077713
1080 CCM_CSCDR1_VAL:         .word   0x01450B21
1081 CCM_CSCMR1_VAL:         .word   0xA5A6A020
1082 PLL1_BASE_ADDR_W:       .word   PLL1_BASE_ADDR
1083 PLL2_BASE_ADDR_W:       .word   PLL2_BASE_ADDR
1084 PLL3_BASE_ADDR_W:       .word   PLL3_BASE_ADDR
1085 PLL_1_2_VAL:            .word   0x1222
1086 PLL_3_VAL:              .word   0x222
1087
1088 /*--------------------------------------------------------------------------*/
1089 /* end of hal_platform_setup.h                                              */
1090 #endif /* CYGONCE_HAL_PLATFORM_SETUP_H */