#ifndef _GIC_V3_VAR_H_
#define _GIC_V3_VAR_H_
#include <arm/arm/gic_common.h>
#define GIC_V3_DEVSTR "ARM Generic Interrupt Controller v3.0"
DECLARE_CLASS(gic_v3_driver);
struct gic_v3_irqsrc;
struct redist_pcpu {
struct resource *res;
vm_offset_t pend_base;
bus_size_t offset;
bool lpi_enabled;
};
struct gic_redists {
struct resource ** regions;
u_int nregions;
bool single;
struct redist_pcpu *pcpu;
};
#define GIC_V3_FLAGS_FORCE_NOSHAREABLE 0x0000001
struct gic_v3_softc {
device_t dev;
struct resource ** gic_res;
struct mtx gic_mtx;
struct resource * gic_dist;
struct gic_redists gic_redists;
u_int gic_mbi_start;
u_int gic_mbi_end;
struct mtx gic_mbi_mtx;
uint32_t gic_pidr2;
u_int gic_bus;
u_int gic_nirqs;
u_int gic_idbits;
boolean_t gic_registered;
int gic_nchildren;
device_t *gic_children;
struct intr_pic *gic_pic;
struct gic_v3_irqsrc *gic_irqs;
int nranges;
struct arm_gic_range * ranges;
uint32_t gic_flags;
};
struct gic_v3_devinfo {
int gic_domain;
int msi_xref;
int is_vgic;
};
#define GIC_INTR_ISRC(sc, irq) (&sc->gic_irqs[irq].gi_isrc)
MALLOC_DECLARE(M_GIC_V3);
enum {
GICV3_IVAR_NIRQS = BUS_IVARS_PRIVATE,
GICV3_IVAR_REDIST,
GICV3_IVAR_FLAGS,
};
__BUS_ACCESSOR(gicv3, nirqs, GICV3, NIRQS, u_int);
__BUS_ACCESSOR(gicv3, redist, GICV3, REDIST, void *);
__BUS_ACCESSOR(gicv3, flags, GICV3, FLAGS, uint32_t);
int gic_v3_attach(device_t dev);
int gic_v3_detach(device_t dev);
int arm_gic_v3_intr(void *);
uint32_t gic_r_read_4(device_t, bus_size_t);
uint64_t gic_r_read_8(device_t, bus_size_t);
void gic_r_write_4(device_t, bus_size_t, uint32_t var);
void gic_r_write_8(device_t, bus_size_t, uint64_t var);
#define gic_d_read(sc, len, reg) \
({ \
bus_read_##len(sc->gic_dist, reg); \
})
#define gic_d_write(sc, len, reg, val) \
({ \
bus_write_##len(sc->gic_dist, reg, val);\
})
#define gic_r_read(sc, len, reg) \
({ \
u_int cpu = PCPU_GET(cpuid); \
\
bus_read_##len( \
(sc)->gic_redists.pcpu[cpu].res, \
(sc)->gic_redists.pcpu[cpu].offset + (reg)); \
})
#define gic_r_write(sc, len, reg, val) \
({ \
u_int cpu = PCPU_GET(cpuid); \
\
bus_write_##len( \
(sc)->gic_redists.pcpu[cpu].res, \
(sc)->gic_redists.pcpu[cpu].offset + (reg), \
(val)); \
})
#endif