Merge tag 'docs-4.9-2' of git://git.lwn.net/linux
[cascardo/linux.git] / arch / powerpc / kernel / misc_64.S
1 /*
2  * This file contains miscellaneous low-level functions.
3  *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
4  *
5  * Largely rewritten by Cort Dougan (cort@cs.nmt.edu)
6  * and Paul Mackerras.
7  * Adapted for iSeries by Mike Corrigan (mikejc@us.ibm.com)
8  * PPC64 updates by Dave Engebretsen (engebret@us.ibm.com)
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version
13  * 2 of the License, or (at your option) any later version.
14  *
15  */
16
17 #include <linux/sys.h>
18 #include <asm/unistd.h>
19 #include <asm/errno.h>
20 #include <asm/processor.h>
21 #include <asm/page.h>
22 #include <asm/cache.h>
23 #include <asm/ppc_asm.h>
24 #include <asm/asm-offsets.h>
25 #include <asm/cputable.h>
26 #include <asm/thread_info.h>
27 #include <asm/kexec.h>
28 #include <asm/ptrace.h>
29 #include <asm/mmu.h>
30
31         .text
32
33 _GLOBAL(call_do_softirq)
34         mflr    r0
35         std     r0,16(r1)
36         stdu    r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r3)
37         mr      r1,r3
38         bl      __do_softirq
39         ld      r1,0(r1)
40         ld      r0,16(r1)
41         mtlr    r0
42         blr
43
44 _GLOBAL(call_do_irq)
45         mflr    r0
46         std     r0,16(r1)
47         stdu    r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r4)
48         mr      r1,r4
49         bl      __do_irq
50         ld      r1,0(r1)
51         ld      r0,16(r1)
52         mtlr    r0
53         blr
54
55         .section        ".toc","aw"
56 PPC64_CACHES:
57         .tc             ppc64_caches[TC],ppc64_caches
58         .section        ".text"
59
60 /*
61  * Write any modified data cache blocks out to memory
62  * and invalidate the corresponding instruction cache blocks.
63  *
64  * flush_icache_range(unsigned long start, unsigned long stop)
65  *
66  *   flush all bytes from start through stop-1 inclusive
67  */
68
69 _GLOBAL(flush_icache_range)
70 BEGIN_FTR_SECTION
71         PURGE_PREFETCHED_INS
72         blr
73 END_FTR_SECTION_IFSET(CPU_FTR_COHERENT_ICACHE)
74 /*
75  * Flush the data cache to memory 
76  * 
77  * Different systems have different cache line sizes
78  * and in some cases i-cache and d-cache line sizes differ from
79  * each other.
80  */
81         ld      r10,PPC64_CACHES@toc(r2)
82         lwz     r7,DCACHEL1LINESIZE(r10)/* Get cache line size */
83         addi    r5,r7,-1
84         andc    r6,r3,r5                /* round low to line bdy */
85         subf    r8,r6,r4                /* compute length */
86         add     r8,r8,r5                /* ensure we get enough */
87         lwz     r9,DCACHEL1LOGLINESIZE(r10)     /* Get log-2 of cache line size */
88         srw.    r8,r8,r9                /* compute line count */
89         beqlr                           /* nothing to do? */
90         mtctr   r8
91 1:      dcbst   0,r6
92         add     r6,r6,r7
93         bdnz    1b
94         sync
95
96 /* Now invalidate the instruction cache */
97         
98         lwz     r7,ICACHEL1LINESIZE(r10)        /* Get Icache line size */
99         addi    r5,r7,-1
100         andc    r6,r3,r5                /* round low to line bdy */
101         subf    r8,r6,r4                /* compute length */
102         add     r8,r8,r5
103         lwz     r9,ICACHEL1LOGLINESIZE(r10)     /* Get log-2 of Icache line size */
104         srw.    r8,r8,r9                /* compute line count */
105         beqlr                           /* nothing to do? */
106         mtctr   r8
107 2:      icbi    0,r6
108         add     r6,r6,r7
109         bdnz    2b
110         isync
111         blr
112 _ASM_NOKPROBE_SYMBOL(flush_icache_range)
113
114 /*
115  * Like above, but only do the D-cache.
116  *
117  * flush_dcache_range(unsigned long start, unsigned long stop)
118  *
119  *    flush all bytes from start to stop-1 inclusive
120  */
121 _GLOBAL(flush_dcache_range)
122
123 /*
124  * Flush the data cache to memory 
125  * 
126  * Different systems have different cache line sizes
127  */
128         ld      r10,PPC64_CACHES@toc(r2)
129         lwz     r7,DCACHEL1LINESIZE(r10)        /* Get dcache line size */
130         addi    r5,r7,-1
131         andc    r6,r3,r5                /* round low to line bdy */
132         subf    r8,r6,r4                /* compute length */
133         add     r8,r8,r5                /* ensure we get enough */
134         lwz     r9,DCACHEL1LOGLINESIZE(r10)     /* Get log-2 of dcache line size */
135         srw.    r8,r8,r9                /* compute line count */
136         beqlr                           /* nothing to do? */
137         mtctr   r8
138 0:      dcbst   0,r6
139         add     r6,r6,r7
140         bdnz    0b
141         sync
142         blr
143
144 /*
145  * Like above, but works on non-mapped physical addresses.
146  * Use only for non-LPAR setups ! It also assumes real mode
147  * is cacheable. Used for flushing out the DART before using
148  * it as uncacheable memory 
149  *
150  * flush_dcache_phys_range(unsigned long start, unsigned long stop)
151  *
152  *    flush all bytes from start to stop-1 inclusive
153  */
154 _GLOBAL(flush_dcache_phys_range)
155         ld      r10,PPC64_CACHES@toc(r2)
156         lwz     r7,DCACHEL1LINESIZE(r10)        /* Get dcache line size */
157         addi    r5,r7,-1
158         andc    r6,r3,r5                /* round low to line bdy */
159         subf    r8,r6,r4                /* compute length */
160         add     r8,r8,r5                /* ensure we get enough */
161         lwz     r9,DCACHEL1LOGLINESIZE(r10)     /* Get log-2 of dcache line size */
162         srw.    r8,r8,r9                /* compute line count */
163         beqlr                           /* nothing to do? */
164         mfmsr   r5                      /* Disable MMU Data Relocation */
165         ori     r0,r5,MSR_DR
166         xori    r0,r0,MSR_DR
167         sync
168         mtmsr   r0
169         sync
170         isync
171         mtctr   r8
172 0:      dcbst   0,r6
173         add     r6,r6,r7
174         bdnz    0b
175         sync
176         isync
177         mtmsr   r5                      /* Re-enable MMU Data Relocation */
178         sync
179         isync
180         blr
181
182 _GLOBAL(flush_inval_dcache_range)
183         ld      r10,PPC64_CACHES@toc(r2)
184         lwz     r7,DCACHEL1LINESIZE(r10)        /* Get dcache line size */
185         addi    r5,r7,-1
186         andc    r6,r3,r5                /* round low to line bdy */
187         subf    r8,r6,r4                /* compute length */
188         add     r8,r8,r5                /* ensure we get enough */
189         lwz     r9,DCACHEL1LOGLINESIZE(r10)/* Get log-2 of dcache line size */
190         srw.    r8,r8,r9                /* compute line count */
191         beqlr                           /* nothing to do? */
192         sync
193         isync
194         mtctr   r8
195 0:      dcbf    0,r6
196         add     r6,r6,r7
197         bdnz    0b
198         sync
199         isync
200         blr
201
202
203 /*
204  * Flush a particular page from the data cache to RAM.
205  * Note: this is necessary because the instruction cache does *not*
206  * snoop from the data cache.
207  *
208  *      void __flush_dcache_icache(void *page)
209  */
210 _GLOBAL(__flush_dcache_icache)
211 /*
212  * Flush the data cache to memory 
213  * 
214  * Different systems have different cache line sizes
215  */
216
217 BEGIN_FTR_SECTION
218         PURGE_PREFETCHED_INS
219         blr
220 END_FTR_SECTION_IFSET(CPU_FTR_COHERENT_ICACHE)
221
222 /* Flush the dcache */
223         ld      r7,PPC64_CACHES@toc(r2)
224         clrrdi  r3,r3,PAGE_SHIFT                    /* Page align */
225         lwz     r4,DCACHEL1LINESPERPAGE(r7)     /* Get # dcache lines per page */
226         lwz     r5,DCACHEL1LINESIZE(r7)         /* Get dcache line size */
227         mr      r6,r3
228         mtctr   r4
229 0:      dcbst   0,r6
230         add     r6,r6,r5
231         bdnz    0b
232         sync
233
234 /* Now invalidate the icache */ 
235
236         lwz     r4,ICACHEL1LINESPERPAGE(r7)     /* Get # icache lines per page */
237         lwz     r5,ICACHEL1LINESIZE(r7)         /* Get icache line size */
238         mtctr   r4
239 1:      icbi    0,r3
240         add     r3,r3,r5
241         bdnz    1b
242         isync
243         blr
244
245 _GLOBAL(__bswapdi2)
246         srdi    r8,r3,32
247         rlwinm  r7,r3,8,0xffffffff
248         rlwimi  r7,r3,24,0,7
249         rlwinm  r9,r8,8,0xffffffff
250         rlwimi  r7,r3,24,16,23
251         rlwimi  r9,r8,24,0,7
252         rlwimi  r9,r8,24,16,23
253         sldi    r7,r7,32
254         or      r3,r7,r9
255         blr
256
257
258 #ifdef CONFIG_PPC_EARLY_DEBUG_BOOTX
259 _GLOBAL(rmci_on)
260         sync
261         isync
262         li      r3,0x100
263         rldicl  r3,r3,32,0
264         mfspr   r5,SPRN_HID4
265         or      r5,r5,r3
266         sync
267         mtspr   SPRN_HID4,r5
268         isync
269         slbia
270         isync
271         sync
272         blr
273
274 _GLOBAL(rmci_off)
275         sync
276         isync
277         li      r3,0x100
278         rldicl  r3,r3,32,0
279         mfspr   r5,SPRN_HID4
280         andc    r5,r5,r3
281         sync
282         mtspr   SPRN_HID4,r5
283         isync
284         slbia
285         isync
286         sync
287         blr
288 #endif /* CONFIG_PPC_EARLY_DEBUG_BOOTX */
289
290 #if defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE)
291
292 /*
293  * Do an IO access in real mode
294  */
295 _GLOBAL(real_readb)
296         mfmsr   r7
297         ori     r0,r7,MSR_DR
298         xori    r0,r0,MSR_DR
299         sync
300         mtmsrd  r0
301         sync
302         isync
303         mfspr   r6,SPRN_HID4
304         rldicl  r5,r6,32,0
305         ori     r5,r5,0x100
306         rldicl  r5,r5,32,0
307         sync
308         mtspr   SPRN_HID4,r5
309         isync
310         slbia
311         isync
312         lbz     r3,0(r3)
313         sync
314         mtspr   SPRN_HID4,r6
315         isync
316         slbia
317         isync
318         mtmsrd  r7
319         sync
320         isync
321         blr
322
323         /*
324  * Do an IO access in real mode
325  */
326 _GLOBAL(real_writeb)
327         mfmsr   r7
328         ori     r0,r7,MSR_DR
329         xori    r0,r0,MSR_DR
330         sync
331         mtmsrd  r0
332         sync
333         isync
334         mfspr   r6,SPRN_HID4
335         rldicl  r5,r6,32,0
336         ori     r5,r5,0x100
337         rldicl  r5,r5,32,0
338         sync
339         mtspr   SPRN_HID4,r5
340         isync
341         slbia
342         isync
343         stb     r3,0(r4)
344         sync
345         mtspr   SPRN_HID4,r6
346         isync
347         slbia
348         isync
349         mtmsrd  r7
350         sync
351         isync
352         blr
353 #endif /* defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE) */
354
355 #ifdef CONFIG_PPC_PASEMI
356
357 _GLOBAL(real_205_readb)
358         mfmsr   r7
359         ori     r0,r7,MSR_DR
360         xori    r0,r0,MSR_DR
361         sync
362         mtmsrd  r0
363         sync
364         isync
365         LBZCIX(R3,R0,R3)
366         isync
367         mtmsrd  r7
368         sync
369         isync
370         blr
371
372 _GLOBAL(real_205_writeb)
373         mfmsr   r7
374         ori     r0,r7,MSR_DR
375         xori    r0,r0,MSR_DR
376         sync
377         mtmsrd  r0
378         sync
379         isync
380         STBCIX(R3,R0,R4)
381         isync
382         mtmsrd  r7
383         sync
384         isync
385         blr
386
387 #endif /* CONFIG_PPC_PASEMI */
388
389
390 #if defined(CONFIG_CPU_FREQ_PMAC64) || defined(CONFIG_CPU_FREQ_MAPLE)
391 /*
392  * SCOM access functions for 970 (FX only for now)
393  *
394  * unsigned long scom970_read(unsigned int address);
395  * void scom970_write(unsigned int address, unsigned long value);
396  *
397  * The address passed in is the 24 bits register address. This code
398  * is 970 specific and will not check the status bits, so you should
399  * know what you are doing.
400  */
401 _GLOBAL(scom970_read)
402         /* interrupts off */
403         mfmsr   r4
404         ori     r0,r4,MSR_EE
405         xori    r0,r0,MSR_EE
406         mtmsrd  r0,1
407
408         /* rotate 24 bits SCOM address 8 bits left and mask out it's low 8 bits
409          * (including parity). On current CPUs they must be 0'd,
410          * and finally or in RW bit
411          */
412         rlwinm  r3,r3,8,0,15
413         ori     r3,r3,0x8000
414
415         /* do the actual scom read */
416         sync
417         mtspr   SPRN_SCOMC,r3
418         isync
419         mfspr   r3,SPRN_SCOMD
420         isync
421         mfspr   r0,SPRN_SCOMC
422         isync
423
424         /* XXX: fixup result on some buggy 970's (ouch ! we lost a bit, bah
425          * that's the best we can do). Not implemented yet as we don't use
426          * the scom on any of the bogus CPUs yet, but may have to be done
427          * ultimately
428          */
429
430         /* restore interrupts */
431         mtmsrd  r4,1
432         blr
433
434
435 _GLOBAL(scom970_write)
436         /* interrupts off */
437         mfmsr   r5
438         ori     r0,r5,MSR_EE
439         xori    r0,r0,MSR_EE
440         mtmsrd  r0,1
441
442         /* rotate 24 bits SCOM address 8 bits left and mask out it's low 8 bits
443          * (including parity). On current CPUs they must be 0'd.
444          */
445
446         rlwinm  r3,r3,8,0,15
447
448         sync
449         mtspr   SPRN_SCOMD,r4      /* write data */
450         isync
451         mtspr   SPRN_SCOMC,r3      /* write command */
452         isync
453         mfspr   3,SPRN_SCOMC
454         isync
455
456         /* restore interrupts */
457         mtmsrd  r5,1
458         blr
459 #endif /* CONFIG_CPU_FREQ_PMAC64 || CONFIG_CPU_FREQ_MAPLE */
460
461 /* kexec_wait(phys_cpu)
462  *
463  * wait for the flag to change, indicating this kernel is going away but
464  * the slave code for the next one is at addresses 0 to 100.
465  *
466  * This is used by all slaves, even those that did not find a matching
467  * paca in the secondary startup code.
468  *
469  * Physical (hardware) cpu id should be in r3.
470  */
471 _GLOBAL(kexec_wait)
472         bl      1f
473 1:      mflr    r5
474         addi    r5,r5,kexec_flag-1b
475
476 99:     HMT_LOW
477 #ifdef CONFIG_KEXEC             /* use no memory without kexec */
478         lwz     r4,0(r5)
479         cmpwi   0,r4,0
480         beq     99b
481 #ifdef CONFIG_PPC_BOOK3S_64
482         li      r10,0x60
483         mfmsr   r11
484         clrrdi  r11,r11,1       /* Clear MSR_LE */
485         mtsrr0  r10
486         mtsrr1  r11
487         rfid
488 #else
489         /* Create TLB entry in book3e_secondary_core_init */
490         li      r4,0
491         ba      0x60
492 #endif
493 #endif
494
495 /* this can be in text because we won't change it until we are
496  * running in real anyways
497  */
498 kexec_flag:
499         .long   0
500
501
502 #ifdef CONFIG_KEXEC
503 #ifdef CONFIG_PPC_BOOK3E
504 /*
505  * BOOK3E has no real MMU mode, so we have to setup the initial TLB
506  * for a core to identity map v:0 to p:0.  This current implementation
507  * assumes that 1G is enough for kexec.
508  */
509 kexec_create_tlb:
510         /*
511          * Invalidate all non-IPROT TLB entries to avoid any TLB conflict.
512          * IPROT TLB entries should be >= PAGE_OFFSET and thus not conflict.
513          */
514         PPC_TLBILX_ALL(0,R0)
515         sync
516         isync
517
518         mfspr   r10,SPRN_TLB1CFG
519         andi.   r10,r10,TLBnCFG_N_ENTRY /* Extract # entries */
520         subi    r10,r10,1       /* Last entry: no conflict with kernel text */
521         lis     r9,MAS0_TLBSEL(1)@h
522         rlwimi  r9,r10,16,4,15          /* Setup MAS0 = TLBSEL | ESEL(r9) */
523
524 /* Set up a temp identity mapping v:0 to p:0 and return to it. */
525 #if defined(CONFIG_SMP) || defined(CONFIG_PPC_E500MC)
526 #define M_IF_NEEDED     MAS2_M
527 #else
528 #define M_IF_NEEDED     0
529 #endif
530         mtspr   SPRN_MAS0,r9
531
532         lis     r9,(MAS1_VALID|MAS1_IPROT)@h
533         ori     r9,r9,(MAS1_TSIZE(BOOK3E_PAGESZ_1GB))@l
534         mtspr   SPRN_MAS1,r9
535
536         LOAD_REG_IMMEDIATE(r9, 0x0 | M_IF_NEEDED)
537         mtspr   SPRN_MAS2,r9
538
539         LOAD_REG_IMMEDIATE(r9, 0x0 | MAS3_SR | MAS3_SW | MAS3_SX)
540         mtspr   SPRN_MAS3,r9
541         li      r9,0
542         mtspr   SPRN_MAS7,r9
543
544         tlbwe
545         isync
546         blr
547 #endif
548
549 /* kexec_smp_wait(void)
550  *
551  * call with interrupts off
552  * note: this is a terminal routine, it does not save lr
553  *
554  * get phys id from paca
555  * switch to real mode
556  * mark the paca as no longer used
557  * join other cpus in kexec_wait(phys_id)
558  */
559 _GLOBAL(kexec_smp_wait)
560         lhz     r3,PACAHWCPUID(r13)
561         bl      real_mode
562
563         li      r4,KEXEC_STATE_REAL_MODE
564         stb     r4,PACAKEXECSTATE(r13)
565         SYNC
566
567         b       kexec_wait
568
569 /*
570  * switch to real mode (turn mmu off)
571  * we use the early kernel trick that the hardware ignores bits
572  * 0 and 1 (big endian) of the effective address in real mode
573  *
574  * don't overwrite r3 here, it is live for kexec_wait above.
575  */
576 real_mode:      /* assume normal blr return */
577 #ifdef CONFIG_PPC_BOOK3E
578         /* Create an identity mapping. */
579         b       kexec_create_tlb
580 #else
581 1:      li      r9,MSR_RI
582         li      r10,MSR_DR|MSR_IR
583         mflr    r11             /* return address to SRR0 */
584         mfmsr   r12
585         andc    r9,r12,r9
586         andc    r10,r12,r10
587
588         mtmsrd  r9,1
589         mtspr   SPRN_SRR1,r10
590         mtspr   SPRN_SRR0,r11
591         rfid
592 #endif
593
594 /*
595  * kexec_sequence(newstack, start, image, control, clear_all(),
596                   copy_with_mmu_off)
597  *
598  * does the grungy work with stack switching and real mode switches
599  * also does simple calls to other code
600  */
601
602 _GLOBAL(kexec_sequence)
603         mflr    r0
604         std     r0,16(r1)
605
606         /* switch stacks to newstack -- &kexec_stack.stack */
607         stdu    r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r3)
608         mr      r1,r3
609
610         li      r0,0
611         std     r0,16(r1)
612
613         /* save regs for local vars on new stack.
614          * yes, we won't go back, but ...
615          */
616         std     r31,-8(r1)
617         std     r30,-16(r1)
618         std     r29,-24(r1)
619         std     r28,-32(r1)
620         std     r27,-40(r1)
621         std     r26,-48(r1)
622         std     r25,-56(r1)
623
624         stdu    r1,-STACK_FRAME_OVERHEAD-64(r1)
625
626         /* save args into preserved regs */
627         mr      r31,r3                  /* newstack (both) */
628         mr      r30,r4                  /* start (real) */
629         mr      r29,r5                  /* image (virt) */
630         mr      r28,r6                  /* control, unused */
631         mr      r27,r7                  /* clear_all() fn desc */
632         mr      r26,r8                  /* copy_with_mmu_off */
633         lhz     r25,PACAHWCPUID(r13)    /* get our phys cpu from paca */
634
635         /* disable interrupts, we are overwriting kernel data next */
636 #ifdef CONFIG_PPC_BOOK3E
637         wrteei  0
638 #else
639         mfmsr   r3
640         rlwinm  r3,r3,0,17,15
641         mtmsrd  r3,1
642 #endif
643
644         /* We need to turn the MMU off unless we are in hash mode
645          * under a hypervisor
646          */
647         cmpdi   r26,0
648         beq     1f
649         bl      real_mode
650 1:
651         /* copy dest pages, flush whole dest image */
652         mr      r3,r29
653         bl      kexec_copy_flush        /* (image) */
654
655         /* turn off mmu now if not done earlier */
656         cmpdi   r26,0
657         bne     1f
658         bl      real_mode
659
660         /* copy  0x100 bytes starting at start to 0 */
661 1:      li      r3,0
662         mr      r4,r30          /* start, aka phys mem offset */
663         li      r5,0x100
664         li      r6,0
665         bl      copy_and_flush  /* (dest, src, copy limit, start offset) */
666 1:      /* assume normal blr return */
667
668         /* release other cpus to the new kernel secondary start at 0x60 */
669         mflr    r5
670         li      r6,1
671         stw     r6,kexec_flag-1b(5)
672
673         cmpdi   r27,0
674         beq     1f
675
676         /* clear out hardware hash page table and tlb */
677 #ifdef PPC64_ELF_ABI_v1
678         ld      r12,0(r27)              /* deref function descriptor */
679 #else
680         mr      r12,r27
681 #endif
682         mtctr   r12
683         bctrl                           /* mmu_hash_ops.hpte_clear_all(void); */
684
685 /*
686  *   kexec image calling is:
687  *      the first 0x100 bytes of the entry point are copied to 0
688  *
689  *      all slaves branch to slave = 0x60 (absolute)
690  *              slave(phys_cpu_id);
691  *
692  *      master goes to start = entry point
693  *              start(phys_cpu_id, start, 0);
694  *
695  *
696  *   a wrapper is needed to call existing kernels, here is an approximate
697  *   description of one method:
698  *
699  * v2: (2.6.10)
700  *   start will be near the boot_block (maybe 0x100 bytes before it?)
701  *   it will have a 0x60, which will b to boot_block, where it will wait
702  *   and 0 will store phys into struct boot-block and load r3 from there,
703  *   copy kernel 0-0x100 and tell slaves to back down to 0x60 again
704  *
705  * v1: (2.6.9)
706  *    boot block will have all cpus scanning device tree to see if they
707  *    are the boot cpu ?????
708  *    other device tree differences (prop sizes, va vs pa, etc)...
709  */
710 1:      mr      r3,r25  # my phys cpu
711         mr      r4,r30  # start, aka phys mem offset
712         mtlr    4
713         li      r5,0
714         blr     /* image->start(physid, image->start, 0); */
715 #endif /* CONFIG_KEXEC */