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>
19 #define INITIAL_STACK (L1_SCRATCH_START + L1_SCRATCH_LENGTH - 12)
22 /* R0: argument of command line string, passed from uboot, save it */
24 /* Enable Cycle Counter and Nesting Of Interrupts */
25 #ifdef CONFIG_BFIN_SCRATCH_REG_CYCLES
28 R0 = SYSCFG_SNEN | SYSCFG_CCEN;
33 /* Clear Out All the data and pointer Registers */
55 /* Clear Out All the DAG Registers */
71 trace_buffer_init(p0,r0);
75 /* Turn off the icache */
76 p0.l = LO(IMEM_CONTROL);
77 p0.h = HI(IMEM_CONTROL);
84 /* Turn off the dcache */
85 p0.l = LO(DMEM_CONTROL);
86 p0.h = HI(DMEM_CONTROL);
93 /* in case of double faults, save a few things */
99 #ifdef CONFIG_DEBUG_DOUBLEFAULT
100 /* Only save these if we are storing them,
101 * This happens here, since L1 gets clobbered
106 p1.l = _init_saved_retx;
107 p1.h = _init_saved_retx;
111 p0.l = _saved_dcplb_fault_addr;
112 p0.h = _saved_dcplb_fault_addr;
113 p1.l = _init_saved_dcplb_fault_addr;
114 p1.h = _init_saved_dcplb_fault_addr;
118 p0.l = _saved_icplb_fault_addr;
119 p0.h = _saved_icplb_fault_addr;
120 p1.l = _init_saved_icplb_fault_addr;
121 p1.h = _init_saved_icplb_fault_addr;
125 p0.l = _saved_seqstat;
126 p0.h = _saved_seqstat;
127 p1.l = _init_saved_seqstat;
128 p1.h = _init_saved_seqstat;
133 /* Initialize stack pointer */
134 sp.l = lo(INITIAL_STACK);
135 sp.h = hi(INITIAL_STACK);
139 #ifdef CONFIG_EARLY_PRINTK
140 call _init_early_exception_vectors;
143 /* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */
144 call _bf53x_relocate_l1_mem;
145 #ifdef CONFIG_BFIN_KERNEL_CLOCK
146 call _start_dma_code;
149 /* This section keeps the processor in supervisor mode
150 * during kernel boot. Switches to user mode at end of boot.
151 * See page 3-9 of Hardware Reference manual for documentation.
154 /* EVT15 = _real_start */
183 /* A little BF561 glue ... */
185 # define WDOG_CTL WDOGA_CTL
189 /* Enable nested interrupts */
192 /* watchdog off for now */
199 /* Zero out the bss region
200 * Note: this will fail if bss is 0 bytes ...
211 lsetup (.L_clear_bss, .L_clear_bss) lc0 = p2;
215 /* In case there is a NULL pointer reference,
216 * zero out region before stext
223 lsetup (.L_clear_zero, .L_clear_zero) lc0 = p2;
227 /* Pass the u-boot arguments to the global value command line */
231 /* Load the current thread pointer and stack */
232 sp.l = _init_thread_union;
233 sp.h = _init_thread_union;
234 p1 = THREAD_SIZE (z);
238 jump.l _start_kernel;