2012-08-02 11:16:29 +03:00
/ *
* Coherency f a b r i c : l o w l e v e l f u n c t i o n s
*
* Copyright ( C ) 2 0 1 2 M a r v e l l
*
* Gregory C L E M E N T < g r e g o r y . c l e m e n t @free-electrons.com>
*
* This f i l e i s l i c e n s e d 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
* License v e r s i o n 2 . T h i s p r o g r a m i s l i c e n s e d " a s i s " w i t h o u t a n y
* warranty o f a n y k i n d , w h e t h e r e x p r e s s o r i m p l i e d .
*
* This f i l e i m p l e m e n t s t h e a s s e m b l y f u n c t i o n t o a d d a C P U t o t h e
* coherency f a b r i c . T h i s f u n c t i o n i s c a l l e d b y e a c h o f t h e s e c o n d a r y
* CPUs d u r i n g t h e i r e a r l y b o o t i n a n S M P k e r n e l , t h i s w h y t h i s
* function h a v e t o c a l l a b l e f r o m a s s e m b l y . I t c a n a l s o b e c a l l e d b y a
* primary C P U f r o m C c o d e d u r i n g i t s b o o t .
* /
# include < l i n u x / l i n k a g e . h >
# define A R M A D A _ X P _ C F B _ C T L _ R E G _ O F F S E T 0 x0
# define A R M A D A _ X P _ C F B _ C F G _ R E G _ O F F S E T 0 x4
2013-02-01 10:36:22 +00:00
# include < a s m / a s s e m b l e r . h >
2012-08-02 11:16:29 +03:00
.text
/ *
* r0 : Coherency f a b r i c b a s e r e g i s t e r a d d r e s s
* r1 : HW C P U i d
* /
ENTRY( l l _ s e t _ c p u _ c o h e r e n t )
/* Create bit by cpu index */
mov r3 , #( 1 < < 2 4 )
lsl r1 , r3 , r1
2013-02-01 10:36:22 +00:00
ARM_ B E 8 ( r e v r1 , r1 )
2012-08-02 11:16:29 +03:00
/* Add CPU to SMP group - Atomic */
add r3 , r0 , #A R M A D A _ X P _ C F B _ C T L _ R E G _ O F F S E T
2013-05-23 10:54:02 +02:00
1 :
ldrex r2 , [ r3 ]
2012-08-02 11:16:29 +03:00
orr r2 , r2 , r1
2013-05-23 10:54:02 +02:00
strex r0 , r2 , [ r3 ]
cmp r0 , #0
bne 1 b
2012-08-02 11:16:29 +03:00
/* Enable coherency on CPU - Atomic */
2013-05-23 10:54:02 +02:00
add r3 , r3 , #A R M A D A _ X P _ C F B _ C F G _ R E G _ O F F S E T
1 :
ldrex r2 , [ r3 ]
2012-08-02 11:16:29 +03:00
orr r2 , r2 , r1
2013-05-23 10:54:02 +02:00
strex r0 , r2 , [ r3 ]
cmp r0 , #0
bne 1 b
2012-08-02 11:16:29 +03:00
dsb
mov r0 , #0
mov p c , l r
ENDPROC( l l _ s e t _ c p u _ c o h e r e n t )