1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Copyright (C) 2025 ARM Limited, All Rights Reserved. 4 */ 5 #ifndef __LINUX_IRQCHIP_ARM_GIC_V5_H 6 #define __LINUX_IRQCHIP_ARM_GIC_V5_H 7 8 #include <linux/iopoll.h> 9 10 #include <asm/cacheflush.h> 11 #include <asm/smp.h> 12 #include <asm/sysreg.h> 13 14 #define GICV5_IPIS_PER_CPU MAX_IPI 15 16 /* 17 * INTID handling 18 */ 19 #define GICV5_HWIRQ_ID GENMASK(23, 0) 20 #define GICV5_HWIRQ_TYPE GENMASK(31, 29) 21 #define GICV5_HWIRQ_INTID GENMASK_ULL(31, 0) 22 23 #define GICV5_HWIRQ_TYPE_PPI UL(0x1) 24 #define GICV5_HWIRQ_TYPE_LPI UL(0x2) 25 #define GICV5_HWIRQ_TYPE_SPI UL(0x3) 26 27 /* 28 * Architected PPIs 29 */ 30 #define GICV5_ARCH_PPI_S_DB_PPI 0x0 31 #define GICV5_ARCH_PPI_RL_DB_PPI 0x1 32 #define GICV5_ARCH_PPI_NS_DB_PPI 0x2 33 #define GICV5_ARCH_PPI_SW_PPI 0x3 34 #define GICV5_ARCH_PPI_HACDBSIRQ 0xf 35 #define GICV5_ARCH_PPI_CNTHVS 0x13 36 #define GICV5_ARCH_PPI_CNTHPS 0x14 37 #define GICV5_ARCH_PPI_PMBIRQ 0x15 38 #define GICV5_ARCH_PPI_COMMIRQ 0x16 39 #define GICV5_ARCH_PPI_PMUIRQ 0x17 40 #define GICV5_ARCH_PPI_CTIIRQ 0x18 41 #define GICV5_ARCH_PPI_GICMNT 0x19 42 #define GICV5_ARCH_PPI_CNTHP 0x1a 43 #define GICV5_ARCH_PPI_CNTV 0x1b 44 #define GICV5_ARCH_PPI_CNTHV 0x1c 45 #define GICV5_ARCH_PPI_CNTPS 0x1d 46 #define GICV5_ARCH_PPI_CNTP 0x1e 47 #define GICV5_ARCH_PPI_TRBIRQ 0x1f 48 49 /* 50 * Tables attributes 51 */ 52 #define GICV5_NO_READ_ALLOC 0b0 53 #define GICV5_READ_ALLOC 0b1 54 #define GICV5_NO_WRITE_ALLOC 0b0 55 #define GICV5_WRITE_ALLOC 0b1 56 57 #define GICV5_NON_CACHE 0b00 58 #define GICV5_WB_CACHE 0b01 59 #define GICV5_WT_CACHE 0b10 60 61 #define GICV5_NON_SHARE 0b00 62 #define GICV5_OUTER_SHARE 0b10 63 #define GICV5_INNER_SHARE 0b11 64 65 /* 66 * IRS registers and tables structures 67 */ 68 #define GICV5_IRS_IDR0 0x0000 69 #define GICV5_IRS_IDR1 0x0004 70 #define GICV5_IRS_IDR2 0x0008 71 #define GICV5_IRS_IDR5 0x0014 72 #define GICV5_IRS_IDR6 0x0018 73 #define GICV5_IRS_IDR7 0x001c 74 #define GICV5_IRS_CR0 0x0080 75 #define GICV5_IRS_CR1 0x0084 76 #define GICV5_IRS_SYNCR 0x00c0 77 #define GICV5_IRS_SYNC_STATUSR 0x00c4 78 #define GICV5_IRS_SPI_SELR 0x0108 79 #define GICV5_IRS_SPI_CFGR 0x0114 80 #define GICV5_IRS_SPI_STATUSR 0x0118 81 #define GICV5_IRS_PE_SELR 0x0140 82 #define GICV5_IRS_PE_STATUSR 0x0144 83 #define GICV5_IRS_PE_CR0 0x0148 84 #define GICV5_IRS_IST_BASER 0x0180 85 #define GICV5_IRS_IST_CFGR 0x0190 86 #define GICV5_IRS_IST_STATUSR 0x0194 87 #define GICV5_IRS_MAP_L2_ISTR 0x01c0 88 89 #define GICV5_IRS_IDR0_VIRT BIT(6) 90 91 #define GICV5_IRS_IDR1_PRIORITY_BITS GENMASK(22, 20) 92 #define GICV5_IRS_IDR1_IAFFID_BITS GENMASK(19, 16) 93 94 #define GICV5_IRS_IDR1_PRIORITY_BITS_1BITS 0b000 95 #define GICV5_IRS_IDR1_PRIORITY_BITS_2BITS 0b001 96 #define GICV5_IRS_IDR1_PRIORITY_BITS_3BITS 0b010 97 #define GICV5_IRS_IDR1_PRIORITY_BITS_4BITS 0b011 98 #define GICV5_IRS_IDR1_PRIORITY_BITS_5BITS 0b100 99 100 #define GICV5_IRS_IDR2_ISTMD_SZ GENMASK(19, 15) 101 #define GICV5_IRS_IDR2_ISTMD BIT(14) 102 #define GICV5_IRS_IDR2_IST_L2SZ GENMASK(13, 11) 103 #define GICV5_IRS_IDR2_IST_LEVELS BIT(10) 104 #define GICV5_IRS_IDR2_MIN_LPI_ID_BITS GENMASK(9, 6) 105 #define GICV5_IRS_IDR2_LPI BIT(5) 106 #define GICV5_IRS_IDR2_ID_BITS GENMASK(4, 0) 107 108 #define GICV5_IRS_IDR5_SPI_RANGE GENMASK(24, 0) 109 #define GICV5_IRS_IDR6_SPI_IRS_RANGE GENMASK(24, 0) 110 #define GICV5_IRS_IDR7_SPI_BASE GENMASK(23, 0) 111 112 #define GICV5_IRS_IST_L2SZ_SUPPORT_4KB(r) FIELD_GET(BIT(11), (r)) 113 #define GICV5_IRS_IST_L2SZ_SUPPORT_16KB(r) FIELD_GET(BIT(12), (r)) 114 #define GICV5_IRS_IST_L2SZ_SUPPORT_64KB(r) FIELD_GET(BIT(13), (r)) 115 116 #define GICV5_IRS_CR0_IDLE BIT(1) 117 #define GICV5_IRS_CR0_IRSEN BIT(0) 118 119 #define GICV5_IRS_CR1_VPED_WA BIT(15) 120 #define GICV5_IRS_CR1_VPED_RA BIT(14) 121 #define GICV5_IRS_CR1_VMD_WA BIT(13) 122 #define GICV5_IRS_CR1_VMD_RA BIT(12) 123 #define GICV5_IRS_CR1_VPET_WA BIT(11) 124 #define GICV5_IRS_CR1_VPET_RA BIT(10) 125 #define GICV5_IRS_CR1_VMT_WA BIT(9) 126 #define GICV5_IRS_CR1_VMT_RA BIT(8) 127 #define GICV5_IRS_CR1_IST_WA BIT(7) 128 #define GICV5_IRS_CR1_IST_RA BIT(6) 129 #define GICV5_IRS_CR1_IC GENMASK(5, 4) 130 #define GICV5_IRS_CR1_OC GENMASK(3, 2) 131 #define GICV5_IRS_CR1_SH GENMASK(1, 0) 132 133 #define GICV5_IRS_SYNCR_SYNC BIT(31) 134 135 #define GICV5_IRS_SYNC_STATUSR_IDLE BIT(0) 136 137 #define GICV5_IRS_SPI_STATUSR_V BIT(1) 138 #define GICV5_IRS_SPI_STATUSR_IDLE BIT(0) 139 140 #define GICV5_IRS_SPI_SELR_ID GENMASK(23, 0) 141 142 #define GICV5_IRS_SPI_CFGR_TM BIT(0) 143 144 #define GICV5_IRS_PE_SELR_IAFFID GENMASK(15, 0) 145 146 #define GICV5_IRS_PE_STATUSR_V BIT(1) 147 #define GICV5_IRS_PE_STATUSR_IDLE BIT(0) 148 149 #define GICV5_IRS_PE_CR0_DPS BIT(0) 150 151 #define GICV5_IRS_IST_STATUSR_IDLE BIT(0) 152 153 #define GICV5_IRS_IST_CFGR_STRUCTURE BIT(16) 154 #define GICV5_IRS_IST_CFGR_ISTSZ GENMASK(8, 7) 155 #define GICV5_IRS_IST_CFGR_L2SZ GENMASK(6, 5) 156 #define GICV5_IRS_IST_CFGR_LPI_ID_BITS GENMASK(4, 0) 157 158 #define GICV5_IRS_IST_CFGR_STRUCTURE_LINEAR 0b0 159 #define GICV5_IRS_IST_CFGR_STRUCTURE_TWO_LEVEL 0b1 160 161 #define GICV5_IRS_IST_CFGR_ISTSZ_4 0b00 162 #define GICV5_IRS_IST_CFGR_ISTSZ_8 0b01 163 #define GICV5_IRS_IST_CFGR_ISTSZ_16 0b10 164 165 #define GICV5_IRS_IST_CFGR_L2SZ_4K 0b00 166 #define GICV5_IRS_IST_CFGR_L2SZ_16K 0b01 167 #define GICV5_IRS_IST_CFGR_L2SZ_64K 0b10 168 169 #define GICV5_IRS_IST_BASER_ADDR_MASK GENMASK_ULL(55, 6) 170 #define GICV5_IRS_IST_BASER_VALID BIT_ULL(0) 171 172 #define GICV5_IRS_MAP_L2_ISTR_ID GENMASK(23, 0) 173 174 #define GICV5_ISTL1E_VALID BIT_ULL(0) 175 176 #define GICV5_ISTL1E_L2_ADDR_MASK GENMASK_ULL(55, 12) 177 178 /* 179 * ITS registers and tables structures 180 */ 181 #define GICV5_ITS_IDR1 0x0004 182 #define GICV5_ITS_IDR2 0x0008 183 #define GICV5_ITS_CR0 0x0080 184 #define GICV5_ITS_CR1 0x0084 185 #define GICV5_ITS_DT_BASER 0x00c0 186 #define GICV5_ITS_DT_CFGR 0x00d0 187 #define GICV5_ITS_DIDR 0x0100 188 #define GICV5_ITS_EIDR 0x0108 189 #define GICV5_ITS_INV_EVENTR 0x010c 190 #define GICV5_ITS_INV_DEVICER 0x0110 191 #define GICV5_ITS_STATUSR 0x0120 192 #define GICV5_ITS_SYNCR 0x0140 193 #define GICV5_ITS_SYNC_STATUSR 0x0148 194 195 #define GICV5_ITS_IDR1_L2SZ GENMASK(10, 8) 196 #define GICV5_ITS_IDR1_ITT_LEVELS BIT(7) 197 #define GICV5_ITS_IDR1_DT_LEVELS BIT(6) 198 #define GICV5_ITS_IDR1_DEVICEID_BITS GENMASK(5, 0) 199 200 #define GICV5_ITS_IDR1_L2SZ_SUPPORT_4KB(r) FIELD_GET(BIT(8), (r)) 201 #define GICV5_ITS_IDR1_L2SZ_SUPPORT_16KB(r) FIELD_GET(BIT(9), (r)) 202 #define GICV5_ITS_IDR1_L2SZ_SUPPORT_64KB(r) FIELD_GET(BIT(10), (r)) 203 204 #define GICV5_ITS_IDR2_XDMN_EVENTs GENMASK(6, 5) 205 #define GICV5_ITS_IDR2_EVENTID_BITS GENMASK(4, 0) 206 207 #define GICV5_ITS_CR0_IDLE BIT(1) 208 #define GICV5_ITS_CR0_ITSEN BIT(0) 209 210 #define GICV5_ITS_CR1_ITT_RA BIT(7) 211 #define GICV5_ITS_CR1_DT_RA BIT(6) 212 #define GICV5_ITS_CR1_IC GENMASK(5, 4) 213 #define GICV5_ITS_CR1_OC GENMASK(3, 2) 214 #define GICV5_ITS_CR1_SH GENMASK(1, 0) 215 216 #define GICV5_ITS_DT_CFGR_STRUCTURE BIT(16) 217 #define GICV5_ITS_DT_CFGR_L2SZ GENMASK(7, 6) 218 #define GICV5_ITS_DT_CFGR_DEVICEID_BITS GENMASK(5, 0) 219 220 #define GICV5_ITS_DT_BASER_ADDR_MASK GENMASK_ULL(55, 3) 221 222 #define GICV5_ITS_INV_DEVICER_I BIT(31) 223 #define GICV5_ITS_INV_DEVICER_EVENTID_BITS GENMASK(5, 1) 224 #define GICV5_ITS_INV_DEVICER_L1 BIT(0) 225 226 #define GICV5_ITS_DIDR_DEVICEID GENMASK_ULL(31, 0) 227 228 #define GICV5_ITS_EIDR_EVENTID GENMASK(15, 0) 229 230 #define GICV5_ITS_INV_EVENTR_I BIT(31) 231 #define GICV5_ITS_INV_EVENTR_ITT_L2SZ GENMASK(2, 1) 232 #define GICV5_ITS_INV_EVENTR_L1 BIT(0) 233 234 #define GICV5_ITS_STATUSR_IDLE BIT(0) 235 236 #define GICV5_ITS_SYNCR_SYNC BIT_ULL(63) 237 #define GICV5_ITS_SYNCR_SYNCALL BIT_ULL(32) 238 #define GICV5_ITS_SYNCR_DEVICEID GENMASK_ULL(31, 0) 239 240 #define GICV5_ITS_SYNC_STATUSR_IDLE BIT(0) 241 242 #define GICV5_DTL1E_VALID BIT_ULL(0) 243 /* Note that there is no shift for the address by design */ 244 #define GICV5_DTL1E_L2_ADDR_MASK GENMASK_ULL(55, 3) 245 #define GICV5_DTL1E_SPAN GENMASK_ULL(63, 60) 246 247 #define GICV5_DTL2E_VALID BIT_ULL(0) 248 #define GICV5_DTL2E_ITT_L2SZ GENMASK_ULL(2, 1) 249 /* Note that there is no shift for the address by design */ 250 #define GICV5_DTL2E_ITT_ADDR_MASK GENMASK_ULL(55, 3) 251 #define GICV5_DTL2E_ITT_DSWE BIT_ULL(57) 252 #define GICV5_DTL2E_ITT_STRUCTURE BIT_ULL(58) 253 #define GICV5_DTL2E_EVENT_ID_BITS GENMASK_ULL(63, 59) 254 255 #define GICV5_ITTL1E_VALID BIT_ULL(0) 256 /* Note that there is no shift for the address by design */ 257 #define GICV5_ITTL1E_L2_ADDR_MASK GENMASK_ULL(55, 3) 258 #define GICV5_ITTL1E_SPAN GENMASK_ULL(63, 60) 259 260 #define GICV5_ITTL2E_LPI_ID GENMASK_ULL(23, 0) 261 #define GICV5_ITTL2E_DAC GENMASK_ULL(29, 28) 262 #define GICV5_ITTL2E_VIRTUAL BIT_ULL(30) 263 #define GICV5_ITTL2E_VALID BIT_ULL(31) 264 #define GICV5_ITTL2E_VM_ID GENMASK_ULL(47, 32) 265 266 #define GICV5_ITS_DT_ITT_CFGR_L2SZ_4k 0b00 267 #define GICV5_ITS_DT_ITT_CFGR_L2SZ_16k 0b01 268 #define GICV5_ITS_DT_ITT_CFGR_L2SZ_64k 0b10 269 270 #define GICV5_ITS_DT_ITT_CFGR_STRUCTURE_LINEAR 0 271 #define GICV5_ITS_DT_ITT_CFGR_STRUCTURE_TWO_LEVEL 1 272 273 #define GICV5_ITS_HWIRQ_DEVICE_ID GENMASK_ULL(31, 0) 274 #define GICV5_ITS_HWIRQ_EVENT_ID GENMASK_ULL(63, 32) 275 276 /* 277 * IWB registers 278 */ 279 #define GICV5_IWB_IDR0 0x0000 280 #define GICV5_IWB_CR0 0x0080 281 #define GICV5_IWB_WENABLE_STATUSR 0x00c0 282 #define GICV5_IWB_WENABLER 0x2000 283 #define GICV5_IWB_WTMR 0x4000 284 285 #define GICV5_IWB_IDR0_INT_DOMS GENMASK(14, 11) 286 #define GICV5_IWB_IDR0_IW_RANGE GENMASK(10, 0) 287 288 #define GICV5_IWB_CR0_IDLE BIT(1) 289 #define GICV5_IWB_CR0_IWBEN BIT(0) 290 291 #define GICV5_IWB_WENABLE_STATUSR_IDLE BIT(0) 292 293 #define GICV5_GSI_IC_TYPE GENMASK(31, 29) 294 #define GICV5_GSI_IWB_TYPE 0x7 295 296 #define GICV5_GSI_IWB_FRAME_ID GENMASK(28, 16) 297 #define GICV5_GSI_IWB_WIRE GENMASK(15, 0) 298 299 /* 300 * Global Data structures and functions 301 */ 302 struct gicv5_chip_data { 303 struct fwnode_handle *fwnode; 304 struct irq_domain *ppi_domain; 305 struct irq_domain *spi_domain; 306 struct irq_domain *lpi_domain; 307 struct irq_domain *ipi_domain; 308 u32 global_spi_count; 309 u8 cpuif_pri_bits; 310 u8 cpuif_id_bits; 311 u8 irs_pri_bits; 312 bool virt_capable; 313 struct { 314 __le64 *l1ist_addr; 315 u32 l2_size; 316 u8 l2_bits; 317 bool l2; 318 } ist; 319 }; 320 321 extern struct gicv5_chip_data gicv5_global_data __read_mostly; 322 323 struct gicv5_irs_chip_data { 324 struct list_head entry; 325 struct fwnode_handle *fwnode; 326 void __iomem *irs_base; 327 u32 flags; 328 u32 spi_min; 329 u32 spi_range; 330 raw_spinlock_t spi_config_lock; 331 }; 332 333 static inline int gicv5_wait_for_op_s_atomic(void __iomem *addr, u32 offset, 334 const char *reg_s, u32 mask, 335 u32 *val) 336 { 337 void __iomem *reg = addr + offset; 338 u32 tmp; 339 int ret; 340 341 ret = readl_poll_timeout_atomic(reg, tmp, tmp & mask, 1, 10 * USEC_PER_MSEC); 342 if (unlikely(ret == -ETIMEDOUT)) { 343 pr_err_ratelimited("%s timeout...\n", reg_s); 344 return ret; 345 } 346 347 if (val) 348 *val = tmp; 349 350 return 0; 351 } 352 353 static inline int gicv5_wait_for_op_s(void __iomem *addr, u32 offset, 354 const char *reg_s, u32 mask) 355 { 356 void __iomem *reg = addr + offset; 357 u32 val; 358 int ret; 359 360 ret = readl_poll_timeout(reg, val, val & mask, 1, 10 * USEC_PER_MSEC); 361 if (unlikely(ret == -ETIMEDOUT)) { 362 pr_err_ratelimited("%s timeout...\n", reg_s); 363 return ret; 364 } 365 366 return 0; 367 } 368 369 #define gicv5_wait_for_op_atomic(base, reg, mask, val) \ 370 gicv5_wait_for_op_s_atomic(base, reg, #reg, mask, val) 371 372 #define gicv5_wait_for_op(base, reg, mask) \ 373 gicv5_wait_for_op_s(base, reg, #reg, mask) 374 375 void __init gicv5_init_lpi_domain(void); 376 void __init gicv5_free_lpi_domain(void); 377 378 int gicv5_irs_of_probe(struct device_node *parent); 379 int gicv5_irs_acpi_probe(void); 380 void gicv5_irs_remove(void); 381 int gicv5_irs_enable(void); 382 void gicv5_irs_its_probe(void); 383 int gicv5_irs_register_cpu(int cpuid); 384 int gicv5_irs_cpu_to_iaffid(int cpu_id, u16 *iaffid); 385 struct gicv5_irs_chip_data *gicv5_irs_lookup_by_spi_id(u32 spi_id); 386 int gicv5_spi_irq_set_type(struct irq_data *d, unsigned int type); 387 int gicv5_irs_iste_alloc(u32 lpi); 388 void gicv5_irs_syncr(void); 389 390 /* Embedded in kvm.arch */ 391 struct gicv5_vpe { 392 bool resident; 393 }; 394 395 struct gicv5_its_devtab_cfg { 396 union { 397 struct { 398 __le64 *devtab; 399 } linear; 400 struct { 401 __le64 *l1devtab; 402 __le64 **l2ptrs; 403 } l2; 404 }; 405 u32 cfgr; 406 }; 407 408 struct gicv5_its_itt_cfg { 409 union { 410 struct { 411 __le64 *itt; 412 unsigned int num_ents; 413 } linear; 414 struct { 415 __le64 *l1itt; 416 __le64 **l2ptrs; 417 unsigned int num_l1_ents; 418 u8 l2sz; 419 } l2; 420 }; 421 u8 event_id_bits; 422 bool l2itt; 423 }; 424 425 void gicv5_init_lpis(u32 max); 426 void gicv5_deinit_lpis(void); 427 428 void __init gicv5_its_of_probe(struct device_node *parent); 429 void __init gicv5_its_acpi_probe(void); 430 #endif 431