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