1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2c6557e7fSMartin Schwidefsky /* 3428aecf6SHeiko Carstens * Copyright IBM Corp. 2006, 2010 4428aecf6SHeiko Carstens * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com> 5c6557e7fSMartin Schwidefsky */ 6c6557e7fSMartin Schwidefsky 7c6557e7fSMartin Schwidefsky #ifndef __ASM_IRQFLAGS_H 8c6557e7fSMartin Schwidefsky #define __ASM_IRQFLAGS_H 9c6557e7fSMartin Schwidefsky 10428aecf6SHeiko Carstens #include <linux/types.h> 11c6557e7fSMartin Schwidefsky 12204ee2c5SChristian Borntraeger #define ARCH_IRQ_ENABLED (3UL << (BITS_PER_LONG - 8)) 13204ee2c5SChristian Borntraeger 14df9ee292SDavid Howells /* store then OR system mask. */ 15df9ee292SDavid Howells #define __arch_local_irq_stosm(__or) \ 16c6557e7fSMartin Schwidefsky ({ \ 17c6557e7fSMartin Schwidefsky unsigned long __mask; \ 18c6557e7fSMartin Schwidefsky asm volatile( \ 19c6557e7fSMartin Schwidefsky " stosm %0,%1" \ 20c6557e7fSMartin Schwidefsky : "=Q" (__mask) : "i" (__or) : "memory"); \ 21c6557e7fSMartin Schwidefsky __mask; \ 22c6557e7fSMartin Schwidefsky }) 23c6557e7fSMartin Schwidefsky 24df9ee292SDavid Howells /* store then AND system mask. */ 25df9ee292SDavid Howells #define __arch_local_irq_stnsm(__and) \ 26c6557e7fSMartin Schwidefsky ({ \ 27c6557e7fSMartin Schwidefsky unsigned long __mask; \ 28c6557e7fSMartin Schwidefsky asm volatile( \ 29c6557e7fSMartin Schwidefsky " stnsm %0,%1" \ 30c6557e7fSMartin Schwidefsky : "=Q" (__mask) : "i" (__and) : "memory"); \ 31c6557e7fSMartin Schwidefsky __mask; \ 32c6557e7fSMartin Schwidefsky }) 33c6557e7fSMartin Schwidefsky 34c6557e7fSMartin Schwidefsky /* set system mask. */ 35f433c4aeSSteven Rostedt static inline notrace void __arch_local_irq_ssm(unsigned long flags) 36c6557e7fSMartin Schwidefsky { 37df9ee292SDavid Howells asm volatile("ssm %0" : : "Q" (flags) : "memory"); 38c6557e7fSMartin Schwidefsky } 39c6557e7fSMartin Schwidefsky 40f433c4aeSSteven Rostedt static inline notrace unsigned long arch_local_save_flags(void) 41c6557e7fSMartin Schwidefsky { 4281fc77fbSChristian Borntraeger return __arch_local_irq_stnsm(0xff); 43c6557e7fSMartin Schwidefsky } 44c6557e7fSMartin Schwidefsky 45f433c4aeSSteven Rostedt static inline notrace unsigned long arch_local_irq_save(void) 46c6557e7fSMartin Schwidefsky { 47df9ee292SDavid Howells return __arch_local_irq_stnsm(0xfc); 48c6557e7fSMartin Schwidefsky } 49c6557e7fSMartin Schwidefsky 50f433c4aeSSteven Rostedt static inline notrace void arch_local_irq_disable(void) 51df9ee292SDavid Howells { 52df9ee292SDavid Howells arch_local_irq_save(); 53df9ee292SDavid Howells } 54df9ee292SDavid Howells 55f433c4aeSSteven Rostedt static inline notrace void arch_local_irq_enable(void) 56df9ee292SDavid Howells { 57df9ee292SDavid Howells __arch_local_irq_stosm(0x03); 58df9ee292SDavid Howells } 59df9ee292SDavid Howells 60204ee2c5SChristian Borntraeger /* This only restores external and I/O interrupt state */ 61f433c4aeSSteven Rostedt static inline notrace void arch_local_irq_restore(unsigned long flags) 62df9ee292SDavid Howells { 63204ee2c5SChristian Borntraeger /* only disabled->disabled and disabled->enabled is valid */ 64204ee2c5SChristian Borntraeger if (flags & ARCH_IRQ_ENABLED) 65204ee2c5SChristian Borntraeger arch_local_irq_enable(); 66df9ee292SDavid Howells } 67df9ee292SDavid Howells 68f433c4aeSSteven Rostedt static inline notrace bool arch_irqs_disabled_flags(unsigned long flags) 69c6557e7fSMartin Schwidefsky { 70204ee2c5SChristian Borntraeger return !(flags & ARCH_IRQ_ENABLED); 71c6557e7fSMartin Schwidefsky } 72c6557e7fSMartin Schwidefsky 73f433c4aeSSteven Rostedt static inline notrace bool arch_irqs_disabled(void) 74df9ee292SDavid Howells { 75df9ee292SDavid Howells return arch_irqs_disabled_flags(arch_local_save_flags()); 76df9ee292SDavid Howells } 77c6557e7fSMartin Schwidefsky 78c6557e7fSMartin Schwidefsky #endif /* __ASM_IRQFLAGS_H */ 79