hc
2023-02-18 84d1d1bed0120e0921c876885ca9006fb9ddf42e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/*
 * Copyright (C) 2007 Lemote Inc. & Institute of Computing Technology
 * Author: Fuxin Zhang, zhangfx@lemote.com
 *
 *  This program is free software; you can redistribute     it and/or modify it
 *  under  the terms of     the GNU General  Public License as published by the
 *  Free Software Foundation;  either version 2 of the    License, or (at your
 *  option) any later version.
 */
#include <linux/interrupt.h>
 
#include <asm/irq_cpu.h>
#include <asm/i8259.h>
 
#include <loongson.h>
 
static void i8259_irqdispatch(void)
{
   int irq;
 
   irq = i8259_irq();
   if (irq >= 0)
       do_IRQ(irq);
   else
       spurious_interrupt();
}
 
asmlinkage void mach_irq_dispatch(unsigned int pending)
{
   if (pending & CAUSEF_IP7)
       do_IRQ(MIPS_CPU_IRQ_BASE + 7);
   else if (pending & CAUSEF_IP6) /* perf counter loverflow */
       do_perfcnt_IRQ();
   else if (pending & CAUSEF_IP5)
       i8259_irqdispatch();
   else if (pending & CAUSEF_IP2)
       bonito_irqdispatch();
   else
       spurious_interrupt();
}
 
static struct irqaction cascade_irqaction = {
   .handler = no_action,
   .name = "cascade",
   .flags = IRQF_NO_THREAD,
};
 
void __init mach_init_irq(void)
{
   /* init all controller
    *   0-15      ------> i8259 interrupt
    *   16-23      ------> mips cpu interrupt
    *   32-63      ------> bonito irq
    */
 
   /* most bonito irq should be level triggered */
   LOONGSON_INTEDGE = LOONGSON_ICU_SYSTEMERR | LOONGSON_ICU_MASTERERR |
       LOONGSON_ICU_RETRYERR | LOONGSON_ICU_MBOXES;
 
   /* Sets the first-level interrupt dispatcher. */
   mips_cpu_irq_init();
   init_i8259_irqs();
   bonito_irq_init();
 
   /* bonito irq at IP2 */
   setup_irq(MIPS_CPU_IRQ_BASE + 2, &cascade_irqaction);
   /* 8259 irq at IP5 */
   setup_irq(MIPS_CPU_IRQ_BASE + 5, &cascade_irqaction);
}