xref: /openbmc/linux/arch/s390/include/asm/irqflags.h (revision 56a0eccd)
1 /*
2  *    Copyright IBM Corp. 2006, 2010
3  *    Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>
4  */
5 
6 #ifndef __ASM_IRQFLAGS_H
7 #define __ASM_IRQFLAGS_H
8 
9 #include <linux/types.h>
10 
11 #define ARCH_IRQ_ENABLED	(3UL << (BITS_PER_LONG - 8))
12 
13 /* store then OR system mask. */
14 #define __arch_local_irq_stosm(__or)					\
15 ({									\
16 	unsigned long __mask;						\
17 	asm volatile(							\
18 		"	stosm	%0,%1"					\
19 		: "=Q" (__mask) : "i" (__or) : "memory");		\
20 	__mask;								\
21 })
22 
23 /* store then AND system mask. */
24 #define __arch_local_irq_stnsm(__and)					\
25 ({									\
26 	unsigned long __mask;						\
27 	asm volatile(							\
28 		"	stnsm	%0,%1"					\
29 		: "=Q" (__mask) : "i" (__and) : "memory");		\
30 	__mask;								\
31 })
32 
33 /* set system mask. */
34 static inline notrace void __arch_local_irq_ssm(unsigned long flags)
35 {
36 	asm volatile("ssm   %0" : : "Q" (flags) : "memory");
37 }
38 
39 static inline notrace unsigned long arch_local_save_flags(void)
40 {
41 	return __arch_local_irq_stnsm(0xff);
42 }
43 
44 static inline notrace unsigned long arch_local_irq_save(void)
45 {
46 	return __arch_local_irq_stnsm(0xfc);
47 }
48 
49 static inline notrace void arch_local_irq_disable(void)
50 {
51 	arch_local_irq_save();
52 }
53 
54 static inline notrace void arch_local_irq_enable(void)
55 {
56 	__arch_local_irq_stosm(0x03);
57 }
58 
59 /* This only restores external and I/O interrupt state */
60 static inline notrace void arch_local_irq_restore(unsigned long flags)
61 {
62 	/* only disabled->disabled and disabled->enabled is valid */
63 	if (flags & ARCH_IRQ_ENABLED)
64 		arch_local_irq_enable();
65 }
66 
67 static inline notrace bool arch_irqs_disabled_flags(unsigned long flags)
68 {
69 	return !(flags & ARCH_IRQ_ENABLED);
70 }
71 
72 static inline notrace bool arch_irqs_disabled(void)
73 {
74 	return arch_irqs_disabled_flags(arch_local_save_flags());
75 }
76 
77 #endif /* __ASM_IRQFLAGS_H */
78