1/*
2 * include/asm-sparc64/irqflags.h
3 *
4 * IRQ flags handling
5 *
6 * This file gets included from lowlevel asm headers too, to provide
7 * wrapped versions of the local_irq_*() APIs, based on the
8 * raw_local_irq_*() functions from the lowlevel headers.
9 */
10#ifndef _ASM_IRQFLAGS_H
11#define _ASM_IRQFLAGS_H
12
13#ifndef __ASSEMBLY__
14
15static inline unsigned long __raw_local_save_flags(void)
16{
17	unsigned long flags;
18
19	__asm__ __volatile__(
20		"rdpr	%%pil, %0"
21		: "=r" (flags)
22	);
23
24	return flags;
25}
26
27#define raw_local_save_flags(flags) \
28		do { (flags) = __raw_local_save_flags(); } while (0)
29
30static inline void raw_local_irq_restore(unsigned long flags)
31{
32	__asm__ __volatile__(
33		"wrpr	%0, %%pil"
34		: /* no output */
35		: "r" (flags)
36		: "memory"
37	);
38}
39
40static inline void raw_local_irq_disable(void)
41{
42	__asm__ __volatile__(
43		"wrpr	15, %%pil"
44		: /* no outputs */
45		: /* no inputs */
46		: "memory"
47	);
48}
49
50static inline void raw_local_irq_enable(void)
51{
52	__asm__ __volatile__(
53		"wrpr	0, %%pil"
54		: /* no outputs */
55		: /* no inputs */
56		: "memory"
57	);
58}
59
60static inline int raw_irqs_disabled_flags(unsigned long flags)
61{
62	return (flags > 0);
63}
64
65static inline int raw_irqs_disabled(void)
66{
67	unsigned long flags = __raw_local_save_flags();
68
69	return raw_irqs_disabled_flags(flags);
70}
71
72/*
73 * For spinlocks, etc:
74 */
75static inline unsigned long __raw_local_irq_save(void)
76{
77	unsigned long flags = __raw_local_save_flags();
78
79	raw_local_irq_disable();
80
81	return flags;
82}
83
84#define raw_local_irq_save(flags) \
85		do { (flags) = __raw_local_irq_save(); } while (0)
86
87#endif /* (__ASSEMBLY__) */
88
89#endif /* !(_ASM_IRQFLAGS_H) */
90