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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * arch/mips/dec/int-handler.S
  3.  *
  4.  * Copyright (C) 1995, 1996, 1997 Paul M. Antoine and Harald Koerfgen
  5.  * Copyright (C) 2000  Maciej W. Rozycki
  6.  *
  7.  * Written by Ralf Baechle and Andreas Busse, modified for DECStation
  8.  * support by Paul Antoine and Harald Koerfgen.
  9.  *
  10.  * completly rewritten:
  11.  * Copyright (C) 1998 Harald Koerfgen
  12.  *
  13.  */
  14. #include <asm/asm.h>
  15. #include <asm/regdef.h>
  16. #include <asm/mipsregs.h>
  17. #include <asm/stackframe.h>
  18. #include <asm/addrspace.h>
  19. #include <asm/dec/kn01.h>
  20. #include <asm/dec/kn02.h>
  21. #include <asm/dec/kn02xa.h>
  22. #include <asm/dec/kn03.h>
  23. #include <asm/dec/ioasic_addrs.h>
  24. #include <asm/dec/interrupts.h>
  25. .text
  26. .set noreorder
  27. /*
  28.  * decstation_handle_int: Interrupt handler for DECStations
  29.  *
  30.  * We follow the model in the Indy interrupt code by David Miller, where he
  31.  * says: a lot of complication here is taken away because:
  32.  *
  33.  * 1) We handle one interrupt and return, sitting in a loop
  34.  *    and moving across all the pending IRQ bits in the cause
  35.  *    register is _NOT_ the answer, the common case is one
  36.  *    pending IRQ so optimize in that direction.
  37.  *
  38.  * 2) We need not check against bits in the status register
  39.  *    IRQ mask, that would make this routine slow as hell.
  40.  *
  41.  * 3) Linux only thinks in terms of all IRQs on or all IRQs
  42.  *    off, nothing in between like BSD spl() brain-damage.
  43.  *
  44.  * Furthermore, the IRQs on the DECStations look basically (barring
  45.  * software IRQs which we don't use at all) like...
  46.  *
  47.  * DS2100/3100's, aka kn01, aka Pmax:
  48.  *
  49.  * MIPS IRQ Source
  50.  *      --------        ------
  51.  *             0 Software (ignored)
  52.  *             1        Software (ignored)
  53.  *             2        SCSI
  54.  *             3        Lance Ethernet
  55.  *             4        DZ11 serial
  56.  *             5        RTC
  57.  *             6        Memory Controller
  58.  *             7        FPU
  59.  *
  60.  * DS5000/200, aka kn02, aka 3max:
  61.  *
  62.  * MIPS IRQ Source
  63.  *      --------        ------
  64.  *             0 Software (ignored)
  65.  *             1        Software (ignored)
  66.  *             2        TurboChannel
  67.  *             3        RTC
  68.  *             4        Reserved
  69.  *             5        Memory Controller
  70.  *             6        Reserved
  71.  *             7        FPU
  72.  *
  73.  * DS5000/1xx's, aka kn02ba, aka 3min:
  74.  *
  75.  * MIPS IRQ Source
  76.  *      --------        ------
  77.  *             0 Software (ignored)
  78.  *             1        Software (ignored)
  79.  *             2        TurboChannel Slot 0
  80.  *             3        TurboChannel Slot 1
  81.  *             4        TurboChannel Slot 2
  82.  *             5        TurboChannel Slot 3 (ASIC)
  83.  *             6        Halt button
  84.  *             7        FPU
  85.  *
  86.  * DS5000/2x's, aka kn02ca, aka maxine:
  87.  *
  88.  * MIPS IRQ Source
  89.  *      --------        ------
  90.  *             0 Software (ignored)
  91.  *             1        Software (ignored)
  92.  *             2        Periodic Interrupt (100usec)
  93.  *             3        RTC
  94.  *             4        I/O write timeout
  95.  *             5        TurboChannel (ASIC)
  96.  *             6        Halt Keycode from Access.Bus keyboard (CTRL-ALT-ENTER)
  97.  *             7        FPU
  98.  *
  99.  * DS5000/2xx's, aka kn03, aka 3maxplus:
  100.  *
  101.  * MIPS IRQ Source
  102.  *      --------        ------
  103.  *             0 Software (ignored)
  104.  *             1        Software (ignored)
  105.  *             2        System Board (ASIC)
  106.  *             3        RTC
  107.  *             4        Reserved
  108.  *             5        Memory
  109.  *             6        Halt Button
  110.  *             7        FPU
  111.  *
  112.  * We handle the IRQ according to _our_ priority.
  113.  * Priority is:
  114.  *
  115.  * Highest ----     RTC
  116.  *                  SCSI (if separate from TC)
  117.  *                  Ethernet (if separate from TC)
  118.  *     Serial (if separate from TC)
  119.  *                  TurboChannel (if there is one!)
  120.  *                  Memory Controller (execept kmin)
  121.  * Lowest  ----     Halt (if there is one!)
  122.  *
  123.  * then we just return, if multiple IRQs are pending then we will just take
  124.  * another exception, big deal.
  125.  *
  126.  */
  127. .align 5
  128. NESTED(decstation_handle_int, PT_SIZE, ra)
  129. .set noat
  130. SAVE_ALL
  131. CLI # TEST: interrupts should be off
  132. .set at
  133. .set noreorder
  134. /*
  135.  * Get pending Interrupts
  136.  */
  137. mfc0 t0,CP0_CAUSE # get pending interrupts
  138. mfc0 t2,CP0_STATUS
  139. la t1,cpu_mask_tbl
  140. and t0,t2 # isolate allowed ones
  141. beqz t0,spurious
  142. /*
  143.  * Find irq with highest priority
  144.  */
  145. 1:  lw t2,(t1)
  146. move t3,t0
  147. and t3,t2
  148. beq t3,zero,1b
  149.  addu t1,PTRSIZE # delay slot
  150. /*
  151.  * Do the low-level stuff
  152.  */
  153. lw a0,%lo(cpu_irq_nr-cpu_mask_tbl-PTRSIZE)(t1)
  154. lw t0,%lo(cpu_ivec_tbl-cpu_mask_tbl-PTRSIZE)(t1)
  155. bgez a0, handle_it # irq_nr >= 0?
  156. # irq_nr < 0: t0 contains an address
  157.  nop
  158. jr t0
  159.  nop # delay slot
  160. /*
  161.  * Handle "IRQ Controller" Interrupts
  162.  * Masked Interrupts are still visible and have to be masked "by hand".
  163.  */
  164. EXPORT(kn02_io_int)
  165. kn02_io_int: # 3max
  166. lui t0,KN02_CSR_ADDR>>16 # get interrupt status and mask
  167. lw t0,(t0)
  168. la t1,asic_mask_tbl
  169. move t3,t0
  170. sll t3,16 # shift interrupt status
  171. b find_int
  172.  and t0,t3 # mask out allowed ones
  173. EXPORT(kn03_io_int)
  174. kn03_io_int: # 3max+
  175. lui t2,KN03_IOASIC_BASE>>16 # upper part of IOASIC Address
  176. lw t0,SIR(t2) # get status: IOASIC isr
  177. lw t3,SIMR(t2) # get mask:   IOASIC isrm
  178. la t1,asic_mask_tbl
  179. b find_int
  180.  and t0,t3 # mask out allowed ones
  181. EXPORT(kn02xa_io_int)
  182. kn02xa_io_int: # 3min/maxine
  183. lui t2,KN02XA_IOASIC_BASE>>16
  184. # upper part of IOASIC Address
  185. lw t0,SIR(t2) # get status: IOASIC isr
  186. lw t3,SIMR(t2) # get mask:   IOASIC isrm
  187. la t1,asic_mask_tbl
  188. and t0,t3
  189. /*
  190.  * Find irq with highest priority
  191.  */
  192. find_int: beqz t0,spurious
  193. 1:  lw t2,(t1)
  194. move t3,t0
  195. and t3,t2
  196. beq zero,t3,1b
  197.  addu t1,PTRSIZE # delay slot
  198. /*
  199.  * Do the low-level stuff
  200.  */
  201. lw a0,%lo(asic_irq_nr-asic_mask_tbl-PTRSIZE)(t1)
  202.                 nop
  203. handle_it: jal do_IRQ
  204.  move a1,sp
  205. j ret_from_irq
  206.  nop
  207. spurious:
  208. j spurious_interrupt
  209.  nop
  210. END(decstation_handle_int)
  211. /*
  212.   * Interrupt routines common to all DECStations first.
  213.  */
  214. EXPORT(dec_intr_fpu)
  215. dec_intr_fpu: PANIC("Unimplemented FPU interrupt handler")
  216. /*
  217.  * Generic unimplemented interrupt routines - ivec_tbl is initialised to
  218.  * point all interrupts here.  The table is then filled in by machine-specific
  219.  * initialisation in dec_setup().
  220.  */
  221. EXPORT(dec_intr_unimplemented)
  222. dec_intr_unimplemented:
  223. mfc0 a1,CP0_CAUSE # cheats way of printing an arg!
  224. nop # to be sure...
  225. PANIC("Unimplemented cpu interrupt! CP0_CAUSE: 0x%x");
  226. EXPORT(asic_intr_unimplemented)
  227. asic_intr_unimplemented:
  228. move a1,t0 # cheats way of printing an arg!
  229. PANIC("Unimplemented asic interrupt! ASIC ISR: 0x%x");
  230. /*
  231.  * FIXME: This interrupt vector table is experimental.  It is initialised with 
  232.  *   *_intr_unimplemented and filled in with the addresses of
  233.  *   machine-specific interrupt routines in dec_setup()  Paul 10/5/97.
  234.  *
  235.  *   The mask_tbls contain the interrupt masks which are used. It is 
  236.  *   initialised with all possible interrupt status bits set, so that 
  237.  *    unused Interrupts are catched. Harald
  238.  */
  239. .data
  240. EXPORT(cpu_mask_tbl)
  241. cpu_mask_tbl:
  242. .word 0x00000000
  243. .word 0x00000000
  244. .word 0x00000000
  245. .word 0x00000000
  246. .word 0x00000000
  247. .word 0x00000000
  248. .word 0x00000000 # these two are unlikely 
  249. .word 0x00000000 # to be used
  250. .word 0x0000ff00 # End of list
  251. EXPORT(cpu_irq_nr)
  252. cpu_irq_nr:
  253. .word 0x00000000
  254. .word 0x00000000
  255. .word 0x00000000
  256. .word 0x00000000
  257. .word 0x00000000
  258. .word 0x00000000
  259. .word 0x00000000 # these two are unlikely 
  260. .word 0x00000000 # to be used
  261. .word 0x00ffffff # End of list
  262. EXPORT(cpu_ivec_tbl)
  263. cpu_ivec_tbl:
  264. PTR dec_intr_unimplemented
  265. PTR dec_intr_unimplemented
  266. PTR dec_intr_unimplemented
  267. PTR dec_intr_unimplemented
  268. PTR dec_intr_unimplemented
  269. PTR dec_intr_unimplemented
  270. PTR dec_intr_unimplemented # these two are unlikely
  271. PTR dec_intr_unimplemented # to be used
  272. PTR dec_intr_unimplemented # EOL
  273. EXPORT(asic_mask_tbl)
  274. asic_mask_tbl:
  275. .word 0
  276. .word 0
  277. .word 0
  278. .word 0
  279. .word 0
  280. .word 0
  281. .word 0
  282. .word 0
  283. .word 0
  284. .word 0
  285. .word 0
  286. .word 0
  287. .word 0
  288. .word 0
  289. .word 0
  290. .word 0
  291. .word 0
  292. .word 0
  293. .word 0
  294. .word 0
  295. .word 0
  296. .word 0
  297. .word 0
  298. .word 0
  299. .word 0
  300. .word 0
  301. .word 0
  302. .word 0
  303. .word 0
  304. .word 0
  305. .word 0
  306. .word 0
  307. .word 0xffffffff # EOL
  308. EXPORT(asic_irq_nr)
  309. asic_irq_nr:
  310. .word 0
  311. .word 0
  312. .word 0
  313. .word 0
  314. .word 0
  315. .word 0
  316. .word 0
  317. .word 0
  318. .word 0
  319. .word 0
  320. .word 0
  321. .word 0
  322. .word 0
  323. .word 0
  324. .word 0
  325. .word 0
  326. .word 0
  327. .word 0
  328. .word 0
  329. .word 0
  330. .word 0
  331. .word 0
  332. .word 0
  333. .word 0
  334. .word 0
  335. .word 0
  336. .word 0
  337. .word 0
  338. .word 0
  339. .word 0
  340. .word 0
  341. .word 0
  342. .word 0xffffffff # EOL