]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - arch/powerpc/kernel/misc_64.S
ASoC: hdmi-codec: Add devicetree binding with documentation
[karo-tx-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
30         .text
31
32 _GLOBAL(call_do_softirq)
33         mflr    r0
34         std     r0,16(r1)
35         stdu    r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r3)
36         mr      r1,r3
37         bl      .__do_softirq
38         ld      r1,0(r1)
39         ld      r0,16(r1)
40         mtlr    r0
41         blr
42
43 _GLOBAL(call_do_irq)
44         mflr    r0
45         std     r0,16(r1)
46         stdu    r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r4)
47         mr      r1,r4
48         bl      .__do_irq
49         ld      r1,0(r1)
50         ld      r0,16(r1)
51         mtlr    r0
52         blr
53
54         .section        ".toc","aw"
55 PPC64_CACHES:
56         .tc             ppc64_caches[TC],ppc64_caches
57         .section        ".text"
58
59 /*
60  * Write any modified data cache blocks out to memory
61  * and invalidate the corresponding instruction cache blocks.
62  *
63  * flush_icache_range(unsigned long start, unsigned long stop)
64  *
65  *   flush all bytes from start through stop-1 inclusive
66  */
67
68 _KPROBE(flush_icache_range)
69 BEGIN_FTR_SECTION
70         blr
71 END_FTR_SECTION_IFSET(CPU_FTR_COHERENT_ICACHE)
72 /*
73  * Flush the data cache to memory 
74  * 
75  * Different systems have different cache line sizes
76  * and in some cases i-cache and d-cache line sizes differ from
77  * each other.
78  */
79         ld      r10,PPC64_CACHES@toc(r2)
80         lwz     r7,DCACHEL1LINESIZE(r10)/* Get cache line size */
81         addi    r5,r7,-1
82         andc    r6,r3,r5                /* round low to line bdy */
83         subf    r8,r6,r4                /* compute length */
84         add     r8,r8,r5                /* ensure we get enough */
85         lwz     r9,DCACHEL1LOGLINESIZE(r10)     /* Get log-2 of cache line size */
86         srw.    r8,r8,r9                /* compute line count */
87         beqlr                           /* nothing to do? */
88         mtctr   r8
89 1:      dcbst   0,r6
90         add     r6,r6,r7
91         bdnz    1b
92         sync
93
94 /* Now invalidate the instruction cache */
95         
96         lwz     r7,ICACHEL1LINESIZE(r10)        /* Get Icache line size */
97         addi    r5,r7,-1
98         andc    r6,r3,r5                /* round low to line bdy */
99         subf    r8,r6,r4                /* compute length */
100         add     r8,r8,r5
101         lwz     r9,ICACHEL1LOGLINESIZE(r10)     /* Get log-2 of Icache line size */
102         srw.    r8,r8,r9                /* compute line count */
103         beqlr                           /* nothing to do? */
104         mtctr   r8
105 2:      icbi    0,r6
106         add     r6,r6,r7
107         bdnz    2b
108         isync
109         blr
110         .previous .text
111 /*
112  * Like above, but only do the D-cache.
113  *
114  * flush_dcache_range(unsigned long start, unsigned long stop)
115  *
116  *    flush all bytes from start to stop-1 inclusive
117  */
118 _GLOBAL(flush_dcache_range)
119
120 /*
121  * Flush the data cache to memory 
122  * 
123  * Different systems have different cache line sizes
124  */
125         ld      r10,PPC64_CACHES@toc(r2)
126         lwz     r7,DCACHEL1LINESIZE(r10)        /* Get dcache line size */
127         addi    r5,r7,-1
128         andc    r6,r3,r5                /* round low to line bdy */
129         subf    r8,r6,r4                /* compute length */
130         add     r8,r8,r5                /* ensure we get enough */
131         lwz     r9,DCACHEL1LOGLINESIZE(r10)     /* Get log-2 of dcache line size */
132         srw.    r8,r8,r9                /* compute line count */
133         beqlr                           /* nothing to do? */
134         mtctr   r8
135 0:      dcbst   0,r6
136         add     r6,r6,r7
137         bdnz    0b
138         sync
139         blr
140
141 /*
142  * Like above, but works on non-mapped physical addresses.
143  * Use only for non-LPAR setups ! It also assumes real mode
144  * is cacheable. Used for flushing out the DART before using
145  * it as uncacheable memory 
146  *
147  * flush_dcache_phys_range(unsigned long start, unsigned long stop)
148  *
149  *    flush all bytes from start to stop-1 inclusive
150  */
151 _GLOBAL(flush_dcache_phys_range)
152         ld      r10,PPC64_CACHES@toc(r2)
153         lwz     r7,DCACHEL1LINESIZE(r10)        /* Get dcache line size */
154         addi    r5,r7,-1
155         andc    r6,r3,r5                /* round low to line bdy */
156         subf    r8,r6,r4                /* compute length */
157         add     r8,r8,r5                /* ensure we get enough */
158         lwz     r9,DCACHEL1LOGLINESIZE(r10)     /* Get log-2 of dcache line size */
159         srw.    r8,r8,r9                /* compute line count */
160         beqlr                           /* nothing to do? */
161         mfmsr   r5                      /* Disable MMU Data Relocation */
162         ori     r0,r5,MSR_DR
163         xori    r0,r0,MSR_DR
164         sync
165         mtmsr   r0
166         sync
167         isync
168         mtctr   r8
169 0:      dcbst   0,r6
170         add     r6,r6,r7
171         bdnz    0b
172         sync
173         isync
174         mtmsr   r5                      /* Re-enable MMU Data Relocation */
175         sync
176         isync
177         blr
178
179 _GLOBAL(flush_inval_dcache_range)
180         ld      r10,PPC64_CACHES@toc(r2)
181         lwz     r7,DCACHEL1LINESIZE(r10)        /* Get dcache line size */
182         addi    r5,r7,-1
183         andc    r6,r3,r5                /* round low to line bdy */
184         subf    r8,r6,r4                /* compute length */
185         add     r8,r8,r5                /* ensure we get enough */
186         lwz     r9,DCACHEL1LOGLINESIZE(r10)/* Get log-2 of dcache line size */
187         srw.    r8,r8,r9                /* compute line count */
188         beqlr                           /* nothing to do? */
189         sync
190         isync
191         mtctr   r8
192 0:      dcbf    0,r6
193         add     r6,r6,r7
194         bdnz    0b
195         sync
196         isync
197         blr
198
199
200 /*
201  * Flush a particular page from the data cache to RAM.
202  * Note: this is necessary because the instruction cache does *not*
203  * snoop from the data cache.
204  *
205  *      void __flush_dcache_icache(void *page)
206  */
207 _GLOBAL(__flush_dcache_icache)
208 /*
209  * Flush the data cache to memory 
210  * 
211  * Different systems have different cache line sizes
212  */
213
214 /* Flush the dcache */
215         ld      r7,PPC64_CACHES@toc(r2)
216         clrrdi  r3,r3,PAGE_SHIFT                    /* Page align */
217         lwz     r4,DCACHEL1LINESPERPAGE(r7)     /* Get # dcache lines per page */
218         lwz     r5,DCACHEL1LINESIZE(r7)         /* Get dcache line size */
219         mr      r6,r3
220         mtctr   r4
221 0:      dcbst   0,r6
222         add     r6,r6,r5
223         bdnz    0b
224         sync
225
226 /* Now invalidate the icache */ 
227
228         lwz     r4,ICACHEL1LINESPERPAGE(r7)     /* Get # icache lines per page */
229         lwz     r5,ICACHEL1LINESIZE(r7)         /* Get icache line size */
230         mtctr   r4
231 1:      icbi    0,r3
232         add     r3,r3,r5
233         bdnz    1b
234         isync
235         blr
236
237 _GLOBAL(__bswapdi2)
238         srdi    r8,r3,32
239         rlwinm  r7,r3,8,0xffffffff
240         rlwimi  r7,r3,24,0,7
241         rlwinm  r9,r8,8,0xffffffff
242         rlwimi  r7,r3,24,16,23
243         rlwimi  r9,r8,24,0,7
244         rlwimi  r9,r8,24,16,23
245         sldi    r7,r7,32
246         or      r3,r7,r9
247         blr
248
249 #if defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE)
250
251 _GLOBAL(rmci_on)
252         sync
253         isync
254         li      r3,0x100
255         rldicl  r3,r3,32,0
256         mfspr   r5,SPRN_HID4
257         or      r5,r5,r3
258         sync
259         mtspr   SPRN_HID4,r5
260         isync
261         slbia
262         isync
263         sync
264         blr
265
266 _GLOBAL(rmci_off)
267         sync
268         isync
269         li      r3,0x100
270         rldicl  r3,r3,32,0
271         mfspr   r5,SPRN_HID4
272         andc    r5,r5,r3
273         sync
274         mtspr   SPRN_HID4,r5
275         isync
276         slbia
277         isync
278         sync
279         blr
280
281 /*
282  * Do an IO access in real mode
283  */
284 _GLOBAL(real_readb)
285         mfmsr   r7
286         ori     r0,r7,MSR_DR
287         xori    r0,r0,MSR_DR
288         sync
289         mtmsrd  r0
290         sync
291         isync
292         mfspr   r6,SPRN_HID4
293         rldicl  r5,r6,32,0
294         ori     r5,r5,0x100
295         rldicl  r5,r5,32,0
296         sync
297         mtspr   SPRN_HID4,r5
298         isync
299         slbia
300         isync
301         lbz     r3,0(r3)
302         sync
303         mtspr   SPRN_HID4,r6
304         isync
305         slbia
306         isync
307         mtmsrd  r7
308         sync
309         isync
310         blr
311
312         /*
313  * Do an IO access in real mode
314  */
315 _GLOBAL(real_writeb)
316         mfmsr   r7
317         ori     r0,r7,MSR_DR
318         xori    r0,r0,MSR_DR
319         sync
320         mtmsrd  r0
321         sync
322         isync
323         mfspr   r6,SPRN_HID4
324         rldicl  r5,r6,32,0
325         ori     r5,r5,0x100
326         rldicl  r5,r5,32,0
327         sync
328         mtspr   SPRN_HID4,r5
329         isync
330         slbia
331         isync
332         stb     r3,0(r4)
333         sync
334         mtspr   SPRN_HID4,r6
335         isync
336         slbia
337         isync
338         mtmsrd  r7
339         sync
340         isync
341         blr
342 #endif /* defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE) */
343
344 #ifdef CONFIG_PPC_PASEMI
345
346 _GLOBAL(real_205_readb)
347         mfmsr   r7
348         ori     r0,r7,MSR_DR
349         xori    r0,r0,MSR_DR
350         sync
351         mtmsrd  r0
352         sync
353         isync
354         LBZCIX(R3,R0,R3)
355         isync
356         mtmsrd  r7
357         sync
358         isync
359         blr
360
361 _GLOBAL(real_205_writeb)
362         mfmsr   r7
363         ori     r0,r7,MSR_DR
364         xori    r0,r0,MSR_DR
365         sync
366         mtmsrd  r0
367         sync
368         isync
369         STBCIX(R3,R0,R4)
370         isync
371         mtmsrd  r7
372         sync
373         isync
374         blr
375
376 #endif /* CONFIG_PPC_PASEMI */
377
378
379 #if defined(CONFIG_CPU_FREQ_PMAC64) || defined(CONFIG_CPU_FREQ_MAPLE)
380 /*
381  * SCOM access functions for 970 (FX only for now)
382  *
383  * unsigned long scom970_read(unsigned int address);
384  * void scom970_write(unsigned int address, unsigned long value);
385  *
386  * The address passed in is the 24 bits register address. This code
387  * is 970 specific and will not check the status bits, so you should
388  * know what you are doing.
389  */
390 _GLOBAL(scom970_read)
391         /* interrupts off */
392         mfmsr   r4
393         ori     r0,r4,MSR_EE
394         xori    r0,r0,MSR_EE
395         mtmsrd  r0,1
396
397         /* rotate 24 bits SCOM address 8 bits left and mask out it's low 8 bits
398          * (including parity). On current CPUs they must be 0'd,
399          * and finally or in RW bit
400          */
401         rlwinm  r3,r3,8,0,15
402         ori     r3,r3,0x8000
403
404         /* do the actual scom read */
405         sync
406         mtspr   SPRN_SCOMC,r3
407         isync
408         mfspr   r3,SPRN_SCOMD
409         isync
410         mfspr   r0,SPRN_SCOMC
411         isync
412
413         /* XXX: fixup result on some buggy 970's (ouch ! we lost a bit, bah
414          * that's the best we can do). Not implemented yet as we don't use
415          * the scom on any of the bogus CPUs yet, but may have to be done
416          * ultimately
417          */
418
419         /* restore interrupts */
420         mtmsrd  r4,1
421         blr
422
423
424 _GLOBAL(scom970_write)
425         /* interrupts off */
426         mfmsr   r5
427         ori     r0,r5,MSR_EE
428         xori    r0,r0,MSR_EE
429         mtmsrd  r0,1
430
431         /* rotate 24 bits SCOM address 8 bits left and mask out it's low 8 bits
432          * (including parity). On current CPUs they must be 0'd.
433          */
434
435         rlwinm  r3,r3,8,0,15
436
437         sync
438         mtspr   SPRN_SCOMD,r4      /* write data */
439         isync
440         mtspr   SPRN_SCOMC,r3      /* write command */
441         isync
442         mfspr   3,SPRN_SCOMC
443         isync
444
445         /* restore interrupts */
446         mtmsrd  r5,1
447         blr
448 #endif /* CONFIG_CPU_FREQ_PMAC64 || CONFIG_CPU_FREQ_MAPLE */
449
450 /* kexec_wait(phys_cpu)
451  *
452  * wait for the flag to change, indicating this kernel is going away but
453  * the slave code for the next one is at addresses 0 to 100.
454  *
455  * This is used by all slaves, even those that did not find a matching
456  * paca in the secondary startup code.
457  *
458  * Physical (hardware) cpu id should be in r3.
459  */
460 _GLOBAL(kexec_wait)
461         bl      1f
462 1:      mflr    r5
463         addi    r5,r5,kexec_flag-1b
464
465 99:     HMT_LOW
466 #ifdef CONFIG_KEXEC             /* use no memory without kexec */
467         lwz     r4,0(r5)
468         cmpwi   0,r4,0
469         bnea    0x60
470 #endif
471         b       99b
472
473 /* this can be in text because we won't change it until we are
474  * running in real anyways
475  */
476 kexec_flag:
477         .long   0
478
479
480 #ifdef CONFIG_KEXEC
481
482 /* kexec_smp_wait(void)
483  *
484  * call with interrupts off
485  * note: this is a terminal routine, it does not save lr
486  *
487  * get phys id from paca
488  * switch to real mode
489  * mark the paca as no longer used
490  * join other cpus in kexec_wait(phys_id)
491  */
492 _GLOBAL(kexec_smp_wait)
493         lhz     r3,PACAHWCPUID(r13)
494         bl      real_mode
495
496         li      r4,KEXEC_STATE_REAL_MODE
497         stb     r4,PACAKEXECSTATE(r13)
498         SYNC
499
500         b       .kexec_wait
501
502 /*
503  * switch to real mode (turn mmu off)
504  * we use the early kernel trick that the hardware ignores bits
505  * 0 and 1 (big endian) of the effective address in real mode
506  *
507  * don't overwrite r3 here, it is live for kexec_wait above.
508  */
509 real_mode:      /* assume normal blr return */
510 1:      li      r9,MSR_RI
511         li      r10,MSR_DR|MSR_IR
512         mflr    r11             /* return address to SRR0 */
513         mfmsr   r12
514         andc    r9,r12,r9
515         andc    r10,r12,r10
516
517         mtmsrd  r9,1
518         mtspr   SPRN_SRR1,r10
519         mtspr   SPRN_SRR0,r11
520         rfid
521
522
523 /*
524  * kexec_sequence(newstack, start, image, control, clear_all())
525  *
526  * does the grungy work with stack switching and real mode switches
527  * also does simple calls to other code
528  */
529
530 _GLOBAL(kexec_sequence)
531         mflr    r0
532         std     r0,16(r1)
533
534         /* switch stacks to newstack -- &kexec_stack.stack */
535         stdu    r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r3)
536         mr      r1,r3
537
538         li      r0,0
539         std     r0,16(r1)
540
541         /* save regs for local vars on new stack.
542          * yes, we won't go back, but ...
543          */
544         std     r31,-8(r1)
545         std     r30,-16(r1)
546         std     r29,-24(r1)
547         std     r28,-32(r1)
548         std     r27,-40(r1)
549         std     r26,-48(r1)
550         std     r25,-56(r1)
551
552         stdu    r1,-STACK_FRAME_OVERHEAD-64(r1)
553
554         /* save args into preserved regs */
555         mr      r31,r3                  /* newstack (both) */
556         mr      r30,r4                  /* start (real) */
557         mr      r29,r5                  /* image (virt) */
558         mr      r28,r6                  /* control, unused */
559         mr      r27,r7                  /* clear_all() fn desc */
560         mr      r26,r8                  /* spare */
561         lhz     r25,PACAHWCPUID(r13)    /* get our phys cpu from paca */
562
563         /* disable interrupts, we are overwriting kernel data next */
564         mfmsr   r3
565         rlwinm  r3,r3,0,17,15
566         mtmsrd  r3,1
567
568         /* copy dest pages, flush whole dest image */
569         mr      r3,r29
570         bl      .kexec_copy_flush       /* (image) */
571
572         /* turn off mmu */
573         bl      real_mode
574
575         /* copy  0x100 bytes starting at start to 0 */
576         li      r3,0
577         mr      r4,r30          /* start, aka phys mem offset */
578         li      r5,0x100
579         li      r6,0
580         bl      .copy_and_flush /* (dest, src, copy limit, start offset) */
581 1:      /* assume normal blr return */
582
583         /* release other cpus to the new kernel secondary start at 0x60 */
584         mflr    r5
585         li      r6,1
586         stw     r6,kexec_flag-1b(5)
587
588         /* clear out hardware hash page table and tlb */
589         ld      r5,0(r27)               /* deref function descriptor */
590         mtctr   r5
591         bctrl                           /* ppc_md.hpte_clear_all(void); */
592
593 /*
594  *   kexec image calling is:
595  *      the first 0x100 bytes of the entry point are copied to 0
596  *
597  *      all slaves branch to slave = 0x60 (absolute)
598  *              slave(phys_cpu_id);
599  *
600  *      master goes to start = entry point
601  *              start(phys_cpu_id, start, 0);
602  *
603  *
604  *   a wrapper is needed to call existing kernels, here is an approximate
605  *   description of one method:
606  *
607  * v2: (2.6.10)
608  *   start will be near the boot_block (maybe 0x100 bytes before it?)
609  *   it will have a 0x60, which will b to boot_block, where it will wait
610  *   and 0 will store phys into struct boot-block and load r3 from there,
611  *   copy kernel 0-0x100 and tell slaves to back down to 0x60 again
612  *
613  * v1: (2.6.9)
614  *    boot block will have all cpus scanning device tree to see if they
615  *    are the boot cpu ?????
616  *    other device tree differences (prop sizes, va vs pa, etc)...
617  */
618         mr      r3,r25  # my phys cpu
619         mr      r4,r30  # start, aka phys mem offset
620         mtlr    4
621         li      r5,0
622         blr     /* image->start(physid, image->start, 0); */
623 #endif /* CONFIG_KEXEC */