linux/arch/microblaze/include/asm/irqflags.h
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2006 Atmark Techno, Inc.
   3 *
   4 * This file is subject to the terms and conditions of the GNU General Public
   5 * License. See the file "COPYING" in the main directory of this archive
   6 * for more details.
   7 */
   8
   9#ifndef _ASM_MICROBLAZE_IRQFLAGS_H
  10#define _ASM_MICROBLAZE_IRQFLAGS_H
  11
  12#include <linux/types.h>
  13#include <asm/registers.h>
  14
  15#if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR
  16
  17static inline notrace unsigned long arch_local_irq_save(void)
  18{
  19        unsigned long flags;
  20        asm volatile("  msrclr %0, %1   \n"
  21                     "  nop             \n"
  22                     : "=r"(flags)
  23                     : "i"(MSR_IE)
  24                     : "memory");
  25        return flags;
  26}
  27
  28static inline notrace void arch_local_irq_disable(void)
  29{
  30        /* this uses r0 without declaring it - is that correct? */
  31        asm volatile("  msrclr r0, %0   \n"
  32                     "  nop             \n"
  33                     :
  34                     : "i"(MSR_IE)
  35                     : "memory");
  36}
  37
  38static inline notrace void arch_local_irq_enable(void)
  39{
  40        /* this uses r0 without declaring it - is that correct? */
  41        asm volatile("  msrset  r0, %0  \n"
  42                     "  nop             \n"
  43                     :
  44                     : "i"(MSR_IE)
  45                     : "memory");
  46}
  47
  48#else /* !CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR */
  49
  50static inline notrace unsigned long arch_local_irq_save(void)
  51{
  52        unsigned long flags, tmp;
  53        asm volatile (" mfs     %0, rmsr        \n"
  54                      " nop                     \n"
  55                      " andi    %1, %0, %2      \n"
  56                      " mts     rmsr, %1        \n"
  57                      " nop                     \n"
  58                      : "=r"(flags), "=r"(tmp)
  59                      : "i"(~MSR_IE)
  60                      : "memory");
  61        return flags;
  62}
  63
  64static inline notrace void arch_local_irq_disable(void)
  65{
  66        unsigned long tmp;
  67        asm volatile("  mfs     %0, rmsr        \n"
  68                     "  nop                     \n"
  69                     "  andi    %0, %0, %1      \n"
  70                     "  mts     rmsr, %0        \n"
  71                     "  nop                     \n"
  72                     : "=r"(tmp)
  73                     : "i"(~MSR_IE)
  74                     : "memory");
  75}
  76
  77static inline notrace void arch_local_irq_enable(void)
  78{
  79        unsigned long tmp;
  80        asm volatile("  mfs     %0, rmsr        \n"
  81                     "  nop                     \n"
  82                     "  ori     %0, %0, %1      \n"
  83                     "  mts     rmsr, %0        \n"
  84                     "  nop                     \n"
  85                     : "=r"(tmp)
  86                     : "i"(MSR_IE)
  87                     : "memory");
  88}
  89
  90#endif /* CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR */
  91
  92static inline notrace unsigned long arch_local_save_flags(void)
  93{
  94        unsigned long flags;
  95        asm volatile("  mfs     %0, rmsr        \n"
  96                     "  nop                     \n"
  97                     : "=r"(flags)
  98                     :
  99                     : "memory");
 100        return flags;
 101}
 102
 103static inline notrace void arch_local_irq_restore(unsigned long flags)
 104{
 105        asm volatile("  mts     rmsr, %0        \n"
 106                     "  nop                     \n"
 107                     :
 108                     : "r"(flags)
 109                     : "memory");
 110}
 111
 112static inline notrace bool arch_irqs_disabled_flags(unsigned long flags)
 113{
 114        return (flags & MSR_IE) == 0;
 115}
 116
 117static inline notrace bool arch_irqs_disabled(void)
 118{
 119        return arch_irqs_disabled_flags(arch_local_save_flags());
 120}
 121
 122#endif /* _ASM_MICROBLAZE_IRQFLAGS_H */
 123