xref: /openbmc/linux/arch/powerpc/platforms/52xx/lite5200_sleep.S (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
1b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */
2*2da37761SChristophe Leroy#include <linux/linkage.h>
3*2da37761SChristophe Leroy
4ee983079SDomen Puncer#include <asm/reg.h>
5ee983079SDomen Puncer#include <asm/ppc_asm.h>
6ee983079SDomen Puncer#include <asm/processor.h>
7ee983079SDomen Puncer#include <asm/cache.h>
8ee983079SDomen Puncer
9ee983079SDomen Puncer
10ee983079SDomen Puncer#define SDRAM_CTRL	0x104
11ee983079SDomen Puncer#define SC_MODE_EN	(1<<31)
12ee983079SDomen Puncer#define SC_CKE		(1<<30)
13ee983079SDomen Puncer#define SC_REF_EN	(1<<28)
14ee983079SDomen Puncer#define SC_SOFT_PRE	(1<<1)
15ee983079SDomen Puncer
16ee983079SDomen Puncer#define GPIOW_GPIOE	0xc00
17ee983079SDomen Puncer#define GPIOW_DDR	0xc08
18ee983079SDomen Puncer#define GPIOW_DVO	0xc0c
19ee983079SDomen Puncer
20ee983079SDomen Puncer#define CDM_CE		0x214
21ee983079SDomen Puncer#define CDM_SDRAM	(1<<3)
22ee983079SDomen Puncer
23ee983079SDomen Puncer
24ee983079SDomen Puncer/* helpers... beware: r10 and r4 are overwritten */
25ee983079SDomen Puncer#define SAVE_SPRN(reg, addr)		\
26ee983079SDomen Puncer	mfspr	r10, SPRN_##reg;	\
27ee983079SDomen Puncer	stw	r10, ((addr)*4)(r4);
28ee983079SDomen Puncer
29ee983079SDomen Puncer#define LOAD_SPRN(reg, addr)		\
30ee983079SDomen Puncer	lwz	r10, ((addr)*4)(r4);	\
31ee983079SDomen Puncer	mtspr	SPRN_##reg, r10;	\
32ee983079SDomen Puncer	sync;				\
33ee983079SDomen Puncer	isync;
34ee983079SDomen Puncer
35ee983079SDomen Puncer
36ee983079SDomen Puncer	.data
37ee983079SDomen Puncerregisters:
38ee983079SDomen Puncer	.space 0x5c*4
39ee983079SDomen Puncer	.text
40ee983079SDomen Puncer
41ee983079SDomen Puncer/* ---------------------------------------------------------------------- */
42ee983079SDomen Puncer/* low-power mode with help of M68HLC908QT1 */
43ee983079SDomen Puncer
44ee983079SDomen Puncer	.globl lite5200_low_power
45ee983079SDomen Puncerlite5200_low_power:
46ee983079SDomen Puncer
47ee983079SDomen Puncer	mr	r7, r3	/* save SRAM va */
48ee983079SDomen Puncer	mr	r8, r4	/* save MBAR va */
49ee983079SDomen Puncer
50ee983079SDomen Puncer	/* setup wakeup address for u-boot at physical location 0x0 */
51ee983079SDomen Puncer	lis	r3, CONFIG_KERNEL_START@h
52ee983079SDomen Puncer	lis	r4, lite5200_wakeup@h
53ee983079SDomen Puncer	ori	r4, r4, lite5200_wakeup@l
54ee983079SDomen Puncer	sub	r4, r4, r3
55ee983079SDomen Puncer	stw	r4, 0(r3)
56ee983079SDomen Puncer
57ee983079SDomen Puncer
58ee983079SDomen Puncer	/*
59ee983079SDomen Puncer	 * save stuff BDI overwrites
60ee983079SDomen Puncer	 * 0xf0 (0xe0->0x100 gets overwritten when BDI connected;
618cdcde5fSMichael Ellerman	 *   even when CONFIG_BDI_SWITCH is disabled and MMU XLAT commented; heisenbug?))
62ee983079SDomen Puncer	 * WARNING: self-refresh doesn't seem to work when BDI2000 is connected,
63ee983079SDomen Puncer	 *   possibly because BDI sets SDRAM registers before wakeup code does
64ee983079SDomen Puncer	 */
65ee983079SDomen Puncer	lis	r4, registers@h
66ee983079SDomen Puncer	ori	r4, r4, registers@l
67ee983079SDomen Puncer	lwz	r10, 0xf0(r3)
68ee983079SDomen Puncer	stw	r10, (0x1d*4)(r4)
69ee983079SDomen Puncer
70ee983079SDomen Puncer	/* save registers to r4 [destroys r10] */
71ee983079SDomen Puncer	SAVE_SPRN(LR, 0x1c)
72ee983079SDomen Puncer	bl	save_regs
73ee983079SDomen Puncer
74ee983079SDomen Puncer	/* flush caches [destroys r3, r4] */
75ee983079SDomen Puncer	bl	flush_data_cache
76ee983079SDomen Puncer
77ee983079SDomen Puncer
78ee983079SDomen Puncer	/* copy code to sram */
79ee983079SDomen Puncer	mr	r4, r7
80ee983079SDomen Puncer	li	r3, (sram_code_end - sram_code)/4
81ee983079SDomen Puncer	mtctr	r3
82ee983079SDomen Puncer	lis	r3, sram_code@h
83ee983079SDomen Puncer	ori	r3, r3, sram_code@l
84ee983079SDomen Puncer1:
85ee983079SDomen Puncer	lwz	r5, 0(r3)
86ee983079SDomen Puncer	stw	r5, 0(r4)
87ee983079SDomen Puncer	addi	r3, r3, 4
88ee983079SDomen Puncer	addi	r4, r4, 4
89ee983079SDomen Puncer	bdnz	1b
90ee983079SDomen Puncer
91ee983079SDomen Puncer	/* get tb_ticks_per_usec */
92ee983079SDomen Puncer	lis	r3, tb_ticks_per_usec@h
93ee983079SDomen Puncer	lwz	r11, tb_ticks_per_usec@l(r3)
94ee983079SDomen Puncer
95ee983079SDomen Puncer	/* disable I and D caches */
96ee983079SDomen Puncer	mfspr	r3, SPRN_HID0
97ee983079SDomen Puncer	ori	r3, r3, HID0_ICE | HID0_DCE
98ee983079SDomen Puncer	xori	r3, r3, HID0_ICE | HID0_DCE
99ee983079SDomen Puncer	sync; isync;
100ee983079SDomen Puncer	mtspr	SPRN_HID0, r3
101ee983079SDomen Puncer	sync; isync;
102ee983079SDomen Puncer
103ee983079SDomen Puncer	/* jump to sram */
104ee983079SDomen Puncer	mtlr	r7
105ee983079SDomen Puncer	blrl
106ee983079SDomen Puncer	/* doesn't return */
107ee983079SDomen Puncer
108ee983079SDomen Puncer
109ee983079SDomen Puncersram_code:
110ee983079SDomen Puncer	/* self refresh */
111ee983079SDomen Puncer	lwz	r4, SDRAM_CTRL(r8)
112ee983079SDomen Puncer
113ee983079SDomen Puncer	/* send NOP (precharge) */
114ee983079SDomen Puncer	oris	r4, r4, SC_MODE_EN@h	/* mode_en */
115ee983079SDomen Puncer	stw	r4, SDRAM_CTRL(r8)
116ee983079SDomen Puncer	sync
117ee983079SDomen Puncer
118ee983079SDomen Puncer	ori	r4, r4, SC_SOFT_PRE	/* soft_pre */
119ee983079SDomen Puncer	stw	r4, SDRAM_CTRL(r8)
120ee983079SDomen Puncer	sync
121ee983079SDomen Puncer	xori	r4, r4, SC_SOFT_PRE
122ee983079SDomen Puncer
123ee983079SDomen Puncer	xoris	r4, r4, SC_MODE_EN@h	/* !mode_en */
124ee983079SDomen Puncer	stw	r4, SDRAM_CTRL(r8)
125ee983079SDomen Puncer	sync
126ee983079SDomen Puncer
127ee983079SDomen Puncer	/* delay (for NOP to finish) */
128ee983079SDomen Puncer	li	r12, 1
129ee983079SDomen Puncer	bl	udelay
130ee983079SDomen Puncer
131ee983079SDomen Puncer	/*
132ee983079SDomen Puncer	 * mode_en must not be set when enabling self-refresh
133ee983079SDomen Puncer	 * send AR with CKE low (self-refresh)
134ee983079SDomen Puncer	 */
135ee983079SDomen Puncer	oris	r4, r4, (SC_REF_EN | SC_CKE)@h
136ee983079SDomen Puncer	xoris	r4, r4, (SC_CKE)@h	/* ref_en !cke */
137ee983079SDomen Puncer	stw	r4, SDRAM_CTRL(r8)
138ee983079SDomen Puncer	sync
139ee983079SDomen Puncer
140ee983079SDomen Puncer	/* delay (after !CKE there should be two cycles) */
141ee983079SDomen Puncer	li	r12, 1
142ee983079SDomen Puncer	bl	udelay
143ee983079SDomen Puncer
144ee983079SDomen Puncer	/* disable clock */
145ee983079SDomen Puncer	lwz	r4, CDM_CE(r8)
146ee983079SDomen Puncer	ori	r4, r4, CDM_SDRAM
147ee983079SDomen Puncer	xori	r4, r4, CDM_SDRAM
148ee983079SDomen Puncer	stw	r4, CDM_CE(r8)
149ee983079SDomen Puncer	sync
150ee983079SDomen Puncer
151ee983079SDomen Puncer	/* delay a bit */
152ee983079SDomen Puncer	li	r12, 1
153ee983079SDomen Puncer	bl	udelay
154ee983079SDomen Puncer
155ee983079SDomen Puncer
156ee983079SDomen Puncer	/* turn off with QT chip */
157ee983079SDomen Puncer	li	r4, 0x02
158ee983079SDomen Puncer	stb	r4, GPIOW_GPIOE(r8)	/* enable gpio_wkup1 */
159ee983079SDomen Puncer	sync
160ee983079SDomen Puncer
161ee983079SDomen Puncer	stb	r4, GPIOW_DVO(r8)	/* "output" high */
162ee983079SDomen Puncer	sync
163ee983079SDomen Puncer	stb	r4, GPIOW_DDR(r8)	/* output */
164ee983079SDomen Puncer	sync
165ee983079SDomen Puncer	stb	r4, GPIOW_DVO(r8)	/* output high */
166ee983079SDomen Puncer	sync
167ee983079SDomen Puncer
168ee983079SDomen Puncer	/* 10uS delay */
169ee983079SDomen Puncer	li	r12, 10
170ee983079SDomen Puncer	bl	udelay
171ee983079SDomen Puncer
172ee983079SDomen Puncer	/* turn off */
173ee983079SDomen Puncer	li	r4, 0
174ee983079SDomen Puncer	stb	r4, GPIOW_DVO(r8)	/* output low */
175ee983079SDomen Puncer	sync
176ee983079SDomen Puncer
177ee983079SDomen Puncer	/* wait until we're offline */
178ee983079SDomen Puncer  1:
179ee983079SDomen Puncer	b	1b
180ee983079SDomen Puncer
181ee983079SDomen Puncer
182ee983079SDomen Puncer	/* local udelay in sram is needed */
183*2da37761SChristophe LeroySYM_FUNC_START_LOCAL(udelay)
184*2da37761SChristophe Leroy	/* r11 - tb_ticks_per_usec, r12 - usecs, overwrites r13 */
185ee983079SDomen Puncer	mullw	r12, r12, r11
186ee983079SDomen Puncer	mftb	r13	/* start */
1878a87a507SChristophe Leroy	add	r12, r13, r12 /* end */
188ee983079SDomen Puncer    1:
189ee983079SDomen Puncer	mftb	r13	/* current */
190ee983079SDomen Puncer	cmp	cr0, r13, r12
191ee983079SDomen Puncer	blt	1b
192ee983079SDomen Puncer	blr
193*2da37761SChristophe LeroySYM_FUNC_END(udelay)
194ee983079SDomen Puncer
195ee983079SDomen Puncersram_code_end:
196ee983079SDomen Puncer
197ee983079SDomen Puncer
198ee983079SDomen Puncer
199ee983079SDomen Puncer/* uboot jumps here on resume */
200ee983079SDomen Puncerlite5200_wakeup:
201ee983079SDomen Puncer	bl	restore_regs
202ee983079SDomen Puncer
203ee983079SDomen Puncer
204ee983079SDomen Puncer	/* HIDs, MSR */
205ee983079SDomen Puncer	LOAD_SPRN(HID1, 0x19)
206ee983079SDomen Puncer	LOAD_SPRN(HID2, 0x1a)
207ee983079SDomen Puncer
208ee983079SDomen Puncer
209ee983079SDomen Puncer	/* address translation is tricky (see turn_on_mmu) */
210ee983079SDomen Puncer	mfmsr	r10
211ee983079SDomen Puncer	ori	r10, r10, MSR_DR | MSR_IR
212ee983079SDomen Puncer
213ee983079SDomen Puncer
214ee983079SDomen Puncer	mtspr	SPRN_SRR1, r10
215ee983079SDomen Puncer	lis	r10, mmu_on@h
216ee983079SDomen Puncer	ori	r10, r10, mmu_on@l
217ee983079SDomen Puncer	mtspr	SPRN_SRR0, r10
218ee983079SDomen Puncer	sync
219ee983079SDomen Puncer	rfi
220ee983079SDomen Puncermmu_on:
221ee983079SDomen Puncer	/* kernel offset (r4 is still set from restore_registers) */
222ee983079SDomen Puncer	addis	r4, r4, CONFIG_KERNEL_START@h
223ee983079SDomen Puncer
224ee983079SDomen Puncer
225ee983079SDomen Puncer	/* restore MSR */
226ee983079SDomen Puncer	lwz	r10, (4*0x1b)(r4)
227ee983079SDomen Puncer	mtmsr	r10
228ee983079SDomen Puncer	sync; isync;
229ee983079SDomen Puncer
230ee983079SDomen Puncer	/* invalidate caches */
231ee983079SDomen Puncer	mfspr	r10, SPRN_HID0
232ee983079SDomen Puncer	ori	r5, r10, HID0_ICFI | HID0_DCI
233ee983079SDomen Puncer	mtspr	SPRN_HID0, r5	/* invalidate caches */
234ee983079SDomen Puncer	sync; isync;
235ee983079SDomen Puncer	mtspr	SPRN_HID0, r10
236ee983079SDomen Puncer	sync; isync;
237ee983079SDomen Puncer
238ee983079SDomen Puncer	/* enable caches */
239ee983079SDomen Puncer	lwz	r10, (4*0x18)(r4)
240ee983079SDomen Puncer	mtspr	SPRN_HID0, r10	/* restore (enable caches, DPM) */
241ee983079SDomen Puncer	/* ^ this has to be after address translation set in MSR */
242ee983079SDomen Puncer	sync
243ee983079SDomen Puncer	isync
244ee983079SDomen Puncer
245ee983079SDomen Puncer
246ee983079SDomen Puncer	/* restore 0xf0 (BDI2000) */
247ee983079SDomen Puncer	lis	r3, CONFIG_KERNEL_START@h
248ee983079SDomen Puncer	lwz	r10, (0x1d*4)(r4)
249ee983079SDomen Puncer	stw	r10, 0xf0(r3)
250ee983079SDomen Puncer
251ee983079SDomen Puncer	LOAD_SPRN(LR, 0x1c)
252ee983079SDomen Puncer
253ee983079SDomen Puncer
254ee983079SDomen Puncer	blr
255e83f01fdSChristophe Leroy_ASM_NOKPROBE_SYMBOL(lite5200_wakeup)
256ee983079SDomen Puncer
257ee983079SDomen Puncer
258ee983079SDomen Puncer/* ---------------------------------------------------------------------- */
259ee983079SDomen Puncer/* boring code: helpers */
260ee983079SDomen Puncer
261ee983079SDomen Puncer/* save registers */
262ee983079SDomen Puncer#define SAVE_BAT(n, addr)		\
263ee983079SDomen Puncer	SAVE_SPRN(DBAT##n##L, addr);	\
264ee983079SDomen Puncer	SAVE_SPRN(DBAT##n##U, addr+1);	\
265ee983079SDomen Puncer	SAVE_SPRN(IBAT##n##L, addr+2);	\
266ee983079SDomen Puncer	SAVE_SPRN(IBAT##n##U, addr+3);
267ee983079SDomen Puncer
268ee983079SDomen Puncer#define SAVE_SR(n, addr)		\
269ee983079SDomen Puncer	mfsr	r10, n;			\
270ee983079SDomen Puncer	stw	r10, ((addr)*4)(r4);
271ee983079SDomen Puncer
272ee983079SDomen Puncer#define SAVE_4SR(n, addr)	\
273ee983079SDomen Puncer	SAVE_SR(n, addr);	\
274ee983079SDomen Puncer	SAVE_SR(n+1, addr+1);	\
275ee983079SDomen Puncer	SAVE_SR(n+2, addr+2);	\
276ee983079SDomen Puncer	SAVE_SR(n+3, addr+3);
277ee983079SDomen Puncer
278*2da37761SChristophe LeroySYM_FUNC_START_LOCAL(save_regs)
279ee983079SDomen Puncer	stw	r0, 0(r4)
280ee983079SDomen Puncer	stw	r1, 0x4(r4)
281ee983079SDomen Puncer	stw	r2, 0x8(r4)
282ee983079SDomen Puncer	stmw	r11, 0xc(r4) /* 0xc -> 0x5f, (0x18*4-1) */
283ee983079SDomen Puncer
284ee983079SDomen Puncer	SAVE_SPRN(HID0, 0x18)
285ee983079SDomen Puncer	SAVE_SPRN(HID1, 0x19)
286ee983079SDomen Puncer	SAVE_SPRN(HID2, 0x1a)
287ee983079SDomen Puncer	mfmsr	r10
288ee983079SDomen Puncer	stw	r10, (4*0x1b)(r4)
289ee983079SDomen Puncer	/*SAVE_SPRN(LR, 0x1c) have to save it before the call */
290ee983079SDomen Puncer	/* 0x1d reserved by 0xf0 */
291ee983079SDomen Puncer	SAVE_SPRN(RPA,   0x1e)
292ee983079SDomen Puncer	SAVE_SPRN(SDR1,  0x1f)
293ee983079SDomen Puncer
294ee983079SDomen Puncer	/* save MMU regs */
295ee983079SDomen Puncer	SAVE_BAT(0, 0x20)
296ee983079SDomen Puncer	SAVE_BAT(1, 0x24)
297ee983079SDomen Puncer	SAVE_BAT(2, 0x28)
298ee983079SDomen Puncer	SAVE_BAT(3, 0x2c)
299ee983079SDomen Puncer	SAVE_BAT(4, 0x30)
300ee983079SDomen Puncer	SAVE_BAT(5, 0x34)
301ee983079SDomen Puncer	SAVE_BAT(6, 0x38)
302ee983079SDomen Puncer	SAVE_BAT(7, 0x3c)
303ee983079SDomen Puncer
304ee983079SDomen Puncer	SAVE_4SR(0, 0x40)
305ee983079SDomen Puncer	SAVE_4SR(4, 0x44)
306ee983079SDomen Puncer	SAVE_4SR(8, 0x48)
307ee983079SDomen Puncer	SAVE_4SR(12, 0x4c)
308ee983079SDomen Puncer
309ee983079SDomen Puncer	SAVE_SPRN(SPRG0, 0x50)
310ee983079SDomen Puncer	SAVE_SPRN(SPRG1, 0x51)
311ee983079SDomen Puncer	SAVE_SPRN(SPRG2, 0x52)
312ee983079SDomen Puncer	SAVE_SPRN(SPRG3, 0x53)
313ee983079SDomen Puncer	SAVE_SPRN(SPRG4, 0x54)
314ee983079SDomen Puncer	SAVE_SPRN(SPRG5, 0x55)
315ee983079SDomen Puncer	SAVE_SPRN(SPRG6, 0x56)
316ee983079SDomen Puncer	SAVE_SPRN(SPRG7, 0x57)
317ee983079SDomen Puncer
318ee983079SDomen Puncer	SAVE_SPRN(IABR,  0x58)
319ee983079SDomen Puncer	SAVE_SPRN(DABR,  0x59)
320ee983079SDomen Puncer	SAVE_SPRN(TBRL,  0x5a)
321ee983079SDomen Puncer	SAVE_SPRN(TBRU,  0x5b)
322ee983079SDomen Puncer
323ee983079SDomen Puncer	blr
324*2da37761SChristophe LeroySYM_FUNC_END(save_regs)
325ee983079SDomen Puncer
326ee983079SDomen Puncer
327ee983079SDomen Puncer/* restore registers */
328ee983079SDomen Puncer#define LOAD_BAT(n, addr)		\
329ee983079SDomen Puncer	LOAD_SPRN(DBAT##n##L, addr);	\
330ee983079SDomen Puncer	LOAD_SPRN(DBAT##n##U, addr+1);	\
331ee983079SDomen Puncer	LOAD_SPRN(IBAT##n##L, addr+2);	\
332ee983079SDomen Puncer	LOAD_SPRN(IBAT##n##U, addr+3);
333ee983079SDomen Puncer
334ee983079SDomen Puncer#define LOAD_SR(n, addr)		\
335ee983079SDomen Puncer	lwz	r10, ((addr)*4)(r4);	\
336ee983079SDomen Puncer	mtsr	n, r10;
337ee983079SDomen Puncer
338ee983079SDomen Puncer#define LOAD_4SR(n, addr)	\
339ee983079SDomen Puncer	LOAD_SR(n, addr);	\
340ee983079SDomen Puncer	LOAD_SR(n+1, addr+1);	\
341ee983079SDomen Puncer	LOAD_SR(n+2, addr+2);	\
342ee983079SDomen Puncer	LOAD_SR(n+3, addr+3);
343ee983079SDomen Puncer
344*2da37761SChristophe LeroySYM_FUNC_START_LOCAL(restore_regs)
345ee983079SDomen Puncer	lis	r4, registers@h
346ee983079SDomen Puncer	ori	r4, r4, registers@l
347ee983079SDomen Puncer
348ee983079SDomen Puncer	/* MMU is not up yet */
349ee983079SDomen Puncer	subis	r4, r4, CONFIG_KERNEL_START@h
350ee983079SDomen Puncer
351ee983079SDomen Puncer	lwz	r0, 0(r4)
352ee983079SDomen Puncer	lwz	r1, 0x4(r4)
353ee983079SDomen Puncer	lwz	r2, 0x8(r4)
354ee983079SDomen Puncer	lmw	r11, 0xc(r4)
355ee983079SDomen Puncer
356ee983079SDomen Puncer	/*
357ee983079SDomen Puncer	 * these are a bit tricky
358ee983079SDomen Puncer	 *
359ee983079SDomen Puncer	 * 0x18 - HID0
360ee983079SDomen Puncer	 * 0x19 - HID1
361ee983079SDomen Puncer	 * 0x1a - HID2
362ee983079SDomen Puncer	 * 0x1b - MSR
363ee983079SDomen Puncer	 * 0x1c - LR
364ee983079SDomen Puncer	 * 0x1d - reserved by 0xf0 (BDI2000)
365ee983079SDomen Puncer	 */
366ee983079SDomen Puncer	LOAD_SPRN(RPA,   0x1e);
367ee983079SDomen Puncer	LOAD_SPRN(SDR1,  0x1f);
368ee983079SDomen Puncer
369ee983079SDomen Puncer	/* restore MMU regs */
370ee983079SDomen Puncer	LOAD_BAT(0, 0x20)
371ee983079SDomen Puncer	LOAD_BAT(1, 0x24)
372ee983079SDomen Puncer	LOAD_BAT(2, 0x28)
373ee983079SDomen Puncer	LOAD_BAT(3, 0x2c)
374ee983079SDomen Puncer	LOAD_BAT(4, 0x30)
375ee983079SDomen Puncer	LOAD_BAT(5, 0x34)
376ee983079SDomen Puncer	LOAD_BAT(6, 0x38)
377ee983079SDomen Puncer	LOAD_BAT(7, 0x3c)
378ee983079SDomen Puncer
379ee983079SDomen Puncer	LOAD_4SR(0, 0x40)
380ee983079SDomen Puncer	LOAD_4SR(4, 0x44)
381ee983079SDomen Puncer	LOAD_4SR(8, 0x48)
382ee983079SDomen Puncer	LOAD_4SR(12, 0x4c)
383ee983079SDomen Puncer
384ee983079SDomen Puncer	/* rest of regs */
385ee983079SDomen Puncer	LOAD_SPRN(SPRG0, 0x50);
386ee983079SDomen Puncer	LOAD_SPRN(SPRG1, 0x51);
387ee983079SDomen Puncer	LOAD_SPRN(SPRG2, 0x52);
388ee983079SDomen Puncer	LOAD_SPRN(SPRG3, 0x53);
389ee983079SDomen Puncer	LOAD_SPRN(SPRG4, 0x54);
390ee983079SDomen Puncer	LOAD_SPRN(SPRG5, 0x55);
391ee983079SDomen Puncer	LOAD_SPRN(SPRG6, 0x56);
392ee983079SDomen Puncer	LOAD_SPRN(SPRG7, 0x57);
393ee983079SDomen Puncer
394ee983079SDomen Puncer	LOAD_SPRN(IABR,  0x58);
395ee983079SDomen Puncer	LOAD_SPRN(DABR,  0x59);
396ee983079SDomen Puncer	LOAD_SPRN(TBWL,  0x5a);	/* these two have separate R/W regs */
397ee983079SDomen Puncer	LOAD_SPRN(TBWU,  0x5b);
398ee983079SDomen Puncer
399ee983079SDomen Puncer	blr
400e83f01fdSChristophe Leroy_ASM_NOKPROBE_SYMBOL(restore_regs)
401*2da37761SChristophe LeroySYM_FUNC_END(restore_regs)
402ee983079SDomen Puncer
403ee983079SDomen Puncer
404ee983079SDomen Puncer
405ee983079SDomen Puncer/* cache flushing code. copied from arch/ppc/boot/util.S */
406ee983079SDomen Puncer#define NUM_CACHE_LINES (128*8)
407ee983079SDomen Puncer
408ee983079SDomen Puncer/*
409ee983079SDomen Puncer * Flush data cache
410ee983079SDomen Puncer * Do this by just reading lots of stuff into the cache.
411ee983079SDomen Puncer */
412*2da37761SChristophe LeroySYM_FUNC_START_LOCAL(flush_data_cache)
413ee983079SDomen Puncer	lis	r3,CONFIG_KERNEL_START@h
414ee983079SDomen Puncer	ori	r3,r3,CONFIG_KERNEL_START@l
415ee983079SDomen Puncer	li	r4,NUM_CACHE_LINES
416ee983079SDomen Puncer	mtctr	r4
417ee983079SDomen Puncer1:
418ee983079SDomen Puncer	lwz	r4,0(r3)
419ee983079SDomen Puncer	addi	r3,r3,L1_CACHE_BYTES	/* Next line, please */
420ee983079SDomen Puncer	bdnz	1b
421ee983079SDomen Puncer	blr
422*2da37761SChristophe LeroySYM_FUNC_END(flush_data_cache)
423