setup.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:23k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Setup the interrupt stuff.
  3.  *
  4.  * This file is subject to the terms and conditions of the GNU General Public
  5.  * License.  See the file "COPYING" in the main directory of this archive
  6.  * for more details.
  7.  *
  8.  * Copyright (C) 1998 Harald Koerfgen
  9.  * Copyright (C) 2000, 2001, 2002  Maciej W. Rozycki
  10.  */
  11. #include <linux/config.h>
  12. #include <linux/sched.h>
  13. #include <linux/interrupt.h>
  14. #include <linux/mc146818rtc.h>
  15. #include <linux/param.h>
  16. #include <linux/console.h>
  17. #include <linux/init.h>
  18. #include <linux/module.h>
  19. #include <linux/types.h>
  20. #include <asm/cpu.h>
  21. #include <asm/bootinfo.h>
  22. #include <asm/irq.h>
  23. #include <asm/irq_cpu.h>
  24. #include <asm/mipsregs.h>
  25. #include <asm/reboot.h>
  26. #include <asm/traps.h>
  27. #include <asm/wbflush.h>
  28. #include <asm/dec/interrupts.h>
  29. #include <asm/dec/kn01.h>
  30. #include <asm/dec/kn02.h>
  31. #include <asm/dec/kn02ba.h>
  32. #include <asm/dec/kn02ca.h>
  33. #include <asm/dec/kn03.h>
  34. #include <asm/dec/kn230.h>
  35. #include <asm/dec/ioasic.h>
  36. #include <asm/dec/ioasic_addrs.h>
  37. #include <asm/dec/ioasic_ints.h>
  38. extern void dec_machine_restart(char *command);
  39. extern void dec_machine_halt(void);
  40. extern void dec_machine_power_off(void);
  41. extern void dec_intr_halt(int irq, void *dev_id, struct pt_regs *regs);
  42. extern asmlinkage void decstation_handle_int(void);
  43. volatile u32 *ioasic_base;
  44. unsigned long dec_kn_slot_size;
  45. /*
  46.  * IRQ routing and priority tables.  Priorites are set as follows:
  47.  *
  48.  *  KN01 KN230 KN02 KN02-BA KN02-CA KN03
  49.  *
  50.  * MEMORY CPU CPU CPU ASIC CPU CPU
  51.  * RTC CPU CPU CPU ASIC CPU CPU
  52.  * DMA - - - ASIC ASIC ASIC
  53.  * SERIAL0 CPU CPU CSR ASIC ASIC ASIC
  54.  * SERIAL1 - - - ASIC - ASIC
  55.  * SCSI CPU CPU CSR ASIC ASIC ASIC
  56.  * ETHERNET CPU * CSR ASIC ASIC ASIC
  57.  * other - - - ASIC - -
  58.  * TC2 - - CSR CPU ASIC ASIC
  59.  * TC1 - - CSR CPU ASIC ASIC
  60.  * TC0 - - CSR CPU ASIC ASIC
  61.  * other - CPU - CPU ASIC ASIC
  62.  * other - - - - CPU CPU
  63.  *
  64.  * * -- shared with SCSI
  65.  */
  66. int dec_interrupt[DEC_NR_INTS] = {
  67. [0 ... DEC_NR_INTS - 1] = -1
  68. };
  69. int_ptr cpu_mask_nr_tbl[DEC_MAX_CPU_INTS][2] = {
  70. { { i: ~0 }, { p: dec_intr_unimplemented } },
  71. };
  72. int_ptr asic_mask_nr_tbl[DEC_MAX_ASIC_INTS][2] = {
  73. { { i: ~0 }, { p: asic_intr_unimplemented } },
  74. };
  75. int cpu_fpu_mask = DEC_CPU_IRQ_MASK(DEC_CPU_INR_FPU);
  76. static struct irqaction ioirq = {NULL, 0, 0, "cascade", NULL, NULL};
  77. static struct irqaction fpuirq = {NULL, 0, 0, "fpu", NULL, NULL};
  78. static struct irqaction haltirq = {dec_intr_halt, 0, 0, "halt", NULL, NULL};
  79. void (*board_time_init) (struct irqaction * irq);
  80. /*
  81.  * enable the periodic interrupts
  82.  */
  83. static void __init dec_time_init(struct irqaction *irq)
  84. {
  85. /*
  86. * Here we go, enable periodic rtc interrupts.
  87. */
  88. #ifndef LOG_2_HZ
  89. #  define LOG_2_HZ 7
  90. #endif
  91. CMOS_WRITE(RTC_REF_CLCK_32KHZ | (16 - LOG_2_HZ), RTC_REG_A);
  92. CMOS_WRITE(CMOS_READ(RTC_REG_B) | RTC_PIE, RTC_REG_B);
  93. setup_irq(dec_interrupt[DEC_IRQ_RTC], irq);
  94. }
  95. /*
  96.  * Bus error (DBE/IBE exceptions and memory interrupts) handling
  97.  * setup.  Nothing for now.
  98.  */
  99. void __init bus_error_init(void)
  100. {
  101. }
  102. void __init decstation_setup(void)
  103. {
  104. board_time_init = dec_time_init;
  105. wbflush_setup();
  106. _machine_restart = dec_machine_restart;
  107. _machine_halt = dec_machine_halt;
  108. _machine_power_off = dec_machine_power_off;
  109. #ifdef CONFIG_FB
  110. conswitchp = &dummy_con;
  111. #endif
  112. rtc_ops = &dec_rtc_ops;
  113. }
  114. /*
  115.  * Machine-specific initialisation for KN01, aka DS2100 (aka Pmin)
  116.  * or DS3100 (aka Pmax).
  117.  */
  118. static int kn01_interrupt[DEC_NR_INTS] __initdata = {
  119. [DEC_IRQ_CASCADE] = -1,
  120. [DEC_IRQ_AB_RECV] = -1,
  121. [DEC_IRQ_AB_XMIT] = -1,
  122. [DEC_IRQ_DZ11] = DEC_CPU_IRQ_NR(KN01_CPU_INR_DZ11),
  123. [DEC_IRQ_ASC] = -1,
  124. [DEC_IRQ_FLOPPY] = -1,
  125. [DEC_IRQ_FPU] = DEC_CPU_IRQ_NR(DEC_CPU_INR_FPU),
  126. [DEC_IRQ_HALT] = -1,
  127. [DEC_IRQ_ISDN] = -1,
  128. [DEC_IRQ_LANCE] = DEC_CPU_IRQ_NR(KN01_CPU_INR_LANCE),
  129. [DEC_IRQ_MEMORY] = DEC_CPU_IRQ_NR(KN01_CPU_INR_MEMORY),
  130. [DEC_IRQ_PSU] = -1,
  131. [DEC_IRQ_RTC] = DEC_CPU_IRQ_NR(KN01_CPU_INR_RTC),
  132. [DEC_IRQ_SCC0] = -1,
  133. [DEC_IRQ_SCC1] = -1,
  134. [DEC_IRQ_SII] = DEC_CPU_IRQ_NR(KN01_CPU_INR_SII),
  135. [DEC_IRQ_TC0] = -1,
  136. [DEC_IRQ_TC1] = -1,
  137. [DEC_IRQ_TC2] = -1,
  138. [DEC_IRQ_TIMER] = -1,
  139. [DEC_IRQ_VIDEO] = DEC_CPU_IRQ_NR(KN01_CPU_INR_VIDEO),
  140. [DEC_IRQ_ASC_MERR] = -1,
  141. [DEC_IRQ_ASC_ERR] = -1,
  142. [DEC_IRQ_ASC_DMA] = -1,
  143. [DEC_IRQ_FLOPPY_ERR] = -1,
  144. [DEC_IRQ_ISDN_ERR] = -1,
  145. [DEC_IRQ_ISDN_RXDMA] = -1,
  146. [DEC_IRQ_ISDN_TXDMA] = -1,
  147. [DEC_IRQ_LANCE_MERR] = -1,
  148. [DEC_IRQ_SCC0A_RXERR] = -1,
  149. [DEC_IRQ_SCC0A_RXDMA] = -1,
  150. [DEC_IRQ_SCC0A_TXERR] = -1,
  151. [DEC_IRQ_SCC0A_TXDMA] = -1,
  152. [DEC_IRQ_SCC0B_RXERR] = -1,
  153. [DEC_IRQ_SCC0B_RXDMA] = -1,
  154. [DEC_IRQ_SCC0B_TXERR] = -1,
  155. [DEC_IRQ_SCC0B_TXDMA] = -1,
  156. [DEC_IRQ_SCC1A_RXERR] = -1,
  157. [DEC_IRQ_SCC1A_RXDMA] = -1,
  158. [DEC_IRQ_SCC1A_TXERR] = -1,
  159. [DEC_IRQ_SCC1A_TXDMA] = -1,
  160. };
  161. static int_ptr kn01_cpu_mask_nr_tbl[][2] __initdata = {
  162. { { i: DEC_CPU_IRQ_MASK(KN01_CPU_INR_MEMORY) },
  163. { i: DEC_CPU_IRQ_NR(KN01_CPU_INR_MEMORY) } },
  164. { { i: DEC_CPU_IRQ_MASK(KN01_CPU_INR_RTC) },
  165. { i: DEC_CPU_IRQ_NR(KN01_CPU_INR_RTC) } },
  166. { { i: DEC_CPU_IRQ_MASK(KN01_CPU_INR_DZ11) },
  167. { i: DEC_CPU_IRQ_NR(KN01_CPU_INR_DZ11) } },
  168. { { i: DEC_CPU_IRQ_MASK(KN01_CPU_INR_SII) },
  169. { i: DEC_CPU_IRQ_NR(KN01_CPU_INR_SII) } },
  170. { { i: DEC_CPU_IRQ_MASK(KN01_CPU_INR_LANCE) },
  171. { i: DEC_CPU_IRQ_NR(KN01_CPU_INR_LANCE) } },
  172. { { i: DEC_CPU_IRQ_ALL },
  173. { p: cpu_all_int } },
  174. };
  175. void __init dec_init_kn01(void)
  176. {
  177. /* Setup some memory addresses. */
  178. dec_rtc_base = (void *)KN01_RTC_BASE;
  179. dec_kn_slot_size = KN01_SLOT_SIZE;
  180. /* IRQ routing. */
  181. memcpy(&dec_interrupt, &kn01_interrupt,
  182. sizeof(kn01_interrupt));
  183. /* CPU IRQ priorities. */
  184. memcpy(&cpu_mask_nr_tbl, &kn01_cpu_mask_nr_tbl,
  185. sizeof(kn01_cpu_mask_nr_tbl));
  186. mips_cpu_irq_init(DEC_CPU_IRQ_BASE);
  187. } /* dec_init_kn01 */
  188. /*
  189.  * Machine-specific initialisation for KN230, aka DS5100, aka MIPSmate.
  190.  */
  191. static int kn230_interrupt[DEC_NR_INTS] __initdata = {
  192. [DEC_IRQ_CASCADE] = -1,
  193. [DEC_IRQ_AB_RECV] = -1,
  194. [DEC_IRQ_AB_XMIT] = -1,
  195. [DEC_IRQ_DZ11] = DEC_CPU_IRQ_NR(KN230_CPU_INR_DZ11),
  196. [DEC_IRQ_ASC] = -1,
  197. [DEC_IRQ_FLOPPY] = -1,
  198. [DEC_IRQ_FPU] = DEC_CPU_IRQ_NR(DEC_CPU_INR_FPU),
  199. [DEC_IRQ_HALT] = DEC_CPU_IRQ_NR(KN230_CPU_INR_HALT),
  200. [DEC_IRQ_ISDN] = -1,
  201. [DEC_IRQ_LANCE] = DEC_CPU_IRQ_NR(KN230_CPU_INR_LANCE),
  202. [DEC_IRQ_MEMORY] = DEC_CPU_IRQ_NR(KN230_CPU_INR_MEMORY),
  203. [DEC_IRQ_PSU] = -1,
  204. [DEC_IRQ_RTC] = DEC_CPU_IRQ_NR(KN230_CPU_INR_RTC),
  205. [DEC_IRQ_SCC0] = -1,
  206. [DEC_IRQ_SCC1] = -1,
  207. [DEC_IRQ_SII] = DEC_CPU_IRQ_NR(KN230_CPU_INR_SII),
  208. [DEC_IRQ_TC0] = -1,
  209. [DEC_IRQ_TC1] = -1,
  210. [DEC_IRQ_TC2] = -1,
  211. [DEC_IRQ_TIMER] = -1,
  212. [DEC_IRQ_VIDEO] = -1,
  213. [DEC_IRQ_ASC_MERR] = -1,
  214. [DEC_IRQ_ASC_ERR] = -1,
  215. [DEC_IRQ_ASC_DMA] = -1,
  216. [DEC_IRQ_FLOPPY_ERR] = -1,
  217. [DEC_IRQ_ISDN_ERR] = -1,
  218. [DEC_IRQ_ISDN_RXDMA] = -1,
  219. [DEC_IRQ_ISDN_TXDMA] = -1,
  220. [DEC_IRQ_LANCE_MERR] = -1,
  221. [DEC_IRQ_SCC0A_RXERR] = -1,
  222. [DEC_IRQ_SCC0A_RXDMA] = -1,
  223. [DEC_IRQ_SCC0A_TXERR] = -1,
  224. [DEC_IRQ_SCC0A_TXDMA] = -1,
  225. [DEC_IRQ_SCC0B_RXERR] = -1,
  226. [DEC_IRQ_SCC0B_RXDMA] = -1,
  227. [DEC_IRQ_SCC0B_TXERR] = -1,
  228. [DEC_IRQ_SCC0B_TXDMA] = -1,
  229. [DEC_IRQ_SCC1A_RXERR] = -1,
  230. [DEC_IRQ_SCC1A_RXDMA] = -1,
  231. [DEC_IRQ_SCC1A_TXERR] = -1,
  232. [DEC_IRQ_SCC1A_TXDMA] = -1,
  233. };
  234. static int_ptr kn230_cpu_mask_nr_tbl[][2] __initdata = {
  235. { { i: DEC_CPU_IRQ_MASK(KN230_CPU_INR_MEMORY) },
  236. { i: DEC_CPU_IRQ_NR(KN230_CPU_INR_MEMORY) } },
  237. { { i: DEC_CPU_IRQ_MASK(KN230_CPU_INR_RTC) },
  238. { i: DEC_CPU_IRQ_NR(KN230_CPU_INR_RTC) } },
  239. { { i: DEC_CPU_IRQ_MASK(KN230_CPU_INR_DZ11) },
  240. { i: DEC_CPU_IRQ_NR(KN230_CPU_INR_DZ11) } },
  241. { { i: DEC_CPU_IRQ_MASK(KN230_CPU_INR_SII) },
  242. { i: DEC_CPU_IRQ_NR(KN230_CPU_INR_SII) } },
  243. { { i: DEC_CPU_IRQ_ALL },
  244. { p: cpu_all_int } },
  245. };
  246. void __init dec_init_kn230(void)
  247. {
  248. /* Setup some memory addresses. */
  249. dec_rtc_base = (void *)KN01_RTC_BASE;
  250. dec_kn_slot_size = KN01_SLOT_SIZE;
  251. /* IRQ routing. */
  252. memcpy(&dec_interrupt, &kn230_interrupt,
  253. sizeof(kn230_interrupt));
  254. /* CPU IRQ priorities. */
  255. memcpy(&cpu_mask_nr_tbl, &kn230_cpu_mask_nr_tbl,
  256. sizeof(kn230_cpu_mask_nr_tbl));
  257. mips_cpu_irq_init(DEC_CPU_IRQ_BASE);
  258. } /* dec_init_kn230 */
  259. /*
  260.  * Machine-specific initialisation for KN02, aka DS5000/200, aka 3max.
  261.  */
  262. static int kn02_interrupt[DEC_NR_INTS] __initdata = {
  263. [DEC_IRQ_CASCADE] = DEC_CPU_IRQ_NR(KN02_CPU_INR_CASCADE),
  264. [DEC_IRQ_AB_RECV] = -1,
  265. [DEC_IRQ_AB_XMIT] = -1,
  266. [DEC_IRQ_DZ11] = KN02_IRQ_NR(KN02_CSR_INR_DZ11),
  267. [DEC_IRQ_ASC] = KN02_IRQ_NR(KN02_CSR_INR_ASC),
  268. [DEC_IRQ_FLOPPY] = -1,
  269. [DEC_IRQ_FPU] = DEC_CPU_IRQ_NR(DEC_CPU_INR_FPU),
  270. [DEC_IRQ_HALT] = -1,
  271. [DEC_IRQ_ISDN] = -1,
  272. [DEC_IRQ_LANCE] = KN02_IRQ_NR(KN02_CSR_INR_LANCE),
  273. [DEC_IRQ_MEMORY] = DEC_CPU_IRQ_NR(KN02_CPU_INR_MEMORY),
  274. [DEC_IRQ_PSU] = -1,
  275. [DEC_IRQ_RTC] = DEC_CPU_IRQ_NR(KN02_CPU_INR_RTC),
  276. [DEC_IRQ_SCC0] = -1,
  277. [DEC_IRQ_SCC1] = -1,
  278. [DEC_IRQ_SII] = -1,
  279. [DEC_IRQ_TC0] = KN02_IRQ_NR(KN02_CSR_INR_TC0),
  280. [DEC_IRQ_TC1] = KN02_IRQ_NR(KN02_CSR_INR_TC1),
  281. [DEC_IRQ_TC2] = KN02_IRQ_NR(KN02_CSR_INR_TC2),
  282. [DEC_IRQ_TIMER] = -1,
  283. [DEC_IRQ_VIDEO] = -1,
  284. [DEC_IRQ_ASC_MERR] = -1,
  285. [DEC_IRQ_ASC_ERR] = -1,
  286. [DEC_IRQ_ASC_DMA] = -1,
  287. [DEC_IRQ_FLOPPY_ERR] = -1,
  288. [DEC_IRQ_ISDN_ERR] = -1,
  289. [DEC_IRQ_ISDN_RXDMA] = -1,
  290. [DEC_IRQ_ISDN_TXDMA] = -1,
  291. [DEC_IRQ_LANCE_MERR] = -1,
  292. [DEC_IRQ_SCC0A_RXERR] = -1,
  293. [DEC_IRQ_SCC0A_RXDMA] = -1,
  294. [DEC_IRQ_SCC0A_TXERR] = -1,
  295. [DEC_IRQ_SCC0A_TXDMA] = -1,
  296. [DEC_IRQ_SCC0B_RXERR] = -1,
  297. [DEC_IRQ_SCC0B_RXDMA] = -1,
  298. [DEC_IRQ_SCC0B_TXERR] = -1,
  299. [DEC_IRQ_SCC0B_TXDMA] = -1,
  300. [DEC_IRQ_SCC1A_RXERR] = -1,
  301. [DEC_IRQ_SCC1A_RXDMA] = -1,
  302. [DEC_IRQ_SCC1A_TXERR] = -1,
  303. [DEC_IRQ_SCC1A_TXDMA] = -1,
  304. };
  305. static int_ptr kn02_cpu_mask_nr_tbl[][2] __initdata = {
  306. { { i: DEC_CPU_IRQ_MASK(KN02_CPU_INR_MEMORY) },
  307. { i: DEC_CPU_IRQ_NR(KN02_CPU_INR_MEMORY) } },
  308. { { i: DEC_CPU_IRQ_MASK(KN02_CPU_INR_RTC) },
  309. { i: DEC_CPU_IRQ_NR(KN02_CPU_INR_RTC) } },
  310. { { i: DEC_CPU_IRQ_MASK(KN02_CPU_INR_CASCADE) },
  311. { p: kn02_io_int } },
  312. { { i: DEC_CPU_IRQ_ALL },
  313. { p: cpu_all_int } },
  314. };
  315. static int_ptr kn02_asic_mask_nr_tbl[][2] __initdata = {
  316. { { i: KN02_IRQ_MASK(KN02_CSR_INR_DZ11) },
  317. { i: KN02_IRQ_NR(KN02_CSR_INR_DZ11) } },
  318. { { i: KN02_IRQ_MASK(KN02_CSR_INR_ASC) },
  319. { i: KN02_IRQ_NR(KN02_CSR_INR_ASC) } },
  320. { { i: KN02_IRQ_MASK(KN02_CSR_INR_LANCE) },
  321. { i: KN02_IRQ_NR(KN02_CSR_INR_LANCE) } },
  322. { { i: KN02_IRQ_MASK(KN02_CSR_INR_TC2) },
  323. { i: KN02_IRQ_NR(KN02_CSR_INR_TC2) } },
  324. { { i: KN02_IRQ_MASK(KN02_CSR_INR_TC1) },
  325. { i: KN02_IRQ_NR(KN02_CSR_INR_TC1) } },
  326. { { i: KN02_IRQ_MASK(KN02_CSR_INR_TC0) },
  327. { i: KN02_IRQ_NR(KN02_CSR_INR_TC0) } },
  328. { { i: KN02_IRQ_ALL },
  329. { p: kn02_all_int } },
  330. };
  331. void __init dec_init_kn02(void)
  332. {
  333. /* Setup some memory addresses. */
  334. dec_rtc_base = (void *)KN02_RTC_BASE;
  335. dec_kn_slot_size = KN02_SLOT_SIZE;
  336. /* IRQ routing. */
  337. memcpy(&dec_interrupt, &kn02_interrupt,
  338. sizeof(kn02_interrupt));
  339. /* CPU IRQ priorities. */
  340. memcpy(&cpu_mask_nr_tbl, &kn02_cpu_mask_nr_tbl,
  341. sizeof(kn02_cpu_mask_nr_tbl));
  342. /* KN02 CSR IRQ priorities. */
  343. memcpy(&asic_mask_nr_tbl, &kn02_asic_mask_nr_tbl,
  344. sizeof(kn02_asic_mask_nr_tbl));
  345. mips_cpu_irq_init(DEC_CPU_IRQ_BASE);
  346. init_kn02_irqs(KN02_IRQ_BASE);
  347. } /* dec_init_kn02 */
  348. /*
  349.  * Machine-specific initialisation for KN02-BA, aka DS5000/1xx
  350.  * (xx = 20, 25, 33), aka 3min.  Also applies to KN04(-BA), aka
  351.  * DS5000/150, aka 4min.
  352.  */
  353. static int kn02ba_interrupt[DEC_NR_INTS] __initdata = {
  354. [DEC_IRQ_CASCADE] = DEC_CPU_IRQ_NR(KN02BA_CPU_INR_CASCADE),
  355. [DEC_IRQ_AB_RECV] = -1,
  356. [DEC_IRQ_AB_XMIT] = -1,
  357. [DEC_IRQ_DZ11] = -1,
  358. [DEC_IRQ_ASC] = IO_IRQ_NR(KN02BA_IO_INR_ASC),
  359. [DEC_IRQ_FLOPPY] = -1,
  360. [DEC_IRQ_FPU] = DEC_CPU_IRQ_NR(DEC_CPU_INR_FPU),
  361. [DEC_IRQ_HALT] = DEC_CPU_IRQ_NR(KN02BA_CPU_INR_HALT),
  362. [DEC_IRQ_ISDN] = -1,
  363. [DEC_IRQ_LANCE] = IO_IRQ_NR(KN02BA_IO_INR_LANCE),
  364. [DEC_IRQ_MEMORY] = IO_IRQ_NR(KN02BA_IO_INR_MEMORY),
  365. [DEC_IRQ_PSU] = IO_IRQ_NR(KN02BA_IO_INR_PSU),
  366. [DEC_IRQ_RTC] = IO_IRQ_NR(KN02BA_IO_INR_RTC),
  367. [DEC_IRQ_SCC0] = IO_IRQ_NR(KN02BA_IO_INR_SCC0),
  368. [DEC_IRQ_SCC1] = IO_IRQ_NR(KN02BA_IO_INR_SCC1),
  369. [DEC_IRQ_SII] = -1,
  370. [DEC_IRQ_TC0] = DEC_CPU_IRQ_NR(KN02BA_CPU_INR_TC0),
  371. [DEC_IRQ_TC1] = DEC_CPU_IRQ_NR(KN02BA_CPU_INR_TC1),
  372. [DEC_IRQ_TC2] = DEC_CPU_IRQ_NR(KN02BA_CPU_INR_TC2),
  373. [DEC_IRQ_TIMER] = -1,
  374. [DEC_IRQ_VIDEO] = -1,
  375. [DEC_IRQ_ASC_MERR] = IO_IRQ_NR(IO_INR_ASC_MERR),
  376. [DEC_IRQ_ASC_ERR] = IO_IRQ_NR(IO_INR_ASC_ERR),
  377. [DEC_IRQ_ASC_DMA] = IO_IRQ_NR(IO_INR_ASC_DMA),
  378. [DEC_IRQ_FLOPPY_ERR] = -1,
  379. [DEC_IRQ_ISDN_ERR] = -1,
  380. [DEC_IRQ_ISDN_RXDMA] = -1,
  381. [DEC_IRQ_ISDN_TXDMA] = -1,
  382. [DEC_IRQ_LANCE_MERR] = IO_IRQ_NR(IO_INR_LANCE_MERR),
  383. [DEC_IRQ_SCC0A_RXERR] = IO_IRQ_NR(IO_INR_SCC0A_RXERR),
  384. [DEC_IRQ_SCC0A_RXDMA] = IO_IRQ_NR(IO_INR_SCC0A_RXDMA),
  385. [DEC_IRQ_SCC0A_TXERR] = IO_IRQ_NR(IO_INR_SCC0A_TXERR),
  386. [DEC_IRQ_SCC0A_TXDMA] = IO_IRQ_NR(IO_INR_SCC0A_TXDMA),
  387. [DEC_IRQ_SCC0B_RXERR] = -1,
  388. [DEC_IRQ_SCC0B_RXDMA] = -1,
  389. [DEC_IRQ_SCC0B_TXERR] = -1,
  390. [DEC_IRQ_SCC0B_TXDMA] = -1,
  391. [DEC_IRQ_SCC1A_RXERR] = IO_IRQ_NR(IO_INR_SCC1A_RXERR),
  392. [DEC_IRQ_SCC1A_RXDMA] = IO_IRQ_NR(IO_INR_SCC1A_RXDMA),
  393. [DEC_IRQ_SCC1A_TXERR] = IO_IRQ_NR(IO_INR_SCC1A_TXERR),
  394. [DEC_IRQ_SCC1A_TXDMA] = IO_IRQ_NR(IO_INR_SCC1A_TXDMA),
  395. };
  396. static int_ptr kn02ba_cpu_mask_nr_tbl[][2] __initdata = {
  397. { { i: DEC_CPU_IRQ_MASK(KN02BA_CPU_INR_CASCADE) },
  398. { p: kn02xa_io_int } },
  399. { { i: DEC_CPU_IRQ_MASK(KN02BA_CPU_INR_TC2) },
  400. { i: DEC_CPU_IRQ_NR(KN02BA_CPU_INR_TC2) } },
  401. { { i: DEC_CPU_IRQ_MASK(KN02BA_CPU_INR_TC1) },
  402. { i: DEC_CPU_IRQ_NR(KN02BA_CPU_INR_TC1) } },
  403. { { i: DEC_CPU_IRQ_MASK(KN02BA_CPU_INR_TC0) },
  404. { i: DEC_CPU_IRQ_NR(KN02BA_CPU_INR_TC0) } },
  405. { { i: DEC_CPU_IRQ_ALL },
  406. { p: cpu_all_int } },
  407. };
  408. static int_ptr kn02ba_asic_mask_nr_tbl[][2] __initdata = {
  409. { { i: IO_IRQ_MASK(KN02BA_IO_INR_MEMORY) },
  410. { i: IO_IRQ_NR(KN02BA_IO_INR_MEMORY) } },
  411. { { i: IO_IRQ_MASK(KN02BA_IO_INR_RTC) },
  412. { i: IO_IRQ_NR(KN02BA_IO_INR_RTC) } },
  413. { { i: IO_IRQ_DMA },
  414. { p: asic_dma_int } },
  415. { { i: IO_IRQ_MASK(KN02BA_IO_INR_SCC0) },
  416. { i: IO_IRQ_NR(KN02BA_IO_INR_SCC0) } },
  417. { { i: IO_IRQ_MASK(KN02BA_IO_INR_SCC1) },
  418. { i: IO_IRQ_NR(KN02BA_IO_INR_SCC1) } },
  419. { { i: IO_IRQ_MASK(KN02BA_IO_INR_ASC) },
  420. { i: IO_IRQ_NR(KN02BA_IO_INR_ASC) } },
  421. { { i: IO_IRQ_MASK(KN02BA_IO_INR_LANCE) },
  422. { i: IO_IRQ_NR(KN02BA_IO_INR_LANCE) } },
  423. { { i: IO_IRQ_ALL },
  424. { p: asic_all_int } },
  425. };
  426. void __init dec_init_kn02ba(void)
  427. {
  428. /* Setup some memory addresses. */
  429. ioasic_base = (void *)KN02BA_IOASIC_BASE;
  430. dec_rtc_base = (void *)KN02BA_RTC_BASE;
  431. dec_kn_slot_size = IOASIC_SLOT_SIZE;
  432. /* IRQ routing. */
  433. memcpy(&dec_interrupt, &kn02ba_interrupt,
  434. sizeof(kn02ba_interrupt));
  435. /* CPU IRQ priorities. */
  436. memcpy(&cpu_mask_nr_tbl, &kn02ba_cpu_mask_nr_tbl,
  437. sizeof(kn02ba_cpu_mask_nr_tbl));
  438. /* I/O ASIC IRQ priorities. */
  439. memcpy(&asic_mask_nr_tbl, &kn02ba_asic_mask_nr_tbl,
  440. sizeof(kn02ba_asic_mask_nr_tbl));
  441. mips_cpu_irq_init(DEC_CPU_IRQ_BASE);
  442. init_ioasic_irqs(IO_IRQ_BASE);
  443. } /* dec_init_kn02ba */
  444. /*
  445.  * Machine-specific initialisation for KN02-CA, aka DS5000/xx,
  446.  * (xx = 20, 25, 33), aka MAXine.  Also applies to KN04(-CA), aka
  447.  * DS5000/50, aka 4MAXine.
  448.  */
  449. static int kn02ca_interrupt[DEC_NR_INTS] __initdata = {
  450. [DEC_IRQ_CASCADE] = DEC_CPU_IRQ_NR(KN02CA_CPU_INR_CASCADE),
  451. [DEC_IRQ_AB_RECV] = IO_IRQ_NR(KN02CA_IO_INR_AB_RECV),
  452. [DEC_IRQ_AB_XMIT] = IO_IRQ_NR(KN02CA_IO_INR_AB_XMIT),
  453. [DEC_IRQ_DZ11] = -1,
  454. [DEC_IRQ_ASC] = IO_IRQ_NR(KN02CA_IO_INR_ASC),
  455. [DEC_IRQ_FLOPPY] = IO_IRQ_NR(KN02CA_IO_INR_FLOPPY),
  456. [DEC_IRQ_FPU] = DEC_CPU_IRQ_NR(DEC_CPU_INR_FPU),
  457. [DEC_IRQ_HALT] = DEC_CPU_IRQ_NR(KN02CA_CPU_INR_HALT),
  458. [DEC_IRQ_ISDN] = IO_IRQ_NR(KN02CA_IO_INR_ISDN),
  459. [DEC_IRQ_LANCE] = IO_IRQ_NR(KN02CA_IO_INR_LANCE),
  460. [DEC_IRQ_MEMORY] = DEC_CPU_IRQ_NR(KN02CA_CPU_INR_MEMORY),
  461. [DEC_IRQ_PSU] = -1,
  462. [DEC_IRQ_RTC] = DEC_CPU_IRQ_NR(KN02CA_CPU_INR_RTC),
  463. [DEC_IRQ_SCC0] = IO_IRQ_NR(KN02CA_IO_INR_SCC0),
  464. [DEC_IRQ_SCC1] = -1,
  465. [DEC_IRQ_SII] = -1,
  466. [DEC_IRQ_TC0] = IO_IRQ_NR(KN02CA_IO_INR_TC0),
  467. [DEC_IRQ_TC1] = IO_IRQ_NR(KN02CA_IO_INR_TC1),
  468. [DEC_IRQ_TC2] = -1,
  469. [DEC_IRQ_TIMER] = DEC_CPU_IRQ_NR(KN02CA_CPU_INR_TIMER),
  470. [DEC_IRQ_VIDEO] = IO_IRQ_NR(KN02CA_IO_INR_VIDEO),
  471. [DEC_IRQ_ASC_MERR] = IO_IRQ_NR(IO_INR_ASC_MERR),
  472. [DEC_IRQ_ASC_ERR] = IO_IRQ_NR(IO_INR_ASC_ERR),
  473. [DEC_IRQ_ASC_DMA] = IO_IRQ_NR(IO_INR_ASC_DMA),
  474. [DEC_IRQ_FLOPPY_ERR] = IO_IRQ_NR(IO_INR_FLOPPY_ERR),
  475. [DEC_IRQ_ISDN_ERR] = IO_IRQ_NR(IO_INR_ISDN_ERR),
  476. [DEC_IRQ_ISDN_RXDMA] = IO_IRQ_NR(IO_INR_ISDN_RXDMA),
  477. [DEC_IRQ_ISDN_TXDMA] = IO_IRQ_NR(IO_INR_ISDN_TXDMA),
  478. [DEC_IRQ_LANCE_MERR] = IO_IRQ_NR(IO_INR_LANCE_MERR),
  479. [DEC_IRQ_SCC0A_RXERR] = IO_IRQ_NR(IO_INR_SCC0A_RXERR),
  480. [DEC_IRQ_SCC0A_RXDMA] = IO_IRQ_NR(IO_INR_SCC0A_RXDMA),
  481. [DEC_IRQ_SCC0A_TXERR] = IO_IRQ_NR(IO_INR_SCC0A_TXERR),
  482. [DEC_IRQ_SCC0A_TXDMA] = IO_IRQ_NR(IO_INR_SCC0A_TXDMA),
  483. [DEC_IRQ_SCC0B_RXERR] = IO_IRQ_NR(IO_INR_SCC0B_RXERR),
  484. [DEC_IRQ_SCC0B_RXDMA] = IO_IRQ_NR(IO_INR_SCC0B_RXDMA),
  485. [DEC_IRQ_SCC0B_TXERR] = IO_IRQ_NR(IO_INR_SCC0B_TXERR),
  486. [DEC_IRQ_SCC0B_TXDMA] = IO_IRQ_NR(IO_INR_SCC0B_TXDMA),
  487. [DEC_IRQ_SCC1A_RXERR] = -1,
  488. [DEC_IRQ_SCC1A_RXDMA] = -1,
  489. [DEC_IRQ_SCC1A_TXERR] = -1,
  490. [DEC_IRQ_SCC1A_TXDMA] = -1,
  491. };
  492. static int_ptr kn02ca_cpu_mask_nr_tbl[][2] __initdata = {
  493. { { i: DEC_CPU_IRQ_MASK(KN02CA_CPU_INR_MEMORY) },
  494. { i: DEC_CPU_IRQ_NR(KN02CA_CPU_INR_MEMORY) } },
  495. { { i: DEC_CPU_IRQ_MASK(KN02CA_CPU_INR_RTC) },
  496. { i: DEC_CPU_IRQ_NR(KN02CA_CPU_INR_RTC) } },
  497. { { i: DEC_CPU_IRQ_MASK(KN02CA_CPU_INR_CASCADE) },
  498. { p: kn02xa_io_int } },
  499. { { i: DEC_CPU_IRQ_ALL },
  500. { p: cpu_all_int } },
  501. };
  502. static int_ptr kn02ca_asic_mask_nr_tbl[][2] __initdata = {
  503. { { i: IO_IRQ_DMA },
  504. { p: asic_dma_int } },
  505. { { i: IO_IRQ_MASK(KN02CA_IO_INR_SCC0) },
  506. { i: IO_IRQ_NR(KN02CA_IO_INR_SCC0) } },
  507. { { i: IO_IRQ_MASK(KN02CA_IO_INR_ASC) },
  508. { i: IO_IRQ_NR(KN02CA_IO_INR_ASC) } },
  509. { { i: IO_IRQ_MASK(KN02CA_IO_INR_LANCE) },
  510. { i: IO_IRQ_NR(KN02CA_IO_INR_LANCE) } },
  511. { { i: IO_IRQ_MASK(KN02CA_IO_INR_TC1) },
  512. { i: IO_IRQ_NR(KN02CA_IO_INR_TC1) } },
  513. { { i: IO_IRQ_MASK(KN02CA_IO_INR_TC0) },
  514. { i: IO_IRQ_NR(KN02CA_IO_INR_TC0) } },
  515. { { i: IO_IRQ_ALL },
  516. { p: asic_all_int } },
  517. };
  518. void __init dec_init_kn02ca(void)
  519. {
  520. /* Setup some memory addresses. */
  521. ioasic_base = (void *)KN02CA_IOASIC_BASE;
  522. dec_rtc_base = (void *)KN02CA_RTC_BASE;
  523. dec_kn_slot_size = IOASIC_SLOT_SIZE;
  524. /* IRQ routing. */
  525. memcpy(&dec_interrupt, &kn02ca_interrupt,
  526. sizeof(kn02ca_interrupt));
  527. /* CPU IRQ priorities. */
  528. memcpy(&cpu_mask_nr_tbl, &kn02ca_cpu_mask_nr_tbl,
  529. sizeof(kn02ca_cpu_mask_nr_tbl));
  530. /* I/O ASIC IRQ priorities. */
  531. memcpy(&asic_mask_nr_tbl, &kn02ca_asic_mask_nr_tbl,
  532. sizeof(kn02ca_asic_mask_nr_tbl));
  533. mips_cpu_irq_init(DEC_CPU_IRQ_BASE);
  534. init_ioasic_irqs(IO_IRQ_BASE);
  535. } /* dec_init_kn02ca */
  536. /*
  537.  * Machine-specific initialisation for KN03, aka DS5000/240,
  538.  * aka 3max+ and DS5900, aka BIGmax.  Also applies to KN05, aka
  539.  * DS5000/260, aka 4max+ and DS5900-260.
  540.  */
  541. static int kn03_interrupt[DEC_NR_INTS] __initdata = {
  542. [DEC_IRQ_CASCADE] = DEC_CPU_IRQ_NR(KN03_CPU_INR_CASCADE),
  543. [DEC_IRQ_AB_RECV] = -1,
  544. [DEC_IRQ_AB_XMIT] = -1,
  545. [DEC_IRQ_DZ11] = -1,
  546. [DEC_IRQ_ASC] = IO_IRQ_NR(KN03_IO_INR_ASC),
  547. [DEC_IRQ_FLOPPY] = -1,
  548. [DEC_IRQ_FPU] = DEC_CPU_IRQ_NR(DEC_CPU_INR_FPU),
  549. [DEC_IRQ_HALT] = DEC_CPU_IRQ_NR(KN03_CPU_INR_HALT),
  550. [DEC_IRQ_ISDN] = -1,
  551. [DEC_IRQ_LANCE] = IO_IRQ_NR(KN03_IO_INR_LANCE),
  552. [DEC_IRQ_MEMORY] = DEC_CPU_IRQ_NR(KN03_CPU_INR_MEMORY),
  553. [DEC_IRQ_PSU] = IO_IRQ_NR(KN03_IO_INR_PSU),
  554. [DEC_IRQ_RTC] = DEC_CPU_IRQ_NR(KN03_CPU_INR_RTC),
  555. [DEC_IRQ_SCC0] = IO_IRQ_NR(KN03_IO_INR_SCC0),
  556. [DEC_IRQ_SCC1] = IO_IRQ_NR(KN03_IO_INR_SCC1),
  557. [DEC_IRQ_SII] = -1,
  558. [DEC_IRQ_TC0] = IO_IRQ_NR(KN03_IO_INR_TC0),
  559. [DEC_IRQ_TC1] = IO_IRQ_NR(KN03_IO_INR_TC1),
  560. [DEC_IRQ_TC2] = IO_IRQ_NR(KN03_IO_INR_TC2),
  561. [DEC_IRQ_TIMER] = -1,
  562. [DEC_IRQ_VIDEO] = -1,
  563. [DEC_IRQ_ASC_MERR] = IO_IRQ_NR(IO_INR_ASC_MERR),
  564. [DEC_IRQ_ASC_ERR] = IO_IRQ_NR(IO_INR_ASC_ERR),
  565. [DEC_IRQ_ASC_DMA] = IO_IRQ_NR(IO_INR_ASC_DMA),
  566. [DEC_IRQ_FLOPPY_ERR] = -1,
  567. [DEC_IRQ_ISDN_ERR] = -1,
  568. [DEC_IRQ_ISDN_RXDMA] = -1,
  569. [DEC_IRQ_ISDN_TXDMA] = -1,
  570. [DEC_IRQ_LANCE_MERR] = IO_IRQ_NR(IO_INR_LANCE_MERR),
  571. [DEC_IRQ_SCC0A_RXERR] = IO_IRQ_NR(IO_INR_SCC0A_RXERR),
  572. [DEC_IRQ_SCC0A_RXDMA] = IO_IRQ_NR(IO_INR_SCC0A_RXDMA),
  573. [DEC_IRQ_SCC0A_TXERR] = IO_IRQ_NR(IO_INR_SCC0A_TXERR),
  574. [DEC_IRQ_SCC0A_TXDMA] = IO_IRQ_NR(IO_INR_SCC0A_TXDMA),
  575. [DEC_IRQ_SCC0B_RXERR] = -1,
  576. [DEC_IRQ_SCC0B_RXDMA] = -1,
  577. [DEC_IRQ_SCC0B_TXERR] = -1,
  578. [DEC_IRQ_SCC0B_TXDMA] = -1,
  579. [DEC_IRQ_SCC1A_RXERR] = IO_IRQ_NR(IO_INR_SCC1A_RXERR),
  580. [DEC_IRQ_SCC1A_RXDMA] = IO_IRQ_NR(IO_INR_SCC1A_RXDMA),
  581. [DEC_IRQ_SCC1A_TXERR] = IO_IRQ_NR(IO_INR_SCC1A_TXERR),
  582. [DEC_IRQ_SCC1A_TXDMA] = IO_IRQ_NR(IO_INR_SCC1A_TXDMA),
  583. };
  584. static int_ptr kn03_cpu_mask_nr_tbl[][2] __initdata = {
  585. { { i: DEC_CPU_IRQ_MASK(KN03_CPU_INR_MEMORY) },
  586. { i: DEC_CPU_IRQ_NR(KN03_CPU_INR_MEMORY) } },
  587. { { i: DEC_CPU_IRQ_MASK(KN03_CPU_INR_RTC) },
  588. { i: DEC_CPU_IRQ_NR(KN03_CPU_INR_RTC) } },
  589. { { i: DEC_CPU_IRQ_MASK(KN03_CPU_INR_CASCADE) },
  590. { p: kn03_io_int } },
  591. { { i: DEC_CPU_IRQ_ALL },
  592. { p: cpu_all_int } },
  593. };
  594. static int_ptr kn03_asic_mask_nr_tbl[][2] __initdata = {
  595. { { i: IO_IRQ_DMA },
  596. { p: asic_dma_int } },
  597. { { i: IO_IRQ_MASK(KN03_IO_INR_SCC0) },
  598. { i: IO_IRQ_NR(KN03_IO_INR_SCC0) } },
  599. { { i: IO_IRQ_MASK(KN03_IO_INR_SCC1) },
  600. { i: IO_IRQ_NR(KN03_IO_INR_SCC1) } },
  601. { { i: IO_IRQ_MASK(KN03_IO_INR_ASC) },
  602. { i: IO_IRQ_NR(KN03_IO_INR_ASC) } },
  603. { { i: IO_IRQ_MASK(KN03_IO_INR_LANCE) },
  604. { i: IO_IRQ_NR(KN03_IO_INR_LANCE) } },
  605. { { i: IO_IRQ_MASK(KN03_IO_INR_TC2) },
  606. { i: IO_IRQ_NR(KN03_IO_INR_TC2) } },
  607. { { i: IO_IRQ_MASK(KN03_IO_INR_TC1) },
  608. { i: IO_IRQ_NR(KN03_IO_INR_TC1) } },
  609. { { i: IO_IRQ_MASK(KN03_IO_INR_TC0) },
  610. { i: IO_IRQ_NR(KN03_IO_INR_TC0) } },
  611. { { i: IO_IRQ_ALL },
  612. { p: asic_all_int } },
  613. };
  614. void __init dec_init_kn03(void)
  615. {
  616. /* Setup some memory addresses.  */
  617. ioasic_base = (void *)KN03_IOASIC_BASE;
  618. dec_rtc_base = (void *)KN03_RTC_BASE;
  619. dec_kn_slot_size = IOASIC_SLOT_SIZE;
  620. /* IRQ routing. */
  621. memcpy(&dec_interrupt, &kn03_interrupt,
  622. sizeof(kn03_interrupt));
  623. /* CPU IRQ priorities. */
  624. memcpy(&cpu_mask_nr_tbl, &kn03_cpu_mask_nr_tbl,
  625. sizeof(kn03_cpu_mask_nr_tbl));
  626. /* I/O ASIC IRQ priorities. */
  627. memcpy(&asic_mask_nr_tbl, &kn03_asic_mask_nr_tbl,
  628. sizeof(kn03_asic_mask_nr_tbl));
  629. mips_cpu_irq_init(DEC_CPU_IRQ_BASE);
  630. init_ioasic_irqs(IO_IRQ_BASE);
  631. } /* dec_init_kn03 */
  632. void __init init_IRQ(void)
  633. {
  634. switch (mips_machtype) {
  635. case MACH_DS23100: /* DS2100/DS3100 Pmin/Pmax */
  636. dec_init_kn01();
  637. break;
  638. case MACH_DS5100: /* DS5100 MIPSmate */
  639. dec_init_kn230();
  640. break;
  641. case MACH_DS5000_200: /* DS5000/200 3max */
  642. dec_init_kn02();
  643. break;
  644. case MACH_DS5000_1XX: /* DS5000/1xx 3min */
  645. dec_init_kn02ba();
  646. break;
  647. case MACH_DS5000_2X0: /* DS5000/240 3max+ */
  648. dec_init_kn03();
  649. break;
  650. case MACH_DS5000_XX: /* Personal DS5000/xx */
  651. dec_init_kn02ca();
  652. break;
  653. case MACH_DS5800: /* DS5800 Isis */
  654. panic("Don't know how to set this up!");
  655. break;
  656. case MACH_DS5400: /* DS5400 MIPSfair */
  657. panic("Don't know how to set this up!");
  658. break;
  659. case MACH_DS5500: /* DS5500 MIPSfair-2 */
  660. panic("Don't know how to set this up!");
  661. break;
  662. }
  663. set_except_vector(0, decstation_handle_int);
  664. /* Free the FPU interrupt if the exception is present. */
  665. if (!(mips_cpu.options & MIPS_CPU_NOFPUEX)) {
  666. cpu_fpu_mask = 0;
  667. dec_interrupt[DEC_IRQ_FPU] = -1;
  668. }
  669. /* Register board interrupts: FPU and cascade. */
  670. if (dec_interrupt[DEC_IRQ_FPU] >= 0)
  671. setup_irq(dec_interrupt[DEC_IRQ_FPU], &fpuirq);
  672. if (dec_interrupt[DEC_IRQ_CASCADE] >= 0)
  673. setup_irq(dec_interrupt[DEC_IRQ_CASCADE], &ioirq);
  674. /* Register the HALT interrupt. */
  675. if (dec_interrupt[DEC_IRQ_HALT] >= 0)
  676. setup_irq(dec_interrupt[DEC_IRQ_HALT], &haltirq);
  677. }
  678. EXPORT_SYMBOL(ioasic_base);
  679. EXPORT_SYMBOL(dec_rtc_base);
  680. EXPORT_SYMBOL(dec_kn_slot_size);
  681. EXPORT_SYMBOL(dec_interrupt);