2008-05-20 03:53:02 +04:00
/ *
2005-04-17 02:20:36 +04:00
* hypersparc. S : H i g h s p e e d H y p e r s p a r c m m u / c a c h e o p e r a t i o n s .
*
* Copyright ( C ) 1 9 9 7 D a v i d S . M i l l e r ( d a v e m @caip.rutgers.edu)
* /
# include < a s m / p t r a c e . h >
# include < a s m / p s r . h >
2005-09-09 22:35:55 +04:00
# include < a s m / a s m - o f f s e t s . h >
2005-04-17 02:20:36 +04:00
# include < a s m / a s i . h >
# include < a s m / p a g e . h >
# include < a s m / p g t s r m m u . h >
# include < l i n u x / i n i t . h >
.text
.align 4
.globl hypersparc_ f l u s h _ c a c h e _ a l l , h y p e r s p a r c _ f l u s h _ c a c h e _ m m
.globl hypersparc_ f l u s h _ c a c h e _ r a n g e , h y p e r s p a r c _ f l u s h _ c a c h e _ p a g e
.globl hypersparc_flush_page_to_ram
.globl hypersparc_ f l u s h _ p a g e _ f o r _ d m a , h y p e r s p a r c _ f l u s h _ s i g _ i n s n s
.globl hypersparc_ f l u s h _ t l b _ a l l , h y p e r s p a r c _ f l u s h _ t l b _ m m
.globl hypersparc_ f l u s h _ t l b _ r a n g e , h y p e r s p a r c _ f l u s h _ t l b _ p a g e
hypersparc_flush_cache_all :
WINDOW_ F L U S H ( % g 4 , % g 5 )
sethi % h i ( v a c _ c a c h e _ s i z e ) , % g 4
ld [ % g 4 + % l o ( v a c _ c a c h e _ s i z e ) ] , % g 5
sethi % h i ( v a c _ l i n e _ s i z e ) , % g 1
ld [ % g 1 + % l o ( v a c _ l i n e _ s i z e ) ] , % g 2
1 :
subcc % g 5 , % g 2 , % g 5 ! h y p e r _ f l u s h _ u n c o n d i t i o n a l _ c o m b i n e d
bne 1 b
sta % g 0 , [ % g 5 ] A S I _ M _ F L U S H _ C T X
retl
sta % g 0 , [ % g 0 ] A S I _ M _ F L U S H _ I W H O L E ! h y p e r _ f l u s h _ w h o l e _ i c a c h e
/* We expand the window flush to get maximum performance. */
hypersparc_flush_cache_mm :
# ifndef C O N F I G _ S M P
ld [ % o 0 + A O F F _ m m _ c o n t e x t ] , % g 1
cmp % g 1 , - 1
be h y p e r s p a r c _ f l u s h _ c a c h e _ m m _ o u t
# endif
WINDOW_ F L U S H ( % g 4 , % g 5 )
sethi % h i ( v a c _ l i n e _ s i z e ) , % g 1
ld [ % g 1 + % l o ( v a c _ l i n e _ s i z e ) ] , % o 1
sethi % h i ( v a c _ c a c h e _ s i z e ) , % g 2
ld [ % g 2 + % l o ( v a c _ c a c h e _ s i z e ) ] , % o 0
add % o 1 , % o 1 , % g 1
add % o 1 , % g 1 , % g 2
add % o 1 , % g 2 , % g 3
add % o 1 , % g 3 , % g 4
add % o 1 , % g 4 , % g 5
add % o 1 , % g 5 , % o 4
add % o 1 , % o 4 , % o 5
/* BLAMMO! */
1 :
subcc % o 0 , % o 5 , % o 0 ! h y p e r _ f l u s h _ c a c h e _ u s e r
sta % g 0 , [ % o 0 + % g 0 ] A S I _ M _ F L U S H _ U S E R
sta % g 0 , [ % o 0 + % o 1 ] A S I _ M _ F L U S H _ U S E R
sta % g 0 , [ % o 0 + % g 1 ] A S I _ M _ F L U S H _ U S E R
sta % g 0 , [ % o 0 + % g 2 ] A S I _ M _ F L U S H _ U S E R
sta % g 0 , [ % o 0 + % g 3 ] A S I _ M _ F L U S H _ U S E R
sta % g 0 , [ % o 0 + % g 4 ] A S I _ M _ F L U S H _ U S E R
sta % g 0 , [ % o 0 + % g 5 ] A S I _ M _ F L U S H _ U S E R
bne 1 b
sta % g 0 , [ % o 0 + % o 4 ] A S I _ M _ F L U S H _ U S E R
hypersparc_flush_cache_mm_out :
retl
nop
/* The things we do for performance... */
hypersparc_flush_cache_range :
ld [ % o 0 + 0 x0 ] , % o 0 / * X X X v m a - > v m _ m m , G R O S S X X X * /
# ifndef C O N F I G _ S M P
ld [ % o 0 + A O F F _ m m _ c o n t e x t ] , % g 1
cmp % g 1 , - 1
be h y p e r s p a r c _ f l u s h _ c a c h e _ r a n g e _ o u t
# endif
WINDOW_ F L U S H ( % g 4 , % g 5 )
sethi % h i ( v a c _ l i n e _ s i z e ) , % g 1
ld [ % g 1 + % l o ( v a c _ l i n e _ s i z e ) ] , % o 4
sethi % h i ( v a c _ c a c h e _ s i z e ) , % g 2
ld [ % g 2 + % l o ( v a c _ c a c h e _ s i z e ) ] , % o 3
/* Here comes the fun part... */
add % o 2 , ( P A G E _ S I Z E - 1 ) , % o 2
andn % o 1 , ( P A G E _ S I Z E - 1 ) , % o 1
add % o 4 , % o 4 , % o 5
andn % o 2 , ( P A G E _ S I Z E - 1 ) , % o 2
add % o 4 , % o 5 , % g 1
sub % o 2 , % o 1 , % g 4
add % o 4 , % g 1 , % g 2
sll % o 3 , 2 , % g 5
add % o 4 , % g 2 , % g 3
cmp % g 4 , % g 5
add % o 4 , % g 3 , % g 4
blu 0 f
add % o 4 , % g 4 , % g 5
add % o 4 , % g 5 , % g 7
/ * Flush e n t i r e u s e r s p a c e , b e l i e v e i t o r n o t t h i s i s q u i c k e r
* than p a g e a t a t i m e f l u s h i n g s f o r r a n g e > ( c a c h e _ s i z e < < 2 ) .
* /
1 :
subcc % o 3 , % g 7 , % o 3
sta % g 0 , [ % o 3 + % g 0 ] A S I _ M _ F L U S H _ U S E R
sta % g 0 , [ % o 3 + % o 4 ] A S I _ M _ F L U S H _ U S E R
sta % g 0 , [ % o 3 + % o 5 ] A S I _ M _ F L U S H _ U S E R
sta % g 0 , [ % o 3 + % g 1 ] A S I _ M _ F L U S H _ U S E R
sta % g 0 , [ % o 3 + % g 2 ] A S I _ M _ F L U S H _ U S E R
sta % g 0 , [ % o 3 + % g 3 ] A S I _ M _ F L U S H _ U S E R
sta % g 0 , [ % o 3 + % g 4 ] A S I _ M _ F L U S H _ U S E R
bne 1 b
sta % g 0 , [ % o 3 + % g 5 ] A S I _ M _ F L U S H _ U S E R
retl
nop
/* Below our threshold, flush one page at a time. */
0 :
ld [ % o 0 + A O F F _ m m _ c o n t e x t ] , % o 0
mov S R M M U _ C T X _ R E G , % g 7
lda [ % g 7 ] A S I _ M _ M M U R E G S , % o 3
sta % o 0 , [ % g 7 ] A S I _ M _ M M U R E G S
add % o 2 , - P A G E _ S I Z E , % o 0
1 :
or % o 0 , 0 x40 0 , % g 7
lda [ % g 7 ] A S I _ M _ F L U S H _ P R O B E , % g 7
orcc % g 7 , 0 , % g 0
be,a 3 f
mov % o 0 , % o 2
add % o 4 , % g 5 , % g 7
2 :
sub % o 2 , % g 7 , % o 2
sta % g 0 , [ % o 2 + % g 0 ] A S I _ M _ F L U S H _ P A G E
sta % g 0 , [ % o 2 + % o 4 ] A S I _ M _ F L U S H _ P A G E
sta % g 0 , [ % o 2 + % o 5 ] A S I _ M _ F L U S H _ P A G E
sta % g 0 , [ % o 2 + % g 1 ] A S I _ M _ F L U S H _ P A G E
sta % g 0 , [ % o 2 + % g 2 ] A S I _ M _ F L U S H _ P A G E
sta % g 0 , [ % o 2 + % g 3 ] A S I _ M _ F L U S H _ P A G E
andcc % o 2 , 0 x f f c , % g 0
sta % g 0 , [ % o 2 + % g 4 ] A S I _ M _ F L U S H _ P A G E
bne 2 b
sta % g 0 , [ % o 2 + % g 5 ] A S I _ M _ F L U S H _ P A G E
3 :
cmp % o 2 , % o 1
bne 1 b
add % o 2 , - P A G E _ S I Z E , % o 0
mov S R M M U _ F A U L T _ S T A T U S , % g 5
lda [ % g 5 ] A S I _ M _ M M U R E G S , % g 0
mov S R M M U _ C T X _ R E G , % g 7
sta % o 3 , [ % g 7 ] A S I _ M _ M M U R E G S
hypersparc_flush_cache_range_out :
retl
nop
/ * HyperSparc r e q u i r e s a v a l i d m a p p i n g w h e r e w e a r e a b o u t t o f l u s h
* in o r d e r t o c h e c k f o r a p h y s i c a l t a g m a t c h d u r i n g t h e f l u s h .
* /
/* Verified, my ass... */
hypersparc_flush_cache_page :
ld [ % o 0 + 0 x0 ] , % o 0 / * X X X v m a - > v m _ m m , G R O S S X X X * /
ld [ % o 0 + A O F F _ m m _ c o n t e x t ] , % g 2
# ifndef C O N F I G _ S M P
cmp % g 2 , - 1
be h y p e r s p a r c _ f l u s h _ c a c h e _ p a g e _ o u t
# endif
WINDOW_ F L U S H ( % g 4 , % g 5 )
sethi % h i ( v a c _ l i n e _ s i z e ) , % g 1
ld [ % g 1 + % l o ( v a c _ l i n e _ s i z e ) ] , % o 4
mov S R M M U _ C T X _ R E G , % o 3
andn % o 1 , ( P A G E _ S I Z E - 1 ) , % o 1
lda [ % o 3 ] A S I _ M _ M M U R E G S , % o 2
sta % g 2 , [ % o 3 ] A S I _ M _ M M U R E G S
or % o 1 , 0 x40 0 , % o 5
lda [ % o 5 ] A S I _ M _ F L U S H _ P R O B E , % g 1
orcc % g 0 , % g 1 , % g 0
be 2 f
add % o 4 , % o 4 , % o 5
sub % o 1 , - P A G E _ S I Z E , % o 1
add % o 4 , % o 5 , % g 1
add % o 4 , % g 1 , % g 2
add % o 4 , % g 2 , % g 3
add % o 4 , % g 3 , % g 4
add % o 4 , % g 4 , % g 5
add % o 4 , % g 5 , % g 7
/* BLAMMO! */
1 :
sub % o 1 , % g 7 , % o 1
sta % g 0 , [ % o 1 + % g 0 ] A S I _ M _ F L U S H _ P A G E
sta % g 0 , [ % o 1 + % o 4 ] A S I _ M _ F L U S H _ P A G E
sta % g 0 , [ % o 1 + % o 5 ] A S I _ M _ F L U S H _ P A G E
sta % g 0 , [ % o 1 + % g 1 ] A S I _ M _ F L U S H _ P A G E
sta % g 0 , [ % o 1 + % g 2 ] A S I _ M _ F L U S H _ P A G E
sta % g 0 , [ % o 1 + % g 3 ] A S I _ M _ F L U S H _ P A G E
andcc % o 1 , 0 x f f c , % g 0
sta % g 0 , [ % o 1 + % g 4 ] A S I _ M _ F L U S H _ P A G E
bne 1 b
sta % g 0 , [ % o 1 + % g 5 ] A S I _ M _ F L U S H _ P A G E
2 :
mov S R M M U _ F A U L T _ S T A T U S , % g 7
mov S R M M U _ C T X _ R E G , % g 4
lda [ % g 7 ] A S I _ M _ M M U R E G S , % g 0
sta % o 2 , [ % g 4 ] A S I _ M _ M M U R E G S
hypersparc_flush_cache_page_out :
retl
nop
hypersparc_flush_sig_insns :
flush % o 1
retl
flush % o 1 + 4
/* HyperSparc is copy-back. */
hypersparc_flush_page_to_ram :
sethi % h i ( v a c _ l i n e _ s i z e ) , % g 1
ld [ % g 1 + % l o ( v a c _ l i n e _ s i z e ) ] , % o 4
andn % o 0 , ( P A G E _ S I Z E - 1 ) , % o 0
add % o 4 , % o 4 , % o 5
or % o 0 , 0 x40 0 , % g 7
lda [ % g 7 ] A S I _ M _ F L U S H _ P R O B E , % g 5
add % o 4 , % o 5 , % g 1
orcc % g 5 , 0 , % g 0
be 2 f
add % o 4 , % g 1 , % g 2
add % o 4 , % g 2 , % g 3
sub % o 0 , - P A G E _ S I Z E , % o 0
add % o 4 , % g 3 , % g 4
add % o 4 , % g 4 , % g 5
add % o 4 , % g 5 , % g 7
/* BLAMMO! */
1 :
sub % o 0 , % g 7 , % o 0
sta % g 0 , [ % o 0 + % g 0 ] A S I _ M _ F L U S H _ P A G E
sta % g 0 , [ % o 0 + % o 4 ] A S I _ M _ F L U S H _ P A G E
sta % g 0 , [ % o 0 + % o 5 ] A S I _ M _ F L U S H _ P A G E
sta % g 0 , [ % o 0 + % g 1 ] A S I _ M _ F L U S H _ P A G E
sta % g 0 , [ % o 0 + % g 2 ] A S I _ M _ F L U S H _ P A G E
sta % g 0 , [ % o 0 + % g 3 ] A S I _ M _ F L U S H _ P A G E
andcc % o 0 , 0 x f f c , % g 0
sta % g 0 , [ % o 0 + % g 4 ] A S I _ M _ F L U S H _ P A G E
bne 1 b
sta % g 0 , [ % o 0 + % g 5 ] A S I _ M _ F L U S H _ P A G E
2 :
mov S R M M U _ F A U L T _ S T A T U S , % g 1
retl
lda [ % g 1 ] A S I _ M _ M M U R E G S , % g 0
/* HyperSparc is IO cache coherent. */
hypersparc_flush_page_for_dma :
retl
nop
/ * It w a s n o t e d t h a t a t b o o t t i m e a T L B f l u s h a l l i n a d e l a y s l o t
* can d e l i v e r a n i l l e g a l i n s t r u c t i o n t o t h e p r o c e s s o r i f t h e t i m i n g
* is j u s t r i g h t . . .
* /
hypersparc_flush_tlb_all :
mov 0 x40 0 , % g 1
sta % g 0 , [ % g 1 ] A S I _ M _ F L U S H _ P R O B E
retl
nop
hypersparc_flush_tlb_mm :
mov S R M M U _ C T X _ R E G , % g 1
ld [ % o 0 + A O F F _ m m _ c o n t e x t ] , % o 1
lda [ % g 1 ] A S I _ M _ M M U R E G S , % g 5
# ifndef C O N F I G _ S M P
cmp % o 1 , - 1
be h y p e r s p a r c _ f l u s h _ t l b _ m m _ o u t
# endif
mov 0 x30 0 , % g 2
sta % o 1 , [ % g 1 ] A S I _ M _ M M U R E G S
sta % g 0 , [ % g 2 ] A S I _ M _ F L U S H _ P R O B E
hypersparc_flush_tlb_mm_out :
retl
sta % g 5 , [ % g 1 ] A S I _ M _ M M U R E G S
hypersparc_flush_tlb_range :
ld [ % o 0 + 0 x00 ] , % o 0 / * X X X v m a - > v m _ m m G R O S S X X X * /
mov S R M M U _ C T X _ R E G , % g 1
ld [ % o 0 + A O F F _ m m _ c o n t e x t ] , % o 3
lda [ % g 1 ] A S I _ M _ M M U R E G S , % g 5
# ifndef C O N F I G _ S M P
cmp % o 3 , - 1
be h y p e r s p a r c _ f l u s h _ t l b _ r a n g e _ o u t
# endif
sethi % h i ( ~ ( ( 1 < < S R M M U _ P G D I R _ S H I F T ) - 1 ) ) , % o 4
sta % o 3 , [ % g 1 ] A S I _ M _ M M U R E G S
and % o 1 , % o 4 , % o 1
add % o 1 , 0 x20 0 , % o 1
sta % g 0 , [ % o 1 ] A S I _ M _ F L U S H _ P R O B E
1 :
sub % o 1 , % o 4 , % o 1
cmp % o 1 , % o 2
blu,a 1 b
sta % g 0 , [ % o 1 ] A S I _ M _ F L U S H _ P R O B E
hypersparc_flush_tlb_range_out :
retl
sta % g 5 , [ % g 1 ] A S I _ M _ M M U R E G S
hypersparc_flush_tlb_page :
ld [ % o 0 + 0 x00 ] , % o 0 / * X X X v m a - > v m _ m m G R O S S X X X * /
mov S R M M U _ C T X _ R E G , % g 1
ld [ % o 0 + A O F F _ m m _ c o n t e x t ] , % o 3
andn % o 1 , ( P A G E _ S I Z E - 1 ) , % o 1
# ifndef C O N F I G _ S M P
cmp % o 3 , - 1
be h y p e r s p a r c _ f l u s h _ t l b _ p a g e _ o u t
# endif
lda [ % g 1 ] A S I _ M _ M M U R E G S , % g 5
sta % o 3 , [ % g 1 ] A S I _ M _ M M U R E G S
sta % g 0 , [ % o 1 ] A S I _ M _ F L U S H _ P R O B E
hypersparc_flush_tlb_page_out :
retl
sta % g 5 , [ % g 1 ] A S I _ M _ M M U R E G S
_ _ INIT
/* High speed page clear/copy. */
hypersparc_bzero_1page :
/* NOTE: This routine has to be shorter than 40insns --jj */
clr % g 1
mov 3 2 , % g 2
mov 6 4 , % g 3
mov 9 6 , % g 4
mov 1 2 8 , % g 5
mov 1 6 0 , % g 7
mov 1 9 2 , % o 2
mov 2 2 4 , % o 3
mov 1 6 , % o 1
1 :
stda % g 0 , [ % o 0 + % g 0 ] A S I _ M _ B F I L L
stda % g 0 , [ % o 0 + % g 2 ] A S I _ M _ B F I L L
stda % g 0 , [ % o 0 + % g 3 ] A S I _ M _ B F I L L
stda % g 0 , [ % o 0 + % g 4 ] A S I _ M _ B F I L L
stda % g 0 , [ % o 0 + % g 5 ] A S I _ M _ B F I L L
stda % g 0 , [ % o 0 + % g 7 ] A S I _ M _ B F I L L
stda % g 0 , [ % o 0 + % o 2 ] A S I _ M _ B F I L L
stda % g 0 , [ % o 0 + % o 3 ] A S I _ M _ B F I L L
subcc % o 1 , 1 , % o 1
bne 1 b
add % o 0 , 2 5 6 , % o 0
retl
nop
hypersparc_copy_1page :
/* NOTE: This routine has to be shorter than 70insns --jj */
sub % o 1 , % o 0 , % o 2 ! d i f f e r e n c e
mov 1 6 , % g 1
1 :
sta % o 0 , [ % o 0 + % o 2 ] A S I _ M _ B C O P Y
add % o 0 , 3 2 , % o 0
sta % o 0 , [ % o 0 + % o 2 ] A S I _ M _ B C O P Y
add % o 0 , 3 2 , % o 0
sta % o 0 , [ % o 0 + % o 2 ] A S I _ M _ B C O P Y
add % o 0 , 3 2 , % o 0
sta % o 0 , [ % o 0 + % o 2 ] A S I _ M _ B C O P Y
add % o 0 , 3 2 , % o 0
sta % o 0 , [ % o 0 + % o 2 ] A S I _ M _ B C O P Y
add % o 0 , 3 2 , % o 0
sta % o 0 , [ % o 0 + % o 2 ] A S I _ M _ B C O P Y
add % o 0 , 3 2 , % o 0
sta % o 0 , [ % o 0 + % o 2 ] A S I _ M _ B C O P Y
add % o 0 , 3 2 , % o 0
sta % o 0 , [ % o 0 + % o 2 ] A S I _ M _ B C O P Y
subcc % g 1 , 1 , % g 1
bne 1 b
add % o 0 , 3 2 , % o 0
retl
nop
.globl hypersparc_setup_blockops
hypersparc_setup_blockops :
sethi % h i ( b z e r o _ 1 p a g e ) , % o 0
or % o 0 , % l o ( b z e r o _ 1 p a g e ) , % o 0
sethi % h i ( h y p e r s p a r c _ b z e r o _ 1 p a g e ) , % o 1
or % o 1 , % l o ( h y p e r s p a r c _ b z e r o _ 1 p a g e ) , % o 1
sethi % h i ( h y p e r s p a r c _ c o p y _ 1 p a g e ) , % o 2
or % o 2 , % l o ( h y p e r s p a r c _ c o p y _ 1 p a g e ) , % o 2
ld [ % o 1 ] , % o 4
1 :
add % o 1 , 4 , % o 1
st % o 4 , [ % o 0 ]
add % o 0 , 4 , % o 0
cmp % o 1 , % o 2
bne 1 b
ld [ % o 1 ] , % o 4
sethi % h i ( _ _ c o p y _ 1 p a g e ) , % o 0
or % o 0 , % l o ( _ _ c o p y _ 1 p a g e ) , % o 0
sethi % h i ( h y p e r s p a r c _ s e t u p _ b l o c k o p s ) , % o 2
or % o 2 , % l o ( h y p e r s p a r c _ s e t u p _ b l o c k o p s ) , % o 2
ld [ % o 1 ] , % o 4
1 :
add % o 1 , 4 , % o 1
st % o 4 , [ % o 0 ]
add % o 0 , 4 , % o 0
cmp % o 1 , % o 2
bne 1 b
ld [ % o 1 ] , % o 4
sta % g 0 , [ % g 0 ] A S I _ M _ F L U S H _ I W H O L E
retl
nop