1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2015-2020, Arm Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <arch.h> 8*91f16700Schasinglulu #include <arch_helpers.h> 9*91f16700Schasinglulu #include <common/debug.h> 10*91f16700Schasinglulu #include <common/interrupt_props.h> 11*91f16700Schasinglulu #include <drivers/arm/gicv3.h> 12*91f16700Schasinglulu #include "gicv3_private.h" 13*91f16700Schasinglulu 14*91f16700Schasinglulu /******************************************************************************* 15*91f16700Schasinglulu * GIC Redistributor functions 16*91f16700Schasinglulu * Note: The raw register values correspond to multiple interrupt `id`s and 17*91f16700Schasinglulu * the number of interrupt `id`s involved depends on the register accessed. 18*91f16700Schasinglulu ******************************************************************************/ 19*91f16700Schasinglulu 20*91f16700Schasinglulu /* 21*91f16700Schasinglulu * Accessors to read/write the GIC Redistributor IPRIORITYR and IPRIORITYRE 22*91f16700Schasinglulu * register corresponding to the interrupt `id`, 4 interrupts IDs at a time. 23*91f16700Schasinglulu */ 24*91f16700Schasinglulu unsigned int gicr_read_ipriorityr(uintptr_t base, unsigned int id) 25*91f16700Schasinglulu { 26*91f16700Schasinglulu return GICR_READ(IPRIORITY, base, id); 27*91f16700Schasinglulu } 28*91f16700Schasinglulu 29*91f16700Schasinglulu void gicr_write_ipriorityr(uintptr_t base, unsigned int id, unsigned int val) 30*91f16700Schasinglulu { 31*91f16700Schasinglulu GICR_WRITE(IPRIORITY, base, id, val); 32*91f16700Schasinglulu } 33*91f16700Schasinglulu 34*91f16700Schasinglulu /* 35*91f16700Schasinglulu * Accessor to set the byte corresponding to interrupt `id` 36*91f16700Schasinglulu * in GIC Redistributor IPRIORITYR and IPRIORITYRE. 37*91f16700Schasinglulu */ 38*91f16700Schasinglulu void gicr_set_ipriorityr(uintptr_t base, unsigned int id, unsigned int pri) 39*91f16700Schasinglulu { 40*91f16700Schasinglulu GICR_WRITE_8(IPRIORITY, base, id, (uint8_t)(pri & GIC_PRI_MASK)); 41*91f16700Schasinglulu } 42*91f16700Schasinglulu 43*91f16700Schasinglulu /* 44*91f16700Schasinglulu * Accessors to get/set/clear the bit corresponding to interrupt `id` 45*91f16700Schasinglulu * from GIC Redistributor IGROUPR0 and IGROUPRE 46*91f16700Schasinglulu */ 47*91f16700Schasinglulu unsigned int gicr_get_igroupr(uintptr_t base, unsigned int id) 48*91f16700Schasinglulu { 49*91f16700Schasinglulu return GICR_GET_BIT(IGROUP, base, id); 50*91f16700Schasinglulu } 51*91f16700Schasinglulu 52*91f16700Schasinglulu void gicr_set_igroupr(uintptr_t base, unsigned int id) 53*91f16700Schasinglulu { 54*91f16700Schasinglulu GICR_SET_BIT(IGROUP, base, id); 55*91f16700Schasinglulu } 56*91f16700Schasinglulu 57*91f16700Schasinglulu void gicr_clr_igroupr(uintptr_t base, unsigned int id) 58*91f16700Schasinglulu { 59*91f16700Schasinglulu GICR_CLR_BIT(IGROUP, base, id); 60*91f16700Schasinglulu } 61*91f16700Schasinglulu 62*91f16700Schasinglulu /* 63*91f16700Schasinglulu * Accessors to get/set/clear the bit corresponding to interrupt `id` 64*91f16700Schasinglulu * from GIC Redistributor IGRPMODR0 and IGRPMODRE 65*91f16700Schasinglulu */ 66*91f16700Schasinglulu unsigned int gicr_get_igrpmodr(uintptr_t base, unsigned int id) 67*91f16700Schasinglulu { 68*91f16700Schasinglulu return GICR_GET_BIT(IGRPMOD, base, id); 69*91f16700Schasinglulu } 70*91f16700Schasinglulu 71*91f16700Schasinglulu void gicr_set_igrpmodr(uintptr_t base, unsigned int id) 72*91f16700Schasinglulu { 73*91f16700Schasinglulu GICR_SET_BIT(IGRPMOD, base, id); 74*91f16700Schasinglulu } 75*91f16700Schasinglulu 76*91f16700Schasinglulu void gicr_clr_igrpmodr(uintptr_t base, unsigned int id) 77*91f16700Schasinglulu { 78*91f16700Schasinglulu GICR_CLR_BIT(IGRPMOD, base, id); 79*91f16700Schasinglulu } 80*91f16700Schasinglulu 81*91f16700Schasinglulu /* 82*91f16700Schasinglulu * Accessor to write the bit corresponding to interrupt `id` 83*91f16700Schasinglulu * in GIC Redistributor ISENABLER0 and ISENABLERE 84*91f16700Schasinglulu */ 85*91f16700Schasinglulu void gicr_set_isenabler(uintptr_t base, unsigned int id) 86*91f16700Schasinglulu { 87*91f16700Schasinglulu GICR_WRITE_BIT(ISENABLE, base, id); 88*91f16700Schasinglulu } 89*91f16700Schasinglulu 90*91f16700Schasinglulu /* 91*91f16700Schasinglulu * Accessor to write the bit corresponding to interrupt `id` 92*91f16700Schasinglulu * in GIC Redistributor ICENABLER0 and ICENABLERE 93*91f16700Schasinglulu */ 94*91f16700Schasinglulu void gicr_set_icenabler(uintptr_t base, unsigned int id) 95*91f16700Schasinglulu { 96*91f16700Schasinglulu GICR_WRITE_BIT(ICENABLE, base, id); 97*91f16700Schasinglulu } 98*91f16700Schasinglulu 99*91f16700Schasinglulu /* 100*91f16700Schasinglulu * Accessor to get the bit corresponding to interrupt `id` 101*91f16700Schasinglulu * in GIC Redistributor ISACTIVER0 and ISACTIVERE 102*91f16700Schasinglulu */ 103*91f16700Schasinglulu unsigned int gicr_get_isactiver(uintptr_t base, unsigned int id) 104*91f16700Schasinglulu { 105*91f16700Schasinglulu return GICR_GET_BIT(ISACTIVE, base, id); 106*91f16700Schasinglulu } 107*91f16700Schasinglulu 108*91f16700Schasinglulu /* 109*91f16700Schasinglulu * Accessor to clear the bit corresponding to interrupt `id` 110*91f16700Schasinglulu * in GIC Redistributor ICPENDR0 and ICPENDRE 111*91f16700Schasinglulu */ 112*91f16700Schasinglulu void gicr_set_icpendr(uintptr_t base, unsigned int id) 113*91f16700Schasinglulu { 114*91f16700Schasinglulu GICR_WRITE_BIT(ICPEND, base, id); 115*91f16700Schasinglulu } 116*91f16700Schasinglulu 117*91f16700Schasinglulu /* 118*91f16700Schasinglulu * Accessor to write the bit corresponding to interrupt `id` 119*91f16700Schasinglulu * in GIC Redistributor ISPENDR0 and ISPENDRE 120*91f16700Schasinglulu */ 121*91f16700Schasinglulu void gicr_set_ispendr(uintptr_t base, unsigned int id) 122*91f16700Schasinglulu { 123*91f16700Schasinglulu GICR_WRITE_BIT(ISPEND, base, id); 124*91f16700Schasinglulu } 125*91f16700Schasinglulu 126*91f16700Schasinglulu /* 127*91f16700Schasinglulu * Accessor to set the bit fields corresponding to interrupt `id` 128*91f16700Schasinglulu * in GIC Redistributor ICFGR0, ICFGR1 and ICFGRE 129*91f16700Schasinglulu */ 130*91f16700Schasinglulu void gicr_set_icfgr(uintptr_t base, unsigned int id, unsigned int cfg) 131*91f16700Schasinglulu { 132*91f16700Schasinglulu /* Interrupt configuration is a 2-bit field */ 133*91f16700Schasinglulu unsigned int bit_shift = BIT_NUM(ICFG, id) << 1U; 134*91f16700Schasinglulu 135*91f16700Schasinglulu /* Clear the field, and insert required configuration */ 136*91f16700Schasinglulu mmio_clrsetbits_32(base + GICR_OFFSET(ICFG, id), 137*91f16700Schasinglulu (uint32_t)GIC_CFG_MASK << bit_shift, 138*91f16700Schasinglulu (cfg & GIC_CFG_MASK) << bit_shift); 139*91f16700Schasinglulu } 140