Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] powerpc: merged hw_irq.h

Merged hw_irq.h between ppc32 & ppc64. Added support to use the Book-E
wrtee[i] instructions that allow modifying MSR[EE] atomically.
Additionally, added get_irq_desc() macros to ppc32 to allow mask_irq(),
unmask_irq(), and ack_irq() to be common between ppc32 & ppc64.

Note: because 64-bit Book-E implementations only have a 32-bit MSR the
macro's for Book-E need to come before the PPC64 macro's to ensure the
right thing happends for 64-bit Book-E processors.

Signed-off-by: Kumar Gala <kumar.gala@freescale.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>

authored by

Kumar Gala and committed by
Paul Mackerras
b671ad2b fa2ac7a2

+43 -85
-59
include/asm-ppc/hw_irq.h
··· 1 - /* 2 - * Copyright (C) 1999 Cort Dougan <cort@cs.nmt.edu> 3 - */ 4 - #ifdef __KERNEL__ 5 - #ifndef _PPC_HW_IRQ_H 6 - #define _PPC_HW_IRQ_H 7 - 8 - #include <asm/ptrace.h> 9 - #include <asm/reg.h> 10 - #include <asm/irq.h> 11 - 12 - extern void timer_interrupt(struct pt_regs *); 13 - 14 - #define irqs_disabled() ((mfmsr() & MSR_EE) == 0) 15 - 16 - static inline void local_irq_disable(void) 17 - { 18 - unsigned long msr; 19 - msr = mfmsr(); 20 - mtmsr(msr & ~MSR_EE); 21 - __asm__ __volatile__("": : :"memory"); 22 - } 23 - 24 - static inline void local_irq_enable(void) 25 - { 26 - unsigned long msr; 27 - __asm__ __volatile__("": : :"memory"); 28 - msr = mfmsr(); 29 - mtmsr(msr | MSR_EE); 30 - } 31 - 32 - static inline void local_irq_save_ptr(unsigned long *flags) 33 - { 34 - unsigned long msr; 35 - msr = mfmsr(); 36 - *flags = msr; 37 - mtmsr(msr & ~MSR_EE); 38 - __asm__ __volatile__("": : :"memory"); 39 - } 40 - 41 - #define local_save_flags(flags) ((flags) = mfmsr()) 42 - #define local_irq_save(flags) local_irq_save_ptr(&flags) 43 - #define local_irq_restore(flags) mtmsr(flags) 44 - 45 - extern void do_lost_interrupts(unsigned long); 46 - 47 - #define mask_irq(irq) ({if (irq_desc[irq].handler && irq_desc[irq].handler->disable) irq_desc[irq].handler->disable(irq);}) 48 - #define unmask_irq(irq) ({if (irq_desc[irq].handler && irq_desc[irq].handler->enable) irq_desc[irq].handler->enable(irq);}) 49 - #define ack_irq(irq) ({if (irq_desc[irq].handler && irq_desc[irq].handler->ack) irq_desc[irq].handler->ack(irq);}) 50 - 51 - /* Should we handle this via lost interrupts and IPIs or should we don't care like 52 - * we do now ? --BenH. 53 - */ 54 - struct hw_interrupt_type; 55 - static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) {} 56 - 57 - 58 - #endif /* _PPC_HW_IRQ_H */ 59 - #endif /* __KERNEL__ */
+6
include/asm-ppc/irq.h
··· 24 24 */ 25 25 #define ARCH_HAS_IRQ_PER_CPU 26 26 27 + #define get_irq_desc(irq) (&irq_desc[(irq)]) 28 + 29 + /* Define a way to iterate across irqs. */ 30 + #define for_each_irq(i) \ 31 + for ((i) = 0; (i) < NR_IRQS; ++(i)) 32 + 27 33 #if defined(CONFIG_40x) 28 34 #include <asm/ibm4xx.h> 29 35
+37 -26
include/asm-ppc64/hw_irq.h include/asm-powerpc/hw_irq.h
··· 1 1 /* 2 2 * Copyright (C) 1999 Cort Dougan <cort@cs.nmt.edu> 3 - * 4 - * Use inline IRQs where possible - Anton Blanchard <anton@au.ibm.com> 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 3 */ 4 + #ifndef _ASM_POWERPC_HW_IRQ_H 5 + #define _ASM_POWERPC_HW_IRQ_H 6 + 11 7 #ifdef __KERNEL__ 12 - #ifndef _PPC64_HW_IRQ_H 13 - #define _PPC64_HW_IRQ_H 14 8 15 9 #include <linux/config.h> 16 10 #include <linux/errno.h> 11 + #include <asm/ptrace.h> 12 + #include <asm/processor.h> 17 13 #include <asm/irq.h> 18 14 19 15 extern void timer_interrupt(struct pt_regs *); ··· 29 33 30 34 #else 31 35 32 - #define local_save_flags(flags) ((flags) = mfmsr()) 36 + #if defined(CONFIG_BOOKE) 37 + #define SET_MSR_EE(x) mtmsr(x) 38 + #define local_irq_restore(flags) __asm__ __volatile__("wrtee %0" : : "r" (flags) : "memory") 39 + #elif defined(__powerpc64__) 40 + #define SET_MSR_EE(x) __mtmsrd(x, 1) 33 41 #define local_irq_restore(flags) do { \ 34 42 __asm__ __volatile__("": : :"memory"); \ 35 43 __mtmsrd((flags), 1); \ 36 44 } while(0) 45 + #else 46 + #define SET_MSR_EE(x) mtmsr(x) 47 + #define local_irq_restore(flags) mtmsr(flags) 48 + #endif 37 49 38 50 static inline void local_irq_disable(void) 39 51 { 52 + #ifdef CONFIG_BOOKE 53 + __asm__ __volatile__("wrteei 0": : :"memory"); 54 + #else 40 55 unsigned long msr; 41 - msr = mfmsr(); 42 - __mtmsrd(msr & ~MSR_EE, 1); 43 56 __asm__ __volatile__("": : :"memory"); 57 + msr = mfmsr(); 58 + SET_MSR_EE(msr & ~MSR_EE); 59 + #endif 44 60 } 45 61 46 62 static inline void local_irq_enable(void) 47 63 { 64 + #ifdef CONFIG_BOOKE 65 + __asm__ __volatile__("wrteei 1": : :"memory"); 66 + #else 48 67 unsigned long msr; 49 68 __asm__ __volatile__("": : :"memory"); 50 69 msr = mfmsr(); 51 - __mtmsrd(msr | MSR_EE, 1); 70 + SET_MSR_EE(msr | MSR_EE); 71 + #endif 52 72 } 53 73 54 - static inline void __do_save_and_cli(unsigned long *flags) 74 + static inline void local_irq_save_ptr(unsigned long *flags) 55 75 { 56 76 unsigned long msr; 57 77 msr = mfmsr(); 58 78 *flags = msr; 59 - __mtmsrd(msr & ~MSR_EE, 1); 79 + #ifdef CONFIG_BOOKE 80 + __asm__ __volatile__("wrteei 0": : :"memory"); 81 + #else 82 + SET_MSR_EE(msr & ~MSR_EE); 83 + #endif 60 84 __asm__ __volatile__("": : :"memory"); 61 85 } 62 86 63 - #define local_irq_save(flags) __do_save_and_cli(&flags) 64 - 65 - #define irqs_disabled() \ 66 - ({ \ 67 - unsigned long flags; \ 68 - local_save_flags(flags); \ 69 - !(flags & MSR_EE); \ 70 - }) 87 + #define local_save_flags(flags) ((flags) = mfmsr()) 88 + #define local_irq_save(flags) local_irq_save_ptr(&flags) 89 + #define irqs_disabled() ((mfmsr() & MSR_EE) == 0) 71 90 72 91 #endif /* CONFIG_PPC_ISERIES */ 73 92 ··· 110 99 */ 111 100 struct hw_interrupt_type; 112 101 static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) {} 113 - 114 - #endif /* _PPC64_HW_IRQ_H */ 115 - #endif /* __KERNEL__ */ 102 + 103 + #endif /* __KERNEL__ */ 104 + #endif /* _ASM_POWERPC_HW_IRQ_H */