hw_irq.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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(mfmsr() | MSR_EE, 1)
  56. #define __hard_irq_disable() __mtmsrd(mfmsr() & ~MSR_EE, 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. #else /* CONFIG_PPC64 */
  65. #define SET_MSR_EE(x) mtmsr(x)
  66. static inline unsigned long arch_local_save_flags(void)
  67. {
  68. return mfmsr();
  69. }
  70. static inline void arch_local_irq_restore(unsigned long flags)
  71. {
  72. #if defined(CONFIG_BOOKE)
  73. asm volatile("wrtee %0" : : "r" (flags) : "memory");
  74. #else
  75. mtmsr(flags);
  76. #endif
  77. }
  78. static inline unsigned long arch_local_irq_save(void)
  79. {
  80. unsigned long flags = arch_local_save_flags();
  81. #ifdef CONFIG_BOOKE
  82. asm volatile("wrteei 0" : : : "memory");
  83. #else
  84. SET_MSR_EE(flags & ~MSR_EE);
  85. #endif
  86. return flags;
  87. }
  88. static inline void arch_local_irq_disable(void)
  89. {
  90. #ifdef CONFIG_BOOKE
  91. asm volatile("wrteei 0" : : : "memory");
  92. #else
  93. arch_local_irq_save();
  94. #endif
  95. }
  96. static inline void arch_local_irq_enable(void)
  97. {
  98. #ifdef CONFIG_BOOKE
  99. asm volatile("wrteei 1" : : : "memory");
  100. #else
  101. unsigned long msr = mfmsr();
  102. SET_MSR_EE(msr | MSR_EE);
  103. #endif
  104. }
  105. static inline bool arch_irqs_disabled_flags(unsigned long flags)
  106. {
  107. return (flags & MSR_EE) == 0;
  108. }
  109. static inline bool arch_irqs_disabled(void)
  110. {
  111. return arch_irqs_disabled_flags(arch_local_save_flags());
  112. }
  113. #define hard_irq_disable() arch_local_irq_disable()
  114. #endif /* CONFIG_PPC64 */
  115. /*
  116. * interrupt-retrigger: should we handle this via lost interrupts and IPIs
  117. * or should we not care like we do now ? --BenH.
  118. */
  119. struct irq_chip;
  120. #endif /* __KERNEL__ */
  121. #endif /* _ASM_POWERPC_HW_IRQ_H */