blob: 2dfbd5d5b932ba04718a3259df1b6981f6a6dae8 [file] [log] [blame]
Benjamin Herrenschmidt948cf672011-01-24 18:42:41 +11001/*
Nicholas Piggin10d91612019-04-13 00:30:52 +10002 * Copyright 2018, IBM Corporation.
Benjamin Herrenschmidt948cf672011-01-24 18:42:41 +11003 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version
7 * 2 of the License, or (at your option) any later version.
Nicholas Piggin10d91612019-04-13 00:30:52 +10008 *
9 * This file contains general idle entry/exit functions to save
10 * and restore stack and NVGPRs which allows C code to call idle
11 * states that lose GPRs, and it will return transparently with
12 * SRR1 wakeup reason return value.
13 *
14 * The platform / CPU caller must ensure SPRs and any other non-GPR
15 * state is saved and restored correctly, handle KVM, interrupts, etc.
Benjamin Herrenschmidt948cf672011-01-24 18:42:41 +110016 */
17
Benjamin Herrenschmidt948cf672011-01-24 18:42:41 +110018#include <asm/ppc_asm.h>
19#include <asm/asm-offsets.h>
20#include <asm/ppc-opcode.h>
Shreyas B. Prabhu7cba1602014-12-10 00:26:52 +053021#include <asm/cpuidle.h>
Benjamin Herrenschmidt948cf672011-01-24 18:42:41 +110022
Shreyas B. Prabhu77b54e92014-12-10 00:26:53 +053023/*
Nicholas Piggin10d91612019-04-13 00:30:52 +100024 * Desired PSSCR in r3
Gautham R. Shenoye1c1cfe2017-07-21 16:11:37 +053025 *
Nicholas Piggin10d91612019-04-13 00:30:52 +100026 * No state will be lost regardless of wakeup mechanism (interrupt or NIA).
Michael Ellerman8d6f7c52014-05-23 18:15:26 +100027 *
Nicholas Piggin10d91612019-04-13 00:30:52 +100028 * An EC=0 type wakeup will return with a value of 0. SRESET wakeup (which can
29 * happen with xscom SRESET and possibly MCE) may clobber volatiles except LR,
30 * and must blr, to return to caller with r3 set according to caller's expected
31 * return code (for Book3S/64 that is SRR1).
Vaidyanathan Srinivasanaca79d22014-02-26 05:38:25 +053032 */
Nicholas Piggin10d91612019-04-13 00:30:52 +100033_GLOBAL(isa300_idle_stop_noloss)
34 mtspr SPRN_PSSCR,r3
35 PPC_STOP
36 li r3,0
37 blr
Nicholas Piggin9d292502017-06-13 23:05:51 +100038
Nicholas Piggin10d91612019-04-13 00:30:52 +100039/*
40 * Desired PSSCR in r3
41 *
42 * GPRs may be lost, so they are saved here. Wakeup is by interrupt only.
43 * The SRESET wakeup returns to this function's caller by calling
44 * idle_return_gpr_loss with r3 set to desired return value.
45 *
46 * A wakeup without GPR loss may alteratively be handled as in
47 * isa300_idle_stop_noloss and blr directly, as an optimisation.
48 *
49 * The caller is responsible for saving/restoring SPRs, MSR, timebase,
50 * etc.
51 */
52_GLOBAL(isa300_idle_stop_mayloss)
53 mtspr SPRN_PSSCR,r3
Benjamin Herrenschmidt948cf672011-01-24 18:42:41 +110054 std r1,PACAR1(r13)
Nicholas Piggin10d91612019-04-13 00:30:52 +100055 mflr r4
56 mfcr r5
57 /* use stack red zone rather than a new frame for saving regs */
58 std r2,-8*0(r1)
59 std r14,-8*1(r1)
60 std r15,-8*2(r1)
61 std r16,-8*3(r1)
62 std r17,-8*4(r1)
63 std r18,-8*5(r1)
64 std r19,-8*6(r1)
65 std r20,-8*7(r1)
66 std r21,-8*8(r1)
67 std r22,-8*9(r1)
68 std r23,-8*10(r1)
69 std r24,-8*11(r1)
70 std r25,-8*12(r1)
71 std r26,-8*13(r1)
72 std r27,-8*14(r1)
73 std r28,-8*15(r1)
74 std r29,-8*16(r1)
75 std r30,-8*17(r1)
76 std r31,-8*18(r1)
77 std r4,-8*19(r1)
78 std r5,-8*20(r1)
79 /* 168 bytes */
80 PPC_STOP
81 b . /* catch bugs */
Benjamin Herrenschmidt948cf672011-01-24 18:42:41 +110082
Nicholas Piggin10d91612019-04-13 00:30:52 +100083/*
84 * Desired return value in r3
85 *
86 * The idle wakeup SRESET interrupt can call this after calling
87 * to return to the idle sleep function caller with r3 as the return code.
88 *
89 * This must not be used if idle was entered via a _noloss function (use
90 * a simple blr instead).
91 */
92_GLOBAL(idle_return_gpr_loss)
93 ld r1,PACAR1(r13)
94 ld r4,-8*19(r1)
95 ld r5,-8*20(r1)
96 mtlr r4
97 mtcr r5
Paul Mackerras8117ac62014-12-10 00:26:50 +053098 /*
Nicholas Piggin10d91612019-04-13 00:30:52 +100099 * KVM nap requires r2 to be saved, rather than just restoring it
100 * from PACATOC. This could be avoided for that less common case
101 * if KVM saved its r2.
Nicholas Piggin72b0d512017-08-25 14:30:35 +1000102 */
Nicholas Piggin10d91612019-04-13 00:30:52 +1000103 ld r2,-8*0(r1)
104 ld r14,-8*1(r1)
105 ld r15,-8*2(r1)
106 ld r16,-8*3(r1)
107 ld r17,-8*4(r1)
108 ld r18,-8*5(r1)
109 ld r19,-8*6(r1)
110 ld r20,-8*7(r1)
111 ld r21,-8*8(r1)
112 ld r22,-8*9(r1)
113 ld r23,-8*10(r1)
114 ld r24,-8*11(r1)
115 ld r25,-8*12(r1)
116 ld r26,-8*13(r1)
117 ld r27,-8*14(r1)
118 ld r28,-8*15(r1)
119 ld r29,-8*16(r1)
120 ld r30,-8*17(r1)
121 ld r31,-8*18(r1)
122 blr
Paul Mackerras8117ac62014-12-10 00:26:50 +0530123
Nicholas Pigginaafc8a82017-08-29 21:36:35 +1000124/*
125 * This is the sequence required to execute idle instructions, as
126 * specified in ISA v2.07 (and earlier). MSR[IR] and MSR[DR] must be 0.
Nicholas Piggin10d91612019-04-13 00:30:52 +1000127 *
128 * The 0(r1) slot is used to save r2 in isa206, so use that here.
Nicholas Pigginaafc8a82017-08-29 21:36:35 +1000129 */
Nicholas Piggin65dbbe82017-08-29 21:40:35 +1000130#define IDLE_STATE_ENTER_SEQ_NORET(IDLE_INST) \
Nicholas Pigginaafc8a82017-08-29 21:36:35 +1000131 /* Magic NAP/SLEEP/WINKLE mode enter sequence */ \
Nicholas Piggin10d91612019-04-13 00:30:52 +1000132 std r2,0(r1); \
Nicholas Pigginaafc8a82017-08-29 21:36:35 +1000133 ptesync; \
Nicholas Piggin10d91612019-04-13 00:30:52 +1000134 ld r2,0(r1); \
135236: cmpd cr0,r2,r2; \
Nicholas Pigginaafc8a82017-08-29 21:36:35 +1000136 bne 236b; \
Nicholas Piggin10d91612019-04-13 00:30:52 +1000137 IDLE_INST; \
138 b . /* catch bugs */
Shreyas B. Prabhu7cba1602014-12-10 00:26:52 +0530139
140/*
Nicholas Piggin10d91612019-04-13 00:30:52 +1000141 * Desired instruction type in r3
Michael Ellermand0b791c2018-04-04 09:01:08 +1000142 *
Nicholas Piggin10d91612019-04-13 00:30:52 +1000143 * GPRs may be lost, so they are saved here. Wakeup is by interrupt only.
144 * The SRESET wakeup returns to this function's caller by calling
145 * idle_return_gpr_loss with r3 set to desired return value.
146 *
147 * A wakeup without GPR loss may alteratively be handled as in
148 * isa300_idle_stop_noloss and blr directly, as an optimisation.
149 *
150 * The caller is responsible for saving/restoring SPRs, MSR, timebase,
151 * etc.
152 *
153 * This must be called in real-mode (MSR_IDLE).
Shreyas B. Prabhubcef83a2016-07-08 11:50:49 +0530154 */
Nicholas Piggin10d91612019-04-13 00:30:52 +1000155_GLOBAL(isa206_idle_insn_mayloss)
156 std r1,PACAR1(r13)
157 mflr r4
158 mfcr r5
159 /* use stack red zone rather than a new frame for saving regs */
160 std r2,-8*0(r1)
161 std r14,-8*1(r1)
162 std r15,-8*2(r1)
163 std r16,-8*3(r1)
164 std r17,-8*4(r1)
165 std r18,-8*5(r1)
166 std r19,-8*6(r1)
167 std r20,-8*7(r1)
168 std r21,-8*8(r1)
169 std r22,-8*9(r1)
170 std r23,-8*10(r1)
171 std r24,-8*11(r1)
172 std r25,-8*12(r1)
173 std r26,-8*13(r1)
174 std r27,-8*14(r1)
175 std r28,-8*15(r1)
176 std r29,-8*16(r1)
177 std r30,-8*17(r1)
178 std r31,-8*18(r1)
179 std r4,-8*19(r1)
180 std r5,-8*20(r1)
181 cmpwi r3,PNV_THREAD_NAP
Michael Ellermana67cc592018-04-05 16:03:39 +1000182 bne 1f
Nicholas Piggin10d91612019-04-13 00:30:52 +1000183 IDLE_STATE_ENTER_SEQ_NORET(PPC_NAP)
1841: cmpwi r3,PNV_THREAD_SLEEP
Nicholas Piggin0d7720a2017-04-19 23:05:50 +1000185 bne 2f
Nicholas Piggin10d91612019-04-13 00:30:52 +1000186 IDLE_STATE_ENTER_SEQ_NORET(PPC_SLEEP)
1872: IDLE_STATE_ENTER_SEQ_NORET(PPC_WINKLE)
Nicholas Piggin0d7720a2017-04-19 23:05:50 +1000188