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

嵌入式Linux

开发平台:

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 Maciej W. Rozycki
  10.  */
  11. #include <linux/sched.h>
  12. #include <linux/interrupt.h>
  13. #include <linux/mc146818rtc.h>
  14. #include <linux/param.h>
  15. #include <linux/console.h>
  16. #include <asm/mipsregs.h>
  17. #include <asm/bootinfo.h>
  18. #include <linux/init.h>
  19. #include <asm/irq.h>
  20. #include <asm/reboot.h>
  21. #include <asm/dec/interrupts.h>
  22. #include <asm/dec/kn01.h>
  23. #include <asm/dec/kn02.h>
  24. #include <asm/dec/kn02xa.h>
  25. #include <asm/dec/kn03.h>
  26. #include <asm/dec/ioasic.h>
  27. #include <asm/dec/ioasic_addrs.h>
  28. #include <asm/dec/ioasic_ints.h>
  29. char *dec_rtc_base = (void *) KN01_RTC_BASE; /* Assume DS2100/3100 initially */
  30. volatile unsigned int *ioasic_base;
  31. decint_t dec_interrupt[NR_INTS];
  32. /*
  33.  * Information regarding the IRQ Controller
  34.  */
  35. volatile unsigned int *isr = 0L; /* address of the interrupt status register     */
  36. volatile unsigned int *imr = 0L; /* address of the interrupt mask register       */
  37. extern void dec_machine_restart(char *command);
  38. extern void dec_machine_halt(void);
  39. extern void dec_machine_power_off(void);
  40. extern void dec_intr_halt(int irq, void *dev_id, struct pt_regs *regs);
  41. extern void wbflush_setup(void);
  42. extern struct rtc_ops dec_rtc_ops;
  43. extern int setup_dec_irq(int, struct irqaction *);
  44. void (*board_time_init) (struct irqaction * irq);
  45. static struct irqaction irq10 = {dec_intr_halt, 0, 0, "halt", NULL, NULL};
  46. /*
  47.  * enable the periodic interrupts
  48.  */
  49. static void __init dec_time_init(struct irqaction *irq)
  50. {
  51.     /*
  52.      * Here we go, enable periodic rtc interrupts.
  53.      */
  54. #ifndef LOG_2_HZ
  55. #  define LOG_2_HZ 7
  56. #endif
  57.     CMOS_WRITE(RTC_REF_CLCK_32KHZ | (16 - LOG_2_HZ), RTC_REG_A);
  58.     CMOS_WRITE(CMOS_READ(RTC_REG_B) | RTC_PIE, RTC_REG_B);
  59.     setup_dec_irq(CLOCK, irq);
  60. }
  61. /*
  62.  * Enable the halt interrupt.
  63.  */
  64. static void __init dec_halt_init(struct irqaction *irq)
  65. {
  66.     setup_dec_irq(HALT, irq);
  67. }
  68. void __init decstation_setup(void)
  69. {
  70.     board_time_init = dec_time_init;
  71.     wbflush_setup();
  72.     _machine_restart = dec_machine_restart;
  73.     _machine_halt = dec_machine_halt;
  74.     _machine_power_off = dec_machine_power_off;
  75. #ifdef CONFIG_FB
  76.     conswitchp = &dummy_con;
  77. #endif
  78.     rtc_ops = &dec_rtc_ops;
  79. }
  80. /*
  81.  * Machine-specific initialisation for kn01, aka Pmax, aka DS2100, DS3100,
  82.  * and possibly also the DS5100.
  83.  */
  84. void __init dec_init_kn01(void)
  85. {
  86.     /*
  87.      * Setup some memory addresses.
  88.      */
  89.     dec_rtc_base = (char *) KN01_RTC_BASE;
  90.     /*
  91.      * Setup interrupt structure
  92.      */
  93.     dec_interrupt[CLOCK].cpu_mask = IE_IRQ3;
  94.     dec_interrupt[CLOCK].iemask = 0;
  95.     cpu_mask_tbl[0] = IE_IRQ3;
  96.     cpu_irq_nr[0] = CLOCK;
  97.     dec_interrupt[SCSI_INT].cpu_mask = IE_IRQ0;
  98.     dec_interrupt[SCSI_INT].iemask = 0;
  99.     cpu_mask_tbl[1] = IE_IRQ0;
  100.     cpu_irq_nr[1] = SCSI_INT;
  101.     dec_interrupt[ETHER].cpu_mask = IE_IRQ1;
  102.     dec_interrupt[ETHER].iemask = 0;
  103.     cpu_mask_tbl[2] = IE_IRQ1;
  104.     cpu_irq_nr[2] = ETHER;
  105.     dec_interrupt[SERIAL].cpu_mask = IE_IRQ2;
  106.     dec_interrupt[SERIAL].iemask = 0;
  107.     cpu_mask_tbl[3] = IE_IRQ2;
  108.     cpu_irq_nr[3] = SERIAL;
  109.     dec_interrupt[MEMORY].cpu_mask = IE_IRQ4;
  110.     dec_interrupt[MEMORY].iemask = 0;
  111.     cpu_mask_tbl[4] = IE_IRQ4;
  112.     cpu_irq_nr[4] = MEMORY;
  113.     dec_interrupt[FPU].cpu_mask = IE_IRQ5;
  114.     dec_interrupt[FPU].iemask = 0;
  115.     cpu_mask_tbl[5] = IE_IRQ5;
  116.     cpu_irq_nr[5] = FPU;
  117. } /* dec_init_kn01 */
  118. /*
  119.  * Machine-specific initialisation for kn230, aka MIPSmate, aka DS5100
  120.  *
  121.  * There are a lot of experiments to do, this is definitely incomplete.
  122.  */
  123. void __init dec_init_kn230(void)
  124. {
  125.     /*
  126.      * Setup some memory addresses.
  127.      */
  128.     dec_rtc_base = (char *) KN01_RTC_BASE;
  129.     /*
  130.      * Setup interrupt structure
  131.      */
  132.     dec_interrupt[CLOCK].cpu_mask = IE_IRQ2;
  133.     dec_interrupt[CLOCK].iemask = 0;
  134.     cpu_mask_tbl[0] = IE_IRQ2;
  135.     cpu_irq_nr[0] = CLOCK;
  136.     dec_interrupt[FPU].cpu_mask = IE_IRQ5;
  137.     dec_interrupt[FPU].iemask = 0;
  138.     cpu_mask_tbl[5] = IE_IRQ5;
  139.     cpu_irq_nr[5] = FPU;
  140. } /* dec_init_kn230 */
  141. /*
  142.  * Machine-specific initialisation for kn02, aka 3max, aka DS5000/2xx.
  143.  */
  144. void __init dec_init_kn02(void)
  145. {
  146.     /*
  147.      * Setup some memory addresses. FIXME: probably incomplete!
  148.      */
  149.     dec_rtc_base = (char *) KN02_RTC_BASE;
  150.     isr = (void *) KN02_CSR_ADDR;
  151.     imr = (void *) KN02_CSR_ADDR;
  152.     /*
  153.      * Setup IOASIC interrupt
  154.      */
  155.     cpu_ivec_tbl[1] = kn02_io_int;
  156.     cpu_mask_tbl[1] = IE_IRQ0;
  157.     cpu_irq_nr[1] = -1;
  158.     *imr = *imr & 0xff00ff00;
  159.     /*
  160.      * Setup interrupt structure
  161.      */
  162.     dec_interrupt[CLOCK].cpu_mask = IE_IRQ1;
  163.     dec_interrupt[CLOCK].iemask = 0;
  164.     cpu_mask_tbl[0] = IE_IRQ1;
  165.     cpu_irq_nr[0] = CLOCK;
  166.     dec_interrupt[SCSI_INT].cpu_mask = IE_IRQ0;
  167.     dec_interrupt[SCSI_INT].iemask = KN02_SLOT5;
  168.     asic_mask_tbl[0] = KN02_SLOT5;
  169.     asic_irq_nr[0] = SCSI_INT;
  170.     dec_interrupt[ETHER].cpu_mask = IE_IRQ0;
  171.     dec_interrupt[ETHER].iemask = KN02_SLOT6;
  172.     asic_mask_tbl[1] = KN02_SLOT6;
  173.     asic_irq_nr[1] = ETHER;
  174.     dec_interrupt[SERIAL].cpu_mask = IE_IRQ0;
  175.     dec_interrupt[SERIAL].iemask = KN02_SLOT7;
  176.     asic_mask_tbl[2] = KN02_SLOT7;
  177.     asic_irq_nr[2] = SERIAL;
  178.     dec_interrupt[TC0].cpu_mask = IE_IRQ0;
  179.     dec_interrupt[TC0].iemask = KN02_SLOT0;
  180.     asic_mask_tbl[3] = KN02_SLOT0;
  181.     asic_irq_nr[3] = TC0;
  182.     dec_interrupt[TC1].cpu_mask = IE_IRQ0;
  183.     dec_interrupt[TC1].iemask = KN02_SLOT1;
  184.     asic_mask_tbl[4] = KN02_SLOT1;
  185.     asic_irq_nr[4] = TC1;
  186.     dec_interrupt[TC2].cpu_mask = IE_IRQ0;
  187.     dec_interrupt[TC2].iemask = KN02_SLOT2;
  188.     asic_mask_tbl[5] = KN02_SLOT2;
  189.     asic_irq_nr[5] = TC2;
  190.     dec_interrupt[MEMORY].cpu_mask = IE_IRQ3;
  191.     dec_interrupt[MEMORY].iemask = 0;
  192.     cpu_mask_tbl[2] = IE_IRQ3;
  193.     cpu_irq_nr[2] = MEMORY;
  194.     dec_interrupt[FPU].cpu_mask = IE_IRQ5;
  195.     dec_interrupt[FPU].iemask = 0;
  196.     cpu_mask_tbl[3] = IE_IRQ5;
  197.     cpu_irq_nr[3] = FPU;
  198. } /* dec_init_kn02 */
  199. /*
  200.  * Machine-specific initialisation for kn02ba, aka 3min, aka DS5000/1xx.
  201.  */
  202. void __init dec_init_kn02ba(void)
  203. {
  204.     /*
  205.      * Setup some memory addresses.
  206.      */
  207.     ioasic_base = (void *) KN02XA_IOASIC_BASE;
  208.     dec_rtc_base = (char *) KN02XA_RTC_BASE;
  209.     isr = (void *) KN02XA_IOASIC_REG(SIR);
  210.     imr = (void *) KN02XA_IOASIC_REG(SIMR);
  211.     /*
  212.      * Setup IOASIC interrupt
  213.      */
  214.     cpu_mask_tbl[0] = IE_IRQ3;
  215.     cpu_irq_nr[0] = -1;
  216.     cpu_ivec_tbl[0] = kn02xa_io_int;
  217.     *imr = 0;
  218.     /*
  219.      * Setup interrupt structure
  220.      */
  221.     dec_interrupt[CLOCK].cpu_mask = IE_IRQ3;
  222.     dec_interrupt[CLOCK].iemask = KMIN_CLOCK;
  223.     asic_mask_tbl[0] = KMIN_CLOCK;
  224.     asic_irq_nr[0] = CLOCK;
  225.     dec_interrupt[SCSI_DMA_INT].cpu_mask = IE_IRQ3;
  226.     dec_interrupt[SCSI_DMA_INT].iemask = SCSI_DMA_INTS;
  227.     asic_mask_tbl[1] = SCSI_DMA_INTS;
  228.     asic_irq_nr[1] = SCSI_DMA_INT;
  229.     dec_interrupt[SCSI_INT].cpu_mask = IE_IRQ3;
  230.     dec_interrupt[SCSI_INT].iemask = SCSI_CHIP;
  231.     asic_mask_tbl[2] = SCSI_CHIP;
  232.     asic_irq_nr[2] = SCSI_INT;
  233.     dec_interrupt[ETHER].cpu_mask = IE_IRQ3;
  234.     dec_interrupt[ETHER].iemask = LANCE_INTS;
  235.     asic_mask_tbl[3] = LANCE_INTS;
  236.     asic_irq_nr[3] = ETHER;
  237.     dec_interrupt[SERIAL].cpu_mask = IE_IRQ3;
  238.     dec_interrupt[SERIAL].iemask = SERIAL_INTS;
  239.     asic_mask_tbl[4] = SERIAL_INTS;
  240.     asic_irq_nr[4] = SERIAL;
  241.     dec_interrupt[MEMORY].cpu_mask = IE_IRQ3;
  242.     dec_interrupt[MEMORY].iemask = KMIN_TIMEOUT;
  243.     asic_mask_tbl[5] = KMIN_TIMEOUT;
  244.     asic_irq_nr[5] = MEMORY;
  245.     dec_interrupt[TC0].cpu_mask = IE_IRQ0;
  246.     dec_interrupt[TC0].iemask = 0;
  247.     cpu_mask_tbl[1] = IE_IRQ0;
  248.     cpu_irq_nr[1] = TC0;
  249.     dec_interrupt[TC1].cpu_mask = IE_IRQ1;
  250.     dec_interrupt[TC1].iemask = 0;
  251.     cpu_mask_tbl[2] = IE_IRQ1;
  252.     cpu_irq_nr[2] = TC1;
  253.     dec_interrupt[TC2].cpu_mask = IE_IRQ2;
  254.     dec_interrupt[TC2].iemask = 0;
  255.     cpu_mask_tbl[3] = IE_IRQ2;
  256.     cpu_irq_nr[3] = TC2;
  257.     dec_interrupt[HALT].cpu_mask = IE_IRQ4;
  258.     dec_interrupt[HALT].iemask = 0;
  259.     cpu_mask_tbl[4] = IE_IRQ4;
  260.     cpu_irq_nr[4] = HALT;
  261.     dec_interrupt[FPU].cpu_mask = IE_IRQ5;
  262.     dec_interrupt[FPU].iemask = 0;
  263.     cpu_mask_tbl[5] = IE_IRQ5;
  264.     cpu_irq_nr[5] = FPU;
  265.     dec_halt_init(&irq10);
  266. } /* dec_init_kn02ba */
  267. /*
  268.  * Machine-specific initialisation for kn02ca, aka maxine, aka DS5000/2x.
  269.  */
  270. void __init dec_init_kn02ca(void)
  271. {
  272.     /*
  273.      * Setup some memory addresses. FIXME: probably incomplete!
  274.      */
  275.     ioasic_base = (void *) KN02XA_IOASIC_BASE;
  276.     dec_rtc_base = (char *) KN02XA_RTC_BASE;
  277.     isr = (void *) KN02XA_IOASIC_REG(SIR);
  278.     imr = (void *) KN02XA_IOASIC_REG(SIMR);
  279.     /*
  280.      * Setup IOASIC interrupt
  281.      */
  282.     cpu_ivec_tbl[1] = kn02xa_io_int;
  283.     cpu_irq_nr[1] = -1;
  284.     cpu_mask_tbl[1] = IE_IRQ3;
  285.     *imr = 0;
  286.     /*
  287.      * Setup interrupt structure
  288.      */
  289.     dec_interrupt[CLOCK].cpu_mask = IE_IRQ1;
  290.     dec_interrupt[CLOCK].iemask = 0;
  291.     cpu_mask_tbl[0] = IE_IRQ1;
  292.     cpu_irq_nr[0] = CLOCK;
  293.     dec_interrupt[SCSI_DMA_INT].cpu_mask = IE_IRQ3;
  294.     dec_interrupt[SCSI_DMA_INT].iemask = SCSI_DMA_INTS;
  295.     asic_mask_tbl[0] = SCSI_DMA_INTS;
  296.     asic_irq_nr[0] = SCSI_DMA_INT;
  297.     dec_interrupt[SCSI_INT].cpu_mask = IE_IRQ3;
  298.     dec_interrupt[SCSI_INT].iemask = SCSI_CHIP;
  299.     asic_mask_tbl[1] = SCSI_CHIP;
  300.     asic_irq_nr[1] = SCSI_INT;
  301.     dec_interrupt[ETHER].cpu_mask = IE_IRQ3;
  302.     dec_interrupt[ETHER].iemask = LANCE_INTS;
  303.     asic_mask_tbl[2] = LANCE_INTS;
  304.     asic_irq_nr[2] = ETHER;
  305.     dec_interrupt[SERIAL].cpu_mask = IE_IRQ3;
  306.     dec_interrupt[SERIAL].iemask = XINE_SERIAL_INTS;
  307.     asic_mask_tbl[3] = XINE_SERIAL_INTS;
  308.     asic_irq_nr[3] = SERIAL;
  309.     dec_interrupt[TC0].cpu_mask = IE_IRQ3;
  310.     dec_interrupt[TC0].iemask = MAXINE_TC0;
  311.     asic_mask_tbl[4] = MAXINE_TC0;
  312.     asic_irq_nr[4] = TC0;
  313.     dec_interrupt[TC1].cpu_mask = IE_IRQ3;
  314.     dec_interrupt[TC1].iemask = MAXINE_TC1;
  315.     asic_mask_tbl[5] = MAXINE_TC1;
  316.     asic_irq_nr[5] = TC1;
  317.     dec_interrupt[MEMORY].cpu_mask = IE_IRQ2;
  318.     dec_interrupt[MEMORY].iemask = 0;
  319.     cpu_mask_tbl[2] = IE_IRQ2;
  320.     cpu_irq_nr[2] = MEMORY;
  321.     dec_interrupt[HALT].cpu_mask = IE_IRQ4;
  322.     dec_interrupt[HALT].iemask = 0;
  323.     cpu_mask_tbl[3] = IE_IRQ4;
  324.     cpu_irq_nr[3] = HALT;
  325.     dec_interrupt[FPU].cpu_mask = IE_IRQ5;
  326.     dec_interrupt[FPU].iemask = 0;
  327.     cpu_mask_tbl[4] = IE_IRQ5;
  328.     cpu_irq_nr[4] = FPU;
  329.     dec_halt_init(&irq10);
  330. } /* dec_init_kn02ca */
  331. /*
  332.  * Machine-specific initialisation for kn03, aka 3max+, aka DS5000/240.
  333.  */
  334. void __init dec_init_kn03(void)
  335. {
  336.     /*
  337.      * Setup some memory addresses. FIXME: probably incomplete!
  338.      */
  339.     ioasic_base = (void *) KN03_IOASIC_BASE;
  340.     dec_rtc_base = (char *) KN03_RTC_BASE;
  341.     isr = (void *) KN03_IOASIC_REG(SIR);
  342.     imr = (void *) KN03_IOASIC_REG(SIMR);
  343.     /*
  344.      * Setup IOASIC interrupt
  345.      */
  346.     cpu_ivec_tbl[1] = kn03_io_int;
  347.     cpu_mask_tbl[1] = IE_IRQ0;
  348.     cpu_irq_nr[1] = -1;
  349.     *imr = 0;
  350.     /*
  351.      * Setup interrupt structure
  352.      */
  353.     dec_interrupt[CLOCK].cpu_mask = IE_IRQ1;
  354.     dec_interrupt[CLOCK].iemask = 0;
  355.     cpu_mask_tbl[0] = IE_IRQ1;
  356.     cpu_irq_nr[0] = CLOCK;
  357.     dec_interrupt[SCSI_DMA_INT].cpu_mask = IE_IRQ0;
  358.     dec_interrupt[SCSI_DMA_INT].iemask = SCSI_DMA_INTS;
  359.     asic_mask_tbl[0] = SCSI_DMA_INTS;
  360.     asic_irq_nr[0] = SCSI_DMA_INT;
  361.     dec_interrupt[SCSI_INT].cpu_mask = IE_IRQ0;
  362.     dec_interrupt[SCSI_INT].iemask = SCSI_CHIP;
  363.     asic_mask_tbl[1] = SCSI_CHIP;
  364.     asic_irq_nr[1] = SCSI_INT;
  365.     dec_interrupt[ETHER].cpu_mask = IE_IRQ0;
  366.     dec_interrupt[ETHER].iemask = LANCE_INTS;
  367.     asic_mask_tbl[2] = LANCE_INTS;
  368.     asic_irq_nr[2] = ETHER;
  369.     dec_interrupt[SERIAL].cpu_mask = IE_IRQ0;
  370.     dec_interrupt[SERIAL].iemask = SERIAL_INTS;
  371.     asic_mask_tbl[3] = SERIAL_INTS;
  372.     asic_irq_nr[3] = SERIAL;
  373.     dec_interrupt[TC0].cpu_mask = IE_IRQ0;
  374.     dec_interrupt[TC0].iemask = KN03_TC0;
  375.     asic_mask_tbl[4] = KN03_TC0;
  376.     asic_irq_nr[4] = TC0;
  377.     dec_interrupt[TC1].cpu_mask = IE_IRQ0;
  378.     dec_interrupt[TC1].iemask = KN03_TC1;
  379.     asic_mask_tbl[5] = KN03_TC1;
  380.     asic_irq_nr[5] = TC1;
  381.     dec_interrupt[TC2].cpu_mask = IE_IRQ0;
  382.     dec_interrupt[TC2].iemask = KN03_TC2;
  383.     asic_mask_tbl[6] = KN03_TC2;
  384.     asic_irq_nr[6] = TC2;
  385.     dec_interrupt[MEMORY].cpu_mask = IE_IRQ3;
  386.     dec_interrupt[MEMORY].iemask = 0;
  387.     cpu_mask_tbl[2] = IE_IRQ3;
  388.     cpu_irq_nr[2] = MEMORY;
  389.     dec_interrupt[HALT].cpu_mask = IE_IRQ4;
  390.     dec_interrupt[HALT].iemask = 0;
  391.     cpu_mask_tbl[3] = IE_IRQ4;
  392.     cpu_irq_nr[3] = HALT;
  393.     dec_interrupt[FPU].cpu_mask = IE_IRQ5;
  394.     dec_interrupt[FPU].iemask = 0;
  395.     cpu_mask_tbl[4] = IE_IRQ5;
  396.     cpu_irq_nr[4] = FPU;
  397.     dec_halt_init(&irq10);
  398. } /* dec_init_kn03 */