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