]> git.kernelconcepts.de Git - karo-tx-redboot.git/blob - packages/hal/arm/mx53/karo/v1_0/include/hal_platform_setup.h
RedBoot TX53 Release 2012-02-15
[karo-tx-redboot.git] / packages / hal / arm / mx53 / 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 CYGBLD_HAL_PLF_DEFS_H          // Platform specific hardware definitions
51 #include CYGHWR_MEMORY_LAYOUT_H
52
53 #define CPU_CLK                         CYGNUM_HAL_ARM_TX53_CPU_CLK
54
55 #define SDRAM_CLK                       400
56
57 #define DEBUG_LED_BIT                   20
58 #define LED_GPIO_BASE                   GPIO2_BASE_ADDR
59 #define LED_MUX_OFFSET                  0x174
60 #define LED_MUX_MODE                    0x11
61
62 #ifdef CYGOPT_HAL_ARM_TX53_DEBUG
63 #define LED_ON                          bl      led_on
64 #define LED_OFF                         bl      led_off
65 #else
66 #define LED_ON
67 #define LED_OFF
68 #endif
69
70 #if defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_ROMRAM)
71 #define PLATFORM_SETUP1 _platform_setup1
72 #define CYGHWR_HAL_ARM_HAS_MMU
73
74 #ifdef CYG_HAL_STARTUP_ROMRAM
75 #define CYGSEM_HAL_ROM_RESET_USES_JUMP
76 #endif
77
78 #define TX53_NAND_PAGE_SIZE             2048
79 #define TX53_NAND_BLKS_PER_PAGE         64
80
81 #define PLATFORM_PREAMBLE flash_header
82
83 // This macro represents the initial startup code for the platform
84         .macro  _platform_setup1
85 KARO_TX53_SETUP_START:
86         mrs     r0, CPSR
87         bic     r0, r0, #0x1f
88         orr     r0, r0, #0xd3
89         msr     CPSR_fc, r0
90
91         /*
92          * Invalidate L1 I/D
93          */
94         mov     r0, #0                  @ set up for MCR
95         mcr     p15, 0, r0, c8, c7, 0   @ invalidate TLBs
96         mcr     p15, 0, r0, c7, c5, 0   @ invalidate icache
97
98         /*
99          * disable MMU stuff and caches
100          */
101         mrc     p15, 0, r0, c1, c0, 0
102         bic     r0, r0, #0x00002000     @ clear bits 13 (--V-)
103         bic     r0, r0, #0x00000007     @ clear bits 2:0 (-CAM)
104         orr     r0, r0, #0x00000002     @ set bit 1 (--A-) Align
105         orr     r0, r0, #0x00000800     @ set bit 12 (Z---) BTB
106         mcr     p15, 0, r0, c1, c0, 0
107
108         /* ARM errata ID #468414 */
109         mrc     15, 0, r1, c1, c0, 1
110         orr     r1, r1, #(1 << 5)    /* enable L1NEON bit */
111         mcr     15, 0, r1, c1, c0, 1
112
113         // Explicitly disable L2 cache
114         mrc     15, 0, r0, c1, c0, 1
115         bic     r0, r0, #0x2
116         mcr     15, 0, r0, c1, c0, 1
117
118         // reconfigure L2 cache aux control reg
119         mov     r0, #0xC0               // tag RAM
120         add     r0, r0, #0x4            // data RAM
121         orr     r0, r0, #(1 << 24)      // disable write allocate delay
122         orr     r0, r0, #(1 << 23)      // disable write allocate combine
123         orr     r0, r0, #(1 << 22)      // disable write allocate
124
125         mcr     15, 1, r0, c9, c0, 2
126
127 init_aips_start:
128         init_aips
129         /* switch off LCD backlight */
130         ldr     r10, =GPIO1_BASE_ADDR
131
132         ldr     r9, [r10, #GPIO_DR]
133         orr     r9, r9, #(1 << 1)
134         str     r9, [r10, #GPIO_DR]
135
136         ldr     r9, [r10, #GPIO_GDIR]
137         orr     r9, r9, #(1 << 1)
138         str     r9, [r10, #GPIO_GDIR]
139
140         LED_INIT
141
142 init_clock_start:
143         init_clock
144         LED_BLINK #1
145
146 Normal_Boot_Continue:
147 /*
148  * Note:
149  *      IOMUX/PBC setup is done in C function plf_hardware_init() for simplicity
150  */
151 STACK_Setup:
152         @ Set up a stack [for calling C code]
153         ldr     r1, =__startup_stack
154         ldr     r2, =RAM_BANK0_BASE
155         orr     sp, r1, r2
156
157         @ Create MMU tables
158
159         LED_BLINK #2
160         bl      hal_mmu_init
161         LED_BLINK #3
162
163         /* Workaround for arm erratum #709718 */
164         @ Setup PRRR so device is always mapped to non-shared
165         mrc     MMU_CP, 0, r1, c10, c2, 0 // Read Primary Region Remap Register
166         bic     r1, #(3 << 16)
167         mcr     MMU_CP, 0, r1, c10, c2, 0 // Write Primary Region Remap Register
168
169         @ Enable MMU
170         adr     r2, 10f
171         mrc     MMU_CP, 0, r1, MMU_Control, c0
172         orr     r1, r1, #7                      @ enable MMU bit
173         orr     r1, r1, #0x800                  @ enable z bit
174         orr     r1, r1, #(1 << 28)              @ Enable TEX remap, workaround for L1 cache issue
175         mcr     MMU_CP, 0, r1, MMU_Control, c0
176
177         /* Workaround for arm errata #621766 */
178         mrc     MMU_CP, 0, r1, MMU_Control, c0, 1
179         orr     r1, r1, #(1 << 5)               @ enable L1NEON bit
180         mcr     MMU_CP, 0, r1, MMU_Control, c0, 1
181
182         mov     pc, r2                          @ Change address spaces
183         .ltorg
184         .align  5
185 10:
186         LED_BLINK #4
187         .endm   @ _platform_setup1
188
189         /* AIPS setup - Only setup MPROTx registers. The PACR default values are good.*/
190         .macro  init_aips
191         /*
192         * Set all MPROTx to be non-bufferable, trusted for R/W,
193         * not forced to user-mode.
194         */
195         ldr     r0, =AIPS1_CTRL_BASE_ADDR
196         ldr     r1, =0x77777777
197         str     r1, [r0, #0x00]
198         str     r1, [r0, #0x04]
199         ldr     r0, =AIPS2_CTRL_BASE_ADDR
200         str     r1, [r0, #0x00]
201         str     r1, [r0, #0x04]
202         .endm   /* init_aips */
203
204         .macro  init_clock
205         ldr     r0, =CCM_BASE_ADDR
206         ldr     r1, [r0, #CLKCTL_CCR]
207         tst     r1, #(1 << 12)
208         bne     osc_ok
209
210         orr     r1, r1, #(1 << 12)
211         str     r1, [r0, #CLKCTL_CCR]
212 osc_ok:
213         /* Switch ARM to step clock */
214         mov     r1, #0x4
215         str     r1, [r0, #CLKCTL_CCSR]
216
217 #if CPU_CLK == 1000
218         setup_pll PLL1_BASE_ADDR, 1000
219 #elif CPU_CLK == 800
220         setup_pll PLL1_BASE_ADDR, 800
221 #else
222 #error Bad CPU clock
223 #endif
224         setup_pll PLL3_BASE_ADDR, 400
225
226         /* Switch peripherals to PLL3 */
227         ldr     r1, [r0, #CLKCTL_CBCMR]
228         bic     r1, #(3 << 12)
229         orr     r1, #(1 << 12)
230         str     r1, [r0, #CLKCTL_CBCMR]
231
232         ldr     r1, [r0, #CLKCTL_CBCDR]
233         orr     r1, r1, #(1 << 25)
234         str     r1, [r0, #CLKCTL_CBCDR]
235 1:
236         /* make sure change is effective */
237         ldr     r1, [r0, #CLKCTL_CDHIPR]
238         cmp     r1, #0x0
239         bne     1b
240
241 #if SDRAM_CLK == 400
242         setup_pll PLL2_BASE_ADDR, 400
243 #elif SDRAM_CLK == 333
244         setup_pll PLL2_BASE_ADDR, 333
245 #elif SDRAM_CLK == 266
246         setup_pll PLL2_BASE_ADDR, 266
247 #elif SDRAM_CLK == 216
248         setup_pll PLL2_BASE_ADDR, 216
249 #elif SDRAM_CLK == 666
250         setup_pll PLL2_BASE_ADDR, 666
251 #else
252 #error Bad SDRAM_CLK
253 #endif
254         /* Switch peripheral to PLL2 */
255         ldr     r1, [r0, #CLKCTL_CBCDR]
256         bic     r1, #(1 << 25)
257         str     r1, [r0, #CLKCTL_CBCDR]
258
259         ldr     r1, [r0, #CLKCTL_CBCMR]
260         bic     r1, #(3 << 12)
261         orr     r1, #(2 << 12)
262         str     r1, [r0, #CLKCTL_CBCMR]
263
264         /* make sure change is effective */
265 1:
266         ldr     r1, [r0, #CLKCTL_CDHIPR]
267         cmp     r1, #0x0
268         bne     1b
269
270         setup_pll PLL3_BASE_ADDR, 216
271
272         /* Set the platform clock dividers */
273         ldr     r2, =PLATFORM_BASE_ADDR
274         ldr     r1, PLATFORM_CLOCK_DIV
275         str     r1, [r2, #PLATFORM_ICGC]
276
277         mov     r1, #0
278         str     r1, [r0, #CLKCTL_CACRR] /* ARM podf */
279
280         /* Switch ARM back to PLL 1. */
281         mov     r1, #0
282         str     r1, [r0, #CLKCTL_CCSR]
283
284         /* setup the rest */
285         ldr     r1, W_CSCDR1_VAL
286         str     r1, [r0, #CLKCTL_CSCDR1]
287         ldr     r1, W_CSCMR1_VAL
288         str     r1, [r0, #CLKCTL_CSCMR1]
289
290         mov     r1, #0x00000
291         str     r1, [r0, #CLKCTL_CCDR]
292
293         /* for cko - for ARM div by 8 */
294         mov     r1, #0x000A0000
295         orr     r1, r1, #0x00000F0
296         str     r1, [r0, #CLKCTL_CCOSR]
297 end_clk_init:
298         .endm   @ init_clock
299
300         .macro  setup_pll pll, mhz
301         ldr     r2, =\pll
302         ldr     r1, =0x1232
303         str     r1, [r2, #PLL_DP_CTL]           @ Set DPLL ON (set UPEN bit); BRMO=1
304         mov     r1, #0x2
305         str     r1, [r2, #PLL_DP_CONFIG]        @ Enable auto-restart AREN bit
306
307         ldr     r1, W_DP_OP_\mhz
308         str     r1, [r2, #PLL_DP_OP]
309         str     r1, [r2, #PLL_DP_HFS_OP]
310
311         ldr     r1, W_DP_MFD_\mhz
312         str     r1, [r2, #PLL_DP_MFD]
313         str     r1, [r2, #PLL_DP_HFS_MFD]
314
315         ldr     r1, W_DP_MFN_\mhz
316         str     r1, [r2, #PLL_DP_MFN]
317         str     r1, [r2, #PLL_DP_HFS_MFN]
318
319         /* Now restart PLL */
320         ldr     r1, =0x1232
321         str     r1, [r2, #PLL_DP_CTL]
322 101:
323         ldr     r1, [r2, #PLL_DP_CTL]
324         ands    r1, r1, #0x1
325         beq     101b
326         .endm
327 #else // defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_ROMRAM)
328 #define PLATFORM_SETUP1
329 #endif
330 #ifndef CYGOPT_HAL_ARM_TX53_DEBUG
331         .macro  LED_BLINK,val
332         .endm
333         .macro  DELAY,ms
334         .endm
335 #else
336 #define CYGHWR_LED_MACRO        LED_BLINK #\x
337
338         .macro  DELAY,ms
339         ldr     r10, =\ms
340         bl      delay
341         .endm
342
343         .macro  LED_BLINK,val
344         mov     r8, \val
345         bl      led_blink
346         .endm
347 #endif
348
349         .macro  LED_INIT
350         // initialize GPIO4_10 (PAD CSI2_D13) for LED on STK5
351         ldr     r10, =LED_GPIO_BASE
352         // GPIO_DR
353         ldr     r9, [r10, #GPIO_DR]
354         bic     r9, #(1 << DEBUG_LED_BIT)       @ LED OFF
355         str     r9, [r10, #GPIO_DR]
356         // GPIO_GDIR
357         ldr     r9, [r10, #GPIO_GDIR]
358         orr     r9, r9, #(1 << DEBUG_LED_BIT)
359         str     r9, [r10, #GPIO_GDIR]
360         .endm
361
362 #ifdef CYGOPT_HAL_ARM_TX53_DEBUG
363 led_on:
364         ldr     r10, =LED_GPIO_BASE
365         // GPIO_DR
366         ldr     r9, [r10, #GPIO_DR]
367         orr     r9, #(1 << DEBUG_LED_BIT)       @ LED ON
368         str     r9, [r10, #GPIO_DR]
369         mov     pc, lr
370
371 led_off:
372         ldr     r10, =LED_GPIO_BASE
373         // GPIO_DR
374         ldr     r9, [r10, #GPIO_DR]
375         bic     r9, #(1 << DEBUG_LED_BIT)       @ LED OFF
376         str     r9, [r10, #GPIO_DR]
377         mov     pc, lr
378
379 delay:
380         subs    r10, r10, #1
381         movmi   pc, lr
382
383         ldr     r9, =(36000 / 10)
384 2:
385         subs    r9, r9, #1
386         bne     2b
387         b       delay
388
389 led_blink:
390         mov     r7, lr
391 1:
392         subs    r8, r8, #1
393         bmi     2f
394
395         LED_ON
396         DELAY   200
397         LED_OFF
398         DELAY   300
399         b       1b
400 2:
401         DELAY   700
402         mov     pc, r7
403 #endif
404
405 #define PLATFORM_VECTORS         _platform_vectors
406         .macro  _platform_vectors
407         .globl  _KARO_MAGIC
408 _KARO_MAGIC:
409         .ascii  "KARO_CE6"
410         .globl  _KARO_STRUCT_SIZE
411 _KARO_STRUCT_SIZE:
412         .word   0       // reserve space structure length
413
414         .globl  _KARO_CECFG_START
415 _KARO_CECFG_START:
416         .rept   1024 / 4
417         .word   0       // reserve space for CE configuration
418         .endr
419
420         .globl  _KARO_CECFG_END
421 _KARO_CECFG_END:
422         .endm
423
424         .ltorg
425         .align  5
426         .ascii  "KARO TX53 " __DATE__ " " __TIME__
427         .align
428
429 #define CPU_2_BE_32(l)                  \
430         ((((l) << 24) & 0xFF000000) |   \
431         (((l) << 8) & 0x00FF0000) |     \
432         (((l) >> 8) & 0x0000FF00) |     \
433         (((l) >> 24) & 0x000000FF))
434
435 #define MXC_DCD_ITEM(addr, val)         \
436         .word   CPU_2_BE_32(addr), CPU_2_BE_32(val)
437
438 #define MXC_DCD_CMD_SZ_BYTE             1
439 #define MXC_DCD_CMD_SZ_SHORT            2
440 #define MXC_DCD_CMD_SZ_WORD             4
441 #define MXC_DCD_CMD_FLAG_WRITE          0x0
442 #define MXC_DCD_CMD_FLAG_CLR            0x1
443 #define MXC_DCD_CMD_FLAG_SET            0x3
444 #define MXC_DCD_CMD_FLAG_CHK_ANY        (1 << 0)
445 #define MXC_DCD_CMD_FLAG_CHK_SET        (1 << 1)
446 #define MXC_DCD_CMD_FLAG_CHK_CLR        (0 << 1)
447
448 #define MXC_DCD_CMD_WRT(type, flags, next)                                      \
449         .word   CPU_2_BE_32((0xcc << 24) | (((next) - .) << 8) | ((flags) << 3) | (type))
450
451 #define MXC_DCD_CMD_CHK(type, flags, addr, mask)                                \
452         .word   CPU_2_BE_32((0xcf << 24) | (12 << 8) | ((flags) << 3) | (type)),\
453                 CPU_2_BE_32(addr), CPU_2_BE_32(mask)
454
455 #define MXC_DCD_CMD_CHK_CNT(type, flags, addr, mask, count)                     \
456         .word   CPU_2_BE_32((0xcf << 24) | (16 << 8) | ((flags) << 3) | (type)),\
457                 CPU_2_BE_32(addr), CPU_2_BE_32(mask), CPU_2_BE_32(count)
458
459 #define MXC_DCD_CMD_NOP()                                                       \
460         .word   CPU_2_BE_32((0xc0 << 24) | (4 << 8))
461
462 #define CK_TO_NS(ck)    (((ck) * 1000 + SDRAM_CLK / 2) / SDRAM_CLK)
463 #define NS_TO_CK(ns)    (((ns) * SDRAM_CLK + 999) / 1000)
464
465         .macro          CK_VAL, name, clks, offs, max
466         .iflt           \clks - \offs
467         .set            \name, 0
468         .else
469         .ifle           \clks - \offs - \max
470         .set            \name, \clks - \offs
471         .endif
472         .endif
473         .endm
474
475         .macro          NS_VAL, name, ns, offs, max
476         .iflt           \ns - \offs
477         .set            \name, 0
478         .else
479         CK_VAL          \name, NS_TO_CK(\ns), \offs, \max
480         .endif
481         .endm
482
483         .macro          CK_MAX, name, ck1, ck2, offs, max
484         .ifgt           \ck1 - \ck2
485         CK_VAL          \name, \ck1, \offs, \max
486         .else
487         CK_VAL          \name, \ck2, \offs, \max
488         .endif
489         .endm
490
491 #define ESDMISC_DDR_TYPE_DDR3           0
492 #define ESDMISC_DDR_TYPE_LPDDR2         1
493 #define ESDMISC_DDR_TYPE_DDR2           2
494
495 #define DIV_ROUND_UP(m,d)               (((m) + (d) - 1) / (d))
496
497 #define CKIL_FREQ_Hz                    32768
498 #define ESDOR_CLK_PERIOD_ns             (1000000000 / CKIL_FREQ_Hz / 2) /* base clock for ESDOR values */
499
500 /* DDR3 SDRAM */
501 #if SDRAM_SIZE > SZ_512M
502 #define BANK_ADDR_BITS                  2
503 #else
504 #define BANK_ADDR_BITS                  1
505 #endif
506 #define SDRAM_BURST_LENGTH              8
507 #define RALAT                           5
508 #define WALAT                           1
509 #define ADDR_MIRROR                     0
510 #define DDR_TYPE                        ESDMISC_DDR_TYPE_DDR3
511
512 /* 512/1024MiB SDRAM: NT5CB128M16P-CG */
513 /* ESDCFG0 0x0c */
514 NS_VAL  tRFC,   160, 1, 255             /* clks - 1 (0..255) */
515 CK_MAX  tXS,    tRFC + 1 + NS_TO_CK(10), 5, 1, 255 /* clks - 1 (0..255) tRFC + 10 */
516 CK_MAX  tXP,    3, NS_TO_CK(6), 1, 7    /* clks - 1 (0..7) */ /* max(6ns, 3*CK) */
517 CK_MAX  tXPDLL, NS_TO_CK(24), 2, 1, 15  /* clks - 1 (0..15) */
518 NS_VAL  tFAW,   45, 1, 31               /* clks - 1 (0..31) */
519 CK_VAL  tCL,    9, 3, 8                 /* clks - 3 (0..8) CAS Latency */
520
521 /* ESDCFG1 0x10 */
522 NS_VAL  tRCD,   14, 1, 7                /* clks - 1 (0..7) */
523 NS_VAL  tRP,    14, 1, 7                /* clks - 1 (0..7) */
524 NS_VAL  tRC,    50, 1, 31               /* clks - 1 (0..31) */
525 NS_VAL  tRAS,   36, 1, 31               /* clks - 1 (0..31) */
526 CK_VAL  tRPA,   0, 0, 1                 /* clks     (0..1) */
527 NS_VAL  tWR,    15, 1, 15               /* clks - 1 (0..15) */
528 CK_VAL  tMRD,   4, 1, 15                /* clks - 1 (0..15) */
529 CK_VAL  tCWL,   5, 2, 6                 /* clks - 2 (0..6) */
530
531 /* ESDCFG2 0x14 */
532 CK_VAL  tDLLK,  512, 1, 511             /* clks - 1 (0..511) */
533 CK_MAX  tRTP,   4, NS_TO_CK(8), 1, 7    /* clks - 1 (0..7) */
534 CK_MAX  tWTR,   4, NS_TO_CK(8), 1, 7    /* clks - 1 (0..7) */
535 CK_MAX  tRRD,   4, NS_TO_CK(8), 1, 7    /* clks - 1 (0..7) */
536
537 /* ESDOR 0x30 */
538 CK_MAX  tXPR,   NS_TO_CK(CK_TO_NS(tRFC + 1) + 10), 5, 1, 255 /* clks - 1 (0..255) max(tRFC + 10, 5CK) */
539
540 /* ESDOTC 0x08 */
541 NS_VAL  tAOFPD, 9, 1, 7                 /* clks - 1 (0..7) */
542 NS_VAL  tAONPD, 9, 1, 7                 /* clks - 1 (0..7) */
543 CK_VAL  tANPD,  tCWL, 1, 15             /* clks - 1 (0..15) */
544 CK_VAL  tAXPD,  tCWL, 1, 15             /* clks - 1 (0..15) */
545 CK_VAL  tODTLon tCWL - 1, 1, 7          /* clks - 1 (0..7) */
546 CK_VAL  tODTLoff tCWL - 1, 1, 31        /* clks - 1 (0..31) */
547
548 #define tSDE_RST                        (DIV_ROUND_UP(200000, ESDOR_CLK_PERIOD_ns) + 1)
549
550                                         /* Add an extra (or two?) ESDOR_CLK_PERIOD_ns according to
551                                          * erroneous Erratum Engcm12377
552                                          */
553 #define tRST_CKE                        (DIV_ROUND_UP(500000 + 2 * ESDOR_CLK_PERIOD_ns, ESDOR_CLK_PERIOD_ns) + 1)
554
555 #define ROW_ADDR_BITS                   14
556 #define COL_ADDR_BITS                   10
557
558         .iflt   tWR - 7
559         .set    mrs_val, (0x8080 | \
560                         (3 << 4) /* MRS command */ | \
561                         ((1 << 8) /* DLL Reset */ | \
562                         ((tWR + 1 - 4) << 9) | \
563                         (((tCL + 3) - 4) << 4)) << 16)
564         .else
565         .set    mrs_val, (0x8080 | \
566                         (3 << 4) /* MRS command */ | \
567                         ((1 << 8) /* DLL Reset */ | \
568                         (((tWR + 1) / 2) << 9) | \
569                         (((tCL + 3) - 4) << 4)) << 16)
570         .endif
571 #define ESDSCR_MRS_VAL(cs)      (mrs_val | ((cs) << 3))
572
573 #define ESDCFG0_VAL     (               \
574         (tRFC << 24) |                  \
575         (tXS << 16) |                   \
576         (tXP << 13) |                   \
577         (tXPDLL << 9) |                 \
578         (tFAW << 4) |                   \
579         (tCL << 0))                     \
580
581 #define ESDCFG1_VAL     (               \
582         (tRCD << 29) |                  \
583         (tRP << 26) |                   \
584         (tRC << 21) |                   \
585         (tRAS << 16) |                  \
586         (tRPA << 15) |                  \
587         (tWR << 9) |                    \
588         (tMRD << 5) |                   \
589         (tCWL << 0))                    \
590
591 #define ESDCFG2_VAL     (               \
592         (tDLLK << 16) |                 \
593         (tRTP << 6) |                   \
594         (tWTR << 3) |                   \
595         (tRRD << 0))
596
597 #define BL                              (SDRAM_BURST_LENGTH / 8) /* 0: 4 byte 1: 8 byte */
598 #define ESDCTL_VAL                      (((ROW_ADDR_BITS - 11) << 24) | \
599                                         ((COL_ADDR_BITS - 9) << 20) | \
600                                         (BL << 19) | \
601                                         (1 << 16) | /* SDRAM bus width */ \
602                                         ((-1) << (32 - BANK_ADDR_BITS)))
603
604 #define ESDMISC_VAL                     ((1 << 12) | \
605                                         (0x3 << 9) | \
606                                         (RALAT << 6) | \
607                                         (WALAT << 16) | \
608                                         (ADDR_MIRROR << 19) | \
609                                         (DDR_TYPE << 3))
610
611 #define ESDOR_VAL               ((tXPR << 16) | (tSDE_RST << 8) | (tRST_CKE << 0))
612
613 #define ESDOTC_VAL              ((tAOFPD << 27) |       \
614                                 (tAONPD << 24) |        \
615                                 (tANPD << 20) |         \
616                                 (tAXPD << 16) |         \
617                                 (tODTLon << 12) |       \
618                                 (tODTLoff << 4))
619
620         .macro  flash_header
621 __text_start:
622 fcb_start:
623         b       reset_vector
624         .word   0x20424346      /* "FCB " marker */
625         .word   0x01    /* FCB version number */
626         .org    0x68
627         .word   0x0     /* primary image starting page number */
628         .word   0x0     /* secondary image starting page number */
629         .word   0x6b
630         .word   0x6b
631         .word   0x0     /* DBBT start page (0 == NO DBBT) */
632         .word   0       /* Bad block marker offset in main area (unused) */
633         .org    0xac
634         .word   0       /* BI Swap disabled */
635         .word   0       /* Bad Block marker offset in spare area */
636 fcb_end:
637
638 #if BANK_ADDR_BITS > 1
639 #define REDBOOT_RAM_START       (RAM_BANK1_BASE + RAM_BANK1_SIZE - REDBOOT_OFFSET)
640 #else
641 #define REDBOOT_RAM_START       (RAM_BANK0_BASE + RAM_BANK0_SIZE - REDBOOT_OFFSET)
642 #endif
643
644 #define redboot_v2p(v)  ((v) - __text_start + REDBOOT_RAM_START)
645
646         .org    0x400
647 ivt_header:
648         .word   CPU_2_BE_32((0xd1 << 24) | (32 << 8) | 0x40)
649 app_start_addr:
650         .long   redboot_v2p(reset_vector)
651         .long   0x0
652 dcd_ptr:
653         .long   redboot_v2p(dcd_hdr)
654 boot_data_ptr:
655         .word   redboot_v2p(boot_data)
656 self_ptr:
657         .word   redboot_v2p(ivt_header)
658 app_code_csf:
659         .word   0x0
660         .word   0x0
661 boot_data:
662         .long   redboot_v2p(__text_start)
663 image_len:
664         .long   REDBOOT_IMAGE_SIZE
665 plugin:
666         .word   0
667 ivt_end:
668 #define DCD_VERSION     0x40
669
670 dcd_hdr:
671         .word   CPU_2_BE_32((0xd2 << 24) | ((dcd_end - .) << 8) | DCD_VERSION)
672 dcd_start:
673         MXC_DCD_CMD_WRT(MXC_DCD_CMD_SZ_WORD, MXC_DCD_CMD_FLAG_WRITE, zq_calib)
674         /* disable all irrelevant clocks */
675         MXC_DCD_ITEM(CCM_BASE_ADDR + CLKCTL_CCGR0, 0xffcc0fff)
676         MXC_DCD_ITEM(CCM_BASE_ADDR + CLKCTL_CCGR1, 0x000fffc3)
677         MXC_DCD_ITEM(CCM_BASE_ADDR + CLKCTL_CCGR2, 0x033c0000)
678         MXC_DCD_ITEM(CCM_BASE_ADDR + CLKCTL_CCGR3, 0x00000000)
679         MXC_DCD_ITEM(CCM_BASE_ADDR + CLKCTL_CCGR4, 0x00000000)
680         MXC_DCD_ITEM(CCM_BASE_ADDR + CLKCTL_CCGR5, 0x00fff033)
681         MXC_DCD_ITEM(CCM_BASE_ADDR + CLKCTL_CCGR6, 0x0f00030f)
682         MXC_DCD_ITEM(CCM_BASE_ADDR + CLKCTL_CCGR7, 0xfff00000)
683         MXC_DCD_ITEM(CCM_BASE_ADDR + CLKCTL_CMEOR, 0x00000000)
684
685         MXC_DCD_ITEM(IOMUXC_BASE_ADDR + LED_MUX_OFFSET, LED_MUX_MODE)   /* EIM_D18 => GPIO2[20] STK5-LED */
686         MXC_DCD_ITEM(IOMUXC_BASE_ADDR + 0x318, 0x11)    /* GPIO_1 => LCD Backlight */
687
688         MXC_DCD_ITEM(0x63fd800c, 0x00000000)    /* M4IF: MUX NFC signals on WEIM */
689 #if SDRAM_CLK > 333
690         MXC_DCD_ITEM(0x53fd4014, 0x00888944)    /* CBCDR */
691 #else
692         MXC_DCD_ITEM(0x53fd4014, 0x00888644)    /* CBCDR */
693 #endif
694         MXC_DCD_ITEM(0x53fd4018, 0x00016154)    /* CBCMR */
695
696 #define DDR_SEL_VAL     2
697 #define DSE_VAL         5
698 #define ODT_VAL         2
699
700 #define DDR_SEL_SHIFT   25
701 #define ODT_SHIFT       22
702 #define DSE_SHIFT       19
703 #define DDR_INPUT_SHIFT 9
704 #define HYS_SHIFT       8
705 #define PKE_SHIFT       7
706 #define PUE_SHIFT       6
707 #define PUS_SHIFT       4
708
709 #define DDR_SEL_MASK    (DDR_SEL_VAL << DDR_SEL_SHIFT)
710 #define DSE_MASK        (DSE_VAL << DSE_SHIFT)
711 #define ODT_MASK        (ODT_VAL << ODT_SHIFT)
712
713 #define DQM_VAL         DSE_MASK
714 #define SDQS_VAL        (ODT_MASK | DSE_MASK | (1 << PUE_SHIFT))
715 #define SDODT_VAL       (DSE_MASK | (0 << PKE_SHIFT) | (1 << PUE_SHIFT) | (0 << PUS_SHIFT))
716 #define SDCLK_VAL       DSE_MASK
717 #define SDCKE_VAL       ((1 << PKE_SHIFT) | (1 << PUE_SHIFT) | (0 << PUS_SHIFT))
718
719         MXC_DCD_ITEM(0x53fa8724, DDR_SEL_MASK) /* DDR_TYPE: DDR3 */
720         MXC_DCD_ITEM(0x53fa86f4, 0 << DDR_INPUT_SHIFT) /* DDRMODE_CTL */
721         MXC_DCD_ITEM(0x53fa8714, 0 << DDR_INPUT_SHIFT) /* GRP_DDRMODE */
722         MXC_DCD_ITEM(0x53fa86fc, 1 << PKE_SHIFT) /* GRP_DDRPKE */
723         MXC_DCD_ITEM(0x53fa8710, 0 << HYS_SHIFT) /* GRP_DDRHYS */
724         MXC_DCD_ITEM(0x53fa8708, 1 << PUE_SHIFT) /* GRP_DDRPK */
725
726         MXC_DCD_ITEM(0x53fa8584, DQM_VAL) /* DQM0 */
727         MXC_DCD_ITEM(0x53fa8594, DQM_VAL) /* DQM1 */
728         MXC_DCD_ITEM(0x53fa8560, DQM_VAL) /* DQM2 */
729         MXC_DCD_ITEM(0x53fa8554, DQM_VAL) /* DQM3 */
730
731         MXC_DCD_ITEM(0x53fa857c, SDQS_VAL) /* SDQS0 */
732         MXC_DCD_ITEM(0x53fa8590, SDQS_VAL) /* SDQS1 */
733         MXC_DCD_ITEM(0x53fa8568, SDQS_VAL) /* SDQS2 */
734         MXC_DCD_ITEM(0x53fa8558, SDQS_VAL) /* SDQS3 */
735
736         MXC_DCD_ITEM(0x53fa8580, SDODT_VAL) /* SDODT0 */
737         MXC_DCD_ITEM(0x53fa8578, SDCLK_VAL) /* SDCLK0 */
738
739         MXC_DCD_ITEM(0x53fa8564, SDODT_VAL) /* SDODT1 */
740         MXC_DCD_ITEM(0x53fa8570, SDCLK_VAL) /* SDCLK1 */
741
742         MXC_DCD_ITEM(0x53fa858c, SDCKE_VAL) /* SDCKE0 */
743         MXC_DCD_ITEM(0x53fa855c, SDCKE_VAL) /* SDCKE1 */
744
745         MXC_DCD_ITEM(0x53fa8574, DSE_MASK) /* DRAM_CAS */
746         MXC_DCD_ITEM(0x53fa8588, DSE_MASK) /* DRAM_RAS */
747
748         MXC_DCD_ITEM(0x53fa86f0, DSE_MASK) /* GRP_ADDDS */
749         MXC_DCD_ITEM(0x53fa8720, DSE_MASK) /* GRP_CTLDS */
750         MXC_DCD_ITEM(0x53fa8718, DSE_MASK) /* GRP_B0DS */
751         MXC_DCD_ITEM(0x53fa871c, DSE_MASK) /* GRP_B1DS */
752         MXC_DCD_ITEM(0x53fa8728, DSE_MASK) /* GRP_B2DS */
753         MXC_DCD_ITEM(0x53fa872c, DSE_MASK) /* GRP_B3DS */
754
755         /* calibration defaults */
756         MXC_DCD_ITEM(0x63fd904c, 0x001f001f)
757         MXC_DCD_ITEM(0x63fd9050, 0x001f001f)
758         MXC_DCD_ITEM(0x63fd907c, 0x011e011e)
759         MXC_DCD_ITEM(0x63fd9080, 0x011f0120)
760         MXC_DCD_ITEM(0x63fd9088, 0x3a393d3b)
761         MXC_DCD_ITEM(0x63fd9090, 0x3f3f3f3f)
762
763         MXC_DCD_ITEM(0x63fd9018, ESDMISC_VAL)
764         MXC_DCD_ITEM(0x63fd9000, ESDCTL_VAL)
765         MXC_DCD_ITEM(0x63fd900c, ESDCFG0_VAL)
766         MXC_DCD_ITEM(0x63fd9010, ESDCFG1_VAL)
767         MXC_DCD_ITEM(0x63fd9014, ESDCFG2_VAL)
768
769         MXC_DCD_ITEM(0x63fd902c, 0x000026d2)
770         MXC_DCD_ITEM(0x63fd9030, ESDOR_VAL)
771         MXC_DCD_ITEM(0x63fd9008, ESDOTC_VAL)
772         MXC_DCD_ITEM(0x63fd9004, 0x00030012)
773
774         /* MR0 - CS0 */
775         MXC_DCD_ITEM(0x63fd901c, 0x00008032) /* MRS: MR2 */
776         MXC_DCD_ITEM(0x63fd901c, 0x00008033) /* MRS: MR3 */
777         MXC_DCD_ITEM(0x63fd901c, 0x00408031) /* MRS: MR1 */
778         MXC_DCD_ITEM(0x63fd901c, ESDSCR_MRS_VAL(0)) /* MRS: MR0 */
779         /* MR0 - CS1 */
780 #if BANK_ADDR_BITS > 1
781         MXC_DCD_ITEM(0x63fd901c, 0x0000803a) /* MRS: MR2 */
782         MXC_DCD_ITEM(0x63fd901c, 0x0000803b) /* MRS: MR3 */
783         MXC_DCD_ITEM(0x63fd901c, 0x00408039) /* MRS: MR1 */
784         MXC_DCD_ITEM(0x63fd901c, ESDSCR_MRS_VAL(1)) /* MRS: MR0 */
785 #endif
786         MXC_DCD_ITEM(0x63fd9020, 0x00005800) /* refresh interval */
787         MXC_DCD_ITEM(0x63fd9058, 0x00011112)
788
789         MXC_DCD_ITEM(0x63fd90d0, 0x00000003) /* select default compare pattern for calibration */
790
791         /* ZQ calibration */
792         MXC_DCD_ITEM(0x63fd901c, 0x04008010) /* precharge all */
793         MXC_DCD_ITEM(0x63fd901c, 0x00008040) /* MRS: ZQ calibration */
794         MXC_DCD_ITEM(0x63fd9040, 0x0539002b) /* Force ZQ calibration */
795 zq_calib:
796         MXC_DCD_CMD_CHK(MXC_DCD_CMD_SZ_WORD, 0, 0x63fd9040, 0x00010000)
797         MXC_DCD_CMD_WRT(MXC_DCD_CMD_SZ_WORD, MXC_DCD_CMD_FLAG_WRITE, wl_calib)
798
799         /* Write Leveling */
800         MXC_DCD_ITEM(0x63fd901c, 0x00048033) /* MRS: select MPR */
801         MXC_DCD_ITEM(0x63fd901c, 0x00848231) /* MRS: start write leveling */
802         MXC_DCD_ITEM(0x63fd901c, 0x00000000)
803         MXC_DCD_ITEM(0x63fd9048, 0x00000001)
804 wl_calib:
805         MXC_DCD_CMD_CHK(MXC_DCD_CMD_SZ_WORD, 0, 0x63fd9048, 0x00000001)
806         MXC_DCD_CMD_WRT(MXC_DCD_CMD_SZ_WORD, MXC_DCD_CMD_FLAG_WRITE, dqs_calib)
807         MXC_DCD_ITEM(0x63fd901c, 0x00048031) /* MRS: end write leveling */
808         MXC_DCD_ITEM(0x63fd901c, 0x00008033) /* MRS: select normal data path */
809
810         /* DQS calibration */
811         MXC_DCD_ITEM(0x63fd901c, 0x04008010) /* precharge all */
812         MXC_DCD_ITEM(0x63fd901c, 0x00048033) /* MRS: select MPR */
813         MXC_DCD_ITEM(0x63fd907c, 0x90000000) /* reset RD fifo and start DQS calib. */
814 dqs_calib:
815         MXC_DCD_CMD_CHK(MXC_DCD_CMD_SZ_WORD, 0, 0x63fd907c, 0x90000000)
816         MXC_DCD_CMD_WRT(MXC_DCD_CMD_SZ_WORD, MXC_DCD_CMD_FLAG_WRITE, wr_dl_calib)
817         MXC_DCD_ITEM(0x63fd901c, 0x00008033) /* MRS: select normal data path */
818
819         /* WR DL calibration */
820         MXC_DCD_ITEM(0x63fd901c, 0x00000000)
821         MXC_DCD_ITEM(0x63fd901c, 0x04008010) /* precharge all */
822         MXC_DCD_ITEM(0x63fd901c, 0x00048033) /* MRS: select MPR */
823         MXC_DCD_ITEM(0x63fd90a4, 0x00000010)
824 wr_dl_calib: /* 6c4 */
825         MXC_DCD_CMD_CHK(MXC_DCD_CMD_SZ_WORD, 0, 0x63fd90a4, 0x00000010)
826         MXC_DCD_CMD_WRT(MXC_DCD_CMD_SZ_WORD, MXC_DCD_CMD_FLAG_WRITE, rd_dl_calib)
827         MXC_DCD_ITEM(0x63fd901c, 0x00008033) /* MRS: select normal data path */
828
829         /* RD DL calibration */
830         MXC_DCD_ITEM(0x63fd901c, 0x04008010) /* precharge all */
831         MXC_DCD_ITEM(0x63fd901c, 0x00048033) /* MRS: select MPR */
832         MXC_DCD_ITEM(0x63fd90a0, 0x00000010)
833 rd_dl_calib: /* 70c */
834         MXC_DCD_CMD_CHK(MXC_DCD_CMD_SZ_WORD, 0, 0x63fd90a0, 0x00000010)
835         MXC_DCD_CMD_WRT(MXC_DCD_CMD_SZ_WORD, MXC_DCD_CMD_FLAG_WRITE, dcd_end)
836         MXC_DCD_ITEM(0x63fd901c, 0x00008033) /* MRS: select normal data path */
837
838         MXC_DCD_ITEM(0x63fd901c, 0x00000000)
839
840         MXC_DCD_ITEM(0x53fa8004, 0x00194005)    @ set LDO to 1.3V
841
842         /* setup NFC pads */
843         /* MUX_SEL */
844         MXC_DCD_ITEM(0x53fa819c, 0x00000000)    @ EIM_DA0
845         MXC_DCD_ITEM(0x53fa81a0, 0x00000000)    @ EIM_DA1
846         MXC_DCD_ITEM(0x53fa81a4, 0x00000000)    @ EIM_DA2
847         MXC_DCD_ITEM(0x53fa81a8, 0x00000000)    @ EIM_DA3
848         MXC_DCD_ITEM(0x53fa81ac, 0x00000000)    @ EIM_DA4
849         MXC_DCD_ITEM(0x53fa81b0, 0x00000000)    @ EIM_DA5
850         MXC_DCD_ITEM(0x53fa81b4, 0x00000000)    @ EIM_DA6
851         MXC_DCD_ITEM(0x53fa81b8, 0x00000000)    @ EIM_DA7
852         MXC_DCD_ITEM(0x53fa81dc, 0x00000000)    @ WE_B
853         MXC_DCD_ITEM(0x53fa81e0, 0x00000000)    @ RE_B
854         MXC_DCD_ITEM(0x53fa8228, 0x00000000)    @ CLE
855         MXC_DCD_ITEM(0x53fa822c, 0x00000000)    @ ALE
856         MXC_DCD_ITEM(0x53fa8230, 0x00000000)    @ WP_B
857         MXC_DCD_ITEM(0x53fa8234, 0x00000000)    @ RB0
858         MXC_DCD_ITEM(0x53fa8238, 0x00000000)    @ CS0
859         /* PAD_CTL */
860         MXC_DCD_ITEM(0x53fa84ec, 0x000000e4)    @ EIM_DA0
861         MXC_DCD_ITEM(0x53fa84f0, 0x000000e4)    @ EIM_DA1
862         MXC_DCD_ITEM(0x53fa84f4, 0x000000e4)    @ EIM_DA2
863         MXC_DCD_ITEM(0x53fa84f8, 0x000000e4)    @ EIM_DA3
864         MXC_DCD_ITEM(0x53fa84fc, 0x000000e4)    @ EIM_DA4
865         MXC_DCD_ITEM(0x53fa8500, 0x000000e4)    @ EIM_DA5
866         MXC_DCD_ITEM(0x53fa8504, 0x000000e4)    @ EIM_DA6
867         MXC_DCD_ITEM(0x53fa8508, 0x000000e4)    @ EIM_DA7
868         MXC_DCD_ITEM(0x53fa852c, 0x00000004)    @ NANDF_WE_B
869         MXC_DCD_ITEM(0x53fa8530, 0x00000004)    @ NANDF_RE_B
870         MXC_DCD_ITEM(0x53fa85a0, 0x00000004)    @ NANDF_CLE_B
871         MXC_DCD_ITEM(0x53fa85a4, 0x00000004)    @ NANDF_ALE_B
872         MXC_DCD_ITEM(0x53fa85a8, 0x000000e4)    @ NANDF_WE_B
873         MXC_DCD_ITEM(0x53fa85ac, 0x000000e4)    @ NANDF_RB0
874         MXC_DCD_ITEM(0x53fa85b0, 0x00000004)    @ NANDF_CS0
875 dcd_end:
876         .ifgt   dcd_end - dcd_start - 1768
877         DCD too large!
878         .endif
879         .endm
880
881 MXC_REDBOOT_ROM_START:  .long   SDRAM_BASE_ADDR + SDRAM_SIZE - REDBOOT_OFFSET
882
883 #if SDRAM_CLK > 333
884 CCM_CBCDR_VAL1:         .word   0x02888944
885 CCM_CBCDR_VAL2:         .word   0x00888944
886 #else
887 CCM_CBCDR_VAL1:         .word   0x02888644
888 CCM_CBCDR_VAL2:         .word   0x00888644
889 #endif
890
891 W_CSCMR1_VAL:           .word   0xa6a2a020
892 W_CSCDR1_VAL:           .word   0x00080b18
893 W_DP_OP_1000:           .word   DP_OP_1000
894 W_DP_MFD_1000:          .word   DP_MFD_1000
895 W_DP_MFN_1000:          .word   DP_MFN_1000
896 W_DP_OP_800:            .word   DP_OP_800
897 W_DP_MFD_800:           .word   DP_MFD_800
898 W_DP_MFN_800:           .word   DP_MFN_800
899 W_DP_OP_700:            .word   DP_OP_700
900 W_DP_MFD_700:           .word   DP_MFD_700
901 W_DP_MFN_700:           .word   DP_MFN_700
902 W_DP_OP_400:            .word   DP_OP_400
903 W_DP_MFD_400:           .word   DP_MFD_400
904 W_DP_MFN_400:           .word   DP_MFN_400
905 W_DP_OP_532:            .word   DP_OP_532
906 W_DP_MFD_532:           .word   DP_MFD_532
907 W_DP_MFN_532:           .word   DP_MFN_532
908 W_DP_OP_666:            .word   DP_OP_666
909 W_DP_MFD_666:           .word   DP_MFD_666
910 W_DP_MFN_666:           .word   DP_MFN_666
911 W_DP_OP_665:            .word   DP_OP_665
912 W_DP_MFD_665:           .word   DP_MFD_665
913 W_DP_MFN_665:           .word   DP_MFN_665
914 W_DP_OP_216:            .word   DP_OP_216
915 W_DP_MFD_216:           .word   DP_MFD_216
916 W_DP_MFN_216:           .word   DP_MFN_216
917 W_DP_OP_333:            .word   DP_OP_333
918 W_DP_MFD_333:           .word   DP_MFD_333
919 W_DP_MFN_333:           .word   DP_MFN_333
920 W_DP_OP_266:            .word   DP_OP_266
921 W_DP_MFD_266:           .word   DP_MFD_266
922 W_DP_MFN_266:           .word   DP_MFN_266
923 PLATFORM_CLOCK_DIV:     .word   0x00000124
924
925 /*----------------------------------------------------------------------*/
926 /* end of hal_platform_setup.h                                          */
927 #endif /* CYGONCE_HAL_PLATFORM_SETUP_H */