#ifndef _GIC_COMMON_H_
#define _GIC_COMMON_H_
struct arm_gic_range {
uint64_t bus;
uint64_t host;
uint64_t size;
};
enum {
GIC_IVAR_HW_REV = BUS_IVARS_GIC,
GIC_IVAR_BUS,
GIC_IVAR_VGIC,
GIC_IVAR_SUPPORT_LPIS
};
#define GIC_BUS_UNKNOWN 0
#define GIC_BUS_FDT 1
#define GIC_BUS_ACPI 2
#define GIC_BUS_MAX 2
__BUS_ACCESSOR(gic, hw_rev, GIC, HW_REV, u_int);
__BUS_ACCESSOR(gic, bus, GIC, BUS, u_int);
__BUS_ACCESSOR(gic, vgic, GIC, VGIC, u_int);
__BUS_ACCESSOR(gic, support_lpis, GIC, SUPPORT_LPIS, bool);
#define GIC_FIRST_SGI 0
#define GIC_LAST_SGI 15
#define GIC_FIRST_PPI 16
#define GIC_LAST_PPI 31
#define GIC_FIRST_SPI 32
#define GICD_CTLR 0x0000
#define GICD_TYPER 0x0004
#define GICD_TYPER_ITLINESNUM_MASK 0x1f
#define GICD_TYPER_I_NUM(n) ((((n) & 0x1F) + 1) * 32)
#define GICD_IIDR 0x0008
#define GICD_IIDR_PROD_SHIFT 24
#define GICD_IIDR_PROD_MASK 0xff000000
#define GICD_IIDR_PROD(x) \
(((x) & GICD_IIDR_PROD_MASK) >> GICD_IIDR_PROD_SHIFT)
#define GICD_IIDR_VAR_SHIFT 16
#define GICD_IIDR_VAR_MASK 0x000f0000
#define GICD_IIDR_VAR(x) \
(((x) & GICD_IIDR_VAR_MASK) >> GICD_IIDR_VAR_SHIFT)
#define GICD_IIDR_REV_SHIFT 12
#define GICD_IIDR_REV_MASK 0x0000f000
#define GICD_IIDR_REV(x) \
(((x) & GICD_IIDR_REV_MASK) >> GICD_IIDR_REV_SHIFT)
#define GICD_IIDR_IMPL_SHIFT 0
#define GICD_IIDR_IMPL_MASK 0x00000fff
#define GICD_IIDR_IMPL(x) \
(((x) & GICD_IIDR_IMPL_MASK) >> GICD_IIDR_IMPL_SHIFT)
#define GICD_IGROUPR(n) (0x0080 + (((n) >> 5) * 4))
#define GICD_I_PER_IGROUPRn 32
#define GICD_ISENABLER(n) (0x0100 + (((n) >> 5) * 4))
#define GICD_I_MASK(n) (1ul << ((n) & 0x1f))
#define GICD_I_PER_ISENABLERn 32
#define GICD_ICENABLER(n) (0x0180 + (((n) >> 5) * 4))
#define GICD_ISPENDR(n) (0x0200 + (((n) >> 5) * 4))
#define GICD_ICPENDR(n) (0x0280 + (((n) >> 5) * 4))
#define GICD_ISACTIVER(n) (0x0300 + (((n) >> 5) * 4))
#define GICD_ICACTIVER(n) (0x0380 + (((n) >> 5) * 4))
#define GICD_IPRIORITYR(n) (0x0400 + (((n) >> 2) * 4))
#define GICD_I_PER_IPRIORITYn 4
#define GICD_ITARGETSR(n) (0x0800 + (((n) >> 2) * 4))
#define GICD_ICFGR(n) (0x0C00 + (((n) >> 4) * 4))
#define GICD_I_PER_ICFGRn 16
#define GICD_ICFGR_POL_LOW (0 << 0)
#define GICD_ICFGR_POL_HIGH (1 << 0)
#define GICD_ICFGR_POL_MASK 0x1
#define GICD_ICFGR_TRIG_LVL (0 << 1)
#define GICD_ICFGR_TRIG_EDGE (1 << 1)
#define GICD_ICFGR_TRIG_MASK 0x2
#define GICD_SGIR 0x0F00
#define GICD_SGI_TARGET_SHIFT 16
#endif