Merge tag 'f2fs-for-5.4-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk...
[linux-2.6-block.git] / arch / nds32 / kernel / sleep.S
CommitLineData
7938e631
NH
1/* SPDX-License-Identifier: GPL-2.0 */
2/* Copyright (C) 2017 Andes Technology Corporation */
3
4#include <asm/memory.h>
5
6.data
7.global sp_tmp
8sp_tmp:
9.long
10
11.text
12.globl suspend2ram
13.globl cpu_resume
14
15suspend2ram:
16 pushm $r0, $r31
17#if defined(CONFIG_HWZOL)
18 mfusr $r0, $lc
19 mfusr $r1, $le
20 mfusr $r2, $lb
21#endif
22 mfsr $r3, $mr0
23 mfsr $r4, $mr1
24 mfsr $r5, $mr4
25 mfsr $r6, $mr6
26 mfsr $r7, $mr7
27 mfsr $r8, $mr8
28 mfsr $r9, $ir0
29 mfsr $r10, $ir1
30 mfsr $r11, $ir2
31 mfsr $r12, $ir3
32 mfsr $r13, $ir9
33 mfsr $r14, $ir10
34 mfsr $r15, $ir12
35 mfsr $r16, $ir13
36 mfsr $r17, $ir14
37 mfsr $r18, $ir15
38 pushm $r0, $r19
e46bf83c
VC
39#if defined(CONFIG_FPU)
40 jal store_fpu_for_suspend
41#endif
7938e631
NH
42 tlbop FlushAll
43 isb
44
45 // transfer $sp from va to pa
46 sethi $r0, hi20(PAGE_OFFSET)
47 ori $r0, $r0, lo12(PAGE_OFFSET)
48 movi $r2, PHYS_OFFSET
49 sub $r1, $sp, $r0
50 add $r2, $r1, $r2
51
52 // store pa($sp) to sp_tmp
53 sethi $r1, hi20(sp_tmp)
54 swi $r2, [$r1 + lo12(sp_tmp)]
55
56 pushm $r16, $r25
57 pushm $r29, $r30
58#ifdef CONFIG_CACHE_L2
59 jal dcache_wb_all_level
60#else
61 jal cpu_dcache_wb_all
62#endif
63 popm $r29, $r30
64 popm $r16, $r25
65
66 // get wake_mask and loop in standby
67 la $r1, wake_mask
68 lwi $r1, [$r1]
69self_loop:
70 standby wake_grant
71 mfsr $r2, $ir15
72 and $r2, $r1, $r2
73 beqz $r2, self_loop
74
75 // set ipc to resume address
76 la $r1, resume_addr
77 lwi $r1, [$r1]
78 mtsr $r1, $ipc
79 isb
80
81 // reset psw, turn off the address translation
82 li $r2, 0x7000a
83 mtsr $r2, $ipsw
84 isb
85
86 iret
87cpu_resume:
88 // translate the address of sp_tmp variable to pa
89 la $r1, sp_tmp
90 sethi $r0, hi20(PAGE_OFFSET)
91 ori $r0, $r0, lo12(PAGE_OFFSET)
92 movi $r2, PHYS_OFFSET
93 sub $r1, $r1, $r0
94 add $r1, $r1, $r2
95
96 // access the sp_tmp to get stack pointer
97 lwi $sp, [$r1]
98
99 popm $r0, $r19
100#if defined(CONFIG_HWZOL)
101 mtusr $r0, $lb
102 mtusr $r1, $lc
103 mtusr $r2, $le
104#endif
105 mtsr $r3, $mr0
106 mtsr $r4, $mr1
107 mtsr $r5, $mr4
108 mtsr $r6, $mr6
109 mtsr $r7, $mr7
110 mtsr $r8, $mr8
111 // set original psw to ipsw
112 mtsr $r9, $ir1
113
114 mtsr $r11, $ir2
115 mtsr $r12, $ir3
116
117 // set ipc to RR
118 la $r13, RR
119 mtsr $r13, $ir9
120
121 mtsr $r14, $ir10
122 mtsr $r15, $ir12
123 mtsr $r16, $ir13
124 mtsr $r17, $ir14
125 mtsr $r18, $ir15
126 popm $r0, $r31
127
128 isb
129 iret
130RR:
131 ret