hw_irq.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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. #ifdef __KERNEL__
  7. #include <linux/errno.h>
  8. #include <linux/compiler.h>
  9. #include <asm/ptrace.h>
  10. #include <asm/processor.h>
  11. extern void timer_interrupt(struct pt_regs *);
  12. #ifdef CONFIG_PPC64
  13. #include <asm/paca.h>
  14. static inline unsigned long arch_local_save_flags(void)
  15. {
  16. unsigned long flags;
  17. asm volatile(
  18. "lbz %0,%1(13)"
  19. : "=r" (flags)
  20. : "i" (offsetof(struct paca_struct, soft_enabled)));
  21. return flags;
  22. }
  23. static inline unsigned long arch_local_irq_disable(void)
  24. {
  25. unsigned long flags, zero;
  26. asm volatile(
  27. "li %1,0; lbz %0,%2(13); stb %1,%2(13)"
  28. : "=r" (flags), "=&r" (zero)
  29. : "i" (offsetof(struct paca_struct, soft_enabled))
  30. : "memory");
  31. return flags;
  32. }
  33. extern void arch_local_irq_restore(unsigned long);
  34. extern void iseries_handle_interrupts(void);
  35. static inline void arch_local_irq_enable(void)
  36. {
  37. arch_local_irq_restore(1);
  38. }
  39. static inline unsigned long arch_local_irq_save(void)
  40. {
  41. return arch_local_irq_disable();
  42. }
  43. static inline bool arch_irqs_disabled_flags(unsigned long flags)
  44. {
  45. return flags == 0;
  46. }
  47. static inline bool arch_irqs_disabled(void)
  48. {
  49. return arch_irqs_disabled_flags(arch_local_save_flags());
  50. }
  51. #ifdef CONFIG_PPC_BOOK3E
  52. #define __hard_irq_enable() asm volatile("wrteei 1" : : : "memory");
  53. #define __hard_irq_disable() asm volatile("wrteei 0" : : : "memory");
  54. #else
  55. #define __hard_irq_enable() __mtmsrd(local_paca->kernel_msr | MSR_EE, 1)
  56. #define __hard_irq_disable() __mtmsrd(local_paca->kernel_msr, 1)
  57. #endif
  58. #define hard_irq_disable() \
  59. do { \
  60. __hard_irq_disable(); \
  61. get_paca()->soft_enabled = 0; \
  62. get_paca()->hard_enabled = 0; \
  63. } while(0)
  64. static inline bool arch_irq_disabled_regs(struct pt_regs *regs)
  65. {
  66. return !regs->softe;
  67. }
  68. #else /* CONFIG_PPC64 */
  69. #define SET_MSR_EE(x) mtmsr(x)
  70. static inline unsigned long arch_local_save_flags(void)
  71. {
  72. return mfmsr();
  73. }
  74. static inline void arch_local_irq_restore(unsigned long flags)
  75. {
  76. #if defined(CONFIG_BOOKE)
  77. asm volatile("wrtee %0" : : "r" (flags) : "memory");
  78. #else
  79. mtmsr(flags);
  80. #endif
  81. }
  82. static inline unsigned long arch_local_irq_save(void)
  83. {
  84. unsigned long flags = arch_local_save_flags();
  85. #ifdef CONFIG_BOOKE
  86. asm volatile("wrteei 0" : : : "memory");
  87. #else
  88. SET_MSR_EE(flags & ~MSR_EE);
  89. #endif
  90. return flags;
  91. }
  92. static inline void arch_local_irq_disable(void)
  93. {
  94. #ifdef CONFIG_BOOKE
  95. asm volatile("wrteei 0" : : : "memory");
  96. #else
  97. arch_local_irq_save();
  98. #endif
  99. }
  100. static inline void arch_local_irq_enable(void)
  101. {
  102. #ifdef CONFIG_BOOKE
  103. asm volatile("wrteei 1" : : : "memory");
  104. #else
  105. unsigned long msr = mfmsr();
  106. SET_MSR_EE(msr | MSR_EE);
  107. #endif
  108. }
  109. static inline bool arch_irqs_disabled_flags(unsigned long flags)
  110. {
  111. return (flags & MSR_EE) == 0;
  112. }
  113. static inline bool arch_irqs_disabled(void)
  114. {
  115. return arch_irqs_disabled_flags(arch_local_save_flags());
  116. }
  117. #define hard_irq_disable() arch_local_irq_disable()
  118. static inline bool arch_irq_disabled_regs(struct pt_regs *regs)
  119. {
  120. return !(regs->msr & MSR_EE);
  121. }
  122. #endif /* CONFIG_PPC64 */
  123. #define ARCH_IRQ_INIT_FLAGS IRQ_NOREQUEST
  124. /*
  125. * interrupt-retrigger: should we handle this via lost interrupts and IPIs
  126. * or should we not care like we do now ? --BenH.
  127. */
  128. struct irq_chip;
  129. #endif /* __KERNEL__ */
  130. #endif /* _ASM_POWERPC_HW_IRQ_H */