xref: /kvm-unit-tests/lib/arm/asm/gic.h (revision f2f220de6fd7473d552fe48fc858b78bd6fed5ef)
100cc96f0SAndrew Jones /*
200cc96f0SAndrew Jones  * Copyright (C) 2016, Red Hat Inc, Andrew Jones <drjones@redhat.com>
300cc96f0SAndrew Jones  *
400cc96f0SAndrew Jones  * This work is licensed under the terms of the GNU LGPL, version 2.
500cc96f0SAndrew Jones  */
600cc96f0SAndrew Jones #ifndef _ASMARM_GIC_H_
700cc96f0SAndrew Jones #define _ASMARM_GIC_H_
800cc96f0SAndrew Jones 
900cc96f0SAndrew Jones 
1000cc96f0SAndrew Jones /* Distributor registers */
1100cc96f0SAndrew Jones #define GICD_CTLR			0x0000
1200cc96f0SAndrew Jones #define GICD_TYPER			0x0004
1391a6c3ceSAndrew Jones #define GICD_IGROUPR			0x0080
1400cc96f0SAndrew Jones #define GICD_ISENABLER			0x0100
15*f2f220deSAlexander Graf #define GICD_ISPENDR			0x0200
16*f2f220deSAlexander Graf #define GICD_ICPENDR			0x0280
17c152d8bcSChristoffer Dall #define GICD_ISACTIVER			0x0300
18c152d8bcSChristoffer Dall #define GICD_ICACTIVER			0x0380
1900cc96f0SAndrew Jones #define GICD_IPRIORITYR			0x0400
20ac4a67b6SAndrew Jones #define GICD_SGIR			0x0f00
2100cc96f0SAndrew Jones 
2200cc96f0SAndrew Jones #define GICD_TYPER_IRQS(typer)		((((typer) & 0x1f) + 1) * 32)
2300cc96f0SAndrew Jones #define GICD_INT_EN_SET_SGI		0x0000ffff
2400cc96f0SAndrew Jones #define GICD_INT_DEF_PRI_X4		0xa0a0a0a0
2500cc96f0SAndrew Jones 
2600cc96f0SAndrew Jones /* CPU interface registers */
2700cc96f0SAndrew Jones #define GICC_CTLR			0x0000
2800cc96f0SAndrew Jones #define GICC_PMR			0x0004
29ac4a67b6SAndrew Jones #define GICC_IAR			0x000c
30ac4a67b6SAndrew Jones #define GICC_EOIR			0x0010
3100cc96f0SAndrew Jones 
3200cc96f0SAndrew Jones #define GICC_INT_PRI_THRESHOLD		0xf0
33ac4a67b6SAndrew Jones #define GICC_INT_SPURIOUS		0x3ff
3400cc96f0SAndrew Jones 
3591a6c3ceSAndrew Jones #include <asm/gic-v2.h>
3691a6c3ceSAndrew Jones #include <asm/gic-v3.h>
3791a6c3ceSAndrew Jones 
38*f2f220deSAlexander Graf #define PPI(irq)			((irq) + 16)
39*f2f220deSAlexander Graf 
4000cc96f0SAndrew Jones #ifndef __ASSEMBLY__
412e2d471dSAndrew Jones #include <asm/cpumask.h>
4200cc96f0SAndrew Jones 
4300cc96f0SAndrew Jones /*
4400cc96f0SAndrew Jones  * gic_init will try to find all known gics, and then
4500cc96f0SAndrew Jones  * initialize the gic data for the one found.
4600cc96f0SAndrew Jones  * returns
4700cc96f0SAndrew Jones  *  0   : no gic was found
4800cc96f0SAndrew Jones  *  > 0 : the gic version of the gic found
4900cc96f0SAndrew Jones  */
5000cc96f0SAndrew Jones extern int gic_init(void);
5100cc96f0SAndrew Jones 
522e2d471dSAndrew Jones /*
532e2d471dSAndrew Jones  * gic_enable_defaults enables the gic with basic but useful
542e2d471dSAndrew Jones  * settings. gic_enable_defaults will call gic_init if it has
552e2d471dSAndrew Jones  * not yet been invoked.
562e2d471dSAndrew Jones  */
572e2d471dSAndrew Jones extern void gic_enable_defaults(void);
582e2d471dSAndrew Jones 
592e2d471dSAndrew Jones /*
602e2d471dSAndrew Jones  * After enabling the gic with gic_enable_defaults the functions
612e2d471dSAndrew Jones  * below will work with any supported gic version.
622e2d471dSAndrew Jones  */
632e2d471dSAndrew Jones extern int gic_version(void);
642e2d471dSAndrew Jones extern u32 gic_read_iar(void);
652e2d471dSAndrew Jones extern u32 gic_iar_irqnr(u32 iar);
662e2d471dSAndrew Jones extern void gic_write_eoir(u32 irqstat);
672e2d471dSAndrew Jones extern void gic_ipi_send_single(int irq, int cpu);
682e2d471dSAndrew Jones extern void gic_ipi_send_mask(int irq, const cpumask_t *dest);
692e2d471dSAndrew Jones 
7000cc96f0SAndrew Jones #endif /* !__ASSEMBLY__ */
7100cc96f0SAndrew Jones #endif /* _ASMARM_GIC_H_ */
72