1df373737SAchin Gupta /* 2*1322dc94SAlexei Fedorov * Copyright (c) 2015-2020, ARM Limited and Contributors. All rights reserved. 3df373737SAchin Gupta * 482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause 5df373737SAchin Gupta */ 6df373737SAchin Gupta 7*1322dc94SAlexei Fedorov #pragma message __FILE__ " is deprecated, use gicv2.mk instead" 8*1322dc94SAlexei Fedorov 9df373737SAchin Gupta #include <assert.h> 1009d40e0eSAntonio Nino Diaz 1109d40e0eSAntonio Nino Diaz #include <drivers/arm/gic_common.h> 1209d40e0eSAntonio Nino Diaz #include <lib/mmio.h> 1309d40e0eSAntonio Nino Diaz 14e9ec3cecSSoby Mathew #include "gic_common_private.h" 15df373737SAchin Gupta 16df373737SAchin Gupta /******************************************************************************* 17df373737SAchin Gupta * GIC Distributor interface accessors for reading entire registers 18df373737SAchin Gupta ******************************************************************************/ 19df373737SAchin Gupta /* 20df373737SAchin Gupta * Accessor to read the GIC Distributor IGROUPR corresponding to the interrupt 21df373737SAchin Gupta * `id`, 32 interrupt ids at a time. 22df373737SAchin Gupta */ 23df373737SAchin Gupta unsigned int gicd_read_igroupr(uintptr_t base, unsigned int id) 24df373737SAchin Gupta { 253fea9c8bSAntonio Nino Diaz unsigned int n = id >> IGROUPR_SHIFT; 263fea9c8bSAntonio Nino Diaz 27df373737SAchin Gupta return mmio_read_32(base + GICD_IGROUPR + (n << 2)); 28df373737SAchin Gupta } 29df373737SAchin Gupta 30df373737SAchin Gupta /* 31df373737SAchin Gupta * Accessor to read the GIC Distributor ISENABLER corresponding to the 32df373737SAchin Gupta * interrupt `id`, 32 interrupt ids at a time. 33df373737SAchin Gupta */ 34df373737SAchin Gupta unsigned int gicd_read_isenabler(uintptr_t base, unsigned int id) 35df373737SAchin Gupta { 363fea9c8bSAntonio Nino Diaz unsigned int n = id >> ISENABLER_SHIFT; 373fea9c8bSAntonio Nino Diaz 38df373737SAchin Gupta return mmio_read_32(base + GICD_ISENABLER + (n << 2)); 39df373737SAchin Gupta } 40df373737SAchin Gupta 41df373737SAchin Gupta /* 42df373737SAchin Gupta * Accessor to read the GIC Distributor ICENABLER corresponding to the 43df373737SAchin Gupta * interrupt `id`, 32 interrupt IDs at a time. 44df373737SAchin Gupta */ 45df373737SAchin Gupta unsigned int gicd_read_icenabler(uintptr_t base, unsigned int id) 46df373737SAchin Gupta { 473fea9c8bSAntonio Nino Diaz unsigned int n = id >> ICENABLER_SHIFT; 483fea9c8bSAntonio Nino Diaz 49df373737SAchin Gupta return mmio_read_32(base + GICD_ICENABLER + (n << 2)); 50df373737SAchin Gupta } 51df373737SAchin Gupta 52df373737SAchin Gupta /* 53df373737SAchin Gupta * Accessor to read the GIC Distributor ISPENDR corresponding to the 54df373737SAchin Gupta * interrupt `id`, 32 interrupt IDs at a time. 55df373737SAchin Gupta */ 56df373737SAchin Gupta unsigned int gicd_read_ispendr(uintptr_t base, unsigned int id) 57df373737SAchin Gupta { 583fea9c8bSAntonio Nino Diaz unsigned int n = id >> ISPENDR_SHIFT; 593fea9c8bSAntonio Nino Diaz 60df373737SAchin Gupta return mmio_read_32(base + GICD_ISPENDR + (n << 2)); 61df373737SAchin Gupta } 62df373737SAchin Gupta 63df373737SAchin Gupta /* 64df373737SAchin Gupta * Accessor to read the GIC Distributor ICPENDR corresponding to the 65df373737SAchin Gupta * interrupt `id`, 32 interrupt IDs at a time. 66df373737SAchin Gupta */ 67df373737SAchin Gupta unsigned int gicd_read_icpendr(uintptr_t base, unsigned int id) 68df373737SAchin Gupta { 693fea9c8bSAntonio Nino Diaz unsigned int n = id >> ICPENDR_SHIFT; 703fea9c8bSAntonio Nino Diaz 71df373737SAchin Gupta return mmio_read_32(base + GICD_ICPENDR + (n << 2)); 72df373737SAchin Gupta } 73df373737SAchin Gupta 74df373737SAchin Gupta /* 75df373737SAchin Gupta * Accessor to read the GIC Distributor ISACTIVER corresponding to the 76df373737SAchin Gupta * interrupt `id`, 32 interrupt IDs at a time. 77df373737SAchin Gupta */ 78df373737SAchin Gupta unsigned int gicd_read_isactiver(uintptr_t base, unsigned int id) 79df373737SAchin Gupta { 803fea9c8bSAntonio Nino Diaz unsigned int n = id >> ISACTIVER_SHIFT; 813fea9c8bSAntonio Nino Diaz 82df373737SAchin Gupta return mmio_read_32(base + GICD_ISACTIVER + (n << 2)); 83df373737SAchin Gupta } 84df373737SAchin Gupta 85df373737SAchin Gupta /* 86df373737SAchin Gupta * Accessor to read the GIC Distributor ICACTIVER corresponding to the 87df373737SAchin Gupta * interrupt `id`, 32 interrupt IDs at a time. 88df373737SAchin Gupta */ 89df373737SAchin Gupta unsigned int gicd_read_icactiver(uintptr_t base, unsigned int id) 90df373737SAchin Gupta { 913fea9c8bSAntonio Nino Diaz unsigned int n = id >> ICACTIVER_SHIFT; 923fea9c8bSAntonio Nino Diaz 93df373737SAchin Gupta return mmio_read_32(base + GICD_ICACTIVER + (n << 2)); 94df373737SAchin Gupta } 95df373737SAchin Gupta 96df373737SAchin Gupta /* 97df373737SAchin Gupta * Accessor to read the GIC Distributor IPRIORITYR corresponding to the 98df373737SAchin Gupta * interrupt `id`, 4 interrupt IDs at a time. 99df373737SAchin Gupta */ 100df373737SAchin Gupta unsigned int gicd_read_ipriorityr(uintptr_t base, unsigned int id) 101df373737SAchin Gupta { 1023fea9c8bSAntonio Nino Diaz unsigned int n = id >> IPRIORITYR_SHIFT; 1033fea9c8bSAntonio Nino Diaz 104df373737SAchin Gupta return mmio_read_32(base + GICD_IPRIORITYR + (n << 2)); 105df373737SAchin Gupta } 106df373737SAchin Gupta 107df373737SAchin Gupta /* 108df373737SAchin Gupta * Accessor to read the GIC Distributor ICGFR corresponding to the 109df373737SAchin Gupta * interrupt `id`, 16 interrupt IDs at a time. 110df373737SAchin Gupta */ 111df373737SAchin Gupta unsigned int gicd_read_icfgr(uintptr_t base, unsigned int id) 112df373737SAchin Gupta { 1133fea9c8bSAntonio Nino Diaz unsigned int n = id >> ICFGR_SHIFT; 1143fea9c8bSAntonio Nino Diaz 115df373737SAchin Gupta return mmio_read_32(base + GICD_ICFGR + (n << 2)); 116df373737SAchin Gupta } 117df373737SAchin Gupta 118df373737SAchin Gupta /* 119df373737SAchin Gupta * Accessor to read the GIC Distributor NSACR corresponding to the 120df373737SAchin Gupta * interrupt `id`, 16 interrupt IDs at a time. 121df373737SAchin Gupta */ 122df373737SAchin Gupta unsigned int gicd_read_nsacr(uintptr_t base, unsigned int id) 123df373737SAchin Gupta { 1243fea9c8bSAntonio Nino Diaz unsigned int n = id >> NSACR_SHIFT; 1253fea9c8bSAntonio Nino Diaz 126df373737SAchin Gupta return mmio_read_32(base + GICD_NSACR + (n << 2)); 127df373737SAchin Gupta } 128df373737SAchin Gupta 129df373737SAchin Gupta /******************************************************************************* 130df373737SAchin Gupta * GIC Distributor interface accessors for writing entire registers 131df373737SAchin Gupta ******************************************************************************/ 132df373737SAchin Gupta /* 133df373737SAchin Gupta * Accessor to write the GIC Distributor IGROUPR corresponding to the 134df373737SAchin Gupta * interrupt `id`, 32 interrupt IDs at a time. 135df373737SAchin Gupta */ 136df373737SAchin Gupta void gicd_write_igroupr(uintptr_t base, unsigned int id, unsigned int val) 137df373737SAchin Gupta { 1383fea9c8bSAntonio Nino Diaz unsigned int n = id >> IGROUPR_SHIFT; 1393fea9c8bSAntonio Nino Diaz 140df373737SAchin Gupta mmio_write_32(base + GICD_IGROUPR + (n << 2), val); 141df373737SAchin Gupta } 142df373737SAchin Gupta 143df373737SAchin Gupta /* 144df373737SAchin Gupta * Accessor to write the GIC Distributor ISENABLER corresponding to the 145df373737SAchin Gupta * interrupt `id`, 32 interrupt IDs at a time. 146df373737SAchin Gupta */ 147df373737SAchin Gupta void gicd_write_isenabler(uintptr_t base, unsigned int id, unsigned int val) 148df373737SAchin Gupta { 1493fea9c8bSAntonio Nino Diaz unsigned int n = id >> ISENABLER_SHIFT; 1503fea9c8bSAntonio Nino Diaz 151df373737SAchin Gupta mmio_write_32(base + GICD_ISENABLER + (n << 2), val); 152df373737SAchin Gupta } 153df373737SAchin Gupta 154df373737SAchin Gupta /* 155df373737SAchin Gupta * Accessor to write the GIC Distributor ICENABLER corresponding to the 156df373737SAchin Gupta * interrupt `id`, 32 interrupt IDs at a time. 157df373737SAchin Gupta */ 158df373737SAchin Gupta void gicd_write_icenabler(uintptr_t base, unsigned int id, unsigned int val) 159df373737SAchin Gupta { 1603fea9c8bSAntonio Nino Diaz unsigned int n = id >> ICENABLER_SHIFT; 1613fea9c8bSAntonio Nino Diaz 162df373737SAchin Gupta mmio_write_32(base + GICD_ICENABLER + (n << 2), val); 163df373737SAchin Gupta } 164df373737SAchin Gupta 165df373737SAchin Gupta /* 166df373737SAchin Gupta * Accessor to write the GIC Distributor ISPENDR corresponding to the 167df373737SAchin Gupta * interrupt `id`, 32 interrupt IDs at a time. 168df373737SAchin Gupta */ 169df373737SAchin Gupta void gicd_write_ispendr(uintptr_t base, unsigned int id, unsigned int val) 170df373737SAchin Gupta { 1713fea9c8bSAntonio Nino Diaz unsigned int n = id >> ISPENDR_SHIFT; 1723fea9c8bSAntonio Nino Diaz 173df373737SAchin Gupta mmio_write_32(base + GICD_ISPENDR + (n << 2), val); 174df373737SAchin Gupta } 175df373737SAchin Gupta 176df373737SAchin Gupta /* 177df373737SAchin Gupta * Accessor to write the GIC Distributor ICPENDR corresponding to the 178df373737SAchin Gupta * interrupt `id`, 32 interrupt IDs at a time. 179df373737SAchin Gupta */ 180df373737SAchin Gupta void gicd_write_icpendr(uintptr_t base, unsigned int id, unsigned int val) 181df373737SAchin Gupta { 1823fea9c8bSAntonio Nino Diaz unsigned int n = id >> ICPENDR_SHIFT; 1833fea9c8bSAntonio Nino Diaz 184df373737SAchin Gupta mmio_write_32(base + GICD_ICPENDR + (n << 2), val); 185df373737SAchin Gupta } 186df373737SAchin Gupta 187df373737SAchin Gupta /* 188df373737SAchin Gupta * Accessor to write the GIC Distributor ISACTIVER corresponding to the 189df373737SAchin Gupta * interrupt `id`, 32 interrupt IDs at a time. 190df373737SAchin Gupta */ 191df373737SAchin Gupta void gicd_write_isactiver(uintptr_t base, unsigned int id, unsigned int val) 192df373737SAchin Gupta { 1933fea9c8bSAntonio Nino Diaz unsigned int n = id >> ISACTIVER_SHIFT; 1943fea9c8bSAntonio Nino Diaz 195df373737SAchin Gupta mmio_write_32(base + GICD_ISACTIVER + (n << 2), val); 196df373737SAchin Gupta } 197df373737SAchin Gupta 198df373737SAchin Gupta /* 199df373737SAchin Gupta * Accessor to write the GIC Distributor ICACTIVER corresponding to the 200df373737SAchin Gupta * interrupt `id`, 32 interrupt IDs at a time. 201df373737SAchin Gupta */ 202df373737SAchin Gupta void gicd_write_icactiver(uintptr_t base, unsigned int id, unsigned int val) 203df373737SAchin Gupta { 2043fea9c8bSAntonio Nino Diaz unsigned int n = id >> ICACTIVER_SHIFT; 2053fea9c8bSAntonio Nino Diaz 206df373737SAchin Gupta mmio_write_32(base + GICD_ICACTIVER + (n << 2), val); 207df373737SAchin Gupta } 208df373737SAchin Gupta 209df373737SAchin Gupta /* 210df373737SAchin Gupta * Accessor to write the GIC Distributor IPRIORITYR corresponding to the 211df373737SAchin Gupta * interrupt `id`, 4 interrupt IDs at a time. 212df373737SAchin Gupta */ 213df373737SAchin Gupta void gicd_write_ipriorityr(uintptr_t base, unsigned int id, unsigned int val) 214df373737SAchin Gupta { 2153fea9c8bSAntonio Nino Diaz unsigned int n = id >> IPRIORITYR_SHIFT; 2163fea9c8bSAntonio Nino Diaz 217df373737SAchin Gupta mmio_write_32(base + GICD_IPRIORITYR + (n << 2), val); 218df373737SAchin Gupta } 219df373737SAchin Gupta 220df373737SAchin Gupta /* 221df373737SAchin Gupta * Accessor to write the GIC Distributor ICFGR corresponding to the 222df373737SAchin Gupta * interrupt `id`, 16 interrupt IDs at a time. 223df373737SAchin Gupta */ 224df373737SAchin Gupta void gicd_write_icfgr(uintptr_t base, unsigned int id, unsigned int val) 225df373737SAchin Gupta { 2263fea9c8bSAntonio Nino Diaz unsigned int n = id >> ICFGR_SHIFT; 2273fea9c8bSAntonio Nino Diaz 228df373737SAchin Gupta mmio_write_32(base + GICD_ICFGR + (n << 2), val); 229df373737SAchin Gupta } 230df373737SAchin Gupta 231df373737SAchin Gupta /* 232df373737SAchin Gupta * Accessor to write the GIC Distributor NSACR corresponding to the 233df373737SAchin Gupta * interrupt `id`, 16 interrupt IDs at a time. 234df373737SAchin Gupta */ 235df373737SAchin Gupta void gicd_write_nsacr(uintptr_t base, unsigned int id, unsigned int val) 236df373737SAchin Gupta { 2373fea9c8bSAntonio Nino Diaz unsigned int n = id >> NSACR_SHIFT; 2383fea9c8bSAntonio Nino Diaz 239df373737SAchin Gupta mmio_write_32(base + GICD_NSACR + (n << 2), val); 240df373737SAchin Gupta } 241df373737SAchin Gupta 242df373737SAchin Gupta /******************************************************************************* 243e9ec3cecSSoby Mathew * GIC Distributor functions for accessing the GIC registers 244e9ec3cecSSoby Mathew * corresponding to a single interrupt ID. These functions use bitwise 245e9ec3cecSSoby Mathew * operations or appropriate register accesses to modify or return 246e9ec3cecSSoby Mathew * the bit-field corresponding the single interrupt ID. 247df373737SAchin Gupta ******************************************************************************/ 248df373737SAchin Gupta unsigned int gicd_get_igroupr(uintptr_t base, unsigned int id) 249df373737SAchin Gupta { 2503fea9c8bSAntonio Nino Diaz unsigned int bit_num = id & ((1U << IGROUPR_SHIFT) - 1U); 251df373737SAchin Gupta unsigned int reg_val = gicd_read_igroupr(base, id); 252df373737SAchin Gupta 2533fea9c8bSAntonio Nino Diaz return (reg_val >> bit_num) & 0x1U; 254df373737SAchin Gupta } 255df373737SAchin Gupta 256df373737SAchin Gupta void gicd_set_igroupr(uintptr_t base, unsigned int id) 257df373737SAchin Gupta { 2583fea9c8bSAntonio Nino Diaz unsigned int bit_num = id & ((1U << IGROUPR_SHIFT) - 1U); 259df373737SAchin Gupta unsigned int reg_val = gicd_read_igroupr(base, id); 260df373737SAchin Gupta 2613fea9c8bSAntonio Nino Diaz gicd_write_igroupr(base, id, reg_val | (1U << bit_num)); 262df373737SAchin Gupta } 263df373737SAchin Gupta 264df373737SAchin Gupta void gicd_clr_igroupr(uintptr_t base, unsigned int id) 265df373737SAchin Gupta { 2663fea9c8bSAntonio Nino Diaz unsigned int bit_num = id & ((1U << IGROUPR_SHIFT) - 1U); 267df373737SAchin Gupta unsigned int reg_val = gicd_read_igroupr(base, id); 268df373737SAchin Gupta 2693fea9c8bSAntonio Nino Diaz gicd_write_igroupr(base, id, reg_val & ~(1U << bit_num)); 270df373737SAchin Gupta } 271df373737SAchin Gupta 272df373737SAchin Gupta void gicd_set_isenabler(uintptr_t base, unsigned int id) 273df373737SAchin Gupta { 2743fea9c8bSAntonio Nino Diaz unsigned int bit_num = id & ((1U << ISENABLER_SHIFT) - 1U); 275df373737SAchin Gupta 2763fea9c8bSAntonio Nino Diaz gicd_write_isenabler(base, id, (1U << bit_num)); 277df373737SAchin Gupta } 278df373737SAchin Gupta 279df373737SAchin Gupta void gicd_set_icenabler(uintptr_t base, unsigned int id) 280df373737SAchin Gupta { 2813fea9c8bSAntonio Nino Diaz unsigned int bit_num = id & ((1U << ICENABLER_SHIFT) - 1U); 282df373737SAchin Gupta 2833fea9c8bSAntonio Nino Diaz gicd_write_icenabler(base, id, (1U << bit_num)); 284df373737SAchin Gupta } 285df373737SAchin Gupta 286df373737SAchin Gupta void gicd_set_ispendr(uintptr_t base, unsigned int id) 287df373737SAchin Gupta { 2883fea9c8bSAntonio Nino Diaz unsigned int bit_num = id & ((1U << ISPENDR_SHIFT) - 1U); 289df373737SAchin Gupta 2903fea9c8bSAntonio Nino Diaz gicd_write_ispendr(base, id, (1U << bit_num)); 291df373737SAchin Gupta } 292df373737SAchin Gupta 293df373737SAchin Gupta void gicd_set_icpendr(uintptr_t base, unsigned int id) 294df373737SAchin Gupta { 2953fea9c8bSAntonio Nino Diaz unsigned int bit_num = id & ((1U << ICPENDR_SHIFT) - 1U); 296df373737SAchin Gupta 2973fea9c8bSAntonio Nino Diaz gicd_write_icpendr(base, id, (1U << bit_num)); 298df373737SAchin Gupta } 299df373737SAchin Gupta 300cbd3f370SJeenu Viswambharan unsigned int gicd_get_isactiver(uintptr_t base, unsigned int id) 301cbd3f370SJeenu Viswambharan { 3023fea9c8bSAntonio Nino Diaz unsigned int bit_num = id & ((1U << ISACTIVER_SHIFT) - 1U); 303cbd3f370SJeenu Viswambharan unsigned int reg_val = gicd_read_isactiver(base, id); 304cbd3f370SJeenu Viswambharan 3053fea9c8bSAntonio Nino Diaz return (reg_val >> bit_num) & 0x1U; 306cbd3f370SJeenu Viswambharan } 307cbd3f370SJeenu Viswambharan 308df373737SAchin Gupta void gicd_set_isactiver(uintptr_t base, unsigned int id) 309df373737SAchin Gupta { 3103fea9c8bSAntonio Nino Diaz unsigned int bit_num = id & ((1U << ISACTIVER_SHIFT) - 1U); 311df373737SAchin Gupta 3123fea9c8bSAntonio Nino Diaz gicd_write_isactiver(base, id, (1U << bit_num)); 313df373737SAchin Gupta } 314df373737SAchin Gupta 315df373737SAchin Gupta void gicd_set_icactiver(uintptr_t base, unsigned int id) 316df373737SAchin Gupta { 3173fea9c8bSAntonio Nino Diaz unsigned int bit_num = id & ((1U << ICACTIVER_SHIFT) - 1U); 318df373737SAchin Gupta 3193fea9c8bSAntonio Nino Diaz gicd_write_icactiver(base, id, (1U << bit_num)); 320df373737SAchin Gupta } 32138a78614SSoby Mathew 32238a78614SSoby Mathew void gicd_set_ipriorityr(uintptr_t base, unsigned int id, unsigned int pri) 32338a78614SSoby Mathew { 3243fea9c8bSAntonio Nino Diaz uint8_t val = pri & GIC_PRI_MASK; 3253fea9c8bSAntonio Nino Diaz 3263fea9c8bSAntonio Nino Diaz mmio_write_8(base + GICD_IPRIORITYR + id, val); 32738a78614SSoby Mathew } 32822966106SJeenu Viswambharan 32922966106SJeenu Viswambharan void gicd_set_icfgr(uintptr_t base, unsigned int id, unsigned int cfg) 33022966106SJeenu Viswambharan { 33117e84eedSJeenu Viswambharan /* Interrupt configuration is a 2-bit field */ 3323fea9c8bSAntonio Nino Diaz unsigned int bit_num = id & ((1U << ICFGR_SHIFT) - 1U); 33317e84eedSJeenu Viswambharan unsigned int bit_shift = bit_num << 1; 33417e84eedSJeenu Viswambharan 33522966106SJeenu Viswambharan uint32_t reg_val = gicd_read_icfgr(base, id); 33622966106SJeenu Viswambharan 33722966106SJeenu Viswambharan /* Clear the field, and insert required configuration */ 33817e84eedSJeenu Viswambharan reg_val &= ~(GIC_CFG_MASK << bit_shift); 33917e84eedSJeenu Viswambharan reg_val |= ((cfg & GIC_CFG_MASK) << bit_shift); 34022966106SJeenu Viswambharan 34122966106SJeenu Viswambharan gicd_write_icfgr(base, id, reg_val); 34222966106SJeenu Viswambharan } 343