@ -93,12 +93,15 @@ _fiq: .word fiq
* - jump t o s e c o n d s t a g e
* /
.globl _TEXT_BASE
_TEXT_BASE :
.word TEXT_BASE
# if d e f i n e d ( C O N F I G _ S Y S _ A R M _ W I T H O U T _ R E L O C )
.globl _armboot_start
_armboot_start :
.word _start
# endif
/ *
* These a r e d e f i n e d i n t h e b o a r d - s p e c i f i c l i n k e r s c r i p t .
@ -123,6 +126,274 @@ FIQ_STACK_START:
.word 0x0badc0de
# endif
# if ! d e f i n e d ( C O N F I G _ S Y S _ A R M _ W I T H O U T _ R E L O C )
/* IRQ stack memory (calculated at run-time) + 8 bytes */
.globl IRQ_STACK_START_IN
IRQ_STACK_START_IN :
.word 0x0badc0de
.globl _datarel_start
_datarel_start :
.word __datarel_start
.globl _datarelrolocal_start
_datarelrolocal_start :
.word __datarelrolocal_start
.globl _datarellocal_start
_datarellocal_start :
.word __datarellocal_start
.globl _datarelro_start
_datarelro_start :
.word __datarelro_start
.globl _got_start
_got_start :
.word __got_start
.globl _got_end
_got_end :
.word __got_end
/ *
* the a c t u a l r e s e t c o d e
* /
reset :
/* disable mmu, set big-endian */
mov r0 , #0xf8
mcr p15 , 0 , r0 , c1 , c0 , 0
CPWAIT r0
/* invalidate I & D caches & BTB */
mcr p15 , 0 , r0 , c7 , c7 , 0
CPWAIT r0
/* invalidate I & Data TLB */
mcr p15 , 0 , r0 , c8 , c7 , 0
CPWAIT r0
/* drain write and fill buffers */
mcr p15 , 0 , r0 , c7 , c10 , 4
CPWAIT r0
/* disable write buffer coalescing */
mrc p15 , 0 , r0 , c1 , c0 , 1
orr r0 , r0 , #1
mcr p15 , 0 , r0 , c1 , c0 , 1
CPWAIT r0
/* set EXP CS0 to the optimum timing */
ldr r1 , =CONFIG_SYS_EXP_CS0
ldr r2 , =IXP425_EXP_CS0
str r1 , [ r2 ]
/* make sure flash is visible at 0 */
# if 0
ldr r2 , =IXP425_EXP_CFG0
ldr r1 , [ r2 ]
orr r1 , r1 , #0x80000000
str r1 , [ r2 ]
# endif
mov r1 , #C O N F I G _ S Y S _ S D R _ C O N F I G
ldr r2 , =IXP425_SDR_CONFIG
str r1 , [ r2 ]
/* disable refresh cycles */
mov r1 , #0
ldr r3 , =IXP425_SDR_REFRESH
str r1 , [ r3 ]
/* send nop command */
mov r1 , #3
ldr r4 , =IXP425_SDR_IR
str r1 , [ r4 ]
DELAY_ F O R 0 x40 0 0 , r0
/* set SDRAM internal refresh val */
ldr r1 , =CONFIG_SYS_SDRAM_REFRESH_CNT
str r1 , [ r3 ]
DELAY_ F O R 0 x40 0 0 , r0
/* send precharge-all command to close all open banks */
mov r1 , #2
str r1 , [ r4 ]
DELAY_ F O R 0 x40 0 0 , r0
/* provide 8 auto-refresh cycles */
mov r1 , #4
mov r5 , #8
111 : str r1 , [ r4 ]
DELAY_ F O R 0 x10 0 , r0
subs r5 , r5 , #1
bne 1 1 1 b
/* set mode register in sdram */
mov r1 , #C O N F I G _ S Y S _ S D R _ M O D E _ C O N F I G
str r1 , [ r4 ]
DELAY_ F O R 0 x40 0 0 , r0
/* send normal operation command */
mov r1 , #6
str r1 , [ r4 ]
DELAY_ F O R 0 x40 0 0 , r0
/* copy */
mov r0 , #0
mov r4 , r0
add r2 , r0 , #C O N F I G _ S Y S _ M O N I T O R _ L E N
mov r1 , #0x10000000
mov r5 , r1
30 :
ldr r3 , [ r0 ] , #4
str r3 , [ r1 ] , #4
cmp r0 , r2
bne 3 0 b
/* invalidate I & D caches & BTB */
mcr p15 , 0 , r0 , c7 , c7 , 0
CPWAIT r0
/* invalidate I & Data TLB */
mcr p15 , 0 , r0 , c8 , c7 , 0
CPWAIT r0
/* drain write and fill buffers */
mcr p15 , 0 , r0 , c7 , c10 , 4
CPWAIT r0
/* move flash to 0x50000000 */
ldr r2 , =IXP425_EXP_CFG0
ldr r1 , [ r2 ]
bic r1 , r1 , #0x80000000
str r1 , [ r2 ]
nop
nop
nop
nop
nop
nop
/* invalidate I & Data TLB */
mcr p15 , 0 , r0 , c8 , c7 , 0
CPWAIT r0
/* enable I cache */
mrc p15 , 0 , r0 , c1 , c0 , 0
orr r0 , r0 , #M M U _ C o n t r o l _ I
mcr p15 , 0 , r0 , c1 , c0 , 0
CPWAIT r0
mrs r0 ,c p s r / * s e t t h e c p u t o S V C 3 2 m o d e * /
bic r0 ,r0 ,#0x1f / * ( s u p e r v i s e r m o d e , M =10011 ) * /
orr r0 ,r0 ,#0x13
msr c p s r ,r0
/* Set stackpointer in internal RAM to call board_init_f */
call_board_init_f :
ldr s p , = ( C O N F I G _ S Y S _ I N I T _ S P _ A D D R )
ldr r0 ,=0x00000000
bl b o a r d _ i n i t _ f
/*------------------------------------------------------------------------------*/
/ *
* void r e l o c a t e _ c o d e ( a d d r _ s p , g d , a d d r _ m o n i )
*
* This " f u n c t i o n " d o e s n o t r e t u r n , i n s t e a d i t c o n t i n u e s i n R A M
* after r e l o c a t i n g t h e m o n i t o r c o d e .
*
* /
.globl relocate_code
relocate_code :
mov r4 , r0 / * s a v e a d d r _ s p * /
mov r5 , r1 / * s a v e a d d r o f g d * /
mov r6 , r2 / * s a v e a d d r o f d e s t i n a t i o n * /
mov r7 , r2 / * s a v e a d d r o f d e s t i n a t i o n * /
/* Set up the stack */
stack_setup :
mov s p , r4
adr r0 , _ s t a r t
ldr r2 , _ T E X T _ B A S E
ldr r3 , _ b s s _ s t a r t
sub r2 , r3 , r2 / * r2 < - s i z e o f a r m b o o t * /
add r2 , r0 , r2 / * r2 < - s o u r c e e n d a d d r e s s * /
cmp r0 , r6
beq c l e a r _ b s s
# ifndef C O N F I G _ S K I P _ R E L O C A T E _ U B O O T
copy_loop :
ldmia r0 ! , { r9 - r10 } / * c o p y f r o m s o u r c e a d d r e s s [ r0 ] * /
stmia r6 ! , { r9 - r10 } / * c o p y t o t a r g e t a d d r e s s [ r1 ] * /
cmp r0 , r2 / * u n t i l s o u r c e e n d a d d r e e e [ r2 ] * /
ble c o p y _ l o o p
# ifndef C O N F I G _ P R E L O A D E R
/* fix got entries */
ldr r1 , _ T E X T _ B A S E / * T e x t b a s e * /
mov r0 , r7 / * r e l o c a d d r * /
ldr r2 , _ g o t _ s t a r t / * a d d r i n F l a s h * /
ldr r3 , _ g o t _ e n d / * a d d r i n F l a s h * /
sub r3 , r3 , r1
add r3 , r3 , r0
sub r2 , r2 , r1
add r2 , r2 , r0
fixloop :
ldr r4 , [ r2 ]
sub r4 , r4 , r1
add r4 , r4 , r0
str r4 , [ r2 ]
add r2 , r2 , #4
cmp r2 , r3
bne f i x l o o p
# endif
# endif / * #i f n d e f C O N F I G _ S K I P _ R E L O C A T E _ U B O O T * /
clear_bss :
# ifndef C O N F I G _ P R E L O A D E R
ldr r0 , _ b s s _ s t a r t
ldr r1 , _ b s s _ e n d
ldr r3 , _ T E X T _ B A S E / * T e x t b a s e * /
mov r4 , r7 / * r e l o c a d d r * /
sub r0 , r0 , r3
add r0 , r0 , r4
sub r1 , r1 , r3
add r1 , r1 , r4
mov r2 , #0x00000000 / * c l e a r * /
clbss_l : str r2 , [ r0 ] / * c l e a r l o o p . . . * /
add r0 , r0 , #4
cmp r0 , r1
bne c l b s s _ l
bl c o l o u r e d _ L E D _ i n i t
bl r e d _ L E D _ o n
# endif
/ *
* We a r e d o n e . D o n o t r e t u r n , i n s t e a d b r a n c h t o s e c o n d p a r t o f b o a r d
* initialization, n o w r u n n i n g f r o m R A M .
* /
ldr r0 , _ T E X T _ B A S E
ldr r2 , _ b o a r d _ i n i t _ r
sub r2 , r2 , r0
add r2 , r2 , r7 / * p o s i t i o n f r o m b o a r d _ i n i t _ r i n R A M * /
/* setup parameters for board_init_r */
mov r0 , r5 / * g d _ t * /
mov r1 , r7 / * d e s t _ a d d r * /
/* jump to it ... */
mov l r , r2
mov p c , l r
_board_init_r : .word b o a r d _ i n i t _ r
# else / * #i f ! d e f i n e d ( C O N F I G _ S Y S _ A R M _ W I T H O U T _ R E L O C ) * /
/****************************************************************************/
/* */
/* the actual reset code */
@ -304,6 +575,7 @@ clbss_l:str r2, [r0] /* clear loop... */
ldr p c , _ s t a r t _ a r m b o o t
_start_armboot : .word s t a r t _ a r m b o o t
# endif / * #i f ! d e f i n e d ( C O N F I G _ S Y S _ A R M _ W I T H O U T _ R E L O C ) * /
/****************************************************************************/
@ -345,9 +617,13 @@ _start_armboot: .word start_armboot
stmia s p , { r0 - r12 } / * C a l l i n g r0 - r12 * /
add r8 , s p , #S _ P C
# if d e f i n e d ( C O N F I G _ S Y S _ A R M _ W I T H O U T _ R E L O C )
ldr r2 , _ a r m b o o t _ s t a r t
sub r2 , r2 , #( C O N F I G _ S T A C K S I Z E + C O N F I G _ S Y S _ M A L L O C _ L E N )
sub r2 , r2 , #( C O N F I G _ S Y S _ G B L _ D A T A _ S I Z E + 8 ) @ set base 2 words into abort stack
# else
ldr r2 , I R Q _ S T A C K _ S T A R T _ I N
# endif
ldmia r2 , { r2 - r4 } / * g e t p c , c p s r , o l d _ r0 * /
add r0 , s p , #S _ F R A M E _ S I Z E / * r e s t o r e s p _ S V C * /
@ -382,9 +658,13 @@ _start_armboot: .word start_armboot
.endm
.macro get_bad_stack
# if d e f i n e d ( C O N F I G _ S Y S _ A R M _ W I T H O U T _ R E L O C )
ldr r13 , _ a r m b o o t _ s t a r t @ setup our mode stack
sub r13 , r13 , #( C O N F I G _ S T A C K S I Z E + C O N F I G _ S Y S _ M A L L O C _ L E N )
sub r13 , r13 , #( C O N F I G _ S Y S _ G B L _ D A T A _ S I Z E + 8 ) @ reserved a couple spots in abort stack
# else
ldr r13 , I R Q _ S T A C K _ S T A R T _ I N @ setup our mode stack
# endif
str l r , [ r13 ] @ save caller lr / spsr
mrs l r , s p s r