linux/include/asm-powerpc/hw_irq.h
<<
>>
Prefs
   1/*
   2 * Copyright (C) 1999 Cort Dougan <cort@cs.nmt.edu>
   3 */
   4#ifndef _ASM_POWERPC_HW_IRQ_H
   5#define _ASM_POWERPC_HW_IRQ_H
   6
   7#ifdef __KERNEL__
   8
   9#include <linux/errno.h>
  10#include <linux/compiler.h>
  11#include <asm/ptrace.h>
  12#include <asm/processor.h>
  13
  14extern void timer_interrupt(struct pt_regs *);
  15
  16#ifdef CONFIG_PPC64
  17#include <asm/paca.h>
  18
  19static inline unsigned long local_get_flags(void)
  20{
  21        unsigned long flags;
  22
  23        __asm__ __volatile__("lbz %0,%1(13)"
  24        : "=r" (flags)
  25        : "i" (offsetof(struct paca_struct, soft_enabled)));
  26
  27        return flags;
  28}
  29
  30static inline unsigned long local_irq_disable(void)
  31{
  32        unsigned long flags, zero;
  33
  34        __asm__ __volatile__("li %1,0; lbz %0,%2(13); stb %1,%2(13)"
  35        : "=r" (flags), "=&r" (zero)
  36        : "i" (offsetof(struct paca_struct, soft_enabled))
  37        : "memory");
  38
  39        return flags;
  40}
  41
  42extern void local_irq_restore(unsigned long);
  43extern void iseries_handle_interrupts(void);
  44
  45#define local_irq_enable()      local_irq_restore(1)
  46#define local_save_flags(flags) ((flags) = local_get_flags())
  47#define local_irq_save(flags)   ((flags) = local_irq_disable())
  48
  49#define irqs_disabled()         (local_get_flags() == 0)
  50
  51#define __hard_irq_enable()     __mtmsrd(mfmsr() | MSR_EE, 1)
  52#define __hard_irq_disable()    __mtmsrd(mfmsr() & ~MSR_EE, 1)
  53
  54#define  hard_irq_disable()                     \
  55        do {                                    \
  56                __hard_irq_disable();           \
  57                get_paca()->soft_enabled = 0;   \
  58                get_paca()->hard_enabled = 0;   \
  59        } while(0)
  60
  61#else
  62
  63#if defined(CONFIG_BOOKE)
  64#define SET_MSR_EE(x)   mtmsr(x)
  65#define local_irq_restore(flags)        __asm__ __volatile__("wrtee %0" : : "r" (flags) : "memory")
  66#else
  67#define SET_MSR_EE(x)   mtmsr(x)
  68#define local_irq_restore(flags)        mtmsr(flags)
  69#endif
  70
  71static inline void local_irq_disable(void)
  72{
  73#ifdef CONFIG_BOOKE
  74        __asm__ __volatile__("wrteei 0": : :"memory");
  75#else
  76        unsigned long msr;
  77        __asm__ __volatile__("": : :"memory");
  78        msr = mfmsr();
  79        SET_MSR_EE(msr & ~MSR_EE);
  80#endif
  81}
  82
  83static inline void local_irq_enable(void)
  84{
  85#ifdef CONFIG_BOOKE
  86        __asm__ __volatile__("wrteei 1": : :"memory");
  87#else
  88        unsigned long msr;
  89        __asm__ __volatile__("": : :"memory");
  90        msr = mfmsr();
  91        SET_MSR_EE(msr | MSR_EE);
  92#endif
  93}
  94
  95static inline void local_irq_save_ptr(unsigned long *flags)
  96{
  97        unsigned long msr;
  98        msr = mfmsr();
  99        *flags = msr;
 100#ifdef CONFIG_BOOKE
 101        __asm__ __volatile__("wrteei 0": : :"memory");
 102#else
 103        SET_MSR_EE(msr & ~MSR_EE);
 104#endif
 105        __asm__ __volatile__("": : :"memory");
 106}
 107
 108#define local_save_flags(flags) ((flags) = mfmsr())
 109#define local_irq_save(flags)   local_irq_save_ptr(&flags)
 110#define irqs_disabled()         ((mfmsr() & MSR_EE) == 0)
 111
 112#define hard_irq_enable()       local_irq_enable()
 113#define hard_irq_disable()      local_irq_disable()
 114
 115#endif /* CONFIG_PPC64 */
 116
 117/*
 118 * interrupt-retrigger: should we handle this via lost interrupts and IPIs
 119 * or should we not care like we do now ? --BenH.
 120 */
 121struct hw_interrupt_type;
 122
 123#endif  /* __KERNEL__ */
 124#endif  /* _ASM_POWERPC_HW_IRQ_H */
 125