2 * Copyright (C) 2014 Imagination Technologies Ltd
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
9 * PM helper macros for CPU power off (e.g. Suspend-to-RAM).
17 #include <asm/asm-offsets.h>
19 #include <asm/mipsregs.h>
20 #include <asm/regdef.h>
22 /* Save CPU state to stack for suspend to RAM */
23 .macro SUSPEND_SAVE_REGS
25 /* Call preserved GPRs */
26 LONG_S $
16, PT_R16(sp
)
27 LONG_S $
17, PT_R17(sp
)
28 LONG_S $
18, PT_R18(sp
)
29 LONG_S $
19, PT_R19(sp
)
30 LONG_S $
20, PT_R20(sp
)
31 LONG_S $
21, PT_R21(sp
)
32 LONG_S $
22, PT_R22(sp
)
33 LONG_S $
23, PT_R23(sp
)
34 LONG_S $
28, PT_R28(sp
)
35 LONG_S $
30, PT_R30(sp
)
36 LONG_S $
31, PT_R31(sp
)
37 /* A couple of CP0 registers with space in pt_regs */
39 LONG_S k0
, PT_STATUS(sp
)
42 /* Restore CPU state from stack after resume from RAM */
43 .macro RESUME_RESTORE_REGS_RETURN
46 /* A couple of CP0 registers with space in pt_regs */
47 LONG_L k0
, PT_STATUS(sp
)
49 /* Call preserved GPRs */
50 LONG_L $
16, PT_R16(sp
)
51 LONG_L $
17, PT_R17(sp
)
52 LONG_L $
18, PT_R18(sp
)
53 LONG_L $
19, PT_R19(sp
)
54 LONG_L $
20, PT_R20(sp
)
55 LONG_L $
21, PT_R21(sp
)
56 LONG_L $
22, PT_R22(sp
)
57 LONG_L $
23, PT_R23(sp
)
58 LONG_L $
28, PT_R28(sp
)
59 LONG_L $
30, PT_R30(sp
)
60 LONG_L $
31, PT_R31(sp
)
67 /* Get address of static suspend state into t1 */
68 .macro LA_STATIC_SUSPEND
69 la t1
, mips_static_suspend_state
72 /* Save important CPU state for early restoration to global data */
73 .macro SUSPEND_SAVE_STATIC
76 * Segment configuration is saved in global data where it can be easily
77 * reloaded without depending on the segment configuration.
79 mfc0 k0
, CP0_PAGEMASK
, 2 /* SegCtl0 */
80 LONG_S k0
, SSS_SEGCTL0(t1
)
81 mfc0 k0
, CP0_PAGEMASK
, 3 /* SegCtl1 */
82 LONG_S k0
, SSS_SEGCTL1(t1
)
83 mfc0 k0
, CP0_PAGEMASK
, 4 /* SegCtl2 */
84 LONG_S k0
, SSS_SEGCTL2(t1
)
86 /* save stack pointer (pointing to GPRs) */
90 /* Restore important CPU state early from global data */
91 .macro RESUME_RESTORE_STATIC
94 * Segment configuration must be restored prior to any access to
95 * allocated memory, as it may reside outside of the legacy kernel
98 LONG_L k0
, SSS_SEGCTL0(t1
)
99 mtc0 k0
, CP0_PAGEMASK
, 2 /* SegCtl0 */
100 LONG_L k0
, SSS_SEGCTL1(t1
)
101 mtc0 k0
, CP0_PAGEMASK
, 3 /* SegCtl1 */
102 LONG_L k0
, SSS_SEGCTL2(t1
)
103 mtc0 k0
, CP0_PAGEMASK
, 4 /* SegCtl2 */
106 /* restore stack pointer (pointing to GPRs) */
107 LONG_L sp
, SSS_SP(t1
)
110 /* flush caches to make sure context has reached memory */
111 .macro SUSPEND_CACHE_FLUSH
112 .extern __wback_cache_all
115 la t1
, __wback_cache_all
122 /* Save suspend state and flush data caches to RAM */
130 /* Restore saved state after resume from RAM and return */
131 .macro RESUME_RESTORE_RETURN
133 RESUME_RESTORE_STATIC
134 RESUME_RESTORE_REGS_RETURN
137 #else /* __ASSEMBLY__ */
140 * struct mips_static_suspend_state - Core saved CPU state across S2R.
141 * @segctl: CP0 Segment control registers.
142 * @sp: Stack frame where GP register context is saved.
144 * This structure contains minimal CPU state that must be saved in static kernel
145 * data in order to be able to restore the rest of the state. This includes
146 * segmentation configuration in the case of EVA being enabled, as they must be
147 * restored prior to any kmalloc'd memory being referenced (even the stack
150 struct mips_static_suspend_state
{
152 unsigned long segctl
[3];
157 #endif /* !__ASSEMBLY__ */
159 #endif /* __ASM_PM_HELPERS_H */