2018-10-24 18:14:32 +08:00
/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (C) 2017 Andes Technology Corporation */
# include < a s m / m e m o r y . h >
.data
.global sp_tmp
sp_tmp :
.long
.text
.globl suspend2ram
.globl cpu_resume
suspend2ram :
pushm $ r0 , $ r31
# if d e f i n e d ( C O N F I G _ H W Z O L )
mfusr $ r0 , $ l c
mfusr $ r1 , $ l e
mfusr $ r2 , $ l b
# endif
mfsr $ r3 , $ m r0
mfsr $ r4 , $ m r1
mfsr $ r5 , $ m r4
mfsr $ r6 , $ m r6
mfsr $ r7 , $ m r7
mfsr $ r8 , $ m r8
mfsr $ r9 , $ i r0
mfsr $ r10 , $ i r1
mfsr $ r11 , $ i r2
mfsr $ r12 , $ i r3
mfsr $ r13 , $ i r9
mfsr $ r14 , $ i r10
mfsr $ r15 , $ i r12
mfsr $ r16 , $ i r13
mfsr $ r17 , $ i r14
mfsr $ r18 , $ i r15
pushm $ r0 , $ r19
2018-11-22 11:14:34 +08:00
# if d e f i n e d ( C O N F I G _ F P U )
jal s t o r e _ f p u _ f o r _ s u s p e n d
# endif
2018-10-24 18:14:32 +08:00
tlbop F l u s h A l l
isb
/ / transfer $ s p f r o m v a t o p a
sethi $ r0 , h i 2 0 ( P A G E _ O F F S E T )
ori $ r0 , $ r0 , l o 1 2 ( P A G E _ O F F S E T )
movi $ r2 , P H Y S _ O F F S E T
sub $ r1 , $ s p , $ r0
add $ r2 , $ r1 , $ r2
/ / store p a ( $ s p ) t o s p _ t m p
sethi $ r1 , h i 2 0 ( s p _ t m p )
swi $ r2 , [ $ r1 + l o 1 2 ( s p _ t m p ) ]
pushm $ r16 , $ r25
pushm $ r29 , $ r30
# ifdef C O N F I G _ C A C H E _ L 2
jal d c a c h e _ w b _ a l l _ l e v e l
# else
jal c p u _ d c a c h e _ w b _ a l l
# endif
popm $ r29 , $ r30
popm $ r16 , $ r25
/ / get w a k e _ m a s k a n d l o o p i n s t a n d b y
la $ r1 , w a k e _ m a s k
lwi $ r1 , [ $ r1 ]
self_loop :
standby w a k e _ g r a n t
mfsr $ r2 , $ i r15
and $ r2 , $ r1 , $ r2
beqz $ r2 , s e l f _ l o o p
/ / set i p c t o r e s u m e a d d r e s s
la $ r1 , r e s u m e _ a d d r
lwi $ r1 , [ $ r1 ]
mtsr $ r1 , $ i p c
isb
/ / reset p s w , t u r n o f f t h e a d d r e s s t r a n s l a t i o n
li $ r2 , 0 x70 0 0 a
mtsr $ r2 , $ i p s w
isb
iret
cpu_resume :
/ / translate t h e a d d r e s s o f s p _ t m p v a r i a b l e t o p a
la $ r1 , s p _ t m p
sethi $ r0 , h i 2 0 ( P A G E _ O F F S E T )
ori $ r0 , $ r0 , l o 1 2 ( P A G E _ O F F S E T )
movi $ r2 , P H Y S _ O F F S E T
sub $ r1 , $ r1 , $ r0
add $ r1 , $ r1 , $ r2
/ / access t h e s p _ t m p t o g e t s t a c k p o i n t e r
lwi $ s p , [ $ r1 ]
popm $ r0 , $ r19
# if d e f i n e d ( C O N F I G _ H W Z O L )
mtusr $ r0 , $ l b
mtusr $ r1 , $ l c
mtusr $ r2 , $ l e
# endif
mtsr $ r3 , $ m r0
mtsr $ r4 , $ m r1
mtsr $ r5 , $ m r4
mtsr $ r6 , $ m r6
mtsr $ r7 , $ m r7
mtsr $ r8 , $ m r8
/ / set o r i g i n a l p s w t o i p s w
mtsr $ r9 , $ i r1
mtsr $ r11 , $ i r2
mtsr $ r12 , $ i r3
/ / set i p c t o R R
la $ r13 , R R
mtsr $ r13 , $ i r9
mtsr $ r14 , $ i r10
mtsr $ r15 , $ i r12
mtsr $ r16 , $ i r13
mtsr $ r17 , $ i r14
mtsr $ r18 , $ i r15
popm $ r0 , $ r31
isb
iret
RR :
ret