2 * Common Blackfin startup code
4 * Copyright 2004-2008 Analog Devices Inc.
6 * Enter bugs at http://blackfin.uclinux.org/
8 * Licensed under the GPL-2 or later.
11 #include <linux/linkage.h>
12 #include <linux/init.h>
13 #include <asm/blackfin.h>
14 #include <asm/thread_info.h>
15 #include <asm/trace.h>
16 #include <asm/asm-offsets.h>
20 #define INITIAL_STACK (L1_SCRATCH_START + L1_SCRATCH_LENGTH - 12)
23 /* R0: argument of command line string, passed from uboot, save it */
25 /* Enable Cycle Counter and Nesting Of Interrupts */
26 #ifdef CONFIG_BFIN_SCRATCH_REG_CYCLES
29 R0 = SYSCFG_SNEN | SYSCFG_CCEN;
34 /* Clear Out All the data and pointer Registers */
56 /* Clear Out All the DAG Registers */
73 * Clear ITEST_COMMAND and DTEST_COMMAND registers,
74 * Leaving these as non-zero can confuse the emulator
76 p0.L = LO(DTEST_COMMAND);
77 p0.H = HI(DTEST_COMMAND);
79 [p0 + (ITEST_COMMAND - DTEST_COMMAND)] = R0;
82 trace_buffer_init(p0,r0);
86 /* Turn off the icache */
87 p0.l = LO(IMEM_CONTROL);
88 p0.h = HI(IMEM_CONTROL);
95 /* Turn off the dcache */
96 p0.l = LO(DMEM_CONTROL);
97 p0.h = HI(DMEM_CONTROL);
104 /* in case of double faults, save a few things */
110 #ifdef CONFIG_DEBUG_DOUBLEFAULT
111 /* Only save these if we are storing them,
112 * This happens here, since L1 gets clobbered
116 r7 = [p0 + PDA_RETX];
117 p1.l = _init_saved_retx;
118 p1.h = _init_saved_retx;
121 r7 = [p0 + PDA_DCPLB];
122 p1.l = _init_saved_dcplb_fault_addr;
123 p1.h = _init_saved_dcplb_fault_addr;
126 r7 = [p0 + PDA_ICPLB];
127 p1.l = _init_saved_icplb_fault_addr;
128 p1.h = _init_saved_icplb_fault_addr;
131 r7 = [p0 + PDA_SEQSTAT];
132 p1.l = _init_saved_seqstat;
133 p1.h = _init_saved_seqstat;
137 /* Initialize stack pointer */
138 sp.l = lo(INITIAL_STACK);
139 sp.h = hi(INITIAL_STACK);
143 #ifdef CONFIG_EARLY_PRINTK
144 call _init_early_exception_vectors;
147 /* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */
148 call _bfin_relocate_l1_mem;
149 #ifdef CONFIG_BFIN_KERNEL_CLOCK
153 /* This section keeps the processor in supervisor mode
154 * during kernel boot. Switches to user mode at end of boot.
155 * See page 3-9 of Hardware Reference manual for documentation.
158 /* EVT15 = _real_start */
183 /* A little BF561 glue ... */
185 # define WDOG_CTL WDOGA_CTL
188 ENTRY(__init_clear_bss)
191 if cc jump .L_bss_done;
195 lsetup (1f, 1f) lc0 = p2;
199 ENDPROC(__init_clear_bss)
202 /* Enable nested interrupts */
205 /* watchdog off for now */
213 /* Zero out all of the fun bss regions */
214 #if L1_DATA_A_LENGTH > 0
219 call __init_clear_bss
221 #if L1_DATA_B_LENGTH > 0
226 call __init_clear_bss
233 call __init_clear_bss
239 call __init_clear_bss
241 /* Pass the u-boot arguments to the global value command line */
245 /* Load the current thread pointer and stack */
246 sp.l = _init_thread_union;
247 sp.h = _init_thread_union;
248 p1 = THREAD_SIZE (z);
255 jump.l _start_kernel;