2019-06-04 10:11:33 +02:00
/* SPDX-License-Identifier: GPL-2.0-only */
2011-01-15 18:18:29 +08:00
/ *
* linux/ a r c h / u n i c o r e 3 2 / m m / c a c h e - u c v2 . S
*
* Code s p e c i f i c t o P K U n i t y S o C a n d U n i C o r e I S A
*
* Copyright ( C ) 2 0 0 1 - 2 0 1 0 G U A N X u e - t a o
*
* This i s t h e " s h e l l " o f t h e U n i C o r e - v2 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 < l i n u x / i n i t . h >
# include < a s m / a s s e m b l e r . h >
# include < a s m / p a g e . h >
# include " p r o c - m a c r o s . S "
/ *
* _ _ cpuc_ f l u s h _ i c a c h e _ a l l ( )
* _ _ cpuc_ f l u s h _ k e r n _ a l l ( )
* _ _ cpuc_ f l u s h _ u s e r _ a l l ( )
*
* Flush t h e e n t i r e c a c h e .
* /
ENTRY( _ _ c p u c _ f l u s h _ i c a c h e _ a l l )
/*FALLTHROUGH*/
ENTRY( _ _ c p u c _ f l u s h _ k e r n _ a l l )
/*FALLTHROUGH*/
ENTRY( _ _ c p u c _ f l u s h _ u s e r _ a l l )
mov r0 , #0
movc p0 . c5 , r0 , #14 @ Dcache flush all
nop8
mov r0 , #0
movc p0 . c5 , r0 , #20 @ Icache invalidate all
nop8
mov p c , l r
/ *
* _ _ cpuc_ f l u s h _ u s e r _ r a n g e ( s t a r t , e n d , f l a g s )
*
* Flush a r a n g e o f T L B e n t r i e s i n t h e s p e c i f i e d a d d r e s s s p a c e .
*
* - start - s t a r t a d d r e s s ( m a y n o t b e a l i g n e d )
* - end - e n d a d d r e s s ( e x c l u s i v e , m a y n o t b e a l i g n e d )
* - flags - v m _ a r e a _ s t r u c t f l a g s d e s c r i b i n g a d d r e s s s p a c e
* /
ENTRY( _ _ c p u c _ f l u s h _ u s e r _ r a n g e )
cxor. a r2 , #0
beq _ _ c p u c _ d m a _ f l u s h _ r a n g e
# ifndef C O N F I G _ C P U _ D C A C H E _ L I N E _ D I S A B L E
andn r0 , r0 , #C A C H E _ L I N E S I Z E - 1 @ Safety check
sub r1 , r1 , r0
csub. a r1 , #M A X _ A R E A _ S I Z E
bsg 2 f
andn r1 , r1 , #C A C H E _ L I N E S I Z E - 1
add r1 , r1 , #C A C H E _ L I N E S I Z E
101 : dcacheline_ f l u s h r0 , r11 , r12
add r0 , r0 , #C A C H E _ L I N E S I Z E
sub. a r1 , r1 , #C A C H E _ L I N E S I Z E
bns 1 0 1 b
b 3 f
# endif
2 : mov i p , #0
movc p0 . c5 , i p , #14 @ Dcache flush all
nop8
3 : mov i p , #0
movc p0 . c5 , i p , #20 @ Icache invalidate all
nop8
mov p c , l r
/ *
* _ _ cpuc_ c o h e r e n t _ k e r n _ r a n g e ( s t a r t ,e n d )
* _ _ cpuc_ c o h e r e n t _ u s e r _ r a n g e ( s t a r t ,e n d )
*
* Ensure t h a t t h e I a n d D c a c h e s a r e c o h e r e n t w i t h i n s p e c i f i e d
* region. T h i s i s t y p i c a l l y u s e d w h e n c o d e h a s b e e n w r i t t e n t o
* a m e m o r y r e g i o n , a n d w i l l b e e x e c u t e d .
*
* - start - v i r t u a l s t a r t a d d r e s s o f r e g i o n
* - end - v i r t u a l e n d a d d r e s s o f r e g i o n
* /
ENTRY( _ _ c p u c _ c o h e r e n t _ k e r n _ r a n g e )
/* FALLTHROUGH */
ENTRY( _ _ c p u c _ c o h e r e n t _ u s e r _ r a n g e )
# ifndef C O N F I G _ C P U _ D C A C H E _ L I N E _ D I S A B L E
andn r0 , r0 , #C A C H E _ L I N E S I Z E - 1 @ Safety check
sub r1 , r1 , r0
csub. a r1 , #M A X _ A R E A _ S I Z E
bsg 2 f
andn r1 , r1 , #C A C H E _ L I N E S I Z E - 1
add r1 , r1 , #C A C H E _ L I N E S I Z E
@ r0 va2pa r10
mov r9 , #P A G E _ S Z
sub r9 , r9 , #1 @ PAGE_MASK
101 : va2 p a r0 , r10 , r11 , r12 , r13 , 2 f @ r10 is PA
b 1 0 3 f
102 : cand. a r0 , r9
beq 1 0 1 b
103 : movc p0 . c5 , r10 , #11 @ Dcache clean line of R10
nop8
add r0 , r0 , #C A C H E _ L I N E S I Z E
add r10 , r10 , #C A C H E _ L I N E S I Z E
sub. a r1 , r1 , #C A C H E _ L I N E S I Z E
bns 1 0 2 b
b 3 f
# endif
2 : mov i p , #0
movc p0 . c5 , i p , #10 @ Dcache clean all
nop8
3 : mov i p , #0
movc p0 . c5 , i p , #20 @ Icache invalidate all
nop8
mov p c , l r
/ *
* _ _ cpuc_ f l u s h _ k e r n _ d c a c h e _ a r e a ( v o i d * a d d r , s i z e _ t s i z e )
*
* - addr - k e r n e l a d d r e s s
* - size - r e g i o n s i z e
* /
ENTRY( _ _ c p u c _ f l u s h _ k e r n _ d c a c h e _ a r e a )
mov i p , #0
movc p0 . c5 , i p , #14 @ Dcache flush all
nop8
mov p c , l r
/ *
* _ _ cpuc_ d m a _ c l e a n _ r a n g e ( s t a r t ,e n d )
* - start - v i r t u a l s t a r t a d d r e s s o f r e g i o n
* - end - v i r t u a l e n d a d d r e s s o f r e g i o n
* /
ENTRY( _ _ c p u c _ d m a _ c l e a n _ r a n g e )
# ifndef C O N F I G _ C P U _ D C A C H E _ L I N E _ D I S A B L E
andn r0 , r0 , #C A C H E _ L I N E S I Z E - 1
sub r1 , r1 , r0
andn r1 , r1 , #C A C H E _ L I N E S I Z E - 1
add r1 , r1 , #C A C H E _ L I N E S I Z E
csub. a r1 , #M A X _ A R E A _ S I Z E
bsg 2 f
@ r0 va2pa r10
mov r9 , #P A G E _ S Z
sub r9 , r9 , #1 @ PAGE_MASK
101 : va2 p a r0 , r10 , r11 , r12 , r13 , 2 f @ r10 is PA
b 1 f
102 : cand. a r0 , r9
beq 1 0 1 b
1 : movc p0 . c5 , r10 , #11 @ Dcache clean line of R10
nop8
add r0 , r0 , #C A C H E _ L I N E S I Z E
add r10 , r10 , #C A C H E _ L I N E S I Z E
sub. a r1 , r1 , #C A C H E _ L I N E S I Z E
bns 1 0 2 b
mov p c , l r
# endif
2 : mov i p , #0
movc p0 . c5 , i p , #10 @ Dcache clean all
nop8
mov p c , l r
/ *
* _ _ cpuc_ d m a _ i n v _ r a n g e ( s t a r t ,e n d )
* _ _ cpuc_ d m a _ f l u s h _ r a n g e ( s t a r t ,e n d )
* - start - v i r t u a l s t a r t a d d r e s s o f r e g i o n
* - end - v i r t u a l e n d a d d r e s s o f r e g i o n
* /
__cpuc_dma_inv_range :
/* FALLTHROUGH */
ENTRY( _ _ c p u c _ d m a _ f l u s h _ r a n g e )
# ifndef C O N F I G _ C P U _ D C A C H E _ L I N E _ D I S A B L E
andn r0 , r0 , #C A C H E _ L I N E S I Z E - 1
sub r1 , r1 , r0
andn r1 , r1 , #C A C H E _ L I N E S I Z E - 1
add r1 , r1 , #C A C H E _ L I N E S I Z E
csub. a r1 , #M A X _ A R E A _ S I Z E
bsg 2 f
@ r0 va2pa r10
101 : dcacheline_ f l u s h r0 , r11 , r12
add r0 , r0 , #C A C H E _ L I N E S I Z E
sub. a r1 , r1 , #C A C H E _ L I N E S I Z E
bns 1 0 1 b
mov p c , l r
# endif
2 : mov i p , #0
movc p0 . c5 , i p , #14 @ Dcache flush all
nop8
mov p c , l r