embox
1/**
2* @file
3* @brief MIPS build-in interrupt controller
4*
5* @date 04.07.2012
6* @author Anton Bondarev
7*/
8
9#include <assert.h>10#include <stddef.h>11#include <stdint.h>12
13#include <asm/mipsregs.h>14#include <drivers/irqctrl.h>15#include <kernel/irq.h>16
17void irqctrl_enable(unsigned int irq) {18uint32_t c0;19
20assert(irq_nr_valid(irq));21
22c0 = mips_read_c0_status();23c0 |= 1U << (irq + ST0_IRQ_MASK_OFFSET);24mips_write_c0_status(c0);25}
26
27void irqctrl_disable(unsigned int irq) {28uint32_t c0;29
30assert(irq_nr_valid(irq));31
32c0 = mips_read_c0_status();33c0 &= ~(1U << (irq + ST0_IRQ_MASK_OFFSET));34mips_write_c0_status(c0);35}
36
37void irqctrl_force(unsigned int irq) {38}
39
40int irqctrl_pending(unsigned int irq) {41return 0;42}
43
44void irqctrl_eoi(unsigned int irq) {45}
46
47unsigned int irqctrl_get_intid(void) {48unsigned int irq;49uint32_t pending;50
51pending = (mips_read_c0_cause() & CAUSE_IM) >> ST0_IRQ_MASK_OFFSET;52
53for (irq = 0; irq < IRQCTRL_IRQS_TOTAL; irq++) {54if (pending & (1U << irq)) {55return irq;56}57}58
59return -1;60}
61
62IRQCTRL_DEF(mips_intc, NULL);63