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

Configure Feed

Select the types of activity you want to include in your feed.

at v3.3 153 lines 3.1 kB view raw
1/* 2 * Copyright (C) 1999 Cort Dougan <cort@cs.nmt.edu> 3 */ 4#ifndef _ASM_POWERPC_HW_IRQ_H 5#define _ASM_POWERPC_HW_IRQ_H 6 7#ifdef __KERNEL__ 8 9#include <linux/errno.h> 10#include <linux/compiler.h> 11#include <asm/ptrace.h> 12#include <asm/processor.h> 13 14extern void timer_interrupt(struct pt_regs *); 15 16#ifdef CONFIG_PPC64 17#include <asm/paca.h> 18 19static inline unsigned long arch_local_save_flags(void) 20{ 21 unsigned long flags; 22 23 asm volatile( 24 "lbz %0,%1(13)" 25 : "=r" (flags) 26 : "i" (offsetof(struct paca_struct, soft_enabled))); 27 28 return flags; 29} 30 31static inline unsigned long arch_local_irq_disable(void) 32{ 33 unsigned long flags, zero; 34 35 asm volatile( 36 "li %1,0; lbz %0,%2(13); stb %1,%2(13)" 37 : "=r" (flags), "=&r" (zero) 38 : "i" (offsetof(struct paca_struct, soft_enabled)) 39 : "memory"); 40 41 return flags; 42} 43 44extern void arch_local_irq_restore(unsigned long); 45extern void iseries_handle_interrupts(void); 46 47static inline void arch_local_irq_enable(void) 48{ 49 arch_local_irq_restore(1); 50} 51 52static inline unsigned long arch_local_irq_save(void) 53{ 54 return arch_local_irq_disable(); 55} 56 57static inline bool arch_irqs_disabled_flags(unsigned long flags) 58{ 59 return flags == 0; 60} 61 62static inline bool arch_irqs_disabled(void) 63{ 64 return arch_irqs_disabled_flags(arch_local_save_flags()); 65} 66 67#ifdef CONFIG_PPC_BOOK3E 68#define __hard_irq_enable() asm volatile("wrteei 1" : : : "memory"); 69#define __hard_irq_disable() asm volatile("wrteei 0" : : : "memory"); 70#else 71#define __hard_irq_enable() __mtmsrd(mfmsr() | MSR_EE, 1) 72#define __hard_irq_disable() __mtmsrd(mfmsr() & ~MSR_EE, 1) 73#endif 74 75#define hard_irq_disable() \ 76 do { \ 77 __hard_irq_disable(); \ 78 get_paca()->soft_enabled = 0; \ 79 get_paca()->hard_enabled = 0; \ 80 } while(0) 81 82#else /* CONFIG_PPC64 */ 83 84#define SET_MSR_EE(x) mtmsr(x) 85 86static inline unsigned long arch_local_save_flags(void) 87{ 88 return mfmsr(); 89} 90 91static inline void arch_local_irq_restore(unsigned long flags) 92{ 93#if defined(CONFIG_BOOKE) 94 asm volatile("wrtee %0" : : "r" (flags) : "memory"); 95#else 96 mtmsr(flags); 97#endif 98} 99 100static inline unsigned long arch_local_irq_save(void) 101{ 102 unsigned long flags = arch_local_save_flags(); 103#ifdef CONFIG_BOOKE 104 asm volatile("wrteei 0" : : : "memory"); 105#else 106 SET_MSR_EE(flags & ~MSR_EE); 107#endif 108 return flags; 109} 110 111static inline void arch_local_irq_disable(void) 112{ 113#ifdef CONFIG_BOOKE 114 asm volatile("wrteei 0" : : : "memory"); 115#else 116 arch_local_irq_save(); 117#endif 118} 119 120static inline void arch_local_irq_enable(void) 121{ 122#ifdef CONFIG_BOOKE 123 asm volatile("wrteei 1" : : : "memory"); 124#else 125 unsigned long msr = mfmsr(); 126 SET_MSR_EE(msr | MSR_EE); 127#endif 128} 129 130static inline bool arch_irqs_disabled_flags(unsigned long flags) 131{ 132 return (flags & MSR_EE) == 0; 133} 134 135static inline bool arch_irqs_disabled(void) 136{ 137 return arch_irqs_disabled_flags(arch_local_save_flags()); 138} 139 140#define hard_irq_disable() arch_local_irq_disable() 141 142#endif /* CONFIG_PPC64 */ 143 144#define ARCH_IRQ_INIT_FLAGS IRQ_NOREQUEST 145 146/* 147 * interrupt-retrigger: should we handle this via lost interrupts and IPIs 148 * or should we not care like we do now ? --BenH. 149 */ 150struct irq_chip; 151 152#endif /* __KERNEL__ */ 153#endif /* _ASM_POWERPC_HW_IRQ_H */