2006-07-03 11:24:46 +04:00
/*
2012-07-20 13:15:04 +04:00
* Copyright IBM Corp . 2006 , 2010
2010-01-27 12:12:36 +03:00
* Author ( s ) : Martin Schwidefsky < schwidefsky @ de . ibm . com >
2006-07-03 11:24:46 +04:00
*/
# ifndef __ASM_IRQFLAGS_H
# define __ASM_IRQFLAGS_H
2010-01-27 12:12:36 +03:00
# include <linux/types.h>
2006-07-03 11:24:46 +04:00
2016-01-11 11:17:18 +03:00
# define ARCH_IRQ_ENABLED (3UL << (BITS_PER_LONG - 8))
2010-10-07 17:08:55 +04:00
/* store then OR system mask. */
# define __arch_local_irq_stosm(__or) \
2006-09-28 18:56:43 +04:00
( { \
unsigned long __mask ; \
asm volatile ( \
" stosm %0,%1 " \
: " =Q " ( __mask ) : " i " ( __or ) : " memory " ) ; \
__mask ; \
} )
2010-10-07 17:08:55 +04:00
/* store then AND system mask. */
# define __arch_local_irq_stnsm(__and) \
2006-09-28 18:56:43 +04:00
( { \
unsigned long __mask ; \
asm volatile ( \
" stnsm %0,%1 " \
: " =Q " ( __mask ) : " i " ( __and ) : " memory " ) ; \
__mask ; \
} )
/* set system mask. */
2011-07-24 12:47:58 +04:00
static inline notrace void __arch_local_irq_ssm ( unsigned long flags )
2010-10-07 17:08:55 +04:00
{
asm volatile ( " ssm %0 " : : " Q " ( flags ) : " memory " ) ;
}
2006-09-28 18:56:43 +04:00
2011-07-24 12:47:58 +04:00
static inline notrace unsigned long arch_local_save_flags ( void )
2006-09-28 18:56:43 +04:00
{
2014-12-16 12:25:37 +03:00
return __arch_local_irq_stnsm ( 0xff ) ;
2006-09-28 18:56:43 +04:00
}
2006-07-12 18:39:47 +04:00
2011-07-24 12:47:58 +04:00
static inline notrace unsigned long arch_local_irq_save ( void )
2006-09-28 18:56:43 +04:00
{
2010-10-07 17:08:55 +04:00
return __arch_local_irq_stnsm ( 0xfc ) ;
2006-09-28 18:56:43 +04:00
}
2011-07-24 12:47:58 +04:00
static inline notrace void arch_local_irq_disable ( void )
2010-10-07 17:08:55 +04:00
{
arch_local_irq_save ( ) ;
}
2006-07-03 11:24:46 +04:00
2011-07-24 12:47:58 +04:00
static inline notrace void arch_local_irq_enable ( void )
2006-09-28 18:56:43 +04:00
{
2010-10-07 17:08:55 +04:00
__arch_local_irq_stosm ( 0x03 ) ;
2006-09-28 18:56:43 +04:00
}
2006-07-03 11:24:46 +04:00
2016-01-11 11:17:18 +03:00
/* This only restores external and I/O interrupt state */
2011-07-24 12:47:58 +04:00
static inline notrace void arch_local_irq_restore ( unsigned long flags )
2010-10-07 17:08:55 +04:00
{
2016-01-11 11:17:18 +03:00
/* only disabled->disabled and disabled->enabled is valid */
if ( flags & ARCH_IRQ_ENABLED )
arch_local_irq_enable ( ) ;
2010-10-07 17:08:55 +04:00
}
2011-07-24 12:47:58 +04:00
static inline notrace bool arch_irqs_disabled_flags ( unsigned long flags )
2006-07-03 11:24:46 +04:00
{
2016-01-11 11:17:18 +03:00
return ! ( flags & ARCH_IRQ_ENABLED ) ;
2006-07-03 11:24:46 +04:00
}
2011-07-24 12:47:58 +04:00
static inline notrace bool arch_irqs_disabled ( void )
2010-10-07 17:08:55 +04:00
{
return arch_irqs_disabled_flags ( arch_local_save_flags ( ) ) ;
}
2006-07-03 11:24:46 +04:00
# endif /* __ASM_IRQFLAGS_H */