1*df373737SAchin Gupta /* 2*df373737SAchin Gupta * Copyright (c) 2015, ARM Limited and Contributors. All rights reserved. 3*df373737SAchin Gupta * 4*df373737SAchin Gupta * Redistribution and use in source and binary forms, with or without 5*df373737SAchin Gupta * modification, are permitted provided that the following conditions are met: 6*df373737SAchin Gupta * 7*df373737SAchin Gupta * Redistributions of source code must retain the above copyright notice, this 8*df373737SAchin Gupta * list of conditions and the following disclaimer. 9*df373737SAchin Gupta * 10*df373737SAchin Gupta * Redistributions in binary form must reproduce the above copyright notice, 11*df373737SAchin Gupta * this list of conditions and the following disclaimer in the documentation 12*df373737SAchin Gupta * and/or other materials provided with the distribution. 13*df373737SAchin Gupta * 14*df373737SAchin Gupta * Neither the name of ARM nor the names of its contributors may be used 15*df373737SAchin Gupta * to endorse or promote products derived from this software without specific 16*df373737SAchin Gupta * prior written permission. 17*df373737SAchin Gupta * 18*df373737SAchin Gupta * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19*df373737SAchin Gupta * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20*df373737SAchin Gupta * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21*df373737SAchin Gupta * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 22*df373737SAchin Gupta * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23*df373737SAchin Gupta * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24*df373737SAchin Gupta * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25*df373737SAchin Gupta * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26*df373737SAchin Gupta * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27*df373737SAchin Gupta * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28*df373737SAchin Gupta * POSSIBILITY OF SUCH DAMAGE. 29*df373737SAchin Gupta */ 30*df373737SAchin Gupta 31*df373737SAchin Gupta #ifndef __GIC_COMMON_H__ 32*df373737SAchin Gupta #define __GIC_COMMON_H__ 33*df373737SAchin Gupta 34*df373737SAchin Gupta /******************************************************************************* 35*df373737SAchin Gupta * GIC Distributor interface general definitions 36*df373737SAchin Gupta ******************************************************************************/ 37*df373737SAchin Gupta /* Constants to categorise interrupts */ 38*df373737SAchin Gupta #define MIN_SGI_ID 0 39*df373737SAchin Gupta #define MIN_PPI_ID 16 40*df373737SAchin Gupta #define MIN_SPI_ID 32 41*df373737SAchin Gupta 42*df373737SAchin Gupta /* Mask for the priority field common to all GIC interfaces */ 43*df373737SAchin Gupta #define GIC_PRI_MASK 0xff 44*df373737SAchin Gupta 45*df373737SAchin Gupta /* Constant to indicate a spurious interrupt in all GIC versions */ 46*df373737SAchin Gupta #define GIC_SPURIOUS_INTERRUPT 1023 47*df373737SAchin Gupta 48*df373737SAchin Gupta /* Constants to categorise priorities */ 49*df373737SAchin Gupta #define GIC_HIGHEST_SEC_PRIORITY 0 50*df373737SAchin Gupta #define GIC_LOWEST_SEC_PRIORITY 127 51*df373737SAchin Gupta #define GIC_HIGHEST_NS_PRIORITY 128 52*df373737SAchin Gupta #define GIC_LOWEST_NS_PRIORITY 254 /* 255 would disable an interrupt */ 53*df373737SAchin Gupta 54*df373737SAchin Gupta /******************************************************************************* 55*df373737SAchin Gupta * GIC Distributor interface register offsets that are common to GICv3 & GICv2 56*df373737SAchin Gupta ******************************************************************************/ 57*df373737SAchin Gupta #define GICD_CTLR 0x0 58*df373737SAchin Gupta #define GICD_TYPER 0x4 59*df373737SAchin Gupta #define GICD_IIDR 0x8 60*df373737SAchin Gupta #define GICD_IGROUPR 0x80 61*df373737SAchin Gupta #define GICD_ISENABLER 0x100 62*df373737SAchin Gupta #define GICD_ICENABLER 0x180 63*df373737SAchin Gupta #define GICD_ISPENDR 0x200 64*df373737SAchin Gupta #define GICD_ICPENDR 0x280 65*df373737SAchin Gupta #define GICD_ISACTIVER 0x300 66*df373737SAchin Gupta #define GICD_ICACTIVER 0x380 67*df373737SAchin Gupta #define GICD_IPRIORITYR 0x400 68*df373737SAchin Gupta #define GICD_ICFGR 0xc00 69*df373737SAchin Gupta #define GICD_NSACR 0xe00 70*df373737SAchin Gupta 71*df373737SAchin Gupta /* GICD_CTLR bit definitions */ 72*df373737SAchin Gupta #define CTLR_ENABLE_G0_SHIFT 0 73*df373737SAchin Gupta #define CTLR_ENABLE_G0_MASK 0x1 74*df373737SAchin Gupta #define CTLR_ENABLE_G0_BIT (1 << CTLR_ENABLE_G0_SHIFT) 75*df373737SAchin Gupta 76*df373737SAchin Gupta 77*df373737SAchin Gupta /******************************************************************************* 78*df373737SAchin Gupta * GIC Distributor interface register constants that are common to GICv3 & GICv2 79*df373737SAchin Gupta ******************************************************************************/ 80*df373737SAchin Gupta #define PIDR2_ARCH_REV_SHIFT 4 81*df373737SAchin Gupta #define PIDR2_ARCH_REV_MASK 0xf 82*df373737SAchin Gupta 83*df373737SAchin Gupta /* GICv3 revision as reported by the PIDR2 register */ 84*df373737SAchin Gupta #define ARCH_REV_GICV3 0x3 85*df373737SAchin Gupta /* GICv2 revision as reported by the PIDR2 register */ 86*df373737SAchin Gupta #define ARCH_REV_GICV2 0x2 87*df373737SAchin Gupta 88*df373737SAchin Gupta #define IGROUPR_SHIFT 5 89*df373737SAchin Gupta #define ISENABLER_SHIFT 5 90*df373737SAchin Gupta #define ICENABLER_SHIFT ISENABLER_SHIFT 91*df373737SAchin Gupta #define ISPENDR_SHIFT 5 92*df373737SAchin Gupta #define ICPENDR_SHIFT ISPENDR_SHIFT 93*df373737SAchin Gupta #define ISACTIVER_SHIFT 5 94*df373737SAchin Gupta #define ICACTIVER_SHIFT ISACTIVER_SHIFT 95*df373737SAchin Gupta #define IPRIORITYR_SHIFT 2 96*df373737SAchin Gupta #define ICFGR_SHIFT 4 97*df373737SAchin Gupta #define NSACR_SHIFT 4 98*df373737SAchin Gupta 99*df373737SAchin Gupta /* GICD_TYPER shifts and masks */ 100*df373737SAchin Gupta #define TYPER_IT_LINES_NO_SHIFT 0 101*df373737SAchin Gupta #define TYPER_IT_LINES_NO_MASK 0x1f 102*df373737SAchin Gupta 103*df373737SAchin Gupta /* Value used to initialize Normal world interrupt priorities four at a time */ 104*df373737SAchin Gupta #define GICD_IPRIORITYR_DEF_VAL \ 105*df373737SAchin Gupta (GIC_HIGHEST_NS_PRIORITY | \ 106*df373737SAchin Gupta (GIC_HIGHEST_NS_PRIORITY << 8) | \ 107*df373737SAchin Gupta (GIC_HIGHEST_NS_PRIORITY << 16) | \ 108*df373737SAchin Gupta (GIC_HIGHEST_NS_PRIORITY << 24)) 109*df373737SAchin Gupta 110*df373737SAchin Gupta #ifndef __ASSEMBLY__ 111*df373737SAchin Gupta 112*df373737SAchin Gupta #include <mmio.h> 113*df373737SAchin Gupta #include <stdint.h> 114*df373737SAchin Gupta 115*df373737SAchin Gupta /******************************************************************************* 116*df373737SAchin Gupta * GIC Distributor interface register accessors that are common to GICv3 & GICv2 117*df373737SAchin Gupta ******************************************************************************/ 118*df373737SAchin Gupta static inline unsigned int gicd_read_ctlr(uintptr_t base) 119*df373737SAchin Gupta { 120*df373737SAchin Gupta return mmio_read_32(base + GICD_CTLR); 121*df373737SAchin Gupta } 122*df373737SAchin Gupta 123*df373737SAchin Gupta static inline unsigned int gicd_read_typer(uintptr_t base) 124*df373737SAchin Gupta { 125*df373737SAchin Gupta return mmio_read_32(base + GICD_TYPER); 126*df373737SAchin Gupta } 127*df373737SAchin Gupta 128*df373737SAchin Gupta static inline unsigned int gicd_read_iidr(uintptr_t base) 129*df373737SAchin Gupta { 130*df373737SAchin Gupta return mmio_read_32(base + GICD_IIDR); 131*df373737SAchin Gupta } 132*df373737SAchin Gupta 133*df373737SAchin Gupta static inline void gicd_write_ctlr(uintptr_t base, unsigned int val) 134*df373737SAchin Gupta { 135*df373737SAchin Gupta mmio_write_32(base + GICD_CTLR, val); 136*df373737SAchin Gupta } 137*df373737SAchin Gupta 138*df373737SAchin Gupta /******************************************************************************* 139*df373737SAchin Gupta * GIC Distributor function prototypes 140*df373737SAchin Gupta ******************************************************************************/ 141*df373737SAchin Gupta unsigned int gicd_read_igroupr(uintptr_t base, unsigned int id); 142*df373737SAchin Gupta unsigned int gicd_read_isenabler(uintptr_t base, unsigned int id); 143*df373737SAchin Gupta unsigned int gicd_read_icenabler(uintptr_t base, unsigned int id); 144*df373737SAchin Gupta unsigned int gicd_read_ispendr(uintptr_t base, unsigned int id); 145*df373737SAchin Gupta unsigned int gicd_read_icpendr(uintptr_t base, unsigned int id); 146*df373737SAchin Gupta unsigned int gicd_read_isactiver(uintptr_t base, unsigned int id); 147*df373737SAchin Gupta unsigned int gicd_read_icactiver(uintptr_t base, unsigned int id); 148*df373737SAchin Gupta unsigned int gicd_read_ipriorityr(uintptr_t base, unsigned int id); 149*df373737SAchin Gupta unsigned int gicd_read_icfgr(uintptr_t base, unsigned int id); 150*df373737SAchin Gupta unsigned int gicd_read_nsacr(uintptr_t base, unsigned int id); 151*df373737SAchin Gupta void gicd_write_igroupr(uintptr_t base, unsigned int id, unsigned int val); 152*df373737SAchin Gupta void gicd_write_isenabler(uintptr_t base, unsigned int id, unsigned int val); 153*df373737SAchin Gupta void gicd_write_icenabler(uintptr_t base, unsigned int id, unsigned int val); 154*df373737SAchin Gupta void gicd_write_ispendr(uintptr_t base, unsigned int id, unsigned int val); 155*df373737SAchin Gupta void gicd_write_icpendr(uintptr_t base, unsigned int id, unsigned int val); 156*df373737SAchin Gupta void gicd_write_isactiver(uintptr_t base, unsigned int id, unsigned int val); 157*df373737SAchin Gupta void gicd_write_icactiver(uintptr_t base, unsigned int id, unsigned int val); 158*df373737SAchin Gupta void gicd_write_ipriorityr(uintptr_t base, unsigned int id, unsigned int val); 159*df373737SAchin Gupta void gicd_write_icfgr(uintptr_t base, unsigned int id, unsigned int val); 160*df373737SAchin Gupta void gicd_write_nsacr(uintptr_t base, unsigned int id, unsigned int val); 161*df373737SAchin Gupta unsigned int gicd_get_igroupr(uintptr_t base, unsigned int id); 162*df373737SAchin Gupta void gicd_set_igroupr(uintptr_t base, unsigned int id); 163*df373737SAchin Gupta void gicd_clr_igroupr(uintptr_t base, unsigned int id); 164*df373737SAchin Gupta void gicd_set_isenabler(uintptr_t base, unsigned int id); 165*df373737SAchin Gupta void gicd_set_icenabler(uintptr_t base, unsigned int id); 166*df373737SAchin Gupta void gicd_set_ispendr(uintptr_t base, unsigned int id); 167*df373737SAchin Gupta void gicd_set_icpendr(uintptr_t base, unsigned int id); 168*df373737SAchin Gupta void gicd_set_isactiver(uintptr_t base, unsigned int id); 169*df373737SAchin Gupta void gicd_set_icactiver(uintptr_t base, unsigned int id); 170*df373737SAchin Gupta 171*df373737SAchin Gupta 172*df373737SAchin Gupta #endif /* __ASSEMBLY__ */ 173*df373737SAchin Gupta #endif /* __GIC_COMMON_H__ */ 174