hw_irq.h 3.9 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3
/*
 * Copyright (C) 1999 Cort Dougan <cort@cs.nmt.edu>
 */
K
Kumar Gala 已提交
4 5 6
#ifndef _ASM_POWERPC_HW_IRQ_H
#define _ASM_POWERPC_HW_IRQ_H

L
Linus Torvalds 已提交
7 8 9
#ifdef __KERNEL__

#include <linux/errno.h>
10
#include <linux/compiler.h>
K
Kumar Gala 已提交
11 12
#include <asm/ptrace.h>
#include <asm/processor.h>
L
Linus Torvalds 已提交
13

14
extern void timer_interrupt(struct pt_regs *);
L
Linus Torvalds 已提交
15

16 17 18 19 20
#ifdef CONFIG_PPC64
#include <asm/paca.h>

static inline unsigned long local_get_flags(void)
{
21 22 23 24 25 26 27
	unsigned long flags;

	__asm__ __volatile__("lbz %0,%1(13)"
	: "=r" (flags)
	: "i" (offsetof(struct paca_struct, soft_enabled)));

	return flags;
28 29
}

30
static inline unsigned long raw_local_irq_disable(void)
31
{
32 33 34 35 36 37 38 39
	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;
40
}
L
Linus Torvalds 已提交
41

42
extern void raw_local_irq_restore(unsigned long);
43
extern void iseries_handle_interrupts(void);
L
Linus Torvalds 已提交
44

45 46 47
#define raw_local_irq_enable()		raw_local_irq_restore(1)
#define raw_local_save_flags(flags)	((flags) = local_get_flags())
#define raw_local_irq_save(flags)	((flags) = raw_local_irq_disable())
L
Linus Torvalds 已提交
48

49 50
#define raw_irqs_disabled()		(local_get_flags() == 0)
#define raw_irqs_disabled_flags(flags)	((flags) == 0)
L
Linus Torvalds 已提交
51

52 53 54 55
#ifdef CONFIG_PPC_BOOK3E
#define __hard_irq_enable()	__asm__ __volatile__("wrteei 1": : :"memory");
#define __hard_irq_disable()	__asm__ __volatile__("wrteei 0": : :"memory");
#else
56 57
#define __hard_irq_enable()	__mtmsrd(mfmsr() | MSR_EE, 1)
#define __hard_irq_disable()	__mtmsrd(mfmsr() & ~MSR_EE, 1)
58
#endif
59 60 61 62 63 64 65

#define  hard_irq_disable()			\
	do {					\
		__hard_irq_disable();		\
		get_paca()->soft_enabled = 0;	\
		get_paca()->hard_enabled = 0;	\
	} while(0)
66

67 68 69 70 71
static inline int irqs_disabled_flags(unsigned long flags)
{
	return flags == 0;
}

L
Linus Torvalds 已提交
72 73
#else

K
Kumar Gala 已提交
74 75
#if defined(CONFIG_BOOKE)
#define SET_MSR_EE(x)	mtmsr(x)
76
#define raw_local_irq_restore(flags)	__asm__ __volatile__("wrtee %0" : : "r" (flags) : "memory")
K
Kumar Gala 已提交
77 78
#else
#define SET_MSR_EE(x)	mtmsr(x)
79
#define raw_local_irq_restore(flags)	mtmsr(flags)
K
Kumar Gala 已提交
80
#endif
L
Linus Torvalds 已提交
81

82
static inline void raw_local_irq_disable(void)
L
Linus Torvalds 已提交
83
{
K
Kumar Gala 已提交
84 85 86
#ifdef CONFIG_BOOKE
	__asm__ __volatile__("wrteei 0": : :"memory");
#else
L
Linus Torvalds 已提交
87
	unsigned long msr;
88

K
Kumar Gala 已提交
89 90 91
	msr = mfmsr();
	SET_MSR_EE(msr & ~MSR_EE);
#endif
L
Linus Torvalds 已提交
92 93
}

94
static inline void raw_local_irq_enable(void)
L
Linus Torvalds 已提交
95
{
K
Kumar Gala 已提交
96 97 98
#ifdef CONFIG_BOOKE
	__asm__ __volatile__("wrteei 1": : :"memory");
#else
L
Linus Torvalds 已提交
99
	unsigned long msr;
100

L
Linus Torvalds 已提交
101
	msr = mfmsr();
K
Kumar Gala 已提交
102 103
	SET_MSR_EE(msr | MSR_EE);
#endif
L
Linus Torvalds 已提交
104 105
}

106
static inline void raw_local_irq_save_ptr(unsigned long *flags)
L
Linus Torvalds 已提交
107 108 109 110
{
	unsigned long msr;
	msr = mfmsr();
	*flags = msr;
K
Kumar Gala 已提交
111 112 113 114 115
#ifdef CONFIG_BOOKE
	__asm__ __volatile__("wrteei 0": : :"memory");
#else
	SET_MSR_EE(msr & ~MSR_EE);
#endif
L
Linus Torvalds 已提交
116 117
}

118 119 120 121
#define raw_local_save_flags(flags)	((flags) = mfmsr())
#define raw_local_irq_save(flags)	raw_local_irq_save_ptr(&flags)
#define raw_irqs_disabled()		((mfmsr() & MSR_EE) == 0)
#define raw_irqs_disabled_flags(flags)	(((flags) & MSR_EE) == 0)
L
Linus Torvalds 已提交
122

123
#define hard_irq_disable()		raw_local_irq_disable()
124

125 126 127 128 129
static inline int irqs_disabled_flags(unsigned long flags)
{
	return (flags & MSR_EE) == 0;
}

130
#endif /* CONFIG_PPC64 */
L
Linus Torvalds 已提交
131

132 133 134
/*
 * interrupt-retrigger: should we handle this via lost interrupts and IPIs
 * or should we not care like we do now ? --BenH.
L
Linus Torvalds 已提交
135
 */
136
struct irq_chip;
K
Kumar Gala 已提交
137

138
#ifdef CONFIG_PERF_EVENTS
139 140

#ifdef CONFIG_PPC64
141
static inline unsigned long test_perf_event_pending(void)
142 143 144 145 146
{
	unsigned long x;

	asm volatile("lbz %0,%1(13)"
		: "=r" (x)
147
		: "i" (offsetof(struct paca_struct, perf_event_pending)));
148 149 150
	return x;
}

151
static inline void set_perf_event_pending(void)
152 153
{
	asm volatile("stb %0,%1(13)" : :
154
		"r" (1),
155
		"i" (offsetof(struct paca_struct, perf_event_pending)));
156 157
}

158
static inline void clear_perf_event_pending(void)
159 160 161
{
	asm volatile("stb %0,%1(13)" : :
		"r" (0),
162
		"i" (offsetof(struct paca_struct, perf_event_pending)));
163
}
164
#endif /* CONFIG_PPC64 */
165

166
#else  /* CONFIG_PERF_EVENTS */
167

168
static inline unsigned long test_perf_event_pending(void)
169 170 171 172
{
	return 0;
}

173 174
static inline void clear_perf_event_pending(void) {}
#endif /* CONFIG_PERF_EVENTS */
175

K
Kumar Gala 已提交
176 177
#endif	/* __KERNEL__ */
#endif	/* _ASM_POWERPC_HW_IRQ_H */