12
#include <drivers/common/memory.h>
13
#include <drivers/irqctrl.h>
14
#include <framework/mod/options.h>
16
#include <kernel/critical.h>
17
#include <kernel/irq.h>
18
#include <kernel/printk.h>
19
#include <util/field.h>
24
#define GIC_SPURIOUS_IRQ 0x3FF
26
static int gic_irqctrl_init(void) {
30
reg = REG32_LOAD(GICC_PMR);
31
reg = FIELD_SET(reg, GICD_PMR_PRIOR, 0xff);
32
REG32_STORE(GICC_PMR, reg);
35
REG32_ORIN(GICD_CTLR, GICD_CTLR_EN);
36
REG32_ORIN(GICC_CTLR, GICC_CTLR_EN);
39
reg = REG32_LOAD(GICD_TYPER);
41
log_info("Number of SPI: %zi",
42
(size_t)(FIELD_GET(reg, GICD_TYPER_ITLINES) * 32));
43
log_info("Number of supported CPU interfaces: %zi",
44
(size_t)FIELD_GET(reg, GICD_TYPER_CPU));
46
if (reg & GICD_TYPER_SECEXT) {
47
log_info("Secutity Extension implemented");
48
log_info("Number of LSPI: %zi",
49
(size_t)FIELD_GET(reg, GICD_TYPER_LSPI));
52
log_info("Secutity Extension not implemented");
53
log_info("LSPI not implemented");
59
void irqctrl_enable(unsigned int irq) {
63
assert(irq_nr_valid(irq));
66
value = 1U << (irq & 0x1f);
70
REG32_STORE(GICD_ISENABLER(reg_nr), value);
73
REG32_STORE(GICD_ICFGR(reg_nr), value);
77
value = 0xff << ((irq & 0x3) << 3);
78
REG32_ORIN(GICD_ITARGETSR(reg_nr), value);
81
void irqctrl_disable(unsigned int irq) {
85
assert(irq_nr_valid(irq));
88
value = 1U << (irq & 0x1f);
92
REG32_STORE(GICD_ICENABLER(reg_nr), value);
95
void irqctrl_force(unsigned int irq) {
98
int irqctrl_pending(unsigned int irq) {
103
void irqctrl_eoi(unsigned int irq) {
104
assert(irq_nr_valid(irq));
106
REG32_STORE(GICC_EOIR, irq);
109
unsigned int irqctrl_get_intid(void) {
112
irq = REG32_LOAD(GICC_IAR);
113
if (irq == GIC_SPURIOUS_IRQ) {
120
IRQCTRL_DEF(gicv1, gic_irqctrl_init);
122
PERIPH_MEMORY_DEFINE(gicd, GICD_BASE, 0x1000);
123
PERIPH_MEMORY_DEFINE(gicc, GICC_BASE, 0x2020);