Blame view

include/asm-powerpc/hw_irq.h 2.79 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
  /*
   * Copyright (C) 1999 Cort Dougan <cort@cs.nmt.edu>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3
   */
b671ad2be   Kumar Gala   [PATCH] powerpc: ...
4
5
  #ifndef _ASM_POWERPC_HW_IRQ_H
  #define _ASM_POWERPC_HW_IRQ_H
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6
  #ifdef __KERNEL__
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
8
  #include <linux/errno.h>
d04c56f73   Paul Mackerras   [POWERPC] Lazy in...
9
  #include <linux/compiler.h>
b671ad2be   Kumar Gala   [PATCH] powerpc: ...
10
11
  #include <asm/ptrace.h>
  #include <asm/processor.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
12

c7aeffc4d   Kumar Gala   [PATCH] powerpc: ...
13
  extern void timer_interrupt(struct pt_regs *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
14

d04c56f73   Paul Mackerras   [POWERPC] Lazy in...
15
16
17
18
19
  #ifdef CONFIG_PPC64
  #include <asm/paca.h>
  
  static inline unsigned long local_get_flags(void)
  {
ef2b343e9   Hugh Dickins   [POWERPC] Make so...
20
21
22
23
24
25
26
  	unsigned long flags;
  
  	__asm__ __volatile__("lbz %0,%1(13)"
  	: "=r" (flags)
  	: "i" (offsetof(struct paca_struct, soft_enabled)));
  
  	return flags;
d04c56f73   Paul Mackerras   [POWERPC] Lazy in...
27
28
29
30
  }
  
  static inline unsigned long local_irq_disable(void)
  {
ef2b343e9   Hugh Dickins   [POWERPC] Make so...
31
32
33
34
35
36
37
38
  	unsigned long flags, zero;
  
  	__asm__ __volatile__("li %1,0; lbz %0,%2(13); stb %1,%2(13)"
  	: "=r" (flags), "=&r" (zero)
  	: "i" (offsetof(struct paca_struct, soft_enabled))
  	: "memory");
  
  	return flags;
d04c56f73   Paul Mackerras   [POWERPC] Lazy in...
39
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
40

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
41
  extern void local_irq_restore(unsigned long);
d04c56f73   Paul Mackerras   [POWERPC] Lazy in...
42
  extern void iseries_handle_interrupts(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
43
44
45
46
47
48
  
  #define local_irq_enable()	local_irq_restore(1)
  #define local_save_flags(flags)	((flags) = local_get_flags())
  #define local_irq_save(flags)	((flags) = local_irq_disable())
  
  #define irqs_disabled()		(local_get_flags() == 0)
e1fa2e136   Benjamin Herrenschmidt   powerpc: fixup ha...
49
50
51
52
53
54
55
56
57
  #define __hard_irq_enable()	__mtmsrd(mfmsr() | MSR_EE, 1)
  #define __hard_irq_disable()	__mtmsrd(mfmsr() & ~MSR_EE, 1)
  
  #define  hard_irq_disable()			\
  	do {					\
  		__hard_irq_disable();		\
  		get_paca()->soft_enabled = 0;	\
  		get_paca()->hard_enabled = 0;	\
  	} while(0)
d04c56f73   Paul Mackerras   [POWERPC] Lazy in...
58

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
59
  #else
b671ad2be   Kumar Gala   [PATCH] powerpc: ...
60
61
62
  #if defined(CONFIG_BOOKE)
  #define SET_MSR_EE(x)	mtmsr(x)
  #define local_irq_restore(flags)	__asm__ __volatile__("wrtee %0" : : "r" (flags) : "memory")
b671ad2be   Kumar Gala   [PATCH] powerpc: ...
63
64
65
66
  #else
  #define SET_MSR_EE(x)	mtmsr(x)
  #define local_irq_restore(flags)	mtmsr(flags)
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
67
68
69
  
  static inline void local_irq_disable(void)
  {
b671ad2be   Kumar Gala   [PATCH] powerpc: ...
70
71
72
  #ifdef CONFIG_BOOKE
  	__asm__ __volatile__("wrteei 0": : :"memory");
  #else
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
73
  	unsigned long msr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
74
  	__asm__ __volatile__("": : :"memory");
b671ad2be   Kumar Gala   [PATCH] powerpc: ...
75
76
77
  	msr = mfmsr();
  	SET_MSR_EE(msr & ~MSR_EE);
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
78
79
80
81
  }
  
  static inline void local_irq_enable(void)
  {
b671ad2be   Kumar Gala   [PATCH] powerpc: ...
82
83
84
  #ifdef CONFIG_BOOKE
  	__asm__ __volatile__("wrteei 1": : :"memory");
  #else
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
85
86
87
  	unsigned long msr;
  	__asm__ __volatile__("": : :"memory");
  	msr = mfmsr();
b671ad2be   Kumar Gala   [PATCH] powerpc: ...
88
89
  	SET_MSR_EE(msr | MSR_EE);
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
90
  }
b671ad2be   Kumar Gala   [PATCH] powerpc: ...
91
  static inline void local_irq_save_ptr(unsigned long *flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
92
93
94
95
  {
  	unsigned long msr;
  	msr = mfmsr();
  	*flags = msr;
b671ad2be   Kumar Gala   [PATCH] powerpc: ...
96
97
98
99
100
  #ifdef CONFIG_BOOKE
  	__asm__ __volatile__("wrteei 0": : :"memory");
  #else
  	SET_MSR_EE(msr & ~MSR_EE);
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
101
102
  	__asm__ __volatile__("": : :"memory");
  }
b671ad2be   Kumar Gala   [PATCH] powerpc: ...
103
104
105
  #define local_save_flags(flags)	((flags) = mfmsr())
  #define local_irq_save(flags)	local_irq_save_ptr(&flags)
  #define irqs_disabled()		((mfmsr() & MSR_EE) == 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
106

143db67af   Michael Ellerman   [POWERPC] Provide...
107
108
  #define hard_irq_enable()	local_irq_enable()
  #define hard_irq_disable()	local_irq_disable()
d04c56f73   Paul Mackerras   [POWERPC] Lazy in...
109
  #endif /* CONFIG_PPC64 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
110

c0ad90a32   Ingo Molnar   [PATCH] genirq: a...
111
112
113
  /*
   * interrupt-retrigger: should we handle this via lost interrupts and IPIs
   * or should we not care like we do now ? --BenH.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
114
115
   */
  struct hw_interrupt_type;
b671ad2be   Kumar Gala   [PATCH] powerpc: ...
116
117
118
  
  #endif	/* __KERNEL__ */
  #endif	/* _ASM_POWERPC_HW_IRQ_H */