2007-05-09 01:27:46 +04:00
/ *
* linux/ a r c h / a r m / m m / p r o c - v7 . S
*
* Copyright ( C ) 2 0 0 1 D e e p B l u e S o l u t i o n s L t d .
*
* This p r o g r a m i s f r e e s o f t w a r e ; you can redistribute it and/or modify
* it u n d e r t h e t e r m s o f t h e G N U G e n e r a l P u b l i c L i c e n s e v e r s i o n 2 a s
* published b y t h e F r e e S o f t w a r e F o u n d a t i o n .
*
* This i s t h e " s h e l l " o f t h e A R M v7 p r o c e s s o r s u p p o r t .
* /
# include < l i n u x / l i n k a g e . h >
# include < a s m / a s s e m b l e r . h >
# include < a s m / a s m - o f f s e t s . h >
# include < a s m / e l f . h >
# include < a s m / p g t a b l e - h w d e f . h >
# include < a s m / p g t a b l e . h >
# include " p r o c - m a c r o s . S "
# define T T B _ C ( 1 < < 0 )
# define T T B _ S ( 1 < < 1 )
# define T T B _ R G N _ O C _ W T ( 2 < < 3 )
# define T T B _ R G N _ O C _ W B ( 3 < < 3 )
ENTRY( c p u _ v7 _ p r o c _ i n i t )
mov p c , l r
ENTRY( c p u _ v7 _ p r o c _ f i n )
mov p c , l r
/ *
* cpu_ v7 _ r e s e t ( l o c )
*
* Perform a s o f t r e s e t o f t h e s y s t e m . P u t t h e C P U i n t o t h e
* same s t a t e a s i t w o u l d b e i f i t h a d b e e n r e s e t , a n d b r a n c h
* to w h a t w o u l d b e t h e r e s e t v e c t o r .
*
* - loc - l o c a t i o n t o j u m p t o f o r s o f t r e s e t
*
* It i s a s s u m e d t h a t :
* /
.align 5
ENTRY( c p u _ v7 _ r e s e t )
mov p c , r0
/ *
* cpu_ v7 _ d o _ i d l e ( )
*
* Idle t h e p r o c e s s o r ( e g , w a i t f o r i n t e r r u p t ) .
*
* IRQs a r e a l r e a d y d i s a b l e d .
* /
ENTRY( c p u _ v7 _ d o _ i d l e )
.long 0xe320f003 @ ARM V7 WFI instruction
mov p c , l r
ENTRY( c p u _ v7 _ d c a c h e _ c l e a n _ a r e a )
# ifndef T L B _ C A N _ R E A D _ F R O M _ L 1 _ C A C H E
dcache_ l i n e _ s i z e r2 , r3
1 : mcr p15 , 0 , r0 , c7 , c10 , 1 @ clean D entry
add r0 , r0 , r2
subs r1 , r1 , r2
bhi 1 b
dsb
# endif
mov p c , l r
/ *
* cpu_ v7 _ s w i t c h _ m m ( p g d _ p h y s , t s k )
*
* Set t h e t r a n s l a t i o n t a b l e b a s e p o i n t e r t o b e p g d _ p h y s
*
* - pgd_ p h y s - p h y s i c a l a d d r e s s o f n e w T T B
*
* It i s a s s u m e d t h a t :
* - we a r e n o t u s i n g s p l i t p a g e t a b l e s
* /
ENTRY( c p u _ v7 _ s w i t c h _ m m )
2007-07-20 14:43:02 +04:00
# ifdef C O N F I G _ M M U
2007-05-09 01:27:46 +04:00
mov r2 , #0
ldr r1 , [ r1 , #M M _ C O N T E X T _ I D ] @ g e t m m - > c o n t e x t . i d
orr r0 , r0 , #T T B _ R G N _ O C _ W B @ m a r k P T W s o u t e r c a c h e a b l e , W B
mcr p15 , 0 , r2 , c13 , c0 , 1 @ set reserved context ID
isb
1 : mcr p15 , 0 , r0 , c2 , c0 , 0 @ set TTB 0
isb
mcr p15 , 0 , r1 , c13 , c0 , 1 @ set context ID
isb
2007-07-20 14:43:02 +04:00
# endif
2007-05-09 01:27:46 +04:00
mov p c , l r
/ *
* cpu_ v7 _ s e t _ p t e _ e x t ( p t e p , p t e )
*
* Set a l e v e l 2 t r a n s l a t i o n t a b l e e n t r y .
*
* - ptep - p o i n t e r t o l e v e l 2 t r a n s l a t i o n t a b l e e n t r y
* ( hardware v e r s i o n i s s t o r e d a t - 1 0 2 4 b y t e s )
* - pte - P T E v a l u e t o s t o r e
* - ext - v a l u e f o r e x t e n d e d P T E b i t s
* /
ENTRY( c p u _ v7 _ s e t _ p t e _ e x t )
2007-07-20 14:43:02 +04:00
# ifdef C O N F I G _ M M U
2008-09-15 20:23:10 +04:00
str r1 , [ r0 ] , #- 2048 @ linux version
bic r3 , r1 , #0x000003f0
bic r3 , r3 , #P T E _ T Y P E _ M A S K
orr r3 , r3 , r2
orr r3 , r3 , #P T E _ E X T _ A P 0 | 2
tst r2 , #1 < < 4
orrne r3 , r3 , #P T E _ E X T _ T E X ( 1 )
tst r1 , #L _ P T E _ W R I T E
tstne r1 , #L _ P T E _ D I R T Y
orreq r3 , r3 , #P T E _ E X T _ A P X
tst r1 , #L _ P T E _ U S E R
orrne r3 , r3 , #P T E _ E X T _ A P 1
tstne r3 , #P T E _ E X T _ A P X
bicne r3 , r3 , #P T E _ E X T _ A P X | P T E _ E X T _ A P 0
tst r1 , #L _ P T E _ E X E C
orreq r3 , r3 , #P T E _ E X T _ X N
tst r1 , #L _ P T E _ Y O U N G
tstne r1 , #L _ P T E _ P R E S E N T
moveq r3 , #0
str r3 , [ r0 ]
mcr p15 , 0 , r0 , c7 , c10 , 1 @ flush_pte
2007-07-20 14:43:02 +04:00
# endif
2007-05-09 01:27:46 +04:00
mov p c , l r
cpu_v7_name :
.ascii " ARMv7 P r o c e s s o r "
.align
.section " .text .init " , # alloc, #e x e c i n s t r
/ *
* _ _ v7 _ s e t u p
*
* Initialise T L B , C a c h e s , a n d M M U s t a t e r e a d y t o s w i t c h t h e M M U
* on. R e t u r n i n r0 t h e n e w C P 1 5 C 1 c o n t r o l r e g i s t e r s e t t i n g .
*
* We a u t o m a t i c a l l y d e t e c t i f w e h a v e a H a r v a r d c a c h e , a n d u s e t h e
* Harvard c a c h e c o n t r o l i n s t r u c t i o n s i n s e a d o f t h e u n i f i e d c a c h e
* control i n s t r u c t i o n s .
*
* This s h o u l d b e a b l e t o c o v e r a l l A R M v7 c o r e s .
*
* It i s a s s u m e d t h a t :
* - cache t y p e r e g i s t e r i s i m p l e m e n t e d
* /
__v7_setup :
adr r12 , _ _ v7 _ s e t u p _ s t a c k @ the local stack
stmia r12 , { r0 - r5 , r7 , r9 , r11 , l r }
bl v7 _ f l u s h _ d c a c h e _ a l l
ldmia r12 , { r0 - r5 , r7 , r9 , r11 , l r }
mov r10 , #0
# ifdef H A R V A R D _ C A C H E
mcr p15 , 0 , r10 , c7 , c5 , 0 @ I+BTB cache invalidate
# endif
dsb
2007-07-20 14:43:02 +04:00
# ifdef C O N F I G _ M M U
2007-05-09 01:27:46 +04:00
mcr p15 , 0 , r10 , c8 , c7 , 0 @ invalidate I + D TLBs
mcr p15 , 0 , r10 , c2 , c0 , 2 @ TTB control register
orr r4 , r4 , #T T B _ R G N _ O C _ W B @ m a r k P T W s o u t e r c a c h e a b l e , W B
mcr p15 , 0 , r4 , c2 , c0 , 0 @ load TTB0
mcr p15 , 0 , r4 , c2 , c0 , 1 @ load TTB1
mov r10 , #0x1f @ domains 0, 1 = manager
mcr p15 , 0 , r10 , c3 , c0 , 0 @ load domain access register
2007-07-20 14:43:02 +04:00
# endif
2008-09-15 20:23:10 +04:00
ldr r5 , =0x40e040e0
ldr r6 , =0xff0aa1a8
mcr p15 , 0 , r5 , c10 , c2 , 0 @ write PRRR
mcr p15 , 0 , r6 , c10 , c2 , 1 @ write NMRR
2007-07-20 14:43:02 +04:00
adr r5 , v7 _ c r v a l
ldmia r5 , { r5 , r6 }
mrc p15 , 0 , r0 , c1 , c0 , 0 @ read control register
bic r0 , r0 , r5 @ clear bits them
orr r0 , r0 , r6 @ set them
2007-05-09 01:27:46 +04:00
mov p c , l r @ return to head.S:__ret
/ *
* V X F I D L R
* . . . . . . .E PUI. . T . T 4 R V I Z F R S B L D P W C A M
* rrrr r r r x x x x0 0 1 0 1 x x x x x x x x x11 1 x x x x < f o r c e d
* 0 1 1 0 0 0 1 1 1 .00 .111 1101 < we w a n t
* /
2007-07-20 14:43:02 +04:00
.type v7 _ c r v a l , #o b j e c t
v7_crval :
2008-09-15 20:23:10 +04:00
crval c l e a r =0x0120c302 , m m u s e t =0x10c0387d , u c s e t =0x00c0187c
2007-05-09 01:27:46 +04:00
__v7_setup_stack :
.space 4 * 1 1 @ 11 registers
.type v7 _ p r o c e s s o r _ f u n c t i o n s , #o b j e c t
ENTRY( v7 _ p r o c e s s o r _ f u n c t i o n s )
.word v7_early_abort
2008-04-21 21:42:04 +04:00
.word pabort_ifar
2007-05-09 01:27:46 +04:00
.word cpu_v7_proc_init
.word cpu_v7_proc_fin
.word cpu_v7_reset
.word cpu_v7_do_idle
.word cpu_v7_dcache_clean_area
.word cpu_v7_switch_mm
.word cpu_v7_set_pte_ext
.size v7 _ p r o c e s s o r _ f u n c t i o n s , . - v7 _ p r o c e s s o r _ f u n c t i o n s
.type cpu_ a r c h _ n a m e , #o b j e c t
cpu_arch_name :
.asciz " armv7 "
.size cpu_ a r c h _ n a m e , . - c p u _ a r c h _ n a m e
.type cpu_ e l f _ n a m e , #o b j e c t
cpu_elf_name :
.asciz " v7 "
.size cpu_ e l f _ n a m e , . - c p u _ e l f _ n a m e
.align
.section " .proc .info .init " , # alloc, #e x e c i n s t r
/ *
* Match a n y A R M v7 p r o c e s s o r c o r e .
* /
.type _ _ v7 _ p r o c _ i n f o , #o b j e c t
__v7_proc_info :
.long 0x000f0000 @ Required ID value
.long 0x000f0000 @ Mask for ID
.long PMD_TYPE_SECT | \
PMD_ S E C T _ B U F F E R A B L E | \
PMD_ S E C T _ C A C H E A B L E | \
PMD_ S E C T _ A P _ W R I T E | \
PMD_ S E C T _ A P _ R E A D
.long PMD_TYPE_SECT | \
PMD_ S E C T _ X N | \
PMD_ S E C T _ A P _ W R I T E | \
PMD_ S E C T _ A P _ R E A D
b _ _ v7 _ s e t u p
.long cpu_arch_name
.long cpu_elf_name
.long HWCAP_ S W P | H W C A P _ H A L F | H W C A P _ T H U M B | H W C A P _ F A S T _ M U L T | H W C A P _ E D S P
.long cpu_v7_name
.long v7_processor_functions
2007-05-18 14:25:31 +04:00
.long v7wbi_tlb_fns
2007-05-09 01:27:46 +04:00
.long v6_user_fns
.long v7_cache_fns
.size _ _ v7 _ p r o c _ i n f o , . - _ _ v7 _ p r o c _ i n f o