2006-10-16 13:52:09 -07:00
/ *
* Copied f r o m < f i l e : a r c h / p o w e r p c / k e r n e l / m i s c _ 3 2 . S >
*
* This f i l e c o n t a i n s m i s c e l l a n e o u s l o w - l e v e l f u n c t i o n s .
* Copyright ( C ) 1 9 9 5 - 1 9 9 6 G a r y T h o m a s ( g d t @linuxppc.org)
*
* Largely r e w r i t t e n b y C o r t D o u g a n ( c o r t @cs.nmt.edu)
* and P a u l M a c k e r r a s .
*
* kexec b i t s :
* Copyright ( C ) 2 0 0 2 - 2 0 0 3 E r i c B i e d e r m a n < e b i e d e r m @xmission.com>
* GameCube/ p p c32 p o r t C o p y r i g h t ( C ) 2 0 0 4 A l b e r t H e r r a n z
*
* 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 i t 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
* as p u b l i s h e d 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 ; either version
* 2 of t h e L i c e n s e , o r ( a t y o u r o p t i o n ) a n y l a t e r v e r s i o n .
*
* /
# include " p p c _ a s m . h "
# define S P R N _ P V R 0 x11 F / * P r o c e s s o r V e r s i o n R e g i s t e r * /
.text
/ * udelay ( o n n o n - 6 0 1 p r o c e s s o r s ) n e e d s t o k n o w t h e p e r i o d o f t h e
* timebase i n n a n o s e c o n d s . T h i s u s e d t o b e h a r d c o d e d t o b e 6 0 n s
* ( period o f 6 6 M H z / 4 ) . N o w a v a r i a b l e i s u s e d t h a t i s i n i t i a l i z e d t o
* 6 0 for b a c k w a r d c o m p a t i b i l i t y , b u t i t c a n b e o v e r r i d d e n a s n e c e s s a r y
* with c o d e s o m e t h i n g l i k e t h i s :
* extern u n s i g n e d l o n g t i m e b a s e _ p e r i o d _ n s ;
* timebase_ p e r i o d _ n s = 1 0 0 0 0 0 0 0 0 0 / b d - > b i _ t b f r e q ;
* /
.data
.globl timebase_period_ns
timebase_period_ns :
.long 60
.text
/ *
* Delay f o r a n u m b e r o f m i c r o s e c o n d s
* /
.globl udelay
udelay :
mfspr r4 ,S P R N _ P V R
srwi r4 ,r4 ,1 6
cmpwi 0 ,r4 ,1 / * 6 0 1 ? * /
2014-02-04 16:04:35 +11:00
bne . L u d e l a y _ n o t _ 6 0 1
2006-10-16 13:52:09 -07:00
00 : li r0 ,8 6 / * I n s t r u c t i o n s / m i c r o s e c o n d ? * /
mtctr r0
10 : addi r0 ,r0 ,0 / * N O P * /
bdnz 1 0 b
subic. r3 ,r3 ,1
bne 0 0 b
blr
2014-02-04 16:04:35 +11:00
.Ludelay_not_601 :
2006-10-16 13:52:09 -07:00
mulli r4 ,r3 ,1 0 0 0 / * n a n o s e c o n d s * /
/ * Change r4 t o b e t h e n u m b e r o f t i c k s u s i n g :
* ( nanoseconds + ( t i m e b a s e _ p e r i o d _ n s - 1 ) ) / t i m e b a s e _ p e r i o d _ n s
* timebase_ p e r i o d _ n s d e f a u l t s t o 6 0 ( 1 6 . 6 M H z ) * /
mflr r5
bl 0 f
0 : mflr r6
mtlr r5
lis r5 ,0 b @ha
addi r5 ,r5 ,0 b @l
subf r5 ,r5 ,r6 / * I n c a s e w e ' r e r e l o c a t e d * /
addis r5 ,r5 ,t i m e b a s e _ p e r i o d _ n s @ha
lwz r5 ,t i m e b a s e _ p e r i o d _ n s @l(r5)
add r4 ,r4 ,r5
addi r4 ,r4 ,- 1
divw r4 ,r4 ,r5 / * B U S t i c k s * /
2013-11-22 17:57:31 +01:00
# ifdef C O N F I G _ 8 x x
1 : mftbu r5
mftb r6
mftbu r7
# else
2013-08-20 19:33:12 -05:00
1 : mfspr r5 , S P R N _ T B R U
mfspr r6 , S P R N _ T B R L
mfspr r7 , S P R N _ T B R U
2013-11-22 17:57:31 +01:00
# endif
2006-10-16 13:52:09 -07:00
cmpw 0 ,r5 ,r7
bne 1 b / * G e t [ s y n c e d ] b a s e t i m e * /
addc r9 ,r6 ,r4 / * C o m p u t e e n d t i m e * /
addze r8 ,r5
2013-11-22 17:57:31 +01:00
# ifdef C O N F I G _ 8 x x
2 : mftbu r5
# else
2013-08-20 19:33:12 -05:00
2 : mfspr r5 , S P R N _ T B R U
2013-11-22 17:57:31 +01:00
# endif
2006-10-16 13:52:09 -07:00
cmpw 0 ,r5 ,r8
blt 2 b
bgt 3 f
2013-11-22 17:57:31 +01:00
# ifdef C O N F I G _ 8 x x
mftb r6
# else
2013-08-20 19:33:12 -05:00
mfspr r6 , S P R N _ T B R L
2013-11-22 17:57:31 +01:00
# endif
2006-10-16 13:52:09 -07:00
cmpw 0 ,r6 ,r9
blt 2 b
3 : blr