hw_irq.h 3.8 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 56 57 58 59 60
#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)
61

62 63 64 65 66
static inline int irqs_disabled_flags(unsigned long flags)
{
	return flags == 0;
}

L
Linus Torvalds 已提交
67 68
#else

K
Kumar Gala 已提交
69 70
#if defined(CONFIG_BOOKE)
#define SET_MSR_EE(x)	mtmsr(x)
71
#define raw_local_irq_restore(flags)	__asm__ __volatile__("wrtee %0" : : "r" (flags) : "memory")
K
Kumar Gala 已提交
72 73
#else
#define SET_MSR_EE(x)	mtmsr(x)
74
#define raw_local_irq_restore(flags)	mtmsr(flags)
K
Kumar Gala 已提交
75
#endif
L
Linus Torvalds 已提交
76

77
static inline void raw_local_irq_disable(void)
L
Linus Torvalds 已提交
78
{
K
Kumar Gala 已提交
79 80 81
#ifdef CONFIG_BOOKE
	__asm__ __volatile__("wrteei 0": : :"memory");
#else
L
Linus Torvalds 已提交
82
	unsigned long msr;
83

K
Kumar Gala 已提交
84 85 86
	msr = mfmsr();
	SET_MSR_EE(msr & ~MSR_EE);
#endif
L
Linus Torvalds 已提交
87 88
}

89
static inline void raw_local_irq_enable(void)
L
Linus Torvalds 已提交
90
{
K
Kumar Gala 已提交
91 92 93
#ifdef CONFIG_BOOKE
	__asm__ __volatile__("wrteei 1": : :"memory");
#else
L
Linus Torvalds 已提交
94
	unsigned long msr;
95

L
Linus Torvalds 已提交
96
	msr = mfmsr();
K
Kumar Gala 已提交
97 98
	SET_MSR_EE(msr | MSR_EE);
#endif
L
Linus Torvalds 已提交
99 100
}

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

113 114 115 116
#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 已提交
117

118
#define hard_irq_disable()		raw_local_irq_disable()
119

120 121 122 123 124
static inline int irqs_disabled_flags(unsigned long flags)
{
	return (flags & MSR_EE) == 0;
}

125
#endif /* CONFIG_PPC64 */
L
Linus Torvalds 已提交
126

127 128 129
/*
 * interrupt-retrigger: should we handle this via lost interrupts and IPIs
 * or should we not care like we do now ? --BenH.
L
Linus Torvalds 已提交
130
 */
131
struct irq_chip;
K
Kumar Gala 已提交
132

133
#ifdef CONFIG_PERF_COUNTERS
134 135

#ifdef CONFIG_PPC64
136
static inline unsigned long test_perf_counter_pending(void)
137 138 139 140 141 142 143 144 145
{
	unsigned long x;

	asm volatile("lbz %0,%1(13)"
		: "=r" (x)
		: "i" (offsetof(struct paca_struct, perf_counter_pending)));
	return x;
}

146
static inline void set_perf_counter_pending(void)
147 148
{
	asm volatile("stb %0,%1(13)" : :
149 150 151 152 153 154 155 156
		"r" (1),
		"i" (offsetof(struct paca_struct, perf_counter_pending)));
}

static inline void clear_perf_counter_pending(void)
{
	asm volatile("stb %0,%1(13)" : :
		"r" (0),
157 158
		"i" (offsetof(struct paca_struct, perf_counter_pending)));
}
159
#endif /* CONFIG_PPC64 */
160

161
#else  /* CONFIG_PERF_COUNTERS */
162

163
static inline unsigned long test_perf_counter_pending(void)
164 165 166 167
{
	return 0;
}

168
static inline void clear_perf_counter_pending(void) {}
169 170
#endif /* CONFIG_PERF_COUNTERS */

K
Kumar Gala 已提交
171 172
#endif	/* __KERNEL__ */
#endif	/* _ASM_POWERPC_HW_IRQ_H */