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 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 71 72 73 74 75
#if defined(CONFIG_BOOKE)
#define SET_MSR_EE(x)	mtmsr(x)
#define local_irq_restore(flags)	__asm__ __volatile__("wrtee %0" : : "r" (flags) : "memory")
#else
#define SET_MSR_EE(x)	mtmsr(x)
#define local_irq_restore(flags)	mtmsr(flags)
#endif
L
Linus Torvalds 已提交
76 77 78

static inline void local_irq_disable(void)
{
K
Kumar Gala 已提交
79 80 81
#ifdef CONFIG_BOOKE
	__asm__ __volatile__("wrteei 0": : :"memory");
#else
L
Linus Torvalds 已提交
82 83
	unsigned long msr;
	__asm__ __volatile__("": : :"memory");
K
Kumar Gala 已提交
84 85 86
	msr = mfmsr();
	SET_MSR_EE(msr & ~MSR_EE);
#endif
L
Linus Torvalds 已提交
87 88 89 90
}

static inline void local_irq_enable(void)
{
K
Kumar Gala 已提交
91 92 93
#ifdef CONFIG_BOOKE
	__asm__ __volatile__("wrteei 1": : :"memory");
#else
L
Linus Torvalds 已提交
94 95 96
	unsigned long msr;
	__asm__ __volatile__("": : :"memory");
	msr = mfmsr();
K
Kumar Gala 已提交
97 98
	SET_MSR_EE(msr | MSR_EE);
#endif
L
Linus Torvalds 已提交
99 100
}

K
Kumar Gala 已提交
101
static inline void 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
	__asm__ __volatile__("": : :"memory");
}

K
Kumar Gala 已提交
114 115 116
#define local_save_flags(flags)	((flags) = mfmsr())
#define local_irq_save(flags)	local_irq_save_ptr(&flags)
#define irqs_disabled()		((mfmsr() & MSR_EE) == 0)
L
Linus Torvalds 已提交
117

118 119 120
#define hard_irq_enable()	local_irq_enable()
#define hard_irq_disable()	local_irq_disable()

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

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

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

134 135 136 137 138 139 140 141 142 143 144
#ifdef CONFIG_PERF_COUNTERS
static inline unsigned long get_perf_counter_pending(void)
{
	unsigned long x;

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

145
static inline void set_perf_counter_pending(void)
146 147
{
	asm volatile("stb %0,%1(13)" : :
148 149 150 151 152 153 154 155
		"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),
156 157 158 159 160 161 162 163 164 165 166 167
		"i" (offsetof(struct paca_struct, perf_counter_pending)));
}

extern void perf_counter_do_pending(void);

#else

static inline unsigned long get_perf_counter_pending(void)
{
	return 0;
}

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

K
Kumar Gala 已提交
173 174
#endif	/* __KERNEL__ */
#endif	/* _ASM_POWERPC_HW_IRQ_H */