1 /* SPDX-License-Identifier: GPL-2.0-only */
3 * PowerPC 64-bit swsusp implementation
5 * Copyright 2006 Johannes Berg <johannes@sipsolutions.net>
8 #include <linux/threads.h>
9 #include <asm/processor.h>
11 #include <asm/cputable.h>
12 #include <asm/thread_info.h>
13 #include <asm/ppc_asm.h>
14 #include <asm/asm-offsets.h>
15 #include <asm/feature-fixups.h>
18 * Structure for storing CPU registers on the save area.
20 #define SL_r1 0x00 /* stack pointer */
49 #define SL_SPRG1 0x100
51 #define SL_SIZE SL_TCR+8
53 /* these macros rely on the save area being
54 * pointed to by r11 */
56 #define SAVE_SPR(register) \
57 mfspr r0, SPRN_##register ;\
58 std r0, SL_##register(r11)
59 #define RESTORE_SPR(register) \
60 ld r0, SL_##register(r11) ;\
61 mtspr SPRN_##register, r0
62 #define SAVE_SPECIAL(special) \
64 std r0, SL_##special(r11)
65 #define RESTORE_SPECIAL(special) \
66 ld r0, SL_##special(r11) ;\
68 #define SAVE_REGISTER(reg) \
69 std reg, SL_##reg(r11)
70 #define RESTORE_REGISTER(reg) \
73 /* space for storing cpu state */
81 _GLOBAL(swsusp_arch_suspend)
82 LOAD_REG_ADDR(r11, swsusp_save_area)
110 #ifdef CONFIG_PPC_BOOK3S_64
113 END_FW_FTR_SECTION_IFCLR(FW_FEATURE_LPAR)
117 /* Save SPRG1, SPRG1 be used save paca */
121 /* we push the stack up 128 bytes but don't store the
122 * stack pointer on the stack like a real stackframe */
128 LOAD_REG_ADDR(r11, swsusp_save_area)
135 _GLOBAL(swsusp_arch_resume)
136 /* Stop pending alitvec streams and memory accesses */
139 END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
142 LOAD_REG_ADDR(r11, restore_pblist)
149 ld r13,pbe_address(r12)
150 ld r14,pbe_orig_address(r12)
165 #ifdef CONFIG_PPC_BOOK3S_64
170 ori r3, r3, CONFIG_KERNEL_START>>48
184 LOAD_REG_ADDR(r11, swsusp_save_area)
188 /* restore timebase */
191 /* get upper 32 bits of it */
193 /* clear tb lower to avoid wrap */
201 /* restore registers */
204 RESTORE_REGISTER(r12)
205 RESTORE_REGISTER(r13)
206 RESTORE_REGISTER(r14)
207 RESTORE_REGISTER(r15)
208 RESTORE_REGISTER(r16)
209 RESTORE_REGISTER(r17)
210 RESTORE_REGISTER(r18)
211 RESTORE_REGISTER(r19)
212 RESTORE_REGISTER(r20)
213 RESTORE_REGISTER(r21)
214 RESTORE_REGISTER(r22)
215 RESTORE_REGISTER(r23)
216 RESTORE_REGISTER(r24)
217 RESTORE_REGISTER(r25)
218 RESTORE_REGISTER(r26)
219 RESTORE_REGISTER(r27)
220 RESTORE_REGISTER(r28)
221 RESTORE_REGISTER(r29)
222 RESTORE_REGISTER(r30)
223 RESTORE_REGISTER(r31)
225 #ifdef CONFIG_PPC_BOOK3S_64
226 /* can't use RESTORE_SPECIAL(MSR) */
230 RESTORE_SPECIAL(SDR1)
231 END_FW_FTR_SECTION_IFCLR(FW_FEATURE_LPAR)
233 /* Restore SPRG1, be used to save paca */
239 /* Restore TCR and clear any pending bits in TSR. */
241 lis r0, (TSR_ENW | TSR_WIS | TSR_DIS | TSR_FIS)@h
244 /* Kick decrementer */
248 /* Invalidate all tlbs */
256 #ifdef CONFIG_PPC_BOOK3S_64
257 bl slb_flush_and_restore_bolted
262 LOAD_REG_ADDR(r11, swsusp_save_area)