1*54fd6939SJiyong Park /* 2*54fd6939SJiyong Park * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved. 3*54fd6939SJiyong Park * 4*54fd6939SJiyong Park * SPDX-License-Identifier: BSD-3-Clause 5*54fd6939SJiyong Park */ 6*54fd6939SJiyong Park 7*54fd6939SJiyong Park #ifndef GICV2_H 8*54fd6939SJiyong Park #define GICV2_H 9*54fd6939SJiyong Park 10*54fd6939SJiyong Park #include <drivers/arm/gic_common.h> 11*54fd6939SJiyong Park 12*54fd6939SJiyong Park /******************************************************************************* 13*54fd6939SJiyong Park * GICv2 miscellaneous definitions 14*54fd6939SJiyong Park ******************************************************************************/ 15*54fd6939SJiyong Park 16*54fd6939SJiyong Park /* Interrupt group definitions */ 17*54fd6939SJiyong Park #define GICV2_INTR_GROUP0 U(0) 18*54fd6939SJiyong Park #define GICV2_INTR_GROUP1 U(1) 19*54fd6939SJiyong Park 20*54fd6939SJiyong Park /* Interrupt IDs reported by the HPPIR and IAR registers */ 21*54fd6939SJiyong Park #define PENDING_G1_INTID U(1022) 22*54fd6939SJiyong Park 23*54fd6939SJiyong Park /* GICv2 can only target up to 8 PEs */ 24*54fd6939SJiyong Park #define GICV2_MAX_TARGET_PE U(8) 25*54fd6939SJiyong Park 26*54fd6939SJiyong Park /******************************************************************************* 27*54fd6939SJiyong Park * GICv2 specific Distributor interface register offsets and constants. 28*54fd6939SJiyong Park ******************************************************************************/ 29*54fd6939SJiyong Park #define GICD_ITARGETSR U(0x800) 30*54fd6939SJiyong Park #define GICD_SGIR U(0xF00) 31*54fd6939SJiyong Park #define GICD_CPENDSGIR U(0xF10) 32*54fd6939SJiyong Park #define GICD_SPENDSGIR U(0xF20) 33*54fd6939SJiyong Park #define GICD_PIDR2_GICV2 U(0xFE8) 34*54fd6939SJiyong Park 35*54fd6939SJiyong Park #define ITARGETSR_SHIFT 2 36*54fd6939SJiyong Park #define GIC_TARGET_CPU_MASK U(0xff) 37*54fd6939SJiyong Park 38*54fd6939SJiyong Park #define CPENDSGIR_SHIFT 2 39*54fd6939SJiyong Park #define SPENDSGIR_SHIFT CPENDSGIR_SHIFT 40*54fd6939SJiyong Park 41*54fd6939SJiyong Park #define SGIR_TGTLSTFLT_SHIFT 24 42*54fd6939SJiyong Park #define SGIR_TGTLSTFLT_MASK U(0x3) 43*54fd6939SJiyong Park #define SGIR_TGTLST_SHIFT 16 44*54fd6939SJiyong Park #define SGIR_TGTLST_MASK U(0xff) 45*54fd6939SJiyong Park #define SGIR_INTID_MASK ULL(0xf) 46*54fd6939SJiyong Park 47*54fd6939SJiyong Park #define SGIR_TGT_SPECIFIC U(0) 48*54fd6939SJiyong Park 49*54fd6939SJiyong Park #define GICV2_SGIR_VALUE(tgt_lst_flt, tgt, intid) \ 50*54fd6939SJiyong Park ((((tgt_lst_flt) & SGIR_TGTLSTFLT_MASK) << SGIR_TGTLSTFLT_SHIFT) | \ 51*54fd6939SJiyong Park (((tgt) & SGIR_TGTLST_MASK) << SGIR_TGTLST_SHIFT) | \ 52*54fd6939SJiyong Park ((intid) & SGIR_INTID_MASK)) 53*54fd6939SJiyong Park 54*54fd6939SJiyong Park /******************************************************************************* 55*54fd6939SJiyong Park * GICv2 specific CPU interface register offsets and constants. 56*54fd6939SJiyong Park ******************************************************************************/ 57*54fd6939SJiyong Park /* Physical CPU Interface registers */ 58*54fd6939SJiyong Park #define GICC_CTLR U(0x0) 59*54fd6939SJiyong Park #define GICC_PMR U(0x4) 60*54fd6939SJiyong Park #define GICC_BPR U(0x8) 61*54fd6939SJiyong Park #define GICC_IAR U(0xC) 62*54fd6939SJiyong Park #define GICC_EOIR U(0x10) 63*54fd6939SJiyong Park #define GICC_RPR U(0x14) 64*54fd6939SJiyong Park #define GICC_HPPIR U(0x18) 65*54fd6939SJiyong Park #define GICC_AHPPIR U(0x28) 66*54fd6939SJiyong Park #define GICC_IIDR U(0xFC) 67*54fd6939SJiyong Park #define GICC_DIR U(0x1000) 68*54fd6939SJiyong Park #define GICC_PRIODROP GICC_EOIR 69*54fd6939SJiyong Park 70*54fd6939SJiyong Park /* GICC_CTLR bit definitions */ 71*54fd6939SJiyong Park #define EOI_MODE_NS BIT_32(10) 72*54fd6939SJiyong Park #define EOI_MODE_S BIT_32(9) 73*54fd6939SJiyong Park #define IRQ_BYP_DIS_GRP1 BIT_32(8) 74*54fd6939SJiyong Park #define FIQ_BYP_DIS_GRP1 BIT_32(7) 75*54fd6939SJiyong Park #define IRQ_BYP_DIS_GRP0 BIT_32(6) 76*54fd6939SJiyong Park #define FIQ_BYP_DIS_GRP0 BIT_32(5) 77*54fd6939SJiyong Park #define CBPR BIT_32(4) 78*54fd6939SJiyong Park #define FIQ_EN_SHIFT 3 79*54fd6939SJiyong Park #define FIQ_EN_BIT BIT_32(FIQ_EN_SHIFT) 80*54fd6939SJiyong Park #define ACK_CTL BIT_32(2) 81*54fd6939SJiyong Park 82*54fd6939SJiyong Park /* GICC_IIDR bit masks and shifts */ 83*54fd6939SJiyong Park #define GICC_IIDR_PID_SHIFT 20 84*54fd6939SJiyong Park #define GICC_IIDR_ARCH_SHIFT 16 85*54fd6939SJiyong Park #define GICC_IIDR_REV_SHIFT 12 86*54fd6939SJiyong Park #define GICC_IIDR_IMP_SHIFT 0 87*54fd6939SJiyong Park 88*54fd6939SJiyong Park #define GICC_IIDR_PID_MASK U(0xfff) 89*54fd6939SJiyong Park #define GICC_IIDR_ARCH_MASK U(0xf) 90*54fd6939SJiyong Park #define GICC_IIDR_REV_MASK U(0xf) 91*54fd6939SJiyong Park #define GICC_IIDR_IMP_MASK U(0xfff) 92*54fd6939SJiyong Park 93*54fd6939SJiyong Park /* HYP view virtual CPU Interface registers */ 94*54fd6939SJiyong Park #define GICH_CTL U(0x0) 95*54fd6939SJiyong Park #define GICH_VTR U(0x4) 96*54fd6939SJiyong Park #define GICH_ELRSR0 U(0x30) 97*54fd6939SJiyong Park #define GICH_ELRSR1 U(0x34) 98*54fd6939SJiyong Park #define GICH_APR0 U(0xF0) 99*54fd6939SJiyong Park #define GICH_LR_BASE U(0x100) 100*54fd6939SJiyong Park 101*54fd6939SJiyong Park /* Virtual CPU Interface registers */ 102*54fd6939SJiyong Park #define GICV_CTL U(0x0) 103*54fd6939SJiyong Park #define GICV_PRIMASK U(0x4) 104*54fd6939SJiyong Park #define GICV_BP U(0x8) 105*54fd6939SJiyong Park #define GICV_INTACK U(0xC) 106*54fd6939SJiyong Park #define GICV_EOI U(0x10) 107*54fd6939SJiyong Park #define GICV_RUNNINGPRI U(0x14) 108*54fd6939SJiyong Park #define GICV_HIGHESTPEND U(0x18) 109*54fd6939SJiyong Park #define GICV_DEACTIVATE U(0x1000) 110*54fd6939SJiyong Park 111*54fd6939SJiyong Park /* GICD_CTLR bit definitions */ 112*54fd6939SJiyong Park #define CTLR_ENABLE_G1_SHIFT 1 113*54fd6939SJiyong Park #define CTLR_ENABLE_G1_MASK U(0x1) 114*54fd6939SJiyong Park #define CTLR_ENABLE_G1_BIT BIT_32(CTLR_ENABLE_G1_SHIFT) 115*54fd6939SJiyong Park 116*54fd6939SJiyong Park /* Interrupt ID mask for HPPIR, AHPPIR, IAR and AIAR CPU Interface registers */ 117*54fd6939SJiyong Park #define INT_ID_MASK U(0x3ff) 118*54fd6939SJiyong Park 119*54fd6939SJiyong Park #ifndef __ASSEMBLER__ 120*54fd6939SJiyong Park 121*54fd6939SJiyong Park #include <cdefs.h> 122*54fd6939SJiyong Park #include <stdint.h> 123*54fd6939SJiyong Park 124*54fd6939SJiyong Park #include <common/interrupt_props.h> 125*54fd6939SJiyong Park 126*54fd6939SJiyong Park /******************************************************************************* 127*54fd6939SJiyong Park * This structure describes some of the implementation defined attributes of 128*54fd6939SJiyong Park * the GICv2 IP. It is used by the platform port to specify these attributes 129*54fd6939SJiyong Park * in order to initialize the GICv2 driver. The attributes are described 130*54fd6939SJiyong Park * below. 131*54fd6939SJiyong Park * 132*54fd6939SJiyong Park * The 'gicd_base' field contains the base address of the Distributor interface 133*54fd6939SJiyong Park * programmer's view. 134*54fd6939SJiyong Park * 135*54fd6939SJiyong Park * The 'gicc_base' field contains the base address of the CPU Interface 136*54fd6939SJiyong Park * programmer's view. 137*54fd6939SJiyong Park * 138*54fd6939SJiyong Park * The 'target_masks' is a pointer to an array containing 'target_masks_num' 139*54fd6939SJiyong Park * elements. The GIC driver will populate the array with per-PE target mask to 140*54fd6939SJiyong Park * use to when targeting interrupts. 141*54fd6939SJiyong Park * 142*54fd6939SJiyong Park * The 'interrupt_props' field is a pointer to an array that enumerates secure 143*54fd6939SJiyong Park * interrupts and their properties. If this field is not NULL, both 144*54fd6939SJiyong Park * 'g0_interrupt_array' and 'g1s_interrupt_array' fields are ignored. 145*54fd6939SJiyong Park * 146*54fd6939SJiyong Park * The 'interrupt_props_num' field contains the number of entries in the 147*54fd6939SJiyong Park * 'interrupt_props' array. If this field is non-zero, 'g0_interrupt_num' is 148*54fd6939SJiyong Park * ignored. 149*54fd6939SJiyong Park ******************************************************************************/ 150*54fd6939SJiyong Park typedef struct gicv2_driver_data { 151*54fd6939SJiyong Park uintptr_t gicd_base; 152*54fd6939SJiyong Park uintptr_t gicc_base; 153*54fd6939SJiyong Park unsigned int *target_masks; 154*54fd6939SJiyong Park unsigned int target_masks_num; 155*54fd6939SJiyong Park const interrupt_prop_t *interrupt_props; 156*54fd6939SJiyong Park unsigned int interrupt_props_num; 157*54fd6939SJiyong Park } gicv2_driver_data_t; 158*54fd6939SJiyong Park 159*54fd6939SJiyong Park /******************************************************************************* 160*54fd6939SJiyong Park * Function prototypes 161*54fd6939SJiyong Park ******************************************************************************/ 162*54fd6939SJiyong Park void gicv2_driver_init(const gicv2_driver_data_t *plat_driver_data); 163*54fd6939SJiyong Park void gicv2_distif_init(void); 164*54fd6939SJiyong Park void gicv2_pcpu_distif_init(void); 165*54fd6939SJiyong Park void gicv2_cpuif_enable(void); 166*54fd6939SJiyong Park void gicv2_cpuif_disable(void); 167*54fd6939SJiyong Park unsigned int gicv2_is_fiq_enabled(void); 168*54fd6939SJiyong Park unsigned int gicv2_get_pending_interrupt_type(void); 169*54fd6939SJiyong Park unsigned int gicv2_get_pending_interrupt_id(void); 170*54fd6939SJiyong Park unsigned int gicv2_acknowledge_interrupt(void); 171*54fd6939SJiyong Park void gicv2_end_of_interrupt(unsigned int id); 172*54fd6939SJiyong Park unsigned int gicv2_get_interrupt_group(unsigned int id); 173*54fd6939SJiyong Park unsigned int gicv2_get_running_priority(void); 174*54fd6939SJiyong Park void gicv2_set_pe_target_mask(unsigned int proc_num); 175*54fd6939SJiyong Park unsigned int gicv2_get_interrupt_active(unsigned int id); 176*54fd6939SJiyong Park void gicv2_enable_interrupt(unsigned int id); 177*54fd6939SJiyong Park void gicv2_disable_interrupt(unsigned int id); 178*54fd6939SJiyong Park void gicv2_set_interrupt_priority(unsigned int id, unsigned int priority); 179*54fd6939SJiyong Park void gicv2_set_interrupt_type(unsigned int id, unsigned int type); 180*54fd6939SJiyong Park void gicv2_raise_sgi(int sgi_num, int proc_num); 181*54fd6939SJiyong Park void gicv2_set_spi_routing(unsigned int id, int proc_num); 182*54fd6939SJiyong Park void gicv2_set_interrupt_pending(unsigned int id); 183*54fd6939SJiyong Park void gicv2_clear_interrupt_pending(unsigned int id); 184*54fd6939SJiyong Park unsigned int gicv2_set_pmr(unsigned int mask); 185*54fd6939SJiyong Park void gicv2_interrupt_set_cfg(unsigned int id, unsigned int cfg); 186*54fd6939SJiyong Park 187*54fd6939SJiyong Park #endif /* __ASSEMBLER__ */ 188*54fd6939SJiyong Park #endif /* GICV2_H */ 189