2017-08-08 09:40:09 -03:00
|
|
|
#include <types.h>
|
|
|
|
#include <gic.h>
|
|
|
|
|
2017-08-21 21:01:18 -03:00
|
|
|
#define IRQVECTOR_BASE ((vu32*)0x1FFFFFA0)
|
2017-08-08 09:40:09 -03:00
|
|
|
|
2017-08-08 23:04:17 -03:00
|
|
|
extern void (*main_irq_handler)(void);
|
2018-03-14 23:18:29 +01:00
|
|
|
irq_handler GIC_Handlers[128];
|
2017-08-08 09:40:09 -03:00
|
|
|
|
|
|
|
void GIC_Reset(void)
|
|
|
|
{
|
2018-03-14 23:18:29 +01:00
|
|
|
u32 irq_s;
|
2017-08-08 09:40:09 -03:00
|
|
|
|
2018-03-14 23:18:29 +01:00
|
|
|
REG_GIC_CONTROL = 0;
|
2019-04-09 09:33:52 -03:00
|
|
|
for (int i = 0; i < 128; i++)
|
|
|
|
GIC_Handlers[i] = NULL;
|
2017-08-08 09:40:09 -03:00
|
|
|
|
2018-03-14 23:18:29 +01:00
|
|
|
REG_DIC_CONTROL = 0;
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
|
|
REG_DIC_CLRENABLE[i] = ~0;
|
|
|
|
REG_DIC_CLRPENDING[i] = ~0;
|
2017-08-08 23:04:17 -03:00
|
|
|
}
|
2018-03-14 23:18:29 +01:00
|
|
|
for (int i = 0; i < 32; i++) REG_DIC_PRIORITY[i] = 0;
|
|
|
|
for (int i = 32; i < 128; i++) REG_DIC_TARGETPROC[i] = 0;
|
|
|
|
for (int i = 0; i < 8; i++) REG_DIC_CFGREG[i] = ~0;
|
|
|
|
REG_DIC_CONTROL = 1;
|
|
|
|
|
|
|
|
REG_DIC_CLRENABLE[0] = ~0;
|
|
|
|
for (int i = 0; i < 32; i++) REG_DIC_PRIORITY[i] = 0;
|
|
|
|
for (int i = 0; i < 2; i++) REG_DIC_CFGREG[i] = ~0;
|
|
|
|
REG_GIC_POI = 3;
|
|
|
|
REG_GIC_PRIOMASK = 0xF << 4;
|
|
|
|
REG_GIC_CONTROL = 1;
|
|
|
|
|
|
|
|
do {
|
|
|
|
irq_s = REG_GIC_PENDING;
|
|
|
|
REG_GIC_IRQEND = irq_s;
|
|
|
|
} while(irq_s != 1023);
|
2017-08-08 09:40:09 -03:00
|
|
|
|
2017-08-21 21:01:18 -03:00
|
|
|
IRQVECTOR_BASE[1] = (u32)&main_irq_handler;
|
|
|
|
IRQVECTOR_BASE[0] = 0xE51FF004;
|
2018-03-14 23:18:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void GIC_SetIRQ(u32 irq, irq_handler handler)
|
|
|
|
{
|
|
|
|
GIC_Handlers[irq] = handler;
|
|
|
|
REG_DIC_CLRPENDING[irq >> 5] |= BIT(irq & 0x1F);
|
|
|
|
REG_DIC_SETENABLE[irq >> 5] |= BIT(irq & 0x1F);
|
|
|
|
REG_DIC_TARGETPROC[irq] = 1;
|
2017-08-08 09:40:09 -03:00
|
|
|
}
|