xref: /kvm-unit-tests/lib/arm/asm/gic.h (revision 0cc3a351b925928827baa4b69cf0e46ff5837083)
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 
978ad7e95SAndre Przywara #define GIC_NR_PRIVATE_IRQS		32
1078ad7e95SAndre Przywara #define GIC_FIRST_SPI			GIC_NR_PRIVATE_IRQS
1100cc96f0SAndrew Jones 
1200cc96f0SAndrew Jones /* Distributor registers */
1300cc96f0SAndrew Jones #define GICD_CTLR			0x0000
1400cc96f0SAndrew Jones #define GICD_TYPER			0x0004
1578ad7e95SAndre Przywara #define GICD_IIDR			0x0008
169c537510SJingyi Wang #define GICD_TYPER2			0x000C
1791a6c3ceSAndrew Jones #define GICD_IGROUPR			0x0080
1800cc96f0SAndrew Jones #define GICD_ISENABLER			0x0100
1908ae0906SAlexandru Elisei #define GICD_ICENABLER			0x0180
20f2f220deSAlexander Graf #define GICD_ISPENDR			0x0200
21f2f220deSAlexander Graf #define GICD_ICPENDR			0x0280
22c152d8bcSChristoffer Dall #define GICD_ISACTIVER			0x0300
23c152d8bcSChristoffer Dall #define GICD_ICACTIVER			0x0380
2400cc96f0SAndrew Jones #define GICD_IPRIORITYR			0x0400
25fe572a5eSAndre Przywara #define GICD_ITARGETSR			0x0800
26ac4a67b6SAndrew Jones #define GICD_SGIR			0x0f00
2778ad7e95SAndre Przywara #define GICD_ICPIDR2			0x0fe8
2800cc96f0SAndrew Jones 
2900cc96f0SAndrew Jones #define GICD_TYPER_IRQS(typer)		((((typer) & 0x1f) + 1) * 32)
3000cc96f0SAndrew Jones #define GICD_INT_EN_SET_SGI		0x0000ffff
3100cc96f0SAndrew Jones #define GICD_INT_DEF_PRI_X4		0xa0a0a0a0
3200cc96f0SAndrew Jones 
3300cc96f0SAndrew Jones /* CPU interface registers */
3400cc96f0SAndrew Jones #define GICC_CTLR			0x0000
3500cc96f0SAndrew Jones #define GICC_PMR			0x0004
36ac4a67b6SAndrew Jones #define GICC_IAR			0x000c
37ac4a67b6SAndrew Jones #define GICC_EOIR			0x0010
3800cc96f0SAndrew Jones 
3900cc96f0SAndrew Jones #define GICC_INT_PRI_THRESHOLD		0xf0
40ac4a67b6SAndrew Jones #define GICC_INT_SPURIOUS		0x3ff
4100cc96f0SAndrew Jones 
4291a6c3ceSAndrew Jones #include <asm/gic-v2.h>
4391a6c3ceSAndrew Jones #include <asm/gic-v3.h>
44ba74b106SEric Auger #include <asm/gic-v3-its.h>
4591a6c3ceSAndrew Jones 
46f2f220deSAlexander Graf #define PPI(irq)			((irq) + 16)
4700d7e265SAlexander Graf #define SPI(irq)			((irq) + GIC_FIRST_SPI)
48f2f220deSAlexander Graf 
49*0cc3a351SSean Christopherson #ifndef __ASSEMBLER__
50dfc1fec2SAndrew Jones #include <cpumask.h>
5100cc96f0SAndrew Jones 
5256145eb8SAndrew Jones enum gic_irq_state {
5356145eb8SAndrew Jones 	GIC_IRQ_STATE_INACTIVE,
5456145eb8SAndrew Jones 	GIC_IRQ_STATE_PENDING,
5556145eb8SAndrew Jones 	GIC_IRQ_STATE_ACTIVE,
5656145eb8SAndrew Jones 	GIC_IRQ_STATE_ACTIVE_PENDING,
57e44a257aSZenghui Yu };
58e44a257aSZenghui Yu 
5900cc96f0SAndrew Jones /*
6000cc96f0SAndrew Jones  * gic_init will try to find all known gics, and then
6100cc96f0SAndrew Jones  * initialize the gic data for the one found.
6200cc96f0SAndrew Jones  * returns
6300cc96f0SAndrew Jones  *  0   : no gic was found
6400cc96f0SAndrew Jones  *  > 0 : the gic version of the gic found
6500cc96f0SAndrew Jones  */
6600cc96f0SAndrew Jones extern int gic_init(void);
6700cc96f0SAndrew Jones 
682e2d471dSAndrew Jones /*
692e2d471dSAndrew Jones  * gic_enable_defaults enables the gic with basic but useful
702e2d471dSAndrew Jones  * settings. gic_enable_defaults will call gic_init if it has
712e2d471dSAndrew Jones  * not yet been invoked.
722e2d471dSAndrew Jones  */
732e2d471dSAndrew Jones extern void gic_enable_defaults(void);
742e2d471dSAndrew Jones 
752e2d471dSAndrew Jones /*
762e2d471dSAndrew Jones  * After enabling the gic with gic_enable_defaults the functions
772e2d471dSAndrew Jones  * below will work with any supported gic version.
782e2d471dSAndrew Jones  */
792e2d471dSAndrew Jones extern int gic_version(void);
802e2d471dSAndrew Jones extern u32 gic_read_iar(void);
812e2d471dSAndrew Jones extern u32 gic_iar_irqnr(u32 iar);
822e2d471dSAndrew Jones extern void gic_write_eoir(u32 irqstat);
832e2d471dSAndrew Jones extern void gic_ipi_send_single(int irq, int cpu);
842e2d471dSAndrew Jones extern void gic_ipi_send_mask(int irq, const cpumask_t *dest);
8556145eb8SAndrew Jones extern enum gic_irq_state gic_irq_state(int irq);
862e2d471dSAndrew Jones 
87cb573c2fSEric Auger void gic_irq_set_clr_enable(int irq, bool enable);
88cb573c2fSEric Auger #define gic_enable_irq(irq) gic_irq_set_clr_enable(irq, true)
89cb573c2fSEric Auger #define gic_disable_irq(irq) gic_irq_set_clr_enable(irq, false)
90cb573c2fSEric Auger 
91*0cc3a351SSean Christopherson #endif /* !__ASSEMBLER__ */
9200cc96f0SAndrew Jones #endif /* _ASMARM_GIC_H_ */
93