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 "
# define T T B _ C ( 1 < < 0 )
# define T T B _ S ( 1 < < 1 )
2008-11-06 13:23:09 +00:00
# define T T B _ R G N _ N C ( 0 < < 3 )
# define T T B _ R G N _ O C _ W B W A ( 1 < < 3 )
2007-05-08 22:27:46 +01:00
# 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 )
2008-11-06 13:23:09 +00:00
# ifndef C O N F I G _ S M P
# define T T B _ F L A G S T T B _ C | T T B _ R G N _ O C _ W B @ mark PTWs cacheable, outer WB
# else
# define T T B _ F L A G S T T B _ C | T T B _ S | T T B _ R G N _ O C _ W B W A @ mark PTWs cacheable and shared, outer WBWA
# endif
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 )
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
*
* 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
2008-08-28 11:22:32 +01:00
ENDPROC( c p u _ v7 _ r e s e t )
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
/ *
* 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 11:43:02 +01:00
# ifdef C O N F I G _ M M U
2007-05-08 22:27:46 +01: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
2008-11-06 13:23:09 +00:00
orr r0 , r0 , #T T B _ F L A G S
2009-04-30 17:06:09 +01:00
# ifdef C O N F I G _ A R M _ E R R A T A _ 4 3 0 9 7 3
mcr p15 , 0 , r2 , c7 , c5 , 6 @ flush BTAC/BTB
# endif
2007-05-08 22:27:46 +01:00
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 11:43:02 +01:00
# endif
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 _ s w i t c h _ m m )
2007-05-08 22:27:46 +01:00
/ *
* 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 11:43:02 +01:00
# ifdef C O N F I G _ M M U
2007-05-08 22:27:46 +01:00
str r1 , [ r0 ] , #- 2048 @ linux version
bic r3 , r1 , #0x000003f0
2008-09-15 17:23:10 +01:00
bic r3 , r3 , #P T E _ T Y P E _ M A S K
2007-05-08 22:27:46 +01:00
orr r3 , r3 , r2
orr r3 , r3 , #P T E _ E X T _ A P 0 | 2
[ARM] mm: fix page table initialization
As a result of the ptebits changes, we ended up marking device mappings
as normal memory on ARMv7 CPUs, resulting in undesirable behaviour with
serial ports and the like. While reviewing the section mapping table
entries, other errors in the memory type settings for devices were
detected and confirmed to prevent Xscale3 platforms booting.
Tested on:
OMAP34xx (ARMv7),
OMAP24xx (ARMv6),
OMAP16xx (ARM926T, ARMv5),
PXA311 (Xscale3),
PXA272 (Xscale),
PXA255 (Xscale),
IXP42x (Xscale),
S3C2410 (ARM920T, ARMv4T),
ARM720T (ARMv4T)
StrongARM-110 (ARMv4)
Acked-by: Tony Lindgren <tony@atomide.com>
Tested-by: Robert Jarzmik <robert.jarzmik@free.fr>
Tested-by: Mike Rapoport <mike@compulab.co.il>
Tested-by: Ben Dooks <ben-linux@fluff.org>
Tested-by: Anders Grafström <grfstrm@users.sourceforge.net>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
2008-11-04 10:52:28 +00:00
tst r1 , #1 < < 4
2008-09-15 17:23:10 +01:00
orrne r3 , r3 , #P T E _ E X T _ T E X ( 1 )
2007-05-08 22:27:46 +01:00
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
2008-09-15 17:23:10 +01:00
tst r1 , #L _ P T E _ Y O U N G
tstne r1 , #L _ P T E _ P R E S E N T
2007-05-08 22:27:46 +01:00
moveq r3 , #0
str r3 , [ r0 ]
mcr p15 , 0 , r0 , c7 , c10 , 1 @ flush_pte
2007-07-20 11:43:02 +01:00
# endif
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 _ s e t _ p t e _ e x t )
2007-05-08 22:27:46 +01:00
cpu_v7_name :
.ascii " ARMv7 P r o c e s s o r "
.align
2009-04-27 14:02:22 -04:00
_ _ INIT
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 .
*
* 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 :
2008-11-06 13:23:09 +00:00
# ifdef C O N F I G _ S M P
2009-05-30 14:00:14 +01:00
mrc p15 , 0 , r0 , c1 , c0 , 1 @ Enable SMP/nAMP mode and
orr r0 , r0 , #( 1 < < 6 ) | ( 1 < < 0 ) @ TLB ops broadcasting
2008-11-06 13:23:09 +00:00
mcr p15 , 0 , r0 , c1 , c0 , 1
# endif
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 }
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 }
2009-04-30 17:06:09 +01:00
# ifdef C O N F I G _ A R M _ E R R A T A _ 4 3 0 9 7 3
mrc p15 , 0 , r10 , c1 , c0 , 1 @ read aux control register
orr r10 , r10 , #( 1 < < 6 ) @ set IBE to 1
mcr 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
mrc p15 , 0 , r10 , c1 , c0 , 1 @ read aux control register
orr r10 , r10 , #( 1 < < 5 ) @ set L1NEON to 1
orr r10 , r10 , #( 1 < < 9 ) @ set PLDNOP to 1
mcr 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
mrc p15 , 1 , r10 , c9 , c0 , 2 @ read L2 cache aux ctrl register
orr r10 , r10 , #( 1 < < 2 2 ) @ set the Write Allocate disable bit
mcr p15 , 1 , r10 , c9 , c0 , 2 @ write the L2 cache aux ctrl register
2009-04-30 17:06:09 +01:00
# endif
2007-05-08 22:27:46 +01:00
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 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
mcr p15 , 0 , r10 , c2 , c0 , 2 @ TTB control register
2008-11-06 13:23:09 +00:00
orr r4 , r4 , #T T B _ F L A G S
2007-05-08 22:27:46 +01:00
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 11:43:02 +01:00
# endif
2008-10-22 13:04:30 +01:00
ldr r5 , =0xff0aa1a8
ldr r6 , =0x40e040e0
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
2007-07-20 11:43:02 +01: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-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
[ARM] mm: fix page table initialization
As a result of the ptebits changes, we ended up marking device mappings
as normal memory on ARMv7 CPUs, resulting in undesirable behaviour with
serial ports and the like. While reviewing the section mapping table
entries, other errors in the memory type settings for devices were
detected and confirmed to prevent Xscale3 platforms booting.
Tested on:
OMAP34xx (ARMv7),
OMAP24xx (ARMv6),
OMAP16xx (ARM926T, ARMv5),
PXA311 (Xscale3),
PXA272 (Xscale),
PXA255 (Xscale),
IXP42x (Xscale),
S3C2410 (ARM920T, ARMv4T),
ARM720T (ARMv4T)
StrongARM-110 (ARMv4)
Acked-by: Tony Lindgren <tony@atomide.com>
Tested-by: Robert Jarzmik <robert.jarzmik@free.fr>
Tested-by: Mike Rapoport <mike@compulab.co.il>
Tested-by: Ben Dooks <ben-linux@fluff.org>
Tested-by: Anders Grafström <grfstrm@users.sourceforge.net>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
2008-11-04 10:52:28 +00:00
/ * AT
* TFR E V X F I D L R
* .EEE . .EE PUI. . T . T 4 R V I Z F R S B L D P W C A M
* rxxx r r x 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
* 1 0 1 1 0 0 0 1 1 1 .00 .111 1101 < we w a n t
2007-05-08 22:27:46 +01:00
* /
2007-07-20 11:43:02 +01:00
.type v7 _ c r v a l , #o b j e c t
v7_crval :
2008-09-15 17:23:10 +01:00
crval c l e a r =0x0120c302 , m m u s e t =0x10c0387d , u c s e t =0x00c0187c
2007-05-08 22:27:46 +01: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 18:42:04 +01:00
.word pabort_ifar
2007-05-08 22:27:46 +01: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 11:25:31 +01:00
.long v7wbi_tlb_fns
2007-05-08 22:27:46 +01: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