.. | .. |
---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0-or-later */ |
---|
1 | 2 | /* |
---|
2 | 3 | * This file contains sleep low-level functions for PowerBook G3. |
---|
3 | 4 | * Copyright (C) 1999 Benjamin Herrenschmidt (benh@kernel.crashing.org) |
---|
4 | 5 | * and Paul Mackerras (paulus@samba.org). |
---|
5 | | - * |
---|
6 | | - * This program is free software; you can redistribute it and/or |
---|
7 | | - * modify it under the terms of the GNU General Public License |
---|
8 | | - * as published by the Free Software Foundation; either version |
---|
9 | | - * 2 of the License, or (at your option) any later version. |
---|
10 | | - * |
---|
11 | 6 | */ |
---|
12 | 7 | |
---|
13 | 8 | #include <asm/processor.h> |
---|
.. | .. |
---|
49 | 44 | #define SL_TB 0xa0 |
---|
50 | 45 | #define SL_R2 0xa8 |
---|
51 | 46 | #define SL_CR 0xac |
---|
52 | | -#define SL_R12 0xb0 /* r12 to r31 */ |
---|
| 47 | +#define SL_LR 0xb0 |
---|
| 48 | +#define SL_R12 0xb4 /* r12 to r31 */ |
---|
53 | 49 | #define SL_SIZE (SL_R12 + 80) |
---|
54 | 50 | |
---|
55 | 51 | .section .text |
---|
.. | .. |
---|
64 | 60 | * vector that will be called by the ROM on wakeup |
---|
65 | 61 | */ |
---|
66 | 62 | _GLOBAL(low_sleep_handler) |
---|
67 | | -#ifndef CONFIG_6xx |
---|
| 63 | +#ifndef CONFIG_PPC_BOOK3S_32 |
---|
68 | 64 | blr |
---|
69 | 65 | #else |
---|
70 | 66 | mflr r0 |
---|
71 | | - stw r0,4(r1) |
---|
72 | | - stwu r1,-SL_SIZE(r1) |
---|
| 67 | + lis r11,sleep_storage@ha |
---|
| 68 | + addi r11,r11,sleep_storage@l |
---|
| 69 | + stw r0,SL_LR(r11) |
---|
73 | 70 | mfcr r0 |
---|
74 | | - stw r0,SL_CR(r1) |
---|
75 | | - stw r2,SL_R2(r1) |
---|
76 | | - stmw r12,SL_R12(r1) |
---|
| 71 | + stw r0,SL_CR(r11) |
---|
| 72 | + stw r1,SL_SP(r11) |
---|
| 73 | + stw r2,SL_R2(r11) |
---|
| 74 | + stmw r12,SL_R12(r11) |
---|
77 | 75 | |
---|
78 | 76 | /* Save MSR & SDR1 */ |
---|
79 | 77 | mfmsr r4 |
---|
80 | | - stw r4,SL_MSR(r1) |
---|
| 78 | + stw r4,SL_MSR(r11) |
---|
81 | 79 | mfsdr1 r4 |
---|
82 | | - stw r4,SL_SDR1(r1) |
---|
| 80 | + stw r4,SL_SDR1(r11) |
---|
83 | 81 | |
---|
84 | 82 | /* Get a stable timebase and save it */ |
---|
85 | 83 | 1: mftbu r4 |
---|
86 | | - stw r4,SL_TB(r1) |
---|
| 84 | + stw r4,SL_TB(r11) |
---|
87 | 85 | mftb r5 |
---|
88 | | - stw r5,SL_TB+4(r1) |
---|
| 86 | + stw r5,SL_TB+4(r11) |
---|
89 | 87 | mftbu r3 |
---|
90 | 88 | cmpw r3,r4 |
---|
91 | 89 | bne 1b |
---|
92 | 90 | |
---|
93 | 91 | /* Save SPRGs */ |
---|
94 | 92 | mfsprg r4,0 |
---|
95 | | - stw r4,SL_SPRG0(r1) |
---|
| 93 | + stw r4,SL_SPRG0(r11) |
---|
96 | 94 | mfsprg r4,1 |
---|
97 | | - stw r4,SL_SPRG0+4(r1) |
---|
| 95 | + stw r4,SL_SPRG0+4(r11) |
---|
98 | 96 | mfsprg r4,2 |
---|
99 | | - stw r4,SL_SPRG0+8(r1) |
---|
| 97 | + stw r4,SL_SPRG0+8(r11) |
---|
100 | 98 | mfsprg r4,3 |
---|
101 | | - stw r4,SL_SPRG0+12(r1) |
---|
| 99 | + stw r4,SL_SPRG0+12(r11) |
---|
102 | 100 | |
---|
103 | 101 | /* Save BATs */ |
---|
104 | 102 | mfdbatu r4,0 |
---|
105 | | - stw r4,SL_DBAT0(r1) |
---|
| 103 | + stw r4,SL_DBAT0(r11) |
---|
106 | 104 | mfdbatl r4,0 |
---|
107 | | - stw r4,SL_DBAT0+4(r1) |
---|
| 105 | + stw r4,SL_DBAT0+4(r11) |
---|
108 | 106 | mfdbatu r4,1 |
---|
109 | | - stw r4,SL_DBAT1(r1) |
---|
| 107 | + stw r4,SL_DBAT1(r11) |
---|
110 | 108 | mfdbatl r4,1 |
---|
111 | | - stw r4,SL_DBAT1+4(r1) |
---|
| 109 | + stw r4,SL_DBAT1+4(r11) |
---|
112 | 110 | mfdbatu r4,2 |
---|
113 | | - stw r4,SL_DBAT2(r1) |
---|
| 111 | + stw r4,SL_DBAT2(r11) |
---|
114 | 112 | mfdbatl r4,2 |
---|
115 | | - stw r4,SL_DBAT2+4(r1) |
---|
| 113 | + stw r4,SL_DBAT2+4(r11) |
---|
116 | 114 | mfdbatu r4,3 |
---|
117 | | - stw r4,SL_DBAT3(r1) |
---|
| 115 | + stw r4,SL_DBAT3(r11) |
---|
118 | 116 | mfdbatl r4,3 |
---|
119 | | - stw r4,SL_DBAT3+4(r1) |
---|
| 117 | + stw r4,SL_DBAT3+4(r11) |
---|
120 | 118 | mfibatu r4,0 |
---|
121 | | - stw r4,SL_IBAT0(r1) |
---|
| 119 | + stw r4,SL_IBAT0(r11) |
---|
122 | 120 | mfibatl r4,0 |
---|
123 | | - stw r4,SL_IBAT0+4(r1) |
---|
| 121 | + stw r4,SL_IBAT0+4(r11) |
---|
124 | 122 | mfibatu r4,1 |
---|
125 | | - stw r4,SL_IBAT1(r1) |
---|
| 123 | + stw r4,SL_IBAT1(r11) |
---|
126 | 124 | mfibatl r4,1 |
---|
127 | | - stw r4,SL_IBAT1+4(r1) |
---|
| 125 | + stw r4,SL_IBAT1+4(r11) |
---|
128 | 126 | mfibatu r4,2 |
---|
129 | | - stw r4,SL_IBAT2(r1) |
---|
| 127 | + stw r4,SL_IBAT2(r11) |
---|
130 | 128 | mfibatl r4,2 |
---|
131 | | - stw r4,SL_IBAT2+4(r1) |
---|
| 129 | + stw r4,SL_IBAT2+4(r11) |
---|
132 | 130 | mfibatu r4,3 |
---|
133 | | - stw r4,SL_IBAT3(r1) |
---|
| 131 | + stw r4,SL_IBAT3(r11) |
---|
134 | 132 | mfibatl r4,3 |
---|
135 | | - stw r4,SL_IBAT3+4(r1) |
---|
| 133 | + stw r4,SL_IBAT3+4(r11) |
---|
136 | 134 | |
---|
137 | 135 | BEGIN_MMU_FTR_SECTION |
---|
138 | 136 | mfspr r4,SPRN_DBAT4U |
---|
139 | | - stw r4,SL_DBAT4(r1) |
---|
| 137 | + stw r4,SL_DBAT4(r11) |
---|
140 | 138 | mfspr r4,SPRN_DBAT4L |
---|
141 | | - stw r4,SL_DBAT4+4(r1) |
---|
| 139 | + stw r4,SL_DBAT4+4(r11) |
---|
142 | 140 | mfspr r4,SPRN_DBAT5U |
---|
143 | | - stw r4,SL_DBAT5(r1) |
---|
| 141 | + stw r4,SL_DBAT5(r11) |
---|
144 | 142 | mfspr r4,SPRN_DBAT5L |
---|
145 | | - stw r4,SL_DBAT5+4(r1) |
---|
| 143 | + stw r4,SL_DBAT5+4(r11) |
---|
146 | 144 | mfspr r4,SPRN_DBAT6U |
---|
147 | | - stw r4,SL_DBAT6(r1) |
---|
| 145 | + stw r4,SL_DBAT6(r11) |
---|
148 | 146 | mfspr r4,SPRN_DBAT6L |
---|
149 | | - stw r4,SL_DBAT6+4(r1) |
---|
| 147 | + stw r4,SL_DBAT6+4(r11) |
---|
150 | 148 | mfspr r4,SPRN_DBAT7U |
---|
151 | | - stw r4,SL_DBAT7(r1) |
---|
| 149 | + stw r4,SL_DBAT7(r11) |
---|
152 | 150 | mfspr r4,SPRN_DBAT7L |
---|
153 | | - stw r4,SL_DBAT7+4(r1) |
---|
| 151 | + stw r4,SL_DBAT7+4(r11) |
---|
154 | 152 | mfspr r4,SPRN_IBAT4U |
---|
155 | | - stw r4,SL_IBAT4(r1) |
---|
| 153 | + stw r4,SL_IBAT4(r11) |
---|
156 | 154 | mfspr r4,SPRN_IBAT4L |
---|
157 | | - stw r4,SL_IBAT4+4(r1) |
---|
| 155 | + stw r4,SL_IBAT4+4(r11) |
---|
158 | 156 | mfspr r4,SPRN_IBAT5U |
---|
159 | | - stw r4,SL_IBAT5(r1) |
---|
| 157 | + stw r4,SL_IBAT5(r11) |
---|
160 | 158 | mfspr r4,SPRN_IBAT5L |
---|
161 | | - stw r4,SL_IBAT5+4(r1) |
---|
| 159 | + stw r4,SL_IBAT5+4(r11) |
---|
162 | 160 | mfspr r4,SPRN_IBAT6U |
---|
163 | | - stw r4,SL_IBAT6(r1) |
---|
| 161 | + stw r4,SL_IBAT6(r11) |
---|
164 | 162 | mfspr r4,SPRN_IBAT6L |
---|
165 | | - stw r4,SL_IBAT6+4(r1) |
---|
| 163 | + stw r4,SL_IBAT6+4(r11) |
---|
166 | 164 | mfspr r4,SPRN_IBAT7U |
---|
167 | | - stw r4,SL_IBAT7(r1) |
---|
| 165 | + stw r4,SL_IBAT7(r11) |
---|
168 | 166 | mfspr r4,SPRN_IBAT7L |
---|
169 | | - stw r4,SL_IBAT7+4(r1) |
---|
| 167 | + stw r4,SL_IBAT7+4(r11) |
---|
170 | 168 | END_MMU_FTR_SECTION_IFSET(MMU_FTR_USE_HIGH_BATS) |
---|
171 | 169 | |
---|
172 | 170 | /* Backup various CPU config stuffs */ |
---|
.. | .. |
---|
185 | 183 | lis r5,grackle_wake_up@ha |
---|
186 | 184 | addi r5,r5,grackle_wake_up@l |
---|
187 | 185 | tophys(r5,r5) |
---|
188 | | - stw r5,SL_PC(r1) |
---|
| 186 | + stw r5,SL_PC(r11) |
---|
189 | 187 | lis r4,KERNELBASE@h |
---|
190 | | - tophys(r5,r1) |
---|
| 188 | + tophys(r5,r11) |
---|
191 | 189 | addi r5,r5,SL_PC |
---|
192 | 190 | lis r6,MAGIC@ha |
---|
193 | 191 | addi r6,r6,MAGIC@l |
---|
.. | .. |
---|
199 | 197 | tophys(r3,r3) |
---|
200 | 198 | stw r3,0x80(r4) |
---|
201 | 199 | stw r5,0x84(r4) |
---|
202 | | - /* Store a pointer to our backup storage into |
---|
203 | | - * a kernel global |
---|
204 | | - */ |
---|
205 | | - lis r3,sleep_storage@ha |
---|
206 | | - addi r3,r3,sleep_storage@l |
---|
207 | | - stw r5,0(r3) |
---|
208 | 200 | |
---|
209 | | - .globl low_cpu_die |
---|
210 | | -low_cpu_die: |
---|
| 201 | + .globl low_cpu_offline_self |
---|
| 202 | +low_cpu_offline_self: |
---|
211 | 203 | /* Flush & disable all caches */ |
---|
212 | 204 | bl flush_disable_caches |
---|
213 | 205 | |
---|
.. | .. |
---|
249 | 241 | mtmsr r2 |
---|
250 | 242 | isync |
---|
251 | 243 | b 1b |
---|
252 | | - |
---|
| 244 | +_ASM_NOKPROBE_SYMBOL(low_cpu_offline_self) |
---|
253 | 245 | /* |
---|
254 | 246 | * Here is the resume code. |
---|
255 | 247 | */ |
---|
.. | .. |
---|
284 | 276 | lis r3,sleep_storage@ha |
---|
285 | 277 | addi r3,r3,sleep_storage@l |
---|
286 | 278 | tophys(r3,r3) |
---|
287 | | - lwz r1,0(r3) |
---|
| 279 | + addi r1,r3,SL_PC |
---|
288 | 280 | |
---|
289 | 281 | /* Pass thru to older resume code ... */ |
---|
| 282 | +_ASM_NOKPROBE_SYMBOL(core99_wake_up) |
---|
290 | 283 | /* |
---|
291 | 284 | * Here is the resume code for older machines. |
---|
292 | 285 | * r1 has the physical address of SL_PC(sp). |
---|
.. | .. |
---|
298 | 291 | * we do any r1 memory access as we are not sure they |
---|
299 | 292 | * are in a sane state above the first 256Mb region |
---|
300 | 293 | */ |
---|
301 | | - li r0,16 /* load up segment register values */ |
---|
302 | | - mtctr r0 /* for context 0 */ |
---|
303 | | - lis r3,0x2000 /* Ku = 1, VSID = 0 */ |
---|
304 | | - li r4,0 |
---|
305 | | -3: mtsrin r3,r4 |
---|
306 | | - addi r3,r3,0x111 /* increment VSID */ |
---|
307 | | - addis r4,r4,0x1000 /* address of next segment */ |
---|
308 | | - bdnz 3b |
---|
| 294 | + bl load_segment_registers |
---|
309 | 295 | sync |
---|
310 | 296 | isync |
---|
311 | 297 | |
---|
.. | .. |
---|
410 | 396 | blt 1b |
---|
411 | 397 | sync |
---|
412 | 398 | |
---|
413 | | - /* restore the MSR and turn on the MMU */ |
---|
414 | | - lwz r3,SL_MSR(r1) |
---|
415 | | - bl turn_on_mmu |
---|
416 | | - |
---|
417 | | - /* get back the stack pointer */ |
---|
418 | | - tovirt(r1,r1) |
---|
419 | | - |
---|
420 | 399 | /* Restore TB */ |
---|
421 | 400 | li r3,0 |
---|
422 | 401 | mttbl r3 |
---|
.. | .. |
---|
430 | 409 | mtcr r0 |
---|
431 | 410 | lwz r2,SL_R2(r1) |
---|
432 | 411 | lmw r12,SL_R12(r1) |
---|
433 | | - addi r1,r1,SL_SIZE |
---|
434 | | - lwz r0,4(r1) |
---|
435 | | - mtlr r0 |
---|
436 | | - blr |
---|
437 | 412 | |
---|
438 | | -turn_on_mmu: |
---|
439 | | - mflr r4 |
---|
440 | | - tovirt(r4,r4) |
---|
| 413 | + /* restore the MSR and SP and turn on the MMU and return */ |
---|
| 414 | + lwz r3,SL_MSR(r1) |
---|
| 415 | + lwz r4,SL_LR(r1) |
---|
| 416 | + lwz r1,SL_SP(r1) |
---|
441 | 417 | mtsrr0 r4 |
---|
442 | 418 | mtsrr1 r3 |
---|
443 | 419 | sync |
---|
444 | 420 | isync |
---|
445 | 421 | rfi |
---|
| 422 | +_ASM_NOKPROBE_SYMBOL(grackle_wake_up) |
---|
446 | 423 | |
---|
447 | 424 | #endif /* defined(CONFIG_PM) || defined(CONFIG_CPU_FREQ) */ |
---|
448 | 425 | |
---|
449 | | - .section .data |
---|
| 426 | + .section .bss |
---|
450 | 427 | .balign L1_CACHE_BYTES |
---|
451 | 428 | sleep_storage: |
---|
452 | | - .long 0 |
---|
| 429 | + .space SL_SIZE |
---|
453 | 430 | .balign L1_CACHE_BYTES, 0 |
---|
454 | 431 | |
---|
455 | | -#endif /* CONFIG_6xx */ |
---|
| 432 | +#endif /* CONFIG_PPC_BOOK3S_32 */ |
---|
456 | 433 | .section .text |
---|