1*1322dc94SAlexei Fedorov /* 2*1322dc94SAlexei Fedorov * Copyright (c) 2015-2020, ARM Limited and Contributors. All rights reserved. 3*1322dc94SAlexei Fedorov * 4*1322dc94SAlexei Fedorov * SPDX-License-Identifier: BSD-3-Clause 5*1322dc94SAlexei Fedorov */ 6*1322dc94SAlexei Fedorov 7*1322dc94SAlexei Fedorov #include <assert.h> 8*1322dc94SAlexei Fedorov 9*1322dc94SAlexei Fedorov #include <drivers/arm/gic_common.h> 10*1322dc94SAlexei Fedorov #include <lib/mmio.h> 11*1322dc94SAlexei Fedorov 12*1322dc94SAlexei Fedorov #include "../common/gic_common_private.h" 13*1322dc94SAlexei Fedorov 14*1322dc94SAlexei Fedorov /******************************************************************************* 15*1322dc94SAlexei Fedorov * GIC Distributor interface accessors for reading entire registers 16*1322dc94SAlexei Fedorov ******************************************************************************/ 17*1322dc94SAlexei Fedorov /* 18*1322dc94SAlexei Fedorov * Accessor to read the GIC Distributor IGROUPR corresponding to the interrupt 19*1322dc94SAlexei Fedorov * `id`, 32 interrupt ids at a time. 20*1322dc94SAlexei Fedorov */ 21*1322dc94SAlexei Fedorov unsigned int gicd_read_igroupr(uintptr_t base, unsigned int id) 22*1322dc94SAlexei Fedorov { 23*1322dc94SAlexei Fedorov unsigned int n = id >> IGROUPR_SHIFT; 24*1322dc94SAlexei Fedorov 25*1322dc94SAlexei Fedorov return mmio_read_32(base + GICD_IGROUPR + (n << 2)); 26*1322dc94SAlexei Fedorov } 27*1322dc94SAlexei Fedorov 28*1322dc94SAlexei Fedorov /* 29*1322dc94SAlexei Fedorov * Accessor to read the GIC Distributor ISENABLER corresponding to the 30*1322dc94SAlexei Fedorov * interrupt `id`, 32 interrupt ids at a time. 31*1322dc94SAlexei Fedorov */ 32*1322dc94SAlexei Fedorov unsigned int gicd_read_isenabler(uintptr_t base, unsigned int id) 33*1322dc94SAlexei Fedorov { 34*1322dc94SAlexei Fedorov unsigned int n = id >> ISENABLER_SHIFT; 35*1322dc94SAlexei Fedorov 36*1322dc94SAlexei Fedorov return mmio_read_32(base + GICD_ISENABLER + (n << 2)); 37*1322dc94SAlexei Fedorov } 38*1322dc94SAlexei Fedorov 39*1322dc94SAlexei Fedorov /* 40*1322dc94SAlexei Fedorov * Accessor to read the GIC Distributor ICENABLER corresponding to the 41*1322dc94SAlexei Fedorov * interrupt `id`, 32 interrupt IDs at a time. 42*1322dc94SAlexei Fedorov */ 43*1322dc94SAlexei Fedorov unsigned int gicd_read_icenabler(uintptr_t base, unsigned int id) 44*1322dc94SAlexei Fedorov { 45*1322dc94SAlexei Fedorov unsigned int n = id >> ICENABLER_SHIFT; 46*1322dc94SAlexei Fedorov 47*1322dc94SAlexei Fedorov return mmio_read_32(base + GICD_ICENABLER + (n << 2)); 48*1322dc94SAlexei Fedorov } 49*1322dc94SAlexei Fedorov 50*1322dc94SAlexei Fedorov /* 51*1322dc94SAlexei Fedorov * Accessor to read the GIC Distributor ISPENDR corresponding to the 52*1322dc94SAlexei Fedorov * interrupt `id`, 32 interrupt IDs at a time. 53*1322dc94SAlexei Fedorov */ 54*1322dc94SAlexei Fedorov unsigned int gicd_read_ispendr(uintptr_t base, unsigned int id) 55*1322dc94SAlexei Fedorov { 56*1322dc94SAlexei Fedorov unsigned int n = id >> ISPENDR_SHIFT; 57*1322dc94SAlexei Fedorov 58*1322dc94SAlexei Fedorov return mmio_read_32(base + GICD_ISPENDR + (n << 2)); 59*1322dc94SAlexei Fedorov } 60*1322dc94SAlexei Fedorov 61*1322dc94SAlexei Fedorov /* 62*1322dc94SAlexei Fedorov * Accessor to read the GIC Distributor ICPENDR corresponding to the 63*1322dc94SAlexei Fedorov * interrupt `id`, 32 interrupt IDs at a time. 64*1322dc94SAlexei Fedorov */ 65*1322dc94SAlexei Fedorov unsigned int gicd_read_icpendr(uintptr_t base, unsigned int id) 66*1322dc94SAlexei Fedorov { 67*1322dc94SAlexei Fedorov unsigned int n = id >> ICPENDR_SHIFT; 68*1322dc94SAlexei Fedorov 69*1322dc94SAlexei Fedorov return mmio_read_32(base + GICD_ICPENDR + (n << 2)); 70*1322dc94SAlexei Fedorov } 71*1322dc94SAlexei Fedorov 72*1322dc94SAlexei Fedorov /* 73*1322dc94SAlexei Fedorov * Accessor to read the GIC Distributor ISACTIVER corresponding to the 74*1322dc94SAlexei Fedorov * interrupt `id`, 32 interrupt IDs at a time. 75*1322dc94SAlexei Fedorov */ 76*1322dc94SAlexei Fedorov unsigned int gicd_read_isactiver(uintptr_t base, unsigned int id) 77*1322dc94SAlexei Fedorov { 78*1322dc94SAlexei Fedorov unsigned int n = id >> ISACTIVER_SHIFT; 79*1322dc94SAlexei Fedorov 80*1322dc94SAlexei Fedorov return mmio_read_32(base + GICD_ISACTIVER + (n << 2)); 81*1322dc94SAlexei Fedorov } 82*1322dc94SAlexei Fedorov 83*1322dc94SAlexei Fedorov /* 84*1322dc94SAlexei Fedorov * Accessor to read the GIC Distributor ICACTIVER corresponding to the 85*1322dc94SAlexei Fedorov * interrupt `id`, 32 interrupt IDs at a time. 86*1322dc94SAlexei Fedorov */ 87*1322dc94SAlexei Fedorov unsigned int gicd_read_icactiver(uintptr_t base, unsigned int id) 88*1322dc94SAlexei Fedorov { 89*1322dc94SAlexei Fedorov unsigned int n = id >> ICACTIVER_SHIFT; 90*1322dc94SAlexei Fedorov 91*1322dc94SAlexei Fedorov return mmio_read_32(base + GICD_ICACTIVER + (n << 2)); 92*1322dc94SAlexei Fedorov } 93*1322dc94SAlexei Fedorov 94*1322dc94SAlexei Fedorov /* 95*1322dc94SAlexei Fedorov * Accessor to read the GIC Distributor IPRIORITYR corresponding to the 96*1322dc94SAlexei Fedorov * interrupt `id`, 4 interrupt IDs at a time. 97*1322dc94SAlexei Fedorov */ 98*1322dc94SAlexei Fedorov unsigned int gicd_read_ipriorityr(uintptr_t base, unsigned int id) 99*1322dc94SAlexei Fedorov { 100*1322dc94SAlexei Fedorov unsigned int n = id >> IPRIORITYR_SHIFT; 101*1322dc94SAlexei Fedorov 102*1322dc94SAlexei Fedorov return mmio_read_32(base + GICD_IPRIORITYR + (n << 2)); 103*1322dc94SAlexei Fedorov } 104*1322dc94SAlexei Fedorov 105*1322dc94SAlexei Fedorov /* 106*1322dc94SAlexei Fedorov * Accessor to read the GIC Distributor ICGFR corresponding to the 107*1322dc94SAlexei Fedorov * interrupt `id`, 16 interrupt IDs at a time. 108*1322dc94SAlexei Fedorov */ 109*1322dc94SAlexei Fedorov unsigned int gicd_read_icfgr(uintptr_t base, unsigned int id) 110*1322dc94SAlexei Fedorov { 111*1322dc94SAlexei Fedorov unsigned int n = id >> ICFGR_SHIFT; 112*1322dc94SAlexei Fedorov 113*1322dc94SAlexei Fedorov return mmio_read_32(base + GICD_ICFGR + (n << 2)); 114*1322dc94SAlexei Fedorov } 115*1322dc94SAlexei Fedorov 116*1322dc94SAlexei Fedorov /* 117*1322dc94SAlexei Fedorov * Accessor to read the GIC Distributor NSACR corresponding to the 118*1322dc94SAlexei Fedorov * interrupt `id`, 16 interrupt IDs at a time. 119*1322dc94SAlexei Fedorov */ 120*1322dc94SAlexei Fedorov unsigned int gicd_read_nsacr(uintptr_t base, unsigned int id) 121*1322dc94SAlexei Fedorov { 122*1322dc94SAlexei Fedorov unsigned int n = id >> NSACR_SHIFT; 123*1322dc94SAlexei Fedorov 124*1322dc94SAlexei Fedorov return mmio_read_32(base + GICD_NSACR + (n << 2)); 125*1322dc94SAlexei Fedorov } 126*1322dc94SAlexei Fedorov 127*1322dc94SAlexei Fedorov /******************************************************************************* 128*1322dc94SAlexei Fedorov * GIC Distributor interface accessors for writing entire registers 129*1322dc94SAlexei Fedorov ******************************************************************************/ 130*1322dc94SAlexei Fedorov /* 131*1322dc94SAlexei Fedorov * Accessor to write the GIC Distributor IGROUPR corresponding to the 132*1322dc94SAlexei Fedorov * interrupt `id`, 32 interrupt IDs at a time. 133*1322dc94SAlexei Fedorov */ 134*1322dc94SAlexei Fedorov void gicd_write_igroupr(uintptr_t base, unsigned int id, unsigned int val) 135*1322dc94SAlexei Fedorov { 136*1322dc94SAlexei Fedorov unsigned int n = id >> IGROUPR_SHIFT; 137*1322dc94SAlexei Fedorov 138*1322dc94SAlexei Fedorov mmio_write_32(base + GICD_IGROUPR + (n << 2), val); 139*1322dc94SAlexei Fedorov } 140*1322dc94SAlexei Fedorov 141*1322dc94SAlexei Fedorov /* 142*1322dc94SAlexei Fedorov * Accessor to write the GIC Distributor ISENABLER corresponding to the 143*1322dc94SAlexei Fedorov * interrupt `id`, 32 interrupt IDs at a time. 144*1322dc94SAlexei Fedorov */ 145*1322dc94SAlexei Fedorov void gicd_write_isenabler(uintptr_t base, unsigned int id, unsigned int val) 146*1322dc94SAlexei Fedorov { 147*1322dc94SAlexei Fedorov unsigned int n = id >> ISENABLER_SHIFT; 148*1322dc94SAlexei Fedorov 149*1322dc94SAlexei Fedorov mmio_write_32(base + GICD_ISENABLER + (n << 2), val); 150*1322dc94SAlexei Fedorov } 151*1322dc94SAlexei Fedorov 152*1322dc94SAlexei Fedorov /* 153*1322dc94SAlexei Fedorov * Accessor to write the GIC Distributor ICENABLER corresponding to the 154*1322dc94SAlexei Fedorov * interrupt `id`, 32 interrupt IDs at a time. 155*1322dc94SAlexei Fedorov */ 156*1322dc94SAlexei Fedorov void gicd_write_icenabler(uintptr_t base, unsigned int id, unsigned int val) 157*1322dc94SAlexei Fedorov { 158*1322dc94SAlexei Fedorov unsigned int n = id >> ICENABLER_SHIFT; 159*1322dc94SAlexei Fedorov 160*1322dc94SAlexei Fedorov mmio_write_32(base + GICD_ICENABLER + (n << 2), val); 161*1322dc94SAlexei Fedorov } 162*1322dc94SAlexei Fedorov 163*1322dc94SAlexei Fedorov /* 164*1322dc94SAlexei Fedorov * Accessor to write the GIC Distributor ISPENDR corresponding to the 165*1322dc94SAlexei Fedorov * interrupt `id`, 32 interrupt IDs at a time. 166*1322dc94SAlexei Fedorov */ 167*1322dc94SAlexei Fedorov void gicd_write_ispendr(uintptr_t base, unsigned int id, unsigned int val) 168*1322dc94SAlexei Fedorov { 169*1322dc94SAlexei Fedorov unsigned int n = id >> ISPENDR_SHIFT; 170*1322dc94SAlexei Fedorov 171*1322dc94SAlexei Fedorov mmio_write_32(base + GICD_ISPENDR + (n << 2), val); 172*1322dc94SAlexei Fedorov } 173*1322dc94SAlexei Fedorov 174*1322dc94SAlexei Fedorov /* 175*1322dc94SAlexei Fedorov * Accessor to write the GIC Distributor ICPENDR corresponding to the 176*1322dc94SAlexei Fedorov * interrupt `id`, 32 interrupt IDs at a time. 177*1322dc94SAlexei Fedorov */ 178*1322dc94SAlexei Fedorov void gicd_write_icpendr(uintptr_t base, unsigned int id, unsigned int val) 179*1322dc94SAlexei Fedorov { 180*1322dc94SAlexei Fedorov unsigned int n = id >> ICPENDR_SHIFT; 181*1322dc94SAlexei Fedorov 182*1322dc94SAlexei Fedorov mmio_write_32(base + GICD_ICPENDR + (n << 2), val); 183*1322dc94SAlexei Fedorov } 184*1322dc94SAlexei Fedorov 185*1322dc94SAlexei Fedorov /* 186*1322dc94SAlexei Fedorov * Accessor to write the GIC Distributor ISACTIVER corresponding to the 187*1322dc94SAlexei Fedorov * interrupt `id`, 32 interrupt IDs at a time. 188*1322dc94SAlexei Fedorov */ 189*1322dc94SAlexei Fedorov void gicd_write_isactiver(uintptr_t base, unsigned int id, unsigned int val) 190*1322dc94SAlexei Fedorov { 191*1322dc94SAlexei Fedorov unsigned int n = id >> ISACTIVER_SHIFT; 192*1322dc94SAlexei Fedorov 193*1322dc94SAlexei Fedorov mmio_write_32(base + GICD_ISACTIVER + (n << 2), val); 194*1322dc94SAlexei Fedorov } 195*1322dc94SAlexei Fedorov 196*1322dc94SAlexei Fedorov /* 197*1322dc94SAlexei Fedorov * Accessor to write the GIC Distributor ICACTIVER corresponding to the 198*1322dc94SAlexei Fedorov * interrupt `id`, 32 interrupt IDs at a time. 199*1322dc94SAlexei Fedorov */ 200*1322dc94SAlexei Fedorov void gicd_write_icactiver(uintptr_t base, unsigned int id, unsigned int val) 201*1322dc94SAlexei Fedorov { 202*1322dc94SAlexei Fedorov unsigned int n = id >> ICACTIVER_SHIFT; 203*1322dc94SAlexei Fedorov 204*1322dc94SAlexei Fedorov mmio_write_32(base + GICD_ICACTIVER + (n << 2), val); 205*1322dc94SAlexei Fedorov } 206*1322dc94SAlexei Fedorov 207*1322dc94SAlexei Fedorov /* 208*1322dc94SAlexei Fedorov * Accessor to write the GIC Distributor IPRIORITYR corresponding to the 209*1322dc94SAlexei Fedorov * interrupt `id`, 4 interrupt IDs at a time. 210*1322dc94SAlexei Fedorov */ 211*1322dc94SAlexei Fedorov void gicd_write_ipriorityr(uintptr_t base, unsigned int id, unsigned int val) 212*1322dc94SAlexei Fedorov { 213*1322dc94SAlexei Fedorov unsigned int n = id >> IPRIORITYR_SHIFT; 214*1322dc94SAlexei Fedorov 215*1322dc94SAlexei Fedorov mmio_write_32(base + GICD_IPRIORITYR + (n << 2), val); 216*1322dc94SAlexei Fedorov } 217*1322dc94SAlexei Fedorov 218*1322dc94SAlexei Fedorov /* 219*1322dc94SAlexei Fedorov * Accessor to write the GIC Distributor ICFGR corresponding to the 220*1322dc94SAlexei Fedorov * interrupt `id`, 16 interrupt IDs at a time. 221*1322dc94SAlexei Fedorov */ 222*1322dc94SAlexei Fedorov void gicd_write_icfgr(uintptr_t base, unsigned int id, unsigned int val) 223*1322dc94SAlexei Fedorov { 224*1322dc94SAlexei Fedorov unsigned int n = id >> ICFGR_SHIFT; 225*1322dc94SAlexei Fedorov 226*1322dc94SAlexei Fedorov mmio_write_32(base + GICD_ICFGR + (n << 2), val); 227*1322dc94SAlexei Fedorov } 228*1322dc94SAlexei Fedorov 229*1322dc94SAlexei Fedorov /* 230*1322dc94SAlexei Fedorov * Accessor to write the GIC Distributor NSACR corresponding to the 231*1322dc94SAlexei Fedorov * interrupt `id`, 16 interrupt IDs at a time. 232*1322dc94SAlexei Fedorov */ 233*1322dc94SAlexei Fedorov void gicd_write_nsacr(uintptr_t base, unsigned int id, unsigned int val) 234*1322dc94SAlexei Fedorov { 235*1322dc94SAlexei Fedorov unsigned int n = id >> NSACR_SHIFT; 236*1322dc94SAlexei Fedorov 237*1322dc94SAlexei Fedorov mmio_write_32(base + GICD_NSACR + (n << 2), val); 238*1322dc94SAlexei Fedorov } 239*1322dc94SAlexei Fedorov 240*1322dc94SAlexei Fedorov /******************************************************************************* 241*1322dc94SAlexei Fedorov * GIC Distributor functions for accessing the GIC registers 242*1322dc94SAlexei Fedorov * corresponding to a single interrupt ID. These functions use bitwise 243*1322dc94SAlexei Fedorov * operations or appropriate register accesses to modify or return 244*1322dc94SAlexei Fedorov * the bit-field corresponding the single interrupt ID. 245*1322dc94SAlexei Fedorov ******************************************************************************/ 246*1322dc94SAlexei Fedorov unsigned int gicd_get_igroupr(uintptr_t base, unsigned int id) 247*1322dc94SAlexei Fedorov { 248*1322dc94SAlexei Fedorov unsigned int bit_num = id & ((1U << IGROUPR_SHIFT) - 1U); 249*1322dc94SAlexei Fedorov unsigned int reg_val = gicd_read_igroupr(base, id); 250*1322dc94SAlexei Fedorov 251*1322dc94SAlexei Fedorov return (reg_val >> bit_num) & 0x1U; 252*1322dc94SAlexei Fedorov } 253*1322dc94SAlexei Fedorov 254*1322dc94SAlexei Fedorov void gicd_set_igroupr(uintptr_t base, unsigned int id) 255*1322dc94SAlexei Fedorov { 256*1322dc94SAlexei Fedorov unsigned int bit_num = id & ((1U << IGROUPR_SHIFT) - 1U); 257*1322dc94SAlexei Fedorov unsigned int reg_val = gicd_read_igroupr(base, id); 258*1322dc94SAlexei Fedorov 259*1322dc94SAlexei Fedorov gicd_write_igroupr(base, id, reg_val | (1U << bit_num)); 260*1322dc94SAlexei Fedorov } 261*1322dc94SAlexei Fedorov 262*1322dc94SAlexei Fedorov void gicd_clr_igroupr(uintptr_t base, unsigned int id) 263*1322dc94SAlexei Fedorov { 264*1322dc94SAlexei Fedorov unsigned int bit_num = id & ((1U << IGROUPR_SHIFT) - 1U); 265*1322dc94SAlexei Fedorov unsigned int reg_val = gicd_read_igroupr(base, id); 266*1322dc94SAlexei Fedorov 267*1322dc94SAlexei Fedorov gicd_write_igroupr(base, id, reg_val & ~(1U << bit_num)); 268*1322dc94SAlexei Fedorov } 269*1322dc94SAlexei Fedorov 270*1322dc94SAlexei Fedorov void gicd_set_isenabler(uintptr_t base, unsigned int id) 271*1322dc94SAlexei Fedorov { 272*1322dc94SAlexei Fedorov unsigned int bit_num = id & ((1U << ISENABLER_SHIFT) - 1U); 273*1322dc94SAlexei Fedorov 274*1322dc94SAlexei Fedorov gicd_write_isenabler(base, id, (1U << bit_num)); 275*1322dc94SAlexei Fedorov } 276*1322dc94SAlexei Fedorov 277*1322dc94SAlexei Fedorov void gicd_set_icenabler(uintptr_t base, unsigned int id) 278*1322dc94SAlexei Fedorov { 279*1322dc94SAlexei Fedorov unsigned int bit_num = id & ((1U << ICENABLER_SHIFT) - 1U); 280*1322dc94SAlexei Fedorov 281*1322dc94SAlexei Fedorov gicd_write_icenabler(base, id, (1U << bit_num)); 282*1322dc94SAlexei Fedorov } 283*1322dc94SAlexei Fedorov 284*1322dc94SAlexei Fedorov void gicd_set_ispendr(uintptr_t base, unsigned int id) 285*1322dc94SAlexei Fedorov { 286*1322dc94SAlexei Fedorov unsigned int bit_num = id & ((1U << ISPENDR_SHIFT) - 1U); 287*1322dc94SAlexei Fedorov 288*1322dc94SAlexei Fedorov gicd_write_ispendr(base, id, (1U << bit_num)); 289*1322dc94SAlexei Fedorov } 290*1322dc94SAlexei Fedorov 291*1322dc94SAlexei Fedorov void gicd_set_icpendr(uintptr_t base, unsigned int id) 292*1322dc94SAlexei Fedorov { 293*1322dc94SAlexei Fedorov unsigned int bit_num = id & ((1U << ICPENDR_SHIFT) - 1U); 294*1322dc94SAlexei Fedorov 295*1322dc94SAlexei Fedorov gicd_write_icpendr(base, id, (1U << bit_num)); 296*1322dc94SAlexei Fedorov } 297*1322dc94SAlexei Fedorov 298*1322dc94SAlexei Fedorov unsigned int gicd_get_isactiver(uintptr_t base, unsigned int id) 299*1322dc94SAlexei Fedorov { 300*1322dc94SAlexei Fedorov unsigned int bit_num = id & ((1U << ISACTIVER_SHIFT) - 1U); 301*1322dc94SAlexei Fedorov unsigned int reg_val = gicd_read_isactiver(base, id); 302*1322dc94SAlexei Fedorov 303*1322dc94SAlexei Fedorov return (reg_val >> bit_num) & 0x1U; 304*1322dc94SAlexei Fedorov } 305*1322dc94SAlexei Fedorov 306*1322dc94SAlexei Fedorov void gicd_set_isactiver(uintptr_t base, unsigned int id) 307*1322dc94SAlexei Fedorov { 308*1322dc94SAlexei Fedorov unsigned int bit_num = id & ((1U << ISACTIVER_SHIFT) - 1U); 309*1322dc94SAlexei Fedorov 310*1322dc94SAlexei Fedorov gicd_write_isactiver(base, id, (1U << bit_num)); 311*1322dc94SAlexei Fedorov } 312*1322dc94SAlexei Fedorov 313*1322dc94SAlexei Fedorov void gicd_set_icactiver(uintptr_t base, unsigned int id) 314*1322dc94SAlexei Fedorov { 315*1322dc94SAlexei Fedorov unsigned int bit_num = id & ((1U << ICACTIVER_SHIFT) - 1U); 316*1322dc94SAlexei Fedorov 317*1322dc94SAlexei Fedorov gicd_write_icactiver(base, id, (1U << bit_num)); 318*1322dc94SAlexei Fedorov } 319*1322dc94SAlexei Fedorov 320*1322dc94SAlexei Fedorov void gicd_set_ipriorityr(uintptr_t base, unsigned int id, unsigned int pri) 321*1322dc94SAlexei Fedorov { 322*1322dc94SAlexei Fedorov uint8_t val = pri & GIC_PRI_MASK; 323*1322dc94SAlexei Fedorov 324*1322dc94SAlexei Fedorov mmio_write_8(base + GICD_IPRIORITYR + id, val); 325*1322dc94SAlexei Fedorov } 326*1322dc94SAlexei Fedorov 327*1322dc94SAlexei Fedorov void gicd_set_icfgr(uintptr_t base, unsigned int id, unsigned int cfg) 328*1322dc94SAlexei Fedorov { 329*1322dc94SAlexei Fedorov /* Interrupt configuration is a 2-bit field */ 330*1322dc94SAlexei Fedorov unsigned int bit_num = id & ((1U << ICFGR_SHIFT) - 1U); 331*1322dc94SAlexei Fedorov unsigned int bit_shift = bit_num << 1; 332*1322dc94SAlexei Fedorov 333*1322dc94SAlexei Fedorov uint32_t reg_val = gicd_read_icfgr(base, id); 334*1322dc94SAlexei Fedorov 335*1322dc94SAlexei Fedorov /* Clear the field, and insert required configuration */ 336*1322dc94SAlexei Fedorov reg_val &= ~(GIC_CFG_MASK << bit_shift); 337*1322dc94SAlexei Fedorov reg_val |= ((cfg & GIC_CFG_MASK) << bit_shift); 338*1322dc94SAlexei Fedorov 339*1322dc94SAlexei Fedorov gicd_write_icfgr(base, id, reg_val); 340*1322dc94SAlexei Fedorov } 341