2009-03-27 14:25:35 +01:00
/*
* Copyright ( C ) 2006 Atmark Techno , Inc .
*
* This file is subject to the terms and conditions of the GNU General Public
* License . See the file " COPYING " in the main directory of this archive
* for more details .
*/
# ifndef _ASM_MICROBLAZE_IRQFLAGS_H
# define _ASM_MICROBLAZE_IRQFLAGS_H
2010-10-07 14:08:55 +01:00
# include <linux/types.h>
2009-10-30 12:26:53 +01:00
# include <asm/registers.h>
2009-03-27 14:25:35 +01:00
2011-02-07 13:32:55 +01:00
# if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR
2010-10-07 14:08:55 +01:00
2011-07-01 23:04:40 -04:00
static inline notrace unsigned long arch_local_irq_save ( void )
2010-10-07 14:08:55 +01:00
{
unsigned long flags ;
asm volatile ( " msrclr %0, %1 \n "
" nop \n "
: " =r " ( flags )
: " i " ( MSR_IE )
: " memory " ) ;
return flags ;
}
2011-07-01 23:04:40 -04:00
static inline notrace void arch_local_irq_disable ( void )
2010-10-07 14:08:55 +01:00
{
/* this uses r0 without declaring it - is that correct? */
asm volatile ( " msrclr r0, %0 \n "
" nop \n "
:
: " i " ( MSR_IE )
: " memory " ) ;
}
2011-07-01 23:04:40 -04:00
static inline notrace void arch_local_irq_enable ( void )
2010-10-07 14:08:55 +01:00
{
/* this uses r0 without declaring it - is that correct? */
asm volatile ( " msrset r0, %0 \n "
" nop \n "
:
: " i " ( MSR_IE )
: " memory " ) ;
}
# else /* !CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR */
2011-07-01 23:04:40 -04:00
static inline notrace unsigned long arch_local_irq_save ( void )
2010-10-07 14:08:55 +01:00
{
unsigned long flags , tmp ;
asm volatile ( " mfs %0, rmsr \n "
" nop \n "
" andi %1, %0, %2 \n "
" mts rmsr, %1 \n "
" nop \n "
: " =r " ( flags ) , " =r " ( tmp )
: " i " ( ~ MSR_IE )
: " memory " ) ;
return flags ;
}
2011-07-01 23:04:40 -04:00
static inline notrace void arch_local_irq_disable ( void )
2010-10-07 14:08:55 +01:00
{
unsigned long tmp ;
asm volatile ( " mfs %0, rmsr \n "
" nop \n "
" andi %0, %0, %1 \n "
" mts rmsr, %0 \n "
" nop \n "
: " =r " ( tmp )
: " i " ( ~ MSR_IE )
: " memory " ) ;
}
2011-07-01 23:04:40 -04:00
static inline notrace void arch_local_irq_enable ( void )
2010-10-07 14:08:55 +01:00
{
unsigned long tmp ;
asm volatile ( " mfs %0, rmsr \n "
" nop \n "
" ori %0, %0, %1 \n "
" mts rmsr, %0 \n "
" nop \n "
: " =r " ( tmp )
: " i " ( MSR_IE )
: " memory " ) ;
}
# endif /* CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR */
2011-07-01 23:04:40 -04:00
static inline notrace unsigned long arch_local_save_flags ( void )
2009-03-27 14:25:35 +01:00
{
unsigned long flags ;
2010-10-07 14:08:55 +01:00
asm volatile ( " mfs %0, rmsr \n "
" nop \n "
: " =r " ( flags )
:
: " memory " ) ;
2009-10-30 12:26:53 +01:00
return flags ;
2009-03-27 14:25:35 +01:00
}
2011-07-01 23:04:40 -04:00
static inline notrace void arch_local_irq_restore ( unsigned long flags )
2010-10-07 14:08:55 +01:00
{
asm volatile ( " mts rmsr, %0 \n "
" nop \n "
:
: " r " ( flags )
: " memory " ) ;
}
2011-07-01 23:04:40 -04:00
static inline notrace bool arch_irqs_disabled_flags ( unsigned long flags )
2010-10-07 14:08:55 +01:00
{
return ( flags & MSR_IE ) = = 0 ;
}
2011-07-01 23:04:40 -04:00
static inline notrace bool arch_irqs_disabled ( void )
2010-10-07 14:08:55 +01:00
{
return arch_irqs_disabled_flags ( arch_local_save_flags ( ) ) ;
}
2009-03-27 14:25:35 +01:00
# endif /* _ASM_MICROBLAZE_IRQFLAGS_H */