mipsIRQ.S
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Carsten Langgaard, carstenl@mips.com
  3.  * Copyright (C) 1999, 2000 MIPS Technologies, Inc.  All rights reserved.
  4.  *
  5.  * ########################################################################
  6.  *
  7.  *  This program is free software; you can distribute it and/or modify it
  8.  *  under the terms of the GNU General Public License (Version 2) as
  9.  *  published by the Free Software Foundation.
  10.  *
  11.  *  This program is distributed in the hope it will be useful, but WITHOUT
  12.  *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13.  *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14.  *  for more details.
  15.  *
  16.  *  You should have received a copy of the GNU General Public License along
  17.  *  with this program; if not, write to the Free Software Foundation, Inc.,
  18.  *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
  19.  *
  20.  * ########################################################################
  21.  *
  22.  * Interrupt exception dispatch code.
  23.  *
  24.  */
  25. #include <linux/config.h>
  26. #include <asm/asm.h>
  27. #include <asm/mipsregs.h>
  28. #include <asm/regdef.h>
  29. #include <asm/stackframe.h>
  30. /* A lot of complication here is taken away because:
  31.  *
  32.  * 1) We handle one interrupt and return, sitting in a loop and moving across
  33.  *    all the pending IRQ bits in the cause register is _NOT_ the answer, the
  34.  *    common case is one pending IRQ so optimize in that direction.
  35.  *
  36.  * 2) We need not check against bits in the status register IRQ mask, that
  37.  *    would make this routine slow as hell.
  38.  *
  39.  * 3) Linux only thinks in terms of all IRQs on or all IRQs off, nothing in
  40.  *    between like BSD spl() brain-damage.
  41.  *
  42.  * Furthermore, the IRQs on the MIPS board look basically (barring software
  43.  * IRQs which we don't use at all and all external interrupt sources are
  44.  * combined together on hardware interrupt 0 (MIPS IRQ 2)) like:
  45.  *
  46.  * MIPS IRQ Source
  47.  *      --------        ------
  48.  *             0 Software (ignored)
  49.  *             1        Software (ignored)
  50.  *             2        Combined hardware interrupt (hw0)
  51.  *             3        Hardware (ignored)
  52.  *             4        Hardware (ignored)
  53.  *             5        Hardware (ignored)
  54.  *             6        Hardware (ignored)
  55.  *             7        R4k timer (what we use)
  56.  *
  57.  * We handle the IRQ according to _our_ priority which is:
  58.  *
  59.  * Highest ----     R4k Timer
  60.  * Lowest  ----     Combined hardware interrupt
  61.  *
  62.  * then we just return, if multiple IRQs are pending then we will just take
  63.  * another exception, big deal.
  64.  */
  65. .text
  66. .set noreorder
  67. .set noat
  68. .align 5
  69. NESTED(mipsIRQ, PT_SIZE, sp)
  70. SAVE_ALL
  71. CLI
  72. .set at
  73. mfc0 s0, CP0_CAUSE # get irq mask
  74. /* First we check for r4k counter/timer IRQ. */
  75. andi a0, s0, CAUSEF_IP7
  76. beq a0, zero, 1f
  77.  andi a0, s0, CAUSEF_IP2 # delay slot, check hw0 interrupt
  78. /* Wheee, a timer interrupt. */
  79. move a0, sp
  80. jal mips_timer_interrupt
  81.  nop
  82. j ret_from_irq
  83.  nop
  84. 1:
  85. beq a0, zero, 1f
  86.  nop
  87. /* Wheee, combined hardware level zero interrupt. */
  88. #if defined(CONFIG_MIPS_ATLAS)
  89. jal atlas_hw0_irqdispatch
  90. #elif defined(CONFIG_MIPS_MALTA)
  91. jal malta_hw0_irqdispatch
  92. #else
  93. #error "MIPS board not supportedn"
  94. #endif
  95.  move a0, sp # delay slot
  96. j ret_from_irq
  97.  nop # delay slot
  98. 1:
  99. /*
  100.  * Here by mistake?  This is possible, what can happen is that by the
  101.  * time we take the exception the IRQ pin goes low, so just leave if
  102.  * this is the case.
  103.  */
  104. move a1,s0
  105. PRINT("Got interrupt: c0_cause = %08xn")
  106. mfc0 a1, CP0_EPC
  107. PRINT("c0_epc = %08xn")
  108. j ret_from_irq
  109.  nop
  110. END(mipsIRQ)