irq.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. /*
  2. * This file is subject to the terms and conditions of the GNU General Public
  3. * License. See the file "COPYING" in the main directory of this archive
  4. * for more details.
  5. *
  6. * Code to handle x86 style IRQs plus some generic interrupt stuff.
  7. *
  8. * Copyright (C) 1992 Linus Torvalds
  9. * Copyright (C) 1994 - 2000 Ralf Baechle
  10. */
  11. #include <linux/kernel.h>
  12. #include <linux/delay.h>
  13. #include <linux/init.h>
  14. #include <linux/interrupt.h>
  15. #include <linux/kernel_stat.h>
  16. #include <linux/module.h>
  17. #include <linux/proc_fs.h>
  18. #include <linux/mm.h>
  19. #include <linux/random.h>
  20. #include <linux/sched.h>
  21. #include <linux/seq_file.h>
  22. #include <linux/kallsyms.h>
  23. #include <linux/kgdb.h>
  24. #include <linux/ftrace.h>
  25. #include <asm/atomic.h>
  26. #include <asm/system.h>
  27. #include <asm/uaccess.h>
  28. #ifdef CONFIG_KGDB
  29. int kgdb_early_setup;
  30. #endif
  31. static unsigned long irq_map[NR_IRQS / BITS_PER_LONG];
  32. int allocate_irqno(void)
  33. {
  34. int irq;
  35. again:
  36. irq = find_first_zero_bit(irq_map, NR_IRQS);
  37. if (irq >= NR_IRQS)
  38. return -ENOSPC;
  39. if (test_and_set_bit(irq, irq_map))
  40. goto again;
  41. return irq;
  42. }
  43. /*
  44. * Allocate the 16 legacy interrupts for i8259 devices. This happens early
  45. * in the kernel initialization so treating allocation failure as BUG() is
  46. * ok.
  47. */
  48. void __init alloc_legacy_irqno(void)
  49. {
  50. int i;
  51. for (i = 0; i <= 16; i++)
  52. BUG_ON(test_and_set_bit(i, irq_map));
  53. }
  54. void free_irqno(unsigned int irq)
  55. {
  56. smp_mb__before_clear_bit();
  57. clear_bit(irq, irq_map);
  58. smp_mb__after_clear_bit();
  59. }
  60. /*
  61. * 'what should we do if we get a hw irq event on an illegal vector'.
  62. * each architecture has to answer this themselves.
  63. */
  64. void ack_bad_irq(unsigned int irq)
  65. {
  66. smtc_im_ack_irq(irq);
  67. printk("unexpected IRQ # %d\n", irq);
  68. }
  69. atomic_t irq_err_count;
  70. int arch_show_interrupts(struct seq_file *p, int prec)
  71. {
  72. seq_printf(p, "%*s: %10u\n", prec, "ERR", atomic_read(&irq_err_count));
  73. return 0;
  74. }
  75. asmlinkage void spurious_interrupt(void)
  76. {
  77. atomic_inc(&irq_err_count);
  78. }
  79. void __init init_IRQ(void)
  80. {
  81. int i;
  82. #ifdef CONFIG_KGDB
  83. if (kgdb_early_setup)
  84. return;
  85. #endif
  86. for (i = 0; i < NR_IRQS; i++)
  87. irq_set_noprobe(i);
  88. arch_init_irq();
  89. #ifdef CONFIG_KGDB
  90. if (!kgdb_early_setup)
  91. kgdb_early_setup = 1;
  92. #endif
  93. }
  94. #ifdef DEBUG_STACKOVERFLOW
  95. static inline void check_stack_overflow(void)
  96. {
  97. unsigned long sp;
  98. __asm__ __volatile__("move %0, $sp" : "=r" (sp));
  99. sp &= THREAD_MASK;
  100. /*
  101. * Check for stack overflow: is there less than STACK_WARN free?
  102. * STACK_WARN is defined as 1/8 of THREAD_SIZE by default.
  103. */
  104. if (unlikely(sp < (sizeof(struct thread_info) + STACK_WARN))) {
  105. printk("do_IRQ: stack overflow: %ld\n",
  106. sp - sizeof(struct thread_info));
  107. dump_stack();
  108. }
  109. }
  110. #else
  111. static inline void check_stack_overflow(void) {}
  112. #endif
  113. /*
  114. * do_IRQ handles all normal device IRQ's (the special
  115. * SMP cross-CPU interrupts have their own specific
  116. * handlers).
  117. */
  118. void __irq_entry do_IRQ(unsigned int irq)
  119. {
  120. irq_enter();
  121. check_stack_overflow();
  122. if (!smtc_handle_on_other_cpu(irq))
  123. generic_handle_irq(irq);
  124. irq_exit();
  125. }
  126. #ifdef CONFIG_MIPS_MT_SMTC_IRQAFF
  127. /*
  128. * To avoid inefficient and in some cases pathological re-checking of
  129. * IRQ affinity, we have this variant that skips the affinity check.
  130. */
  131. void __irq_entry do_IRQ_no_affinity(unsigned int irq)
  132. {
  133. irq_enter();
  134. smtc_im_backstop(irq);
  135. generic_handle_irq(irq);
  136. irq_exit();
  137. }
  138. #endif /* CONFIG_MIPS_MT_SMTC_IRQAFF */