0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/console.h>
0012 #include <linux/export.h>
0013 #include <linux/init.h>
0014 #include <linux/interrupt.h>
0015 #include <linux/ioport.h>
0016 #include <linux/irq.h>
0017 #include <linux/irqnr.h>
0018 #include <linux/memblock.h>
0019 #include <linux/param.h>
0020 #include <linux/percpu-defs.h>
0021 #include <linux/sched.h>
0022 #include <linux/spinlock.h>
0023 #include <linux/types.h>
0024 #include <linux/pm.h>
0025
0026 #include <asm/addrspace.h>
0027 #include <asm/bootinfo.h>
0028 #include <asm/cpu.h>
0029 #include <asm/cpu-features.h>
0030 #include <asm/cpu-type.h>
0031 #include <asm/irq.h>
0032 #include <asm/irq_cpu.h>
0033 #include <asm/mipsregs.h>
0034 #include <asm/page.h>
0035 #include <asm/reboot.h>
0036 #include <asm/sections.h>
0037 #include <asm/time.h>
0038 #include <asm/traps.h>
0039 #include <asm/wbflush.h>
0040
0041 #include <asm/dec/interrupts.h>
0042 #include <asm/dec/ioasic.h>
0043 #include <asm/dec/ioasic_addrs.h>
0044 #include <asm/dec/ioasic_ints.h>
0045 #include <asm/dec/kn01.h>
0046 #include <asm/dec/kn02.h>
0047 #include <asm/dec/kn02ba.h>
0048 #include <asm/dec/kn02ca.h>
0049 #include <asm/dec/kn03.h>
0050 #include <asm/dec/kn230.h>
0051 #include <asm/dec/system.h>
0052
0053
0054 extern void dec_machine_restart(char *command);
0055 extern void dec_machine_halt(void);
0056 extern void dec_machine_power_off(void);
0057 extern irqreturn_t dec_intr_halt(int irq, void *dev_id);
0058
0059 unsigned long dec_kn_slot_base, dec_kn_slot_size;
0060
0061 EXPORT_SYMBOL(dec_kn_slot_base);
0062 EXPORT_SYMBOL(dec_kn_slot_size);
0063
0064 int dec_tc_bus;
0065
0066 DEFINE_SPINLOCK(ioasic_ssr_lock);
0067 EXPORT_SYMBOL(ioasic_ssr_lock);
0068
0069 volatile u32 *ioasic_base;
0070
0071 EXPORT_SYMBOL(ioasic_base);
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095 int dec_interrupt[DEC_NR_INTS] = {
0096 [0 ... DEC_NR_INTS - 1] = -1
0097 };
0098
0099 EXPORT_SYMBOL(dec_interrupt);
0100
0101 int_ptr cpu_mask_nr_tbl[DEC_MAX_CPU_INTS][2] = {
0102 { { .i = ~0 }, { .p = dec_intr_unimplemented } },
0103 };
0104 int_ptr asic_mask_nr_tbl[DEC_MAX_ASIC_INTS][2] = {
0105 { { .i = ~0 }, { .p = asic_intr_unimplemented } },
0106 };
0107 int cpu_fpu_mask = DEC_CPU_IRQ_MASK(DEC_CPU_INR_FPU);
0108 int *fpu_kstat_irq;
0109
0110 static irq_handler_t busirq_handler;
0111 static unsigned int busirq_flags = IRQF_NO_THREAD;
0112
0113
0114
0115
0116 static void __init dec_be_init(void)
0117 {
0118 switch (mips_machtype) {
0119 case MACH_DS23100:
0120 mips_set_be_handler(dec_kn01_be_handler);
0121 busirq_handler = dec_kn01_be_interrupt;
0122 busirq_flags |= IRQF_SHARED;
0123 dec_kn01_be_init();
0124 break;
0125 case MACH_DS5000_1XX:
0126 case MACH_DS5000_XX:
0127 mips_set_be_handler(dec_kn02xa_be_handler);
0128 busirq_handler = dec_kn02xa_be_interrupt;
0129 dec_kn02xa_be_init();
0130 break;
0131 case MACH_DS5000_200:
0132 case MACH_DS5000_2X0:
0133 case MACH_DS5900:
0134 mips_set_be_handler(dec_ecc_be_handler);
0135 busirq_handler = dec_ecc_be_interrupt;
0136 dec_ecc_be_init();
0137 break;
0138 }
0139 }
0140
0141 void __init plat_mem_setup(void)
0142 {
0143 board_be_init = dec_be_init;
0144
0145 wbflush_setup();
0146
0147 _machine_restart = dec_machine_restart;
0148 _machine_halt = dec_machine_halt;
0149 pm_power_off = dec_machine_power_off;
0150
0151 ioport_resource.start = ~0UL;
0152 ioport_resource.end = 0UL;
0153
0154
0155 memblock_reserve(PHYS_OFFSET, __pa_symbol(&_text) - PHYS_OFFSET);
0156 }
0157
0158
0159
0160
0161
0162 static int kn01_interrupt[DEC_NR_INTS] __initdata = {
0163 [DEC_IRQ_CASCADE] = -1,
0164 [DEC_IRQ_AB_RECV] = -1,
0165 [DEC_IRQ_AB_XMIT] = -1,
0166 [DEC_IRQ_DZ11] = DEC_CPU_IRQ_NR(KN01_CPU_INR_DZ11),
0167 [DEC_IRQ_ASC] = -1,
0168 [DEC_IRQ_FLOPPY] = -1,
0169 [DEC_IRQ_FPU] = DEC_CPU_IRQ_NR(DEC_CPU_INR_FPU),
0170 [DEC_IRQ_HALT] = -1,
0171 [DEC_IRQ_ISDN] = -1,
0172 [DEC_IRQ_LANCE] = DEC_CPU_IRQ_NR(KN01_CPU_INR_LANCE),
0173 [DEC_IRQ_BUS] = DEC_CPU_IRQ_NR(KN01_CPU_INR_BUS),
0174 [DEC_IRQ_PSU] = -1,
0175 [DEC_IRQ_RTC] = DEC_CPU_IRQ_NR(KN01_CPU_INR_RTC),
0176 [DEC_IRQ_SCC0] = -1,
0177 [DEC_IRQ_SCC1] = -1,
0178 [DEC_IRQ_SII] = DEC_CPU_IRQ_NR(KN01_CPU_INR_SII),
0179 [DEC_IRQ_TC0] = -1,
0180 [DEC_IRQ_TC1] = -1,
0181 [DEC_IRQ_TC2] = -1,
0182 [DEC_IRQ_TIMER] = -1,
0183 [DEC_IRQ_VIDEO] = DEC_CPU_IRQ_NR(KN01_CPU_INR_VIDEO),
0184 [DEC_IRQ_ASC_MERR] = -1,
0185 [DEC_IRQ_ASC_ERR] = -1,
0186 [DEC_IRQ_ASC_DMA] = -1,
0187 [DEC_IRQ_FLOPPY_ERR] = -1,
0188 [DEC_IRQ_ISDN_ERR] = -1,
0189 [DEC_IRQ_ISDN_RXDMA] = -1,
0190 [DEC_IRQ_ISDN_TXDMA] = -1,
0191 [DEC_IRQ_LANCE_MERR] = -1,
0192 [DEC_IRQ_SCC0A_RXERR] = -1,
0193 [DEC_IRQ_SCC0A_RXDMA] = -1,
0194 [DEC_IRQ_SCC0A_TXERR] = -1,
0195 [DEC_IRQ_SCC0A_TXDMA] = -1,
0196 [DEC_IRQ_AB_RXERR] = -1,
0197 [DEC_IRQ_AB_RXDMA] = -1,
0198 [DEC_IRQ_AB_TXERR] = -1,
0199 [DEC_IRQ_AB_TXDMA] = -1,
0200 [DEC_IRQ_SCC1A_RXERR] = -1,
0201 [DEC_IRQ_SCC1A_RXDMA] = -1,
0202 [DEC_IRQ_SCC1A_TXERR] = -1,
0203 [DEC_IRQ_SCC1A_TXDMA] = -1,
0204 };
0205
0206 static int_ptr kn01_cpu_mask_nr_tbl[][2] __initdata = {
0207 { { .i = DEC_CPU_IRQ_MASK(KN01_CPU_INR_BUS) },
0208 { .i = DEC_CPU_IRQ_NR(KN01_CPU_INR_BUS) } },
0209 { { .i = DEC_CPU_IRQ_MASK(KN01_CPU_INR_RTC) },
0210 { .i = DEC_CPU_IRQ_NR(KN01_CPU_INR_RTC) } },
0211 { { .i = DEC_CPU_IRQ_MASK(KN01_CPU_INR_DZ11) },
0212 { .i = DEC_CPU_IRQ_NR(KN01_CPU_INR_DZ11) } },
0213 { { .i = DEC_CPU_IRQ_MASK(KN01_CPU_INR_SII) },
0214 { .i = DEC_CPU_IRQ_NR(KN01_CPU_INR_SII) } },
0215 { { .i = DEC_CPU_IRQ_MASK(KN01_CPU_INR_LANCE) },
0216 { .i = DEC_CPU_IRQ_NR(KN01_CPU_INR_LANCE) } },
0217 { { .i = DEC_CPU_IRQ_ALL },
0218 { .p = cpu_all_int } },
0219 };
0220
0221 static void __init dec_init_kn01(void)
0222 {
0223
0224 memcpy(&dec_interrupt, &kn01_interrupt,
0225 sizeof(kn01_interrupt));
0226
0227
0228 memcpy(&cpu_mask_nr_tbl, &kn01_cpu_mask_nr_tbl,
0229 sizeof(kn01_cpu_mask_nr_tbl));
0230
0231 mips_cpu_irq_init();
0232
0233 }
0234
0235
0236
0237
0238
0239 static int kn230_interrupt[DEC_NR_INTS] __initdata = {
0240 [DEC_IRQ_CASCADE] = -1,
0241 [DEC_IRQ_AB_RECV] = -1,
0242 [DEC_IRQ_AB_XMIT] = -1,
0243 [DEC_IRQ_DZ11] = DEC_CPU_IRQ_NR(KN230_CPU_INR_DZ11),
0244 [DEC_IRQ_ASC] = -1,
0245 [DEC_IRQ_FLOPPY] = -1,
0246 [DEC_IRQ_FPU] = DEC_CPU_IRQ_NR(DEC_CPU_INR_FPU),
0247 [DEC_IRQ_HALT] = DEC_CPU_IRQ_NR(KN230_CPU_INR_HALT),
0248 [DEC_IRQ_ISDN] = -1,
0249 [DEC_IRQ_LANCE] = DEC_CPU_IRQ_NR(KN230_CPU_INR_LANCE),
0250 [DEC_IRQ_BUS] = DEC_CPU_IRQ_NR(KN230_CPU_INR_BUS),
0251 [DEC_IRQ_PSU] = -1,
0252 [DEC_IRQ_RTC] = DEC_CPU_IRQ_NR(KN230_CPU_INR_RTC),
0253 [DEC_IRQ_SCC0] = -1,
0254 [DEC_IRQ_SCC1] = -1,
0255 [DEC_IRQ_SII] = DEC_CPU_IRQ_NR(KN230_CPU_INR_SII),
0256 [DEC_IRQ_TC0] = -1,
0257 [DEC_IRQ_TC1] = -1,
0258 [DEC_IRQ_TC2] = -1,
0259 [DEC_IRQ_TIMER] = -1,
0260 [DEC_IRQ_VIDEO] = -1,
0261 [DEC_IRQ_ASC_MERR] = -1,
0262 [DEC_IRQ_ASC_ERR] = -1,
0263 [DEC_IRQ_ASC_DMA] = -1,
0264 [DEC_IRQ_FLOPPY_ERR] = -1,
0265 [DEC_IRQ_ISDN_ERR] = -1,
0266 [DEC_IRQ_ISDN_RXDMA] = -1,
0267 [DEC_IRQ_ISDN_TXDMA] = -1,
0268 [DEC_IRQ_LANCE_MERR] = -1,
0269 [DEC_IRQ_SCC0A_RXERR] = -1,
0270 [DEC_IRQ_SCC0A_RXDMA] = -1,
0271 [DEC_IRQ_SCC0A_TXERR] = -1,
0272 [DEC_IRQ_SCC0A_TXDMA] = -1,
0273 [DEC_IRQ_AB_RXERR] = -1,
0274 [DEC_IRQ_AB_RXDMA] = -1,
0275 [DEC_IRQ_AB_TXERR] = -1,
0276 [DEC_IRQ_AB_TXDMA] = -1,
0277 [DEC_IRQ_SCC1A_RXERR] = -1,
0278 [DEC_IRQ_SCC1A_RXDMA] = -1,
0279 [DEC_IRQ_SCC1A_TXERR] = -1,
0280 [DEC_IRQ_SCC1A_TXDMA] = -1,
0281 };
0282
0283 static int_ptr kn230_cpu_mask_nr_tbl[][2] __initdata = {
0284 { { .i = DEC_CPU_IRQ_MASK(KN230_CPU_INR_BUS) },
0285 { .i = DEC_CPU_IRQ_NR(KN230_CPU_INR_BUS) } },
0286 { { .i = DEC_CPU_IRQ_MASK(KN230_CPU_INR_RTC) },
0287 { .i = DEC_CPU_IRQ_NR(KN230_CPU_INR_RTC) } },
0288 { { .i = DEC_CPU_IRQ_MASK(KN230_CPU_INR_DZ11) },
0289 { .i = DEC_CPU_IRQ_NR(KN230_CPU_INR_DZ11) } },
0290 { { .i = DEC_CPU_IRQ_MASK(KN230_CPU_INR_SII) },
0291 { .i = DEC_CPU_IRQ_NR(KN230_CPU_INR_SII) } },
0292 { { .i = DEC_CPU_IRQ_ALL },
0293 { .p = cpu_all_int } },
0294 };
0295
0296 static void __init dec_init_kn230(void)
0297 {
0298
0299 memcpy(&dec_interrupt, &kn230_interrupt,
0300 sizeof(kn230_interrupt));
0301
0302
0303 memcpy(&cpu_mask_nr_tbl, &kn230_cpu_mask_nr_tbl,
0304 sizeof(kn230_cpu_mask_nr_tbl));
0305
0306 mips_cpu_irq_init();
0307
0308 }
0309
0310
0311
0312
0313
0314 static int kn02_interrupt[DEC_NR_INTS] __initdata = {
0315 [DEC_IRQ_CASCADE] = DEC_CPU_IRQ_NR(KN02_CPU_INR_CASCADE),
0316 [DEC_IRQ_AB_RECV] = -1,
0317 [DEC_IRQ_AB_XMIT] = -1,
0318 [DEC_IRQ_DZ11] = KN02_IRQ_NR(KN02_CSR_INR_DZ11),
0319 [DEC_IRQ_ASC] = KN02_IRQ_NR(KN02_CSR_INR_ASC),
0320 [DEC_IRQ_FLOPPY] = -1,
0321 [DEC_IRQ_FPU] = DEC_CPU_IRQ_NR(DEC_CPU_INR_FPU),
0322 [DEC_IRQ_HALT] = -1,
0323 [DEC_IRQ_ISDN] = -1,
0324 [DEC_IRQ_LANCE] = KN02_IRQ_NR(KN02_CSR_INR_LANCE),
0325 [DEC_IRQ_BUS] = DEC_CPU_IRQ_NR(KN02_CPU_INR_BUS),
0326 [DEC_IRQ_PSU] = -1,
0327 [DEC_IRQ_RTC] = DEC_CPU_IRQ_NR(KN02_CPU_INR_RTC),
0328 [DEC_IRQ_SCC0] = -1,
0329 [DEC_IRQ_SCC1] = -1,
0330 [DEC_IRQ_SII] = -1,
0331 [DEC_IRQ_TC0] = KN02_IRQ_NR(KN02_CSR_INR_TC0),
0332 [DEC_IRQ_TC1] = KN02_IRQ_NR(KN02_CSR_INR_TC1),
0333 [DEC_IRQ_TC2] = KN02_IRQ_NR(KN02_CSR_INR_TC2),
0334 [DEC_IRQ_TIMER] = -1,
0335 [DEC_IRQ_VIDEO] = -1,
0336 [DEC_IRQ_ASC_MERR] = -1,
0337 [DEC_IRQ_ASC_ERR] = -1,
0338 [DEC_IRQ_ASC_DMA] = -1,
0339 [DEC_IRQ_FLOPPY_ERR] = -1,
0340 [DEC_IRQ_ISDN_ERR] = -1,
0341 [DEC_IRQ_ISDN_RXDMA] = -1,
0342 [DEC_IRQ_ISDN_TXDMA] = -1,
0343 [DEC_IRQ_LANCE_MERR] = -1,
0344 [DEC_IRQ_SCC0A_RXERR] = -1,
0345 [DEC_IRQ_SCC0A_RXDMA] = -1,
0346 [DEC_IRQ_SCC0A_TXERR] = -1,
0347 [DEC_IRQ_SCC0A_TXDMA] = -1,
0348 [DEC_IRQ_AB_RXERR] = -1,
0349 [DEC_IRQ_AB_RXDMA] = -1,
0350 [DEC_IRQ_AB_TXERR] = -1,
0351 [DEC_IRQ_AB_TXDMA] = -1,
0352 [DEC_IRQ_SCC1A_RXERR] = -1,
0353 [DEC_IRQ_SCC1A_RXDMA] = -1,
0354 [DEC_IRQ_SCC1A_TXERR] = -1,
0355 [DEC_IRQ_SCC1A_TXDMA] = -1,
0356 };
0357
0358 static int_ptr kn02_cpu_mask_nr_tbl[][2] __initdata = {
0359 { { .i = DEC_CPU_IRQ_MASK(KN02_CPU_INR_BUS) },
0360 { .i = DEC_CPU_IRQ_NR(KN02_CPU_INR_BUS) } },
0361 { { .i = DEC_CPU_IRQ_MASK(KN02_CPU_INR_RTC) },
0362 { .i = DEC_CPU_IRQ_NR(KN02_CPU_INR_RTC) } },
0363 { { .i = DEC_CPU_IRQ_MASK(KN02_CPU_INR_CASCADE) },
0364 { .p = kn02_io_int } },
0365 { { .i = DEC_CPU_IRQ_ALL },
0366 { .p = cpu_all_int } },
0367 };
0368
0369 static int_ptr kn02_asic_mask_nr_tbl[][2] __initdata = {
0370 { { .i = KN02_IRQ_MASK(KN02_CSR_INR_DZ11) },
0371 { .i = KN02_IRQ_NR(KN02_CSR_INR_DZ11) } },
0372 { { .i = KN02_IRQ_MASK(KN02_CSR_INR_ASC) },
0373 { .i = KN02_IRQ_NR(KN02_CSR_INR_ASC) } },
0374 { { .i = KN02_IRQ_MASK(KN02_CSR_INR_LANCE) },
0375 { .i = KN02_IRQ_NR(KN02_CSR_INR_LANCE) } },
0376 { { .i = KN02_IRQ_MASK(KN02_CSR_INR_TC2) },
0377 { .i = KN02_IRQ_NR(KN02_CSR_INR_TC2) } },
0378 { { .i = KN02_IRQ_MASK(KN02_CSR_INR_TC1) },
0379 { .i = KN02_IRQ_NR(KN02_CSR_INR_TC1) } },
0380 { { .i = KN02_IRQ_MASK(KN02_CSR_INR_TC0) },
0381 { .i = KN02_IRQ_NR(KN02_CSR_INR_TC0) } },
0382 { { .i = KN02_IRQ_ALL },
0383 { .p = kn02_all_int } },
0384 };
0385
0386 static void __init dec_init_kn02(void)
0387 {
0388
0389 memcpy(&dec_interrupt, &kn02_interrupt,
0390 sizeof(kn02_interrupt));
0391
0392
0393 memcpy(&cpu_mask_nr_tbl, &kn02_cpu_mask_nr_tbl,
0394 sizeof(kn02_cpu_mask_nr_tbl));
0395
0396
0397 memcpy(&asic_mask_nr_tbl, &kn02_asic_mask_nr_tbl,
0398 sizeof(kn02_asic_mask_nr_tbl));
0399
0400 mips_cpu_irq_init();
0401 init_kn02_irqs(KN02_IRQ_BASE);
0402
0403 }
0404
0405
0406
0407
0408
0409
0410
0411 static int kn02ba_interrupt[DEC_NR_INTS] __initdata = {
0412 [DEC_IRQ_CASCADE] = DEC_CPU_IRQ_NR(KN02BA_CPU_INR_CASCADE),
0413 [DEC_IRQ_AB_RECV] = -1,
0414 [DEC_IRQ_AB_XMIT] = -1,
0415 [DEC_IRQ_DZ11] = -1,
0416 [DEC_IRQ_ASC] = IO_IRQ_NR(KN02BA_IO_INR_ASC),
0417 [DEC_IRQ_FLOPPY] = -1,
0418 [DEC_IRQ_FPU] = DEC_CPU_IRQ_NR(DEC_CPU_INR_FPU),
0419 [DEC_IRQ_HALT] = DEC_CPU_IRQ_NR(KN02BA_CPU_INR_HALT),
0420 [DEC_IRQ_ISDN] = -1,
0421 [DEC_IRQ_LANCE] = IO_IRQ_NR(KN02BA_IO_INR_LANCE),
0422 [DEC_IRQ_BUS] = IO_IRQ_NR(KN02BA_IO_INR_BUS),
0423 [DEC_IRQ_PSU] = IO_IRQ_NR(KN02BA_IO_INR_PSU),
0424 [DEC_IRQ_RTC] = IO_IRQ_NR(KN02BA_IO_INR_RTC),
0425 [DEC_IRQ_SCC0] = IO_IRQ_NR(KN02BA_IO_INR_SCC0),
0426 [DEC_IRQ_SCC1] = IO_IRQ_NR(KN02BA_IO_INR_SCC1),
0427 [DEC_IRQ_SII] = -1,
0428 [DEC_IRQ_TC0] = DEC_CPU_IRQ_NR(KN02BA_CPU_INR_TC0),
0429 [DEC_IRQ_TC1] = DEC_CPU_IRQ_NR(KN02BA_CPU_INR_TC1),
0430 [DEC_IRQ_TC2] = DEC_CPU_IRQ_NR(KN02BA_CPU_INR_TC2),
0431 [DEC_IRQ_TIMER] = -1,
0432 [DEC_IRQ_VIDEO] = -1,
0433 [DEC_IRQ_ASC_MERR] = IO_IRQ_NR(IO_INR_ASC_MERR),
0434 [DEC_IRQ_ASC_ERR] = IO_IRQ_NR(IO_INR_ASC_ERR),
0435 [DEC_IRQ_ASC_DMA] = IO_IRQ_NR(IO_INR_ASC_DMA),
0436 [DEC_IRQ_FLOPPY_ERR] = -1,
0437 [DEC_IRQ_ISDN_ERR] = -1,
0438 [DEC_IRQ_ISDN_RXDMA] = -1,
0439 [DEC_IRQ_ISDN_TXDMA] = -1,
0440 [DEC_IRQ_LANCE_MERR] = IO_IRQ_NR(IO_INR_LANCE_MERR),
0441 [DEC_IRQ_SCC0A_RXERR] = IO_IRQ_NR(IO_INR_SCC0A_RXERR),
0442 [DEC_IRQ_SCC0A_RXDMA] = IO_IRQ_NR(IO_INR_SCC0A_RXDMA),
0443 [DEC_IRQ_SCC0A_TXERR] = IO_IRQ_NR(IO_INR_SCC0A_TXERR),
0444 [DEC_IRQ_SCC0A_TXDMA] = IO_IRQ_NR(IO_INR_SCC0A_TXDMA),
0445 [DEC_IRQ_AB_RXERR] = -1,
0446 [DEC_IRQ_AB_RXDMA] = -1,
0447 [DEC_IRQ_AB_TXERR] = -1,
0448 [DEC_IRQ_AB_TXDMA] = -1,
0449 [DEC_IRQ_SCC1A_RXERR] = IO_IRQ_NR(IO_INR_SCC1A_RXERR),
0450 [DEC_IRQ_SCC1A_RXDMA] = IO_IRQ_NR(IO_INR_SCC1A_RXDMA),
0451 [DEC_IRQ_SCC1A_TXERR] = IO_IRQ_NR(IO_INR_SCC1A_TXERR),
0452 [DEC_IRQ_SCC1A_TXDMA] = IO_IRQ_NR(IO_INR_SCC1A_TXDMA),
0453 };
0454
0455 static int_ptr kn02ba_cpu_mask_nr_tbl[][2] __initdata = {
0456 { { .i = DEC_CPU_IRQ_MASK(KN02BA_CPU_INR_CASCADE) },
0457 { .p = kn02xa_io_int } },
0458 { { .i = DEC_CPU_IRQ_MASK(KN02BA_CPU_INR_TC2) },
0459 { .i = DEC_CPU_IRQ_NR(KN02BA_CPU_INR_TC2) } },
0460 { { .i = DEC_CPU_IRQ_MASK(KN02BA_CPU_INR_TC1) },
0461 { .i = DEC_CPU_IRQ_NR(KN02BA_CPU_INR_TC1) } },
0462 { { .i = DEC_CPU_IRQ_MASK(KN02BA_CPU_INR_TC0) },
0463 { .i = DEC_CPU_IRQ_NR(KN02BA_CPU_INR_TC0) } },
0464 { { .i = DEC_CPU_IRQ_ALL },
0465 { .p = cpu_all_int } },
0466 };
0467
0468 static int_ptr kn02ba_asic_mask_nr_tbl[][2] __initdata = {
0469 { { .i = IO_IRQ_MASK(KN02BA_IO_INR_BUS) },
0470 { .i = IO_IRQ_NR(KN02BA_IO_INR_BUS) } },
0471 { { .i = IO_IRQ_MASK(KN02BA_IO_INR_RTC) },
0472 { .i = IO_IRQ_NR(KN02BA_IO_INR_RTC) } },
0473 { { .i = IO_IRQ_DMA },
0474 { .p = asic_dma_int } },
0475 { { .i = IO_IRQ_MASK(KN02BA_IO_INR_SCC0) },
0476 { .i = IO_IRQ_NR(KN02BA_IO_INR_SCC0) } },
0477 { { .i = IO_IRQ_MASK(KN02BA_IO_INR_SCC1) },
0478 { .i = IO_IRQ_NR(KN02BA_IO_INR_SCC1) } },
0479 { { .i = IO_IRQ_MASK(KN02BA_IO_INR_ASC) },
0480 { .i = IO_IRQ_NR(KN02BA_IO_INR_ASC) } },
0481 { { .i = IO_IRQ_MASK(KN02BA_IO_INR_LANCE) },
0482 { .i = IO_IRQ_NR(KN02BA_IO_INR_LANCE) } },
0483 { { .i = IO_IRQ_ALL },
0484 { .p = asic_all_int } },
0485 };
0486
0487 static void __init dec_init_kn02ba(void)
0488 {
0489
0490 memcpy(&dec_interrupt, &kn02ba_interrupt,
0491 sizeof(kn02ba_interrupt));
0492
0493
0494 memcpy(&cpu_mask_nr_tbl, &kn02ba_cpu_mask_nr_tbl,
0495 sizeof(kn02ba_cpu_mask_nr_tbl));
0496
0497
0498 memcpy(&asic_mask_nr_tbl, &kn02ba_asic_mask_nr_tbl,
0499 sizeof(kn02ba_asic_mask_nr_tbl));
0500
0501 mips_cpu_irq_init();
0502 init_ioasic_irqs(IO_IRQ_BASE);
0503
0504 }
0505
0506
0507
0508
0509
0510
0511
0512 static int kn02ca_interrupt[DEC_NR_INTS] __initdata = {
0513 [DEC_IRQ_CASCADE] = DEC_CPU_IRQ_NR(KN02CA_CPU_INR_CASCADE),
0514 [DEC_IRQ_AB_RECV] = IO_IRQ_NR(KN02CA_IO_INR_AB_RECV),
0515 [DEC_IRQ_AB_XMIT] = IO_IRQ_NR(KN02CA_IO_INR_AB_XMIT),
0516 [DEC_IRQ_DZ11] = -1,
0517 [DEC_IRQ_ASC] = IO_IRQ_NR(KN02CA_IO_INR_ASC),
0518 [DEC_IRQ_FLOPPY] = IO_IRQ_NR(KN02CA_IO_INR_FLOPPY),
0519 [DEC_IRQ_FPU] = DEC_CPU_IRQ_NR(DEC_CPU_INR_FPU),
0520 [DEC_IRQ_HALT] = DEC_CPU_IRQ_NR(KN02CA_CPU_INR_HALT),
0521 [DEC_IRQ_ISDN] = IO_IRQ_NR(KN02CA_IO_INR_ISDN),
0522 [DEC_IRQ_LANCE] = IO_IRQ_NR(KN02CA_IO_INR_LANCE),
0523 [DEC_IRQ_BUS] = DEC_CPU_IRQ_NR(KN02CA_CPU_INR_BUS),
0524 [DEC_IRQ_PSU] = -1,
0525 [DEC_IRQ_RTC] = DEC_CPU_IRQ_NR(KN02CA_CPU_INR_RTC),
0526 [DEC_IRQ_SCC0] = IO_IRQ_NR(KN02CA_IO_INR_SCC0),
0527 [DEC_IRQ_SCC1] = -1,
0528 [DEC_IRQ_SII] = -1,
0529 [DEC_IRQ_TC0] = IO_IRQ_NR(KN02CA_IO_INR_TC0),
0530 [DEC_IRQ_TC1] = IO_IRQ_NR(KN02CA_IO_INR_TC1),
0531 [DEC_IRQ_TC2] = -1,
0532 [DEC_IRQ_TIMER] = DEC_CPU_IRQ_NR(KN02CA_CPU_INR_TIMER),
0533 [DEC_IRQ_VIDEO] = IO_IRQ_NR(KN02CA_IO_INR_VIDEO),
0534 [DEC_IRQ_ASC_MERR] = IO_IRQ_NR(IO_INR_ASC_MERR),
0535 [DEC_IRQ_ASC_ERR] = IO_IRQ_NR(IO_INR_ASC_ERR),
0536 [DEC_IRQ_ASC_DMA] = IO_IRQ_NR(IO_INR_ASC_DMA),
0537 [DEC_IRQ_FLOPPY_ERR] = IO_IRQ_NR(IO_INR_FLOPPY_ERR),
0538 [DEC_IRQ_ISDN_ERR] = IO_IRQ_NR(IO_INR_ISDN_ERR),
0539 [DEC_IRQ_ISDN_RXDMA] = IO_IRQ_NR(IO_INR_ISDN_RXDMA),
0540 [DEC_IRQ_ISDN_TXDMA] = IO_IRQ_NR(IO_INR_ISDN_TXDMA),
0541 [DEC_IRQ_LANCE_MERR] = IO_IRQ_NR(IO_INR_LANCE_MERR),
0542 [DEC_IRQ_SCC0A_RXERR] = IO_IRQ_NR(IO_INR_SCC0A_RXERR),
0543 [DEC_IRQ_SCC0A_RXDMA] = IO_IRQ_NR(IO_INR_SCC0A_RXDMA),
0544 [DEC_IRQ_SCC0A_TXERR] = IO_IRQ_NR(IO_INR_SCC0A_TXERR),
0545 [DEC_IRQ_SCC0A_TXDMA] = IO_IRQ_NR(IO_INR_SCC0A_TXDMA),
0546 [DEC_IRQ_AB_RXERR] = IO_IRQ_NR(IO_INR_AB_RXERR),
0547 [DEC_IRQ_AB_RXDMA] = IO_IRQ_NR(IO_INR_AB_RXDMA),
0548 [DEC_IRQ_AB_TXERR] = IO_IRQ_NR(IO_INR_AB_TXERR),
0549 [DEC_IRQ_AB_TXDMA] = IO_IRQ_NR(IO_INR_AB_TXDMA),
0550 [DEC_IRQ_SCC1A_RXERR] = -1,
0551 [DEC_IRQ_SCC1A_RXDMA] = -1,
0552 [DEC_IRQ_SCC1A_TXERR] = -1,
0553 [DEC_IRQ_SCC1A_TXDMA] = -1,
0554 };
0555
0556 static int_ptr kn02ca_cpu_mask_nr_tbl[][2] __initdata = {
0557 { { .i = DEC_CPU_IRQ_MASK(KN02CA_CPU_INR_BUS) },
0558 { .i = DEC_CPU_IRQ_NR(KN02CA_CPU_INR_BUS) } },
0559 { { .i = DEC_CPU_IRQ_MASK(KN02CA_CPU_INR_RTC) },
0560 { .i = DEC_CPU_IRQ_NR(KN02CA_CPU_INR_RTC) } },
0561 { { .i = DEC_CPU_IRQ_MASK(KN02CA_CPU_INR_CASCADE) },
0562 { .p = kn02xa_io_int } },
0563 { { .i = DEC_CPU_IRQ_ALL },
0564 { .p = cpu_all_int } },
0565 };
0566
0567 static int_ptr kn02ca_asic_mask_nr_tbl[][2] __initdata = {
0568 { { .i = IO_IRQ_DMA },
0569 { .p = asic_dma_int } },
0570 { { .i = IO_IRQ_MASK(KN02CA_IO_INR_SCC0) },
0571 { .i = IO_IRQ_NR(KN02CA_IO_INR_SCC0) } },
0572 { { .i = IO_IRQ_MASK(KN02CA_IO_INR_ASC) },
0573 { .i = IO_IRQ_NR(KN02CA_IO_INR_ASC) } },
0574 { { .i = IO_IRQ_MASK(KN02CA_IO_INR_LANCE) },
0575 { .i = IO_IRQ_NR(KN02CA_IO_INR_LANCE) } },
0576 { { .i = IO_IRQ_MASK(KN02CA_IO_INR_TC1) },
0577 { .i = IO_IRQ_NR(KN02CA_IO_INR_TC1) } },
0578 { { .i = IO_IRQ_MASK(KN02CA_IO_INR_TC0) },
0579 { .i = IO_IRQ_NR(KN02CA_IO_INR_TC0) } },
0580 { { .i = IO_IRQ_ALL },
0581 { .p = asic_all_int } },
0582 };
0583
0584 static void __init dec_init_kn02ca(void)
0585 {
0586
0587 memcpy(&dec_interrupt, &kn02ca_interrupt,
0588 sizeof(kn02ca_interrupt));
0589
0590
0591 memcpy(&cpu_mask_nr_tbl, &kn02ca_cpu_mask_nr_tbl,
0592 sizeof(kn02ca_cpu_mask_nr_tbl));
0593
0594
0595 memcpy(&asic_mask_nr_tbl, &kn02ca_asic_mask_nr_tbl,
0596 sizeof(kn02ca_asic_mask_nr_tbl));
0597
0598 mips_cpu_irq_init();
0599 init_ioasic_irqs(IO_IRQ_BASE);
0600
0601 }
0602
0603
0604
0605
0606
0607
0608
0609 static int kn03_interrupt[DEC_NR_INTS] __initdata = {
0610 [DEC_IRQ_CASCADE] = DEC_CPU_IRQ_NR(KN03_CPU_INR_CASCADE),
0611 [DEC_IRQ_AB_RECV] = -1,
0612 [DEC_IRQ_AB_XMIT] = -1,
0613 [DEC_IRQ_DZ11] = -1,
0614 [DEC_IRQ_ASC] = IO_IRQ_NR(KN03_IO_INR_ASC),
0615 [DEC_IRQ_FLOPPY] = -1,
0616 [DEC_IRQ_FPU] = DEC_CPU_IRQ_NR(DEC_CPU_INR_FPU),
0617 [DEC_IRQ_HALT] = DEC_CPU_IRQ_NR(KN03_CPU_INR_HALT),
0618 [DEC_IRQ_ISDN] = -1,
0619 [DEC_IRQ_LANCE] = IO_IRQ_NR(KN03_IO_INR_LANCE),
0620 [DEC_IRQ_BUS] = DEC_CPU_IRQ_NR(KN03_CPU_INR_BUS),
0621 [DEC_IRQ_PSU] = IO_IRQ_NR(KN03_IO_INR_PSU),
0622 [DEC_IRQ_RTC] = DEC_CPU_IRQ_NR(KN03_CPU_INR_RTC),
0623 [DEC_IRQ_SCC0] = IO_IRQ_NR(KN03_IO_INR_SCC0),
0624 [DEC_IRQ_SCC1] = IO_IRQ_NR(KN03_IO_INR_SCC1),
0625 [DEC_IRQ_SII] = -1,
0626 [DEC_IRQ_TC0] = IO_IRQ_NR(KN03_IO_INR_TC0),
0627 [DEC_IRQ_TC1] = IO_IRQ_NR(KN03_IO_INR_TC1),
0628 [DEC_IRQ_TC2] = IO_IRQ_NR(KN03_IO_INR_TC2),
0629 [DEC_IRQ_TIMER] = -1,
0630 [DEC_IRQ_VIDEO] = -1,
0631 [DEC_IRQ_ASC_MERR] = IO_IRQ_NR(IO_INR_ASC_MERR),
0632 [DEC_IRQ_ASC_ERR] = IO_IRQ_NR(IO_INR_ASC_ERR),
0633 [DEC_IRQ_ASC_DMA] = IO_IRQ_NR(IO_INR_ASC_DMA),
0634 [DEC_IRQ_FLOPPY_ERR] = -1,
0635 [DEC_IRQ_ISDN_ERR] = -1,
0636 [DEC_IRQ_ISDN_RXDMA] = -1,
0637 [DEC_IRQ_ISDN_TXDMA] = -1,
0638 [DEC_IRQ_LANCE_MERR] = IO_IRQ_NR(IO_INR_LANCE_MERR),
0639 [DEC_IRQ_SCC0A_RXERR] = IO_IRQ_NR(IO_INR_SCC0A_RXERR),
0640 [DEC_IRQ_SCC0A_RXDMA] = IO_IRQ_NR(IO_INR_SCC0A_RXDMA),
0641 [DEC_IRQ_SCC0A_TXERR] = IO_IRQ_NR(IO_INR_SCC0A_TXERR),
0642 [DEC_IRQ_SCC0A_TXDMA] = IO_IRQ_NR(IO_INR_SCC0A_TXDMA),
0643 [DEC_IRQ_AB_RXERR] = -1,
0644 [DEC_IRQ_AB_RXDMA] = -1,
0645 [DEC_IRQ_AB_TXERR] = -1,
0646 [DEC_IRQ_AB_TXDMA] = -1,
0647 [DEC_IRQ_SCC1A_RXERR] = IO_IRQ_NR(IO_INR_SCC1A_RXERR),
0648 [DEC_IRQ_SCC1A_RXDMA] = IO_IRQ_NR(IO_INR_SCC1A_RXDMA),
0649 [DEC_IRQ_SCC1A_TXERR] = IO_IRQ_NR(IO_INR_SCC1A_TXERR),
0650 [DEC_IRQ_SCC1A_TXDMA] = IO_IRQ_NR(IO_INR_SCC1A_TXDMA),
0651 };
0652
0653 static int_ptr kn03_cpu_mask_nr_tbl[][2] __initdata = {
0654 { { .i = DEC_CPU_IRQ_MASK(KN03_CPU_INR_BUS) },
0655 { .i = DEC_CPU_IRQ_NR(KN03_CPU_INR_BUS) } },
0656 { { .i = DEC_CPU_IRQ_MASK(KN03_CPU_INR_RTC) },
0657 { .i = DEC_CPU_IRQ_NR(KN03_CPU_INR_RTC) } },
0658 { { .i = DEC_CPU_IRQ_MASK(KN03_CPU_INR_CASCADE) },
0659 { .p = kn03_io_int } },
0660 { { .i = DEC_CPU_IRQ_ALL },
0661 { .p = cpu_all_int } },
0662 };
0663
0664 static int_ptr kn03_asic_mask_nr_tbl[][2] __initdata = {
0665 { { .i = IO_IRQ_DMA },
0666 { .p = asic_dma_int } },
0667 { { .i = IO_IRQ_MASK(KN03_IO_INR_SCC0) },
0668 { .i = IO_IRQ_NR(KN03_IO_INR_SCC0) } },
0669 { { .i = IO_IRQ_MASK(KN03_IO_INR_SCC1) },
0670 { .i = IO_IRQ_NR(KN03_IO_INR_SCC1) } },
0671 { { .i = IO_IRQ_MASK(KN03_IO_INR_ASC) },
0672 { .i = IO_IRQ_NR(KN03_IO_INR_ASC) } },
0673 { { .i = IO_IRQ_MASK(KN03_IO_INR_LANCE) },
0674 { .i = IO_IRQ_NR(KN03_IO_INR_LANCE) } },
0675 { { .i = IO_IRQ_MASK(KN03_IO_INR_TC2) },
0676 { .i = IO_IRQ_NR(KN03_IO_INR_TC2) } },
0677 { { .i = IO_IRQ_MASK(KN03_IO_INR_TC1) },
0678 { .i = IO_IRQ_NR(KN03_IO_INR_TC1) } },
0679 { { .i = IO_IRQ_MASK(KN03_IO_INR_TC0) },
0680 { .i = IO_IRQ_NR(KN03_IO_INR_TC0) } },
0681 { { .i = IO_IRQ_ALL },
0682 { .p = asic_all_int } },
0683 };
0684
0685 static void __init dec_init_kn03(void)
0686 {
0687
0688 memcpy(&dec_interrupt, &kn03_interrupt,
0689 sizeof(kn03_interrupt));
0690
0691
0692 memcpy(&cpu_mask_nr_tbl, &kn03_cpu_mask_nr_tbl,
0693 sizeof(kn03_cpu_mask_nr_tbl));
0694
0695
0696 memcpy(&asic_mask_nr_tbl, &kn03_asic_mask_nr_tbl,
0697 sizeof(kn03_asic_mask_nr_tbl));
0698
0699 mips_cpu_irq_init();
0700 init_ioasic_irqs(IO_IRQ_BASE);
0701
0702 }
0703
0704
0705 void __init arch_init_irq(void)
0706 {
0707 switch (mips_machtype) {
0708 case MACH_DS23100:
0709 dec_init_kn01();
0710 break;
0711 case MACH_DS5100:
0712 dec_init_kn230();
0713 break;
0714 case MACH_DS5000_200:
0715 dec_init_kn02();
0716 break;
0717 case MACH_DS5000_1XX:
0718 dec_init_kn02ba();
0719 break;
0720 case MACH_DS5000_2X0:
0721 case MACH_DS5900:
0722 dec_init_kn03();
0723 break;
0724 case MACH_DS5000_XX:
0725 dec_init_kn02ca();
0726 break;
0727 case MACH_DS5800:
0728 panic("Don't know how to set this up!");
0729 break;
0730 case MACH_DS5400:
0731 panic("Don't know how to set this up!");
0732 break;
0733 case MACH_DS5500:
0734 panic("Don't know how to set this up!");
0735 break;
0736 }
0737
0738
0739 if (!cpu_has_nofpuex) {
0740 cpu_fpu_mask = 0;
0741 dec_interrupt[DEC_IRQ_FPU] = -1;
0742 }
0743
0744 if (current_cpu_type() == CPU_R4000SC ||
0745 current_cpu_type() == CPU_R4400SC)
0746 dec_interrupt[DEC_IRQ_HALT] = -1;
0747
0748
0749 if (IS_ENABLED(CONFIG_MIPS_FP_SUPPORT) &&
0750 dec_interrupt[DEC_IRQ_FPU] >= 0 && cpu_has_fpu) {
0751 struct irq_desc *desc_fpu;
0752 int irq_fpu;
0753
0754 irq_fpu = dec_interrupt[DEC_IRQ_FPU];
0755 if (request_irq(irq_fpu, no_action, IRQF_NO_THREAD, "fpu",
0756 NULL))
0757 pr_err("Failed to register fpu interrupt\n");
0758 desc_fpu = irq_to_desc(irq_fpu);
0759 fpu_kstat_irq = this_cpu_ptr(desc_fpu->kstat_irqs);
0760 }
0761 if (dec_interrupt[DEC_IRQ_CASCADE] >= 0) {
0762 if (request_irq(dec_interrupt[DEC_IRQ_CASCADE], no_action,
0763 IRQF_NO_THREAD, "cascade", NULL))
0764 pr_err("Failed to register cascade interrupt\n");
0765 }
0766
0767 if (dec_interrupt[DEC_IRQ_BUS] >= 0 && busirq_handler) {
0768 if (request_irq(dec_interrupt[DEC_IRQ_BUS], busirq_handler,
0769 busirq_flags, "bus error", busirq_handler))
0770 pr_err("Failed to register bus error interrupt\n");
0771 }
0772
0773 if (dec_interrupt[DEC_IRQ_HALT] >= 0) {
0774 if (request_irq(dec_interrupt[DEC_IRQ_HALT], dec_intr_halt,
0775 IRQF_NO_THREAD, "halt", NULL))
0776 pr_err("Failed to register halt interrupt\n");
0777 }
0778 }
0779
0780 asmlinkage unsigned int dec_irq_dispatch(unsigned int irq)
0781 {
0782 do_IRQ(irq);
0783 return 0;
0784 }