2007-05-08 22:27:46 +01: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 .
* /
2009-04-27 14:02:22 -04:00
# include < l i n u x / i n i t . h >
2007-05-08 22:27:46 +01:00
# 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 >
2008-09-07 19:15:31 +01:00
# include < a s m / h w c a p . h >
2007-05-08 22:27:46 +01:00
# 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 "
2011-11-22 17:30:29 +00:00
# ifdef C O N F I G _ A R M _ L P A E
# include " p r o c - v7 - 3 l e v e l . S "
# else
2011-11-22 17:30:28 +00:00
# include " p r o c - v7 - 2 l e v e l . S "
2011-11-22 17:30:29 +00:00
# endif
2008-11-06 13:23:09 +00:00
2007-05-08 22:27:46 +01:00
ENTRY( c p u _ v7 _ p r o c _ i n i t )
mov p c , l r
2008-08-28 11:22:32 +01:00
ENDPROC( c p u _ v7 _ p r o c _ i n i t )
2007-05-08 22:27:46 +01:00
ENTRY( c p u _ v7 _ p r o c _ f i n )
2010-01-19 17:01:33 +01:00
mrc p15 , 0 , r0 , c1 , c0 , 0 @ ctrl register
bic r0 , r0 , #0x1000 @ ...i............
bic r0 , r0 , #0x0006 @ .............ca.
mcr p15 , 0 , r0 , c1 , c0 , 0 @ disable caches
2010-07-26 12:22:12 +01:00
mov p c , l r
2008-08-28 11:22:32 +01:00
ENDPROC( c p u _ v7 _ p r o c _ f i n )
2007-05-08 22:27:46 +01:00
/ *
* 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
2011-06-06 12:27:34 +01:00
*
* This c o d e m u s t b e e x e c u t e d u s i n g a f l a t i d e n t i t y m a p p i n g w i t h
* caches d i s a b l e d .
2007-05-08 22:27:46 +01:00
* /
.align 5
2011-11-15 13:25:04 +00:00
.pushsection .idmap .text , " ax"
2007-05-08 22:27:46 +01:00
ENTRY( c p u _ v7 _ r e s e t )
2011-06-06 12:27:34 +01:00
mrc p15 , 0 , r1 , c1 , c0 , 0 @ ctrl register
bic r1 , r1 , #0x1 @ ...............m
2011-08-26 16:34:51 +01:00
THUMB( b i c r1 , r1 , #1 < < 3 0 ) @ SCTLR.TE (Thumb exceptions)
2011-06-06 12:27:34 +01:00
mcr p15 , 0 , r1 , c1 , c0 , 0 @ disable MMU
isb
2012-10-16 11:54:00 +01:00
bx r0
2008-08-28 11:22:32 +01:00
ENDPROC( c p u _ v7 _ r e s e t )
2011-11-15 13:25:04 +00:00
.popsection
2007-05-08 22:27:46 +01:00
/ *
* 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 )
2008-11-10 14:14:11 +00:00
dsb @ WFI may enter a low-power mode
2008-10-03 11:09:10 +01:00
wfi
2007-05-08 22:27:46 +01:00
mov p c , l r
2008-08-28 11:22:32 +01:00
ENDPROC( c p u _ v7 _ d o _ i d l e )
2007-05-08 22:27:46 +01:00
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
2008-08-28 11:22:32 +01:00
ENDPROC( c p u _ v7 _ d c a c h e _ c l e a n _ a r e a )
2007-05-08 22:27:46 +01:00
2011-06-23 17:26:19 +01:00
string c p u _ v7 _ n a m e , " A R M v7 P r o c e s s o r "
2007-05-08 22:27:46 +01:00
.align
2011-02-06 15:48:39 +00:00
/* Suspend/resume support: derived from arch/arm/mach-s5pv210/sleep.S */
.globl cpu_v7_suspend_size
2011-11-22 17:30:29 +00:00
.equ cpu_ v7 _ s u s p e n d _ s i z e , 4 * 8
2011-10-01 21:09:39 +02:00
# ifdef C O N F I G _ A R M _ C P U _ S U S P E N D
2011-02-06 15:48:39 +00:00
ENTRY( c p u _ v7 _ d o _ s u s p e n d )
2011-08-27 22:39:09 +01:00
stmfd s p ! , { r4 - r10 , l r }
2011-02-06 15:48:39 +00:00
mrc p15 , 0 , r4 , c13 , c0 , 0 @ FCSE/PID
2011-08-28 10:30:34 +01:00
mrc p15 , 0 , r5 , c13 , c0 , 3 @ User r/o thread ID
stmia r0 ! , { r4 - r5 }
2011-02-06 15:48:39 +00:00
mrc p15 , 0 , r6 , c3 , c0 , 0 @ Domain ID
2011-08-27 22:39:09 +01:00
mrc p15 , 0 , r7 , c2 , c0 , 1 @ TTB 1
2011-11-22 17:30:29 +00:00
mrc p15 , 0 , r11 , c2 , c0 , 2 @ TTB control register
2011-08-27 22:39:09 +01:00
mrc p15 , 0 , r8 , c1 , c0 , 0 @ Control register
mrc p15 , 0 , r9 , c1 , c0 , 1 @ Auxiliary control register
mrc p15 , 0 , r10 , c1 , c0 , 2 @ Co-processor access control
2011-11-22 17:30:29 +00:00
stmia r0 , { r6 - r11 }
2011-08-27 22:39:09 +01:00
ldmfd s p ! , { r4 - r10 , p c }
2011-02-06 15:48:39 +00:00
ENDPROC( c p u _ v7 _ d o _ s u s p e n d )
ENTRY( c p u _ v7 _ d o _ r e s u m e )
mov i p , #0
mcr p15 , 0 , i p , c8 , c7 , 0 @ invalidate TLBs
mcr p15 , 0 , i p , c7 , c5 , 0 @ invalidate I cache
2011-08-28 10:30:34 +01:00
mcr p15 , 0 , i p , c13 , c0 , 1 @ set reserved context ID
ldmia r0 ! , { r4 - r5 }
2011-02-06 15:48:39 +00:00
mcr p15 , 0 , r4 , c13 , c0 , 0 @ FCSE/PID
2011-08-28 10:30:34 +01:00
mcr p15 , 0 , r5 , c13 , c0 , 3 @ User r/o thread ID
2011-11-22 17:30:29 +00:00
ldmia r0 , { r6 - r11 }
2011-02-06 15:48:39 +00:00
mcr p15 , 0 , r6 , c3 , c0 , 0 @ Domain ID
2011-11-22 17:30:29 +00:00
# ifndef C O N F I G _ A R M _ L P A E
2011-08-27 22:39:09 +01:00
ALT_ S M P ( o r r r1 , r1 , #T T B _ F L A G S _ S M P )
ALT_ U P ( o r r r1 , r1 , #T T B _ F L A G S _ U P )
2011-11-22 17:30:29 +00:00
# endif
2011-08-27 22:39:09 +01:00
mcr p15 , 0 , r1 , c2 , c0 , 0 @ TTB 0
mcr p15 , 0 , r7 , c2 , c0 , 1 @ TTB 1
2011-11-22 17:30:29 +00:00
mcr p15 , 0 , r11 , c2 , c0 , 2 @ TTB control register
2011-08-26 22:44:59 +01:00
mrc p15 , 0 , r4 , c1 , c0 , 1 @ Read Auxiliary control register
2011-08-27 22:39:09 +01:00
teq r4 , r9 @ Is it already set?
mcrne p15 , 0 , r9 , c1 , c0 , 1 @ No, so write it
mcr p15 , 0 , r10 , c1 , c0 , 2 @ Co-processor access control
2011-02-06 15:48:39 +00:00
ldr r4 , =PRRR @ PRRR
ldr r5 , =NMRR @ NMRR
mcr p15 , 0 , r4 , c10 , c2 , 0 @ write PRRR
mcr p15 , 0 , r5 , c10 , c2 , 1 @ write NMRR
isb
2011-08-27 00:37:38 +01:00
dsb
2011-08-27 22:39:09 +01:00
mov r0 , r8 @ control register
2011-02-06 15:48:39 +00:00
b c p u _ r e s u m e _ m m u
ENDPROC( c p u _ v7 _ d o _ r e s u m e )
# endif
2010-10-01 15:37:05 +01:00
_ _ CPUINIT
2007-05-08 22:27:46 +01:00
/ *
* _ _ 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 .
*
* 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
* /
2011-05-20 14:39:29 +01:00
__v7_ca5mp_setup :
2010-09-17 16:42:10 +01:00
__v7_ca9mp_setup :
2011-01-12 17:10:45 +00:00
mov r10 , #( 1 < < 0 ) @ TLB ops broadcasting
b 1 f
2011-12-09 20:00:39 +01:00
__v7_ca7mp_setup :
2011-01-12 17:10:45 +00:00
__v7_ca15mp_setup :
mov r10 , #0
1 :
2008-11-06 13:23:09 +00:00
# ifdef C O N F I G _ S M P
2010-09-04 10:47:48 +01:00
ALT_ S M P ( m r c p15 , 0 , r0 , c1 , c0 , 1 )
ALT_ U P ( m o v r0 , #( 1 < < 6 ) ) @ fake it for UP
2009-11-04 12:16:38 +00:00
tst r0 , #( 1 < < 6 ) @ SMP/nAMP mode enabled?
2011-01-12 17:10:45 +00:00
orreq r0 , r0 , #( 1 < < 6 ) @ Enable SMP/nAMP mode
orreq r0 , r0 , r10 @ Enable CPU-specific SMP bits
mcreq p15 , 0 , r0 , c1 , c0 , 1
2008-11-06 13:23:09 +00:00
# endif
2013-01-05 13:57:38 +01:00
b _ _ v7 _ s e t u p
2012-10-03 11:58:07 +02:00
__v7_pj4b_setup :
# ifdef C O N F I G _ C P U _ P J 4 B
/* Auxiliary Debug Modes Control 1 Register */
# define P J 4 B _ S T A T I C _ B P ( 1 < < 2 ) / * E n a b l e S t a t i c B P * /
# define P J 4 B _ I N T E R _ P A R I T Y ( 1 < < 8 ) / * D i s a b l e I n t e r n a l P a r i t y H a n d l i n g * /
# define P J 4 B _ B C K _ O F F _ S T R E X ( 1 < < 5 ) / * E n a b l e t h e b a c k o f f o f S T R E X i n s t r * /
# define P J 4 B _ C L E A N _ L I N E ( 1 < < 1 6 ) / * D i s a b l e d a t a t r a n s f e r f o r c l e a n l i n e * /
/* Auxiliary Debug Modes Control 2 Register */
# define P J 4 B _ F A S T _ L D R ( 1 < < 2 3 ) / * D i s a b l e f a s t L D R * /
# define P J 4 B _ S N O O P _ D A T A ( 1 < < 2 5 ) / * D o n o t i n t e r l e a v e w r i t e a n d s n o o p d a t a * /
# define P J 4 B _ C W F ( 1 < < 2 7 ) / * D i s a b l e C r i t i c a l W o r d F i r s t f e a t u r e * /
# define P J 4 B _ O U T S D N G _ N C ( 1 < < 2 9 ) / * D i s a b l e o u t s t a n d i n g n o n c a c h e a b l e r q s t * /
# define P J 4 B _ L 1 _ R E P _ R R ( 1 < < 3 0 ) / * L 1 r e p l a c e m e n t - S t r i c t r o u n d r o b i n * /
# define P J 4 B _ A U X _ D B G _ C T R L 2 ( P J 4 B _ S N O O P _ D A T A | P J 4 B _ C W F | \
PJ4 B _ O U T S D N G _ N C | P J 4 B _ L 1 _ R E P _ R R )
/* Auxiliary Functional Modes Control Register 0 */
# define P J 4 B _ S M P _ C F B ( 1 < < 1 ) / * S e t S M P m o d e . J o i n t h e c o h e r e n c y f a b r i c * /
# define P J 4 B _ L 1 _ P A R _ C H K ( 1 < < 2 ) / * S u p p o r t L 1 p a r i t y c h e c k i n g * /
# define P J 4 B _ B R O A D C A S T _ C A C H E ( 1 < < 8 ) / * B r o a d c a s t C a c h e a n d T L B m a i n t e n a n c e * /
/* Auxiliary Debug Modes Control 0 Register */
# define P J 4 B _ W F I _ W F E ( 1 < < 2 2 ) / * W F I / W F E - s e r v e t h e D V M a n d b a c k t o i d l e * /
/* Auxiliary Debug Modes Control 1 Register */
mrc p15 , 1 , r0 , c15 , c1 , 1
orr r0 , r0 , #P J 4 B _ C L E A N _ L I N E
orr r0 , r0 , #P J 4 B _ B C K _ O F F _ S T R E X
orr r0 , r0 , #P J 4 B _ I N T E R _ P A R I T Y
bic r0 , r0 , #P J 4 B _ S T A T I C _ B P
mcr p15 , 1 , r0 , c15 , c1 , 1
/* Auxiliary Debug Modes Control 2 Register */
mrc p15 , 1 , r0 , c15 , c1 , 2
bic r0 , r0 , #P J 4 B _ F A S T _ L D R
orr r0 , r0 , #P J 4 B _ A U X _ D B G _ C T R L 2
mcr p15 , 1 , r0 , c15 , c1 , 2
/* Auxiliary Functional Modes Control Register 0 */
mrc p15 , 1 , r0 , c15 , c2 , 0
# ifdef C O N F I G _ S M P
orr r0 , r0 , #P J 4 B _ S M P _ C F B
# endif
orr r0 , r0 , #P J 4 B _ L 1 _ P A R _ C H K
orr r0 , r0 , #P J 4 B _ B R O A D C A S T _ C A C H E
mcr p15 , 1 , r0 , c15 , c2 , 0
/* Auxiliary Debug Modes Control 0 Register */
mrc p15 , 1 , r0 , c15 , c1 , 0
orr r0 , r0 , #P J 4 B _ W F I _ W F E
mcr p15 , 1 , r0 , c15 , c1 , 0
# endif / * C O N F I G _ C P U _ P J 4 B * /
2010-09-17 16:42:10 +01:00
__v7_setup :
2007-05-08 22:27:46 +01:00
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 }
2012-09-10 15:07:26 +05:30
bl v7 _ f l u s h _ d c a c h e _ l o u i s
2007-05-08 22:27:46 +01:00
ldmia r12 , { r0 - r5 , r7 , r9 , r11 , l r }
2009-06-01 12:50:33 +01:00
mrc p15 , 0 , r0 , c0 , c0 , 0 @ read main ID register
and r10 , r0 , #0xff000000 @ ARM?
teq r10 , #0x41000000
2010-09-14 09:51:43 +01:00
bne 3 f
2009-06-01 12:50:33 +01:00
and r5 , r0 , #0x00f00000 @ variant
and r6 , r0 , #0x0000000f @ revision
2010-09-14 09:50:03 +01:00
orr r6 , r6 , r5 , l s r #20 - 4 @ combine variant and revision
ubfx r0 , r0 , #4 , #12 @ primary part number
2009-06-01 12:50:33 +01:00
2010-09-14 09:50:03 +01:00
/* Cortex-A8 Errata */
ldr r10 , =0x00000c08 @ Cortex-A8 primary part number
teq r0 , r10
bne 2 f
2012-12-21 22:42:40 +01:00
# if d e f i n e d ( C O N F I G _ A R M _ E R R A T A _ 4 3 0 9 7 3 ) & & ! d e f i n e d ( C O N F I G _ A R C H _ M U L T I P L A T F O R M )
2009-06-01 12:50:33 +01:00
teq r5 , #0x00100000 @ only present in r1p*
mrceq p15 , 0 , r10 , c1 , c0 , 1 @ read aux control register
orreq r10 , r10 , #( 1 < < 6 ) @ set IBE to 1
mcreq p15 , 0 , r10 , c1 , c0 , 1 @ write aux control register
2009-04-30 17:06:15 +01:00
# endif
# ifdef C O N F I G _ A R M _ E R R A T A _ 4 5 8 6 9 3
2010-09-14 09:50:03 +01:00
teq r6 , #0x20 @ only present in r2p0
2009-06-01 12:50:33 +01:00
mrceq p15 , 0 , r10 , c1 , c0 , 1 @ read aux control register
orreq r10 , r10 , #( 1 < < 5 ) @ set L1NEON to 1
orreq r10 , r10 , #( 1 < < 9 ) @ set PLDNOP to 1
mcreq p15 , 0 , r10 , c1 , c0 , 1 @ write aux control register
2009-04-30 17:06:20 +01:00
# endif
# ifdef C O N F I G _ A R M _ E R R A T A _ 4 6 0 0 7 5
2010-09-14 09:50:03 +01:00
teq r6 , #0x20 @ only present in r2p0
2009-06-01 12:50:33 +01:00
mrceq p15 , 1 , r10 , c9 , c0 , 2 @ read L2 cache aux ctrl register
tsteq r10 , #1 < < 2 2
orreq r10 , r10 , #( 1 < < 2 2 ) @ set the Write Allocate disable bit
mcreq p15 , 1 , r10 , c9 , c0 , 2 @ write the L2 cache aux ctrl register
2009-04-30 17:06:09 +01:00
# endif
2010-09-14 09:51:43 +01:00
b 3 f
/* Cortex-A9 Errata */
2 : ldr r10 , =0x00000c09 @ Cortex-A9 primary part number
teq r0 , r10
bne 3 f
# ifdef C O N F I G _ A R M _ E R R A T A _ 7 4 2 2 3 0
cmp r6 , #0x22 @ only present up to r2p2
mrcle p15 , 0 , r10 , c15 , c0 , 1 @ read diagnostic register
orrle r10 , r10 , #1 < < 4 @ set bit #4
mcrle p15 , 0 , r10 , c15 , c0 , 1 @ write diagnostic register
# endif
2010-09-14 09:53:02 +01:00
# ifdef C O N F I G _ A R M _ E R R A T A _ 7 4 2 2 3 1
teq r6 , #0x20 @ present in r2p0
teqne r6 , #0x21 @ present in r2p1
teqne r6 , #0x22 @ present in r2p2
mrceq p15 , 0 , r10 , c15 , c0 , 1 @ read diagnostic register
orreq r10 , r10 , #1 < < 1 2 @ set bit #12
orreq r10 , r10 , #1 < < 2 2 @ set bit #22
mcreq p15 , 0 , r10 , c15 , c0 , 1 @ write diagnostic register
# endif
2010-09-28 14:02:02 +01:00
# ifdef C O N F I G _ A R M _ E R R A T A _ 7 4 3 6 2 2
2012-02-24 12:12:38 +01:00
teq r5 , #0x00200000 @ only present in r2p*
2010-09-28 14:02:02 +01:00
mrceq p15 , 0 , r10 , c15 , c0 , 1 @ read diagnostic register
orreq r10 , r10 , #1 < < 6 @ set bit #6
mcreq p15 , 0 , r10 , c15 , c0 , 1 @ write diagnostic register
# endif
2011-12-08 13:41:06 +01:00
# if d e f i n e d ( C O N F I G _ A R M _ E R R A T A _ 7 5 1 4 7 2 ) & & d e f i n e d ( C O N F I G _ S M P )
ALT_ S M P ( c m p r6 , #0x30 ) @ present prior to r3p0
ALT_ U P _ B ( 1 f )
2011-02-18 16:36:35 +01:00
mrclt p15 , 0 , r10 , c15 , c0 , 1 @ read diagnostic register
orrlt r10 , r10 , #1 < < 1 1 @ set bit #11
mcrlt p15 , 0 , r10 , c15 , c0 , 1 @ write diagnostic register
2011-12-08 13:41:06 +01:00
1 :
2011-02-18 16:36:35 +01:00
# endif
2009-06-01 12:50:33 +01:00
2010-09-14 09:51:43 +01:00
3 : mov r10 , #0
2007-05-08 22:27:46 +01:00
mcr p15 , 0 , r10 , c7 , c5 , 0 @ I+BTB cache invalidate
dsb
2007-07-20 11:43:02 +01:00
# ifdef C O N F I G _ M M U
2007-05-08 22:27:46 +01:00
mcr p15 , 0 , r10 , c8 , c7 , 0 @ invalidate I + D TLBs
2011-11-22 17:30:28 +00:00
v7 _ t t b _ s e t u p r10 , r4 , r8 , r5 @ TTBCR, TTBRx setup
2011-02-06 15:48:39 +00:00
ldr r5 , =PRRR @ PRRR
ldr r6 , =NMRR @ NMRR
2008-09-15 17:23:10 +01:00
mcr p15 , 0 , r5 , c10 , c2 , 0 @ write PRRR
mcr p15 , 0 , r6 , c10 , c2 , 1 @ write NMRR
2012-04-12 17:45:25 +01:00
# endif
# ifndef C O N F I G _ A R M _ T H U M B E E
mrc p15 , 0 , r0 , c0 , c1 , 0 @ read ID_PFR0 for ThumbEE
and r0 , r0 , #( 0xf < < 1 2 ) @ ThumbEE enabled field
teq r0 , #( 1 < < 1 2 ) @ check if ThumbEE is present
bne 1 f
mov r5 , #0
mcr p14 , 6 , r5 , c1 , c0 , 0 @ Initialize TEEHBR to 0
mrc p14 , 6 , r0 , c0 , c0 , 0 @ load TEECR
orr r0 , r0 , #1 @ set the 1st bit in order to
mcr p14 , 6 , r0 , c0 , c0 , 0 @ stop userspace TEEHBR access
1 :
2009-07-24 12:35:06 +01:00
# endif
2007-07-20 11:43:02 +01:00
adr r5 , v7 _ c r v a l
ldmia r5 , { r5 , r6 }
2009-05-30 14:00:18 +01:00
# ifdef C O N F I G _ C P U _ E N D I A N _ B E 8
orr r6 , r6 , #1 < < 2 5 @ big-endian page tables
2010-09-16 18:00:47 +01:00
# endif
# ifdef C O N F I G _ S W P _ E M U L A T E
orr r5 , r5 , #( 1 < < 1 0 ) @ set SW bit in "clear"
bic r6 , r6 , #( 1 < < 1 0 ) @ clear it in "mmuset"
2009-05-30 14:00:18 +01:00
# endif
2007-07-20 11:43:02 +01:00
mrc p15 , 0 , r0 , c1 , c0 , 0 @ read control register
bic r0 , r0 , r5 @ clear bits them
orr r0 , r0 , r6 @ set them
2009-07-24 12:32:56 +01:00
THUMB( o r r r0 , r0 , #1 < < 3 0 ) @ Thumb exceptions
2007-05-08 22:27:46 +01:00
mov p c , l r @ return to head.S:__ret
2008-08-28 11:22:32 +01:00
ENDPROC( _ _ v7 _ s e t u p )
2007-05-08 22:27:46 +01:00
2011-11-22 17:30:28 +00:00
.align 2
2007-05-08 22:27:46 +01:00
__v7_setup_stack :
.space 4 * 1 1 @ 11 registers
2010-10-01 15:37:05 +01:00
_ _ INITDATA
2011-06-23 17:26:19 +01:00
@ define struct processor (see <asm/proc-fns.h> and proc-macros.S)
define_ p r o c e s s o r _ f u n c t i o n s v7 , d a b o r t =v7_early_abort , p a b o r t =v7_pabort , s u s p e n d =1
2007-05-08 22:27:46 +01:00
2010-10-01 15:37:05 +01:00
.section " .rodata "
2011-06-23 17:26:19 +01:00
string c p u _ a r c h _ n a m e , " a r m v7 "
string c p u _ e l f _ n a m e , " v7 "
2007-05-08 22:27:46 +01:00
.align
.section " .proc .info .init " , # alloc, #e x e c i n s t r
2011-05-20 14:39:28 +01:00
/ *
* Standard v7 p r o c i n f o c o n t e n t
* /
.macro __v7_proc initfunc, m m _ m m u f l a g s = 0 , i o _ m m u f l a g s = 0 , h w c a p s = 0
ALT_ S M P ( . l o n g P M D _ T Y P E _ S E C T | P M D _ S E C T _ A P _ W R I T E | P M D _ S E C T _ A P _ R E A D | \
2011-11-22 17:30:29 +00:00
PMD_ S E C T _ A F | P M D _ F L A G S _ S M P | \ m m _ m m u f l a g s )
2011-05-20 14:39:28 +01:00
ALT_ U P ( . l o n g P M D _ T Y P E _ S E C T | P M D _ S E C T _ A P _ W R I T E | P M D _ S E C T _ A P _ R E A D | \
2011-11-22 17:30:29 +00:00
PMD_ S E C T _ A F | P M D _ F L A G S _ U P | \ m m _ m m u f l a g s )
.long PMD_TYPE_SECT | PMD_ S E C T _ A P _ W R I T E | \
PMD_ S E C T _ A P _ R E A D | P M D _ S E C T _ A F | \ i o _ m m u f l a g s
2011-05-20 14:39:28 +01:00
W( b ) \ i n i t f u n c
2010-09-17 16:42:10 +01:00
.long cpu_arch_name
.long cpu_elf_name
2011-05-20 14:39:28 +01:00
.long HWCAP_SWP | HWCAP_ 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 | \
HWCAP_ E D S P | H W C A P _ T L S | \ h w c a p s
2010-09-17 16:42:10 +01:00
.long cpu_v7_name
.long v7_processor_functions
.long v7wbi_tlb_fns
.long v6_user_fns
.long v7_cache_fns
2011-05-20 14:39:28 +01:00
.endm
2011-11-22 17:30:29 +00:00
# ifndef C O N F I G _ A R M _ L P A E
2011-05-20 14:39:29 +01:00
/ *
* ARM L t d . C o r t e x A 5 p r o c e s s o r .
* /
.type _ _ v7 _ c a5 m p _ p r o c _ i n f o , #o b j e c t
__v7_ca5mp_proc_info :
.long 0x410fc050
.long 0xff0ffff0
_ _ v7 _ p r o c _ _ v7 _ c a5 m p _ s e t u p
.size _ _ v7 _ c a5 m p _ p r o c _ i n f o , . - _ _ v7 _ c a5 m p _ p r o c _ i n f o
2011-05-20 14:39:28 +01:00
/ *
* ARM L t d . C o r t e x A 9 p r o c e s s o r .
* /
.type _ _ v7 _ c a9 m p _ p r o c _ i n f o , #o b j e c t
__v7_ca9mp_proc_info :
.long 0x410fc090
.long 0xff0ffff0
_ _ v7 _ p r o c _ _ v7 _ c a9 m p _ s e t u p
2010-09-17 16:42:10 +01:00
.size _ _ v7 _ c a9 m p _ p r o c _ i n f o , . - _ _ v7 _ c a9 m p _ p r o c _ i n f o
2012-10-03 11:58:07 +02:00
/ *
* Marvell P J 4 B p r o c e s s o r .
* /
.type _ _ v7 _ p j 4 b _ p r o c _ i n f o , #o b j e c t
__v7_pj4b_proc_info :
.long 0x562f5840
.long 0xfffffff0
_ _ v7 _ p r o c _ _ v7 _ p j 4 b _ s e t u p
.size _ _ v7 _ p j 4 b _ p r o c _ i n f o , . - _ _ v7 _ p j 4 b _ p r o c _ i n f o
2011-11-22 17:30:29 +00:00
# endif / * C O N F I G _ A R M _ L P A E * /
2010-09-17 16:42:10 +01:00
2012-01-20 12:01:14 +01:00
/ *
* ARM L t d . C o r t e x A 7 p r o c e s s o r .
* /
.type _ _ v7 _ c a7 m p _ p r o c _ i n f o , #o b j e c t
__v7_ca7mp_proc_info :
.long 0x410fc070
.long 0xff0ffff0
_ _ v7 _ p r o c _ _ v7 _ c a7 m p _ s e t u p , h w c a p s = H W C A P _ I D I V
.size _ _ v7 _ c a7 m p _ p r o c _ i n f o , . - _ _ v7 _ c a7 m p _ p r o c _ i n f o
2011-01-12 17:10:45 +00:00
/ *
* ARM L t d . C o r t e x A 1 5 p r o c e s s o r .
* /
.type _ _ v7 _ c a15 m p _ p r o c _ i n f o , #o b j e c t
__v7_ca15mp_proc_info :
.long 0x410fc0f0
.long 0xff0ffff0
_ _ v7 _ p r o c _ _ v7 _ c a15 m p _ s e t u p , h w c a p s = H W C A P _ I D I V
.size _ _ v7 _ c a15 m p _ p r o c _ i n f o , . - _ _ v7 _ c a15 m p _ p r o c _ i n f o
2007-05-08 22:27:46 +01:00
/ *
* 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
2011-05-20 14:39:28 +01:00
_ _ v7 _ p r o c _ _ v7 _ s e t u p
2007-05-08 22:27:46 +01:00
.size _ _ v7 _ p r o c _ i n f o , . - _ _ v7 _ p r o c _ i n f o