2005-04-16 15:20:36 -07:00
/ *
* This f i l e c o n t a i n s t h e p o w e r _ s a v e f u n c t i o n f o r 6 x x & 7 x x x C P U s
* rewritten i n a s s e m b l e r
*
* Warning ! T h i s c o d e a s s u m e s t h a t i f y o u r m a c h i n e h a s a 7 5 0 f x
* it w i l l h a v e P L L 1 s e t t o l o w s p e e d m o d e ( u s e d d u r i n g N A P / D O Z E ) .
* if t h i s i s n o t t h e c a s e s o m e a d d i t i o n a l c h a n g e s w i l l h a v e t o
* be d o n e t o c h e c k a r u n t i m e v a r ( a b i t l i k e p o w e r s a v e - n a p )
*
* 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 < l i n u x / c o n f i g . h >
# include < l i n u x / t h r e a d s . h >
# include < a s m / p r o c e s s o r . h >
# include < a s m / p a g e . h >
# include < a s m / c p u t a b l e . h >
# include < a s m / t h r e a d _ i n f o . h >
# include < a s m / p p c _ a s m . h >
2005-09-09 20:57:26 +02:00
# include < a s m / a s m - o f f s e t s . h >
2005-04-16 15:20:36 -07:00
# undef D E B U G
.text
/ *
* Here i s t h e p o w e r _ s a v e _ 6 x x f u n c t i o n . T h i s c o u l d e v e n t u a l l y b e
* split i n t o s e v e r a l f u n c t i o n s & c h a n g i n g t h e f u n c t i o n p o i n t e r
* depending o n t h e v a r i o u s f e a t u r e s .
* /
_ GLOBAL( p o w e r4 _ i d l e )
BEGIN_ F T R _ S E C T I O N
blr
END_ F T R _ S E C T I O N _ I F C L R ( C P U _ F T R _ C A N _ N A P )
/ * We m u s t d y n a m i c a l l y c h e c k f o r t h e N A P f e a t u r e a s i t
* can b e c l e a r e d b y C P U i n i t a f t e r t h e f i x u p s a r e d o n e
* /
LOADBASE( r3 ,c u r _ c p u _ s p e c )
ld r4 ,c u r _ c p u _ s p e c @l(r3)
ld r4 ,C P U _ S P E C _ F E A T U R E S ( r4 )
andi. r0 ,r4 ,C P U _ F T R _ C A N _ N A P
beqlr
/* Now check if user or arch enabled NAP mode */
LOADBASE( r3 ,p o w e r s a v e _ n a p )
lwz r4 ,p o w e r s a v e _ n a p @l(r3)
cmpwi 0 ,r4 ,0
beqlr
/* Clear MSR:EE */
mfmsr r7
li r4 ,0
ori r4 ,r4 ,M S R _ E E
andc r0 ,r7 ,r4
mtmsrd r0
/* Check current_thread_info()->flags */
clrrdi r4 ,r1 ,T H R E A D _ S H I F T
ld r4 ,T I _ F L A G S ( r4 )
andi. r0 ,r4 ,_ T I F _ N E E D _ R E S C H E D
beq 1 f
mtmsrd r7 / * o u t o f l i n e t h i s ? * /
blr
1 :
/* Go to NAP now */
BEGIN_ F T R _ S E C T I O N
DSSALL
sync
END_ F T R _ S E C T I O N _ I F S E T ( C P U _ F T R _ A L T I V E C )
oris r7 ,r7 ,M S R _ P O W @h
sync
isync
mtmsrd r7
isync
sync
blr