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