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 1691a6c3ceSAndrew Jones #define GICD_IGROUPR 0x0080 1700cc96f0SAndrew Jones #define GICD_ISENABLER 0x0100 1808ae0906SAlexandru Elisei #define GICD_ICENABLER 0x0180 19f2f220deSAlexander Graf #define GICD_ISPENDR 0x0200 20f2f220deSAlexander Graf #define GICD_ICPENDR 0x0280 21c152d8bcSChristoffer Dall #define GICD_ISACTIVER 0x0300 22c152d8bcSChristoffer Dall #define GICD_ICACTIVER 0x0380 2300cc96f0SAndrew Jones #define GICD_IPRIORITYR 0x0400 24fe572a5eSAndre Przywara #define GICD_ITARGETSR 0x0800 25ac4a67b6SAndrew Jones #define GICD_SGIR 0x0f00 2678ad7e95SAndre Przywara #define GICD_ICPIDR2 0x0fe8 2700cc96f0SAndrew Jones 2800cc96f0SAndrew Jones #define GICD_TYPER_IRQS(typer) ((((typer) & 0x1f) + 1) * 32) 2900cc96f0SAndrew Jones #define GICD_INT_EN_SET_SGI 0x0000ffff 3000cc96f0SAndrew Jones #define GICD_INT_DEF_PRI_X4 0xa0a0a0a0 3100cc96f0SAndrew Jones 3200cc96f0SAndrew Jones /* CPU interface registers */ 3300cc96f0SAndrew Jones #define GICC_CTLR 0x0000 3400cc96f0SAndrew Jones #define GICC_PMR 0x0004 35ac4a67b6SAndrew Jones #define GICC_IAR 0x000c 36ac4a67b6SAndrew Jones #define GICC_EOIR 0x0010 3700cc96f0SAndrew Jones 3800cc96f0SAndrew Jones #define GICC_INT_PRI_THRESHOLD 0xf0 39ac4a67b6SAndrew Jones #define GICC_INT_SPURIOUS 0x3ff 4000cc96f0SAndrew Jones 4191a6c3ceSAndrew Jones #include <asm/gic-v2.h> 4291a6c3ceSAndrew Jones #include <asm/gic-v3.h> 4391a6c3ceSAndrew Jones 44f2f220deSAlexander Graf #define PPI(irq) ((irq) + 16) 4500d7e265SAlexander Graf #define SPI(irq) ((irq) + GIC_FIRST_SPI) 46f2f220deSAlexander Graf 4700cc96f0SAndrew Jones #ifndef __ASSEMBLY__ 482e2d471dSAndrew Jones #include <asm/cpumask.h> 4900cc96f0SAndrew Jones 50*e44a257aSZenghui Yu enum gic_state { 51*e44a257aSZenghui Yu GIC_STATE_INACTIVE, 52*e44a257aSZenghui Yu GIC_STATE_PENDING, 53*e44a257aSZenghui Yu GIC_STATE_ACTIVE, 54*e44a257aSZenghui Yu GIC_STATE_ACTIVE_PENDING, 55*e44a257aSZenghui Yu }; 56*e44a257aSZenghui Yu 5700cc96f0SAndrew Jones /* 5800cc96f0SAndrew Jones * gic_init will try to find all known gics, and then 5900cc96f0SAndrew Jones * initialize the gic data for the one found. 6000cc96f0SAndrew Jones * returns 6100cc96f0SAndrew Jones * 0 : no gic was found 6200cc96f0SAndrew Jones * > 0 : the gic version of the gic found 6300cc96f0SAndrew Jones */ 6400cc96f0SAndrew Jones extern int gic_init(void); 6500cc96f0SAndrew Jones 662e2d471dSAndrew Jones /* 672e2d471dSAndrew Jones * gic_enable_defaults enables the gic with basic but useful 682e2d471dSAndrew Jones * settings. gic_enable_defaults will call gic_init if it has 692e2d471dSAndrew Jones * not yet been invoked. 702e2d471dSAndrew Jones */ 712e2d471dSAndrew Jones extern void gic_enable_defaults(void); 722e2d471dSAndrew Jones 732e2d471dSAndrew Jones /* 742e2d471dSAndrew Jones * After enabling the gic with gic_enable_defaults the functions 752e2d471dSAndrew Jones * below will work with any supported gic version. 762e2d471dSAndrew Jones */ 772e2d471dSAndrew Jones extern int gic_version(void); 782e2d471dSAndrew Jones extern u32 gic_read_iar(void); 792e2d471dSAndrew Jones extern u32 gic_iar_irqnr(u32 iar); 802e2d471dSAndrew Jones extern void gic_write_eoir(u32 irqstat); 812e2d471dSAndrew Jones extern void gic_ipi_send_single(int irq, int cpu); 822e2d471dSAndrew Jones extern void gic_ipi_send_mask(int irq, const cpumask_t *dest); 832e2d471dSAndrew Jones 8400cc96f0SAndrew Jones #endif /* !__ASSEMBLY__ */ 8500cc96f0SAndrew Jones #endif /* _ASMARM_GIC_H_ */ 86