| .. | .. |
|---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0-only */ |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Copyright (C) 2013, 2014 ARM Limited, All Rights Reserved. |
|---|
| 3 | 4 | * Author: Marc Zyngier <marc.zyngier@arm.com> |
|---|
| 4 | | - * |
|---|
| 5 | | - * |
|---|
| 6 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 7 | | - * it under the terms of the GNU General Public License version 2 as |
|---|
| 8 | | - * published by the Free Software Foundation. |
|---|
| 9 | | - * |
|---|
| 10 | | - * This program is distributed in the hope that it will be useful, |
|---|
| 11 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 12 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|---|
| 13 | | - * GNU General Public License for more details. |
|---|
| 14 | | - * |
|---|
| 15 | | - * You should have received a copy of the GNU General Public License |
|---|
| 16 | | - * along with this program. If not, see <http://www.gnu.org/licenses/>. |
|---|
| 17 | 5 | */ |
|---|
| 18 | 6 | #ifndef __LINUX_IRQCHIP_ARM_GIC_V3_H |
|---|
| 19 | 7 | #define __LINUX_IRQCHIP_ARM_GIC_V3_H |
|---|
| .. | .. |
|---|
| 25 | 13 | #define GICD_CTLR 0x0000 |
|---|
| 26 | 14 | #define GICD_TYPER 0x0004 |
|---|
| 27 | 15 | #define GICD_IIDR 0x0008 |
|---|
| 16 | +#define GICD_TYPER2 0x000C |
|---|
| 28 | 17 | #define GICD_STATUSR 0x0010 |
|---|
| 29 | 18 | #define GICD_SETSPI_NSR 0x0040 |
|---|
| 30 | 19 | #define GICD_CLRSPI_NSR 0x0048 |
|---|
| 31 | 20 | #define GICD_SETSPI_SR 0x0050 |
|---|
| 32 | 21 | #define GICD_CLRSPI_SR 0x0058 |
|---|
| 33 | | -#define GICD_SEIR 0x0068 |
|---|
| 34 | 22 | #define GICD_IGROUPR 0x0080 |
|---|
| 35 | 23 | #define GICD_ISENABLER 0x0100 |
|---|
| 36 | 24 | #define GICD_ICENABLER 0x0180 |
|---|
| .. | .. |
|---|
| 42 | 30 | #define GICD_ICFGR 0x0C00 |
|---|
| 43 | 31 | #define GICD_IGRPMODR 0x0D00 |
|---|
| 44 | 32 | #define GICD_NSACR 0x0E00 |
|---|
| 33 | +#define GICD_IGROUPRnE 0x1000 |
|---|
| 34 | +#define GICD_ISENABLERnE 0x1200 |
|---|
| 35 | +#define GICD_ICENABLERnE 0x1400 |
|---|
| 36 | +#define GICD_ISPENDRnE 0x1600 |
|---|
| 37 | +#define GICD_ICPENDRnE 0x1800 |
|---|
| 38 | +#define GICD_ISACTIVERnE 0x1A00 |
|---|
| 39 | +#define GICD_ICACTIVERnE 0x1C00 |
|---|
| 40 | +#define GICD_IPRIORITYRnE 0x2000 |
|---|
| 41 | +#define GICD_ICFGRnE 0x3000 |
|---|
| 45 | 42 | #define GICD_IROUTER 0x6000 |
|---|
| 43 | +#define GICD_IROUTERnE 0x8000 |
|---|
| 46 | 44 | #define GICD_IDREGS 0xFFD0 |
|---|
| 47 | 45 | #define GICD_PIDR2 0xFFE8 |
|---|
| 46 | + |
|---|
| 47 | +#define ESPI_BASE_INTID 4096 |
|---|
| 48 | 48 | |
|---|
| 49 | 49 | /* |
|---|
| 50 | 50 | * Those registers are actually from GICv2, but the spec demands that they |
|---|
| .. | .. |
|---|
| 56 | 56 | #define GICD_SPENDSGIR 0x0F20 |
|---|
| 57 | 57 | |
|---|
| 58 | 58 | #define GICD_CTLR_RWP (1U << 31) |
|---|
| 59 | +#define GICD_CTLR_nASSGIreq (1U << 8) |
|---|
| 59 | 60 | #define GICD_CTLR_DS (1U << 6) |
|---|
| 60 | 61 | #define GICD_CTLR_ARE_NS (1U << 4) |
|---|
| 61 | 62 | #define GICD_CTLR_ENABLE_G1A (1U << 1) |
|---|
| .. | .. |
|---|
| 81 | 82 | #define GICD_TYPER_RSS (1U << 26) |
|---|
| 82 | 83 | #define GICD_TYPER_LPIS (1U << 17) |
|---|
| 83 | 84 | #define GICD_TYPER_MBIS (1U << 16) |
|---|
| 85 | +#define GICD_TYPER_ESPI (1U << 8) |
|---|
| 84 | 86 | |
|---|
| 85 | 87 | #define GICD_TYPER_ID_BITS(typer) ((((typer) >> 19) & 0x1f) + 1) |
|---|
| 86 | 88 | #define GICD_TYPER_NUM_LPIS(typer) ((((typer) >> 11) & 0x1f) + 1) |
|---|
| 87 | | -#define GICD_TYPER_IRQS(typer) ((((typer) & 0x1f) + 1) * 32) |
|---|
| 89 | +#define GICD_TYPER_SPIS(typer) ((((typer) & 0x1f) + 1) * 32) |
|---|
| 90 | +#define GICD_TYPER_ESPIS(typer) \ |
|---|
| 91 | + (((typer) & GICD_TYPER_ESPI) ? GICD_TYPER_SPIS((typer) >> 27) : 0) |
|---|
| 92 | + |
|---|
| 93 | +#define GICD_TYPER2_nASSGIcap (1U << 8) |
|---|
| 94 | +#define GICD_TYPER2_VIL (1U << 7) |
|---|
| 95 | +#define GICD_TYPER2_VID GENMASK(4, 0) |
|---|
| 88 | 96 | |
|---|
| 89 | 97 | #define GICD_IROUTER_SPI_MODE_ONE (0U << 31) |
|---|
| 90 | 98 | #define GICD_IROUTER_SPI_MODE_ANY (1U << 31) |
|---|
| .. | .. |
|---|
| 94 | 102 | #define GIC_PIDR2_ARCH_GICv4 0x40 |
|---|
| 95 | 103 | |
|---|
| 96 | 104 | #define GIC_V3_DIST_SIZE 0x10000 |
|---|
| 105 | + |
|---|
| 106 | +#define GIC_PAGE_SIZE_4K 0ULL |
|---|
| 107 | +#define GIC_PAGE_SIZE_16K 1ULL |
|---|
| 108 | +#define GIC_PAGE_SIZE_64K 2ULL |
|---|
| 109 | +#define GIC_PAGE_SIZE_MASK 3ULL |
|---|
| 97 | 110 | |
|---|
| 98 | 111 | /* |
|---|
| 99 | 112 | * Re-Distributor registers, offsets from RD_base |
|---|
| .. | .. |
|---|
| 105 | 118 | #define GICR_WAKER 0x0014 |
|---|
| 106 | 119 | #define GICR_SETLPIR 0x0040 |
|---|
| 107 | 120 | #define GICR_CLRLPIR 0x0048 |
|---|
| 108 | | -#define GICR_SEIR GICD_SEIR |
|---|
| 109 | 121 | #define GICR_PROPBASER 0x0070 |
|---|
| 110 | 122 | #define GICR_PENDBASER 0x0078 |
|---|
| 111 | 123 | #define GICR_INVLPIR 0x00A0 |
|---|
| 112 | 124 | #define GICR_INVALLR 0x00B0 |
|---|
| 113 | 125 | #define GICR_SYNCR 0x00C0 |
|---|
| 114 | | -#define GICR_MOVLPIR 0x0100 |
|---|
| 115 | | -#define GICR_MOVALLR 0x0110 |
|---|
| 116 | 126 | #define GICR_IDREGS GICD_IDREGS |
|---|
| 117 | 127 | #define GICR_PIDR2 GICD_PIDR2 |
|---|
| 118 | 128 | |
|---|
| .. | .. |
|---|
| 120 | 130 | #define GICR_CTLR_RWP (1UL << 3) |
|---|
| 121 | 131 | |
|---|
| 122 | 132 | #define GICR_TYPER_CPU_NUMBER(r) (((r) >> 8) & 0xffff) |
|---|
| 133 | + |
|---|
| 134 | +#define EPPI_BASE_INTID 1056 |
|---|
| 135 | + |
|---|
| 136 | +#define GICR_TYPER_NR_PPIS(r) \ |
|---|
| 137 | + ({ \ |
|---|
| 138 | + unsigned int __ppinum = ((r) >> 27) & 0x1f; \ |
|---|
| 139 | + unsigned int __nr_ppis = 16; \ |
|---|
| 140 | + if (__ppinum == 1 || __ppinum == 2) \ |
|---|
| 141 | + __nr_ppis += __ppinum * 32; \ |
|---|
| 142 | + \ |
|---|
| 143 | + __nr_ppis; \ |
|---|
| 144 | + }) |
|---|
| 123 | 145 | |
|---|
| 124 | 146 | #define GICR_WAKER_ProcessorSleep (1U << 1) |
|---|
| 125 | 147 | #define GICR_WAKER_ChildrenAsleep (1U << 2) |
|---|
| .. | .. |
|---|
| 217 | 239 | |
|---|
| 218 | 240 | #define GICR_TYPER_PLPIS (1U << 0) |
|---|
| 219 | 241 | #define GICR_TYPER_VLPIS (1U << 1) |
|---|
| 242 | +#define GICR_TYPER_DIRTY (1U << 2) |
|---|
| 220 | 243 | #define GICR_TYPER_DirectLPIS (1U << 3) |
|---|
| 221 | 244 | #define GICR_TYPER_LAST (1U << 4) |
|---|
| 245 | +#define GICR_TYPER_RVPEID (1U << 7) |
|---|
| 246 | +#define GICR_TYPER_COMMON_LPI_AFF GENMASK_ULL(25, 24) |
|---|
| 247 | +#define GICR_TYPER_AFFINITY GENMASK_ULL(63, 32) |
|---|
| 248 | + |
|---|
| 249 | +#define GICR_INVLPIR_INTID GENMASK_ULL(31, 0) |
|---|
| 250 | +#define GICR_INVLPIR_VPEID GENMASK_ULL(47, 32) |
|---|
| 251 | +#define GICR_INVLPIR_V GENMASK_ULL(63, 63) |
|---|
| 252 | + |
|---|
| 253 | +#define GICR_INVALLR_VPEID GICR_INVLPIR_VPEID |
|---|
| 254 | +#define GICR_INVALLR_V GICR_INVLPIR_V |
|---|
| 222 | 255 | |
|---|
| 223 | 256 | #define GIC_V3_REDIST_SIZE 0x20000 |
|---|
| 224 | 257 | |
|---|
| .. | .. |
|---|
| 257 | 290 | #define GICR_VPROPBASER_RaWaWt GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, RaWaWt) |
|---|
| 258 | 291 | #define GICR_VPROPBASER_RaWaWb GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, RaWaWb) |
|---|
| 259 | 292 | |
|---|
| 293 | +/* |
|---|
| 294 | + * GICv4.1 VPROPBASER reinvention. A subtle mix between the old |
|---|
| 295 | + * VPROPBASER and ITS_BASER. Just not quite any of the two. |
|---|
| 296 | + */ |
|---|
| 297 | +#define GICR_VPROPBASER_4_1_VALID (1ULL << 63) |
|---|
| 298 | +#define GICR_VPROPBASER_4_1_ENTRY_SIZE GENMASK_ULL(61, 59) |
|---|
| 299 | +#define GICR_VPROPBASER_4_1_INDIRECT (1ULL << 55) |
|---|
| 300 | +#define GICR_VPROPBASER_4_1_PAGE_SIZE GENMASK_ULL(54, 53) |
|---|
| 301 | +#define GICR_VPROPBASER_4_1_Z (1ULL << 52) |
|---|
| 302 | +#define GICR_VPROPBASER_4_1_ADDR GENMASK_ULL(51, 12) |
|---|
| 303 | +#define GICR_VPROPBASER_4_1_SIZE GENMASK_ULL(6, 0) |
|---|
| 304 | + |
|---|
| 260 | 305 | #define GICR_VPENDBASER 0x0078 |
|---|
| 261 | 306 | |
|---|
| 262 | 307 | #define GICR_VPENDBASER_SHAREABILITY_SHIFT (10) |
|---|
| .. | .. |
|---|
| 274 | 319 | #define GICR_VPENDBASER_NonShareable \ |
|---|
| 275 | 320 | GIC_BASER_SHAREABILITY(GICR_VPENDBASER, NonShareable) |
|---|
| 276 | 321 | |
|---|
| 322 | +#define GICR_VPENDBASER_InnerShareable \ |
|---|
| 323 | + GIC_BASER_SHAREABILITY(GICR_VPENDBASER, InnerShareable) |
|---|
| 324 | + |
|---|
| 277 | 325 | #define GICR_VPENDBASER_nCnB GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, nCnB) |
|---|
| 278 | 326 | #define GICR_VPENDBASER_nC GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, nC) |
|---|
| 279 | 327 | #define GICR_VPENDBASER_RaWt GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, RaWt) |
|---|
| .. | .. |
|---|
| 289 | 337 | #define GICR_VPENDBASER_Valid (1ULL << 63) |
|---|
| 290 | 338 | |
|---|
| 291 | 339 | /* |
|---|
| 340 | + * GICv4.1 VPENDBASER, used for VPE residency. On top of these fields, |
|---|
| 341 | + * also use the above Valid, PendingLast and Dirty. |
|---|
| 342 | + */ |
|---|
| 343 | +#define GICR_VPENDBASER_4_1_DB (1ULL << 62) |
|---|
| 344 | +#define GICR_VPENDBASER_4_1_VGRP0EN (1ULL << 59) |
|---|
| 345 | +#define GICR_VPENDBASER_4_1_VGRP1EN (1ULL << 58) |
|---|
| 346 | +#define GICR_VPENDBASER_4_1_VPEID GENMASK_ULL(15, 0) |
|---|
| 347 | + |
|---|
| 348 | +#define GICR_VSGIR 0x0080 |
|---|
| 349 | + |
|---|
| 350 | +#define GICR_VSGIR_VPEID GENMASK(15, 0) |
|---|
| 351 | + |
|---|
| 352 | +#define GICR_VSGIPENDR 0x0088 |
|---|
| 353 | + |
|---|
| 354 | +#define GICR_VSGIPENDR_BUSY (1U << 31) |
|---|
| 355 | +#define GICR_VSGIPENDR_PENDING GENMASK(15, 0) |
|---|
| 356 | + |
|---|
| 357 | +/* |
|---|
| 292 | 358 | * ITS registers, offsets from ITS_base |
|---|
| 293 | 359 | */ |
|---|
| 294 | 360 | #define GITS_CTLR 0x0000 |
|---|
| 295 | 361 | #define GITS_IIDR 0x0004 |
|---|
| 296 | 362 | #define GITS_TYPER 0x0008 |
|---|
| 363 | +#define GITS_MPIDR 0x0018 |
|---|
| 297 | 364 | #define GITS_CBASER 0x0080 |
|---|
| 298 | 365 | #define GITS_CWRITER 0x0088 |
|---|
| 299 | 366 | #define GITS_CREADR 0x0090 |
|---|
| .. | .. |
|---|
| 310 | 377 | |
|---|
| 311 | 378 | #define GITS_TRANSLATER 0x10040 |
|---|
| 312 | 379 | |
|---|
| 380 | +#define GITS_SGIR 0x20020 |
|---|
| 381 | + |
|---|
| 382 | +#define GITS_SGIR_VPEID GENMASK_ULL(47, 32) |
|---|
| 383 | +#define GITS_SGIR_VINTID GENMASK_ULL(3, 0) |
|---|
| 384 | + |
|---|
| 313 | 385 | #define GITS_CTLR_ENABLE (1U << 0) |
|---|
| 314 | 386 | #define GITS_CTLR_ImDe (1U << 1) |
|---|
| 315 | 387 | #define GITS_CTLR_ITS_NUMBER_SHIFT 4 |
|---|
| .. | .. |
|---|
| 319 | 391 | #define GITS_TYPER_PLPIS (1UL << 0) |
|---|
| 320 | 392 | #define GITS_TYPER_VLPIS (1UL << 1) |
|---|
| 321 | 393 | #define GITS_TYPER_ITT_ENTRY_SIZE_SHIFT 4 |
|---|
| 322 | | -#define GITS_TYPER_ITT_ENTRY_SIZE(r) ((((r) >> GITS_TYPER_ITT_ENTRY_SIZE_SHIFT) & 0xf) + 1) |
|---|
| 394 | +#define GITS_TYPER_ITT_ENTRY_SIZE GENMASK_ULL(7, 4) |
|---|
| 323 | 395 | #define GITS_TYPER_IDBITS_SHIFT 8 |
|---|
| 324 | 396 | #define GITS_TYPER_DEVBITS_SHIFT 13 |
|---|
| 325 | | -#define GITS_TYPER_DEVBITS(r) ((((r) >> GITS_TYPER_DEVBITS_SHIFT) & 0x1f) + 1) |
|---|
| 397 | +#define GITS_TYPER_DEVBITS GENMASK_ULL(17, 13) |
|---|
| 326 | 398 | #define GITS_TYPER_PTA (1UL << 19) |
|---|
| 327 | 399 | #define GITS_TYPER_HCC_SHIFT 24 |
|---|
| 328 | 400 | #define GITS_TYPER_HCC(r) (((r) >> GITS_TYPER_HCC_SHIFT) & 0xff) |
|---|
| 329 | 401 | #define GITS_TYPER_VMOVP (1ULL << 37) |
|---|
| 402 | +#define GITS_TYPER_VMAPP (1ULL << 40) |
|---|
| 403 | +#define GITS_TYPER_SVPET GENMASK_ULL(42, 41) |
|---|
| 330 | 404 | |
|---|
| 331 | 405 | #define GITS_IIDR_REV_SHIFT 12 |
|---|
| 332 | 406 | #define GITS_IIDR_REV_MASK (0xf << GITS_IIDR_REV_SHIFT) |
|---|
| .. | .. |
|---|
| 356 | 430 | #define GITS_CBASER_WaWb GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, WaWb) |
|---|
| 357 | 431 | #define GITS_CBASER_RaWaWt GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, RaWaWt) |
|---|
| 358 | 432 | #define GITS_CBASER_RaWaWb GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, RaWaWb) |
|---|
| 433 | + |
|---|
| 434 | +#define GITS_CBASER_ADDRESS(cbaser) ((cbaser) & GENMASK_ULL(51, 12)) |
|---|
| 359 | 435 | |
|---|
| 360 | 436 | #define GITS_BASER_NR_REGS 8 |
|---|
| 361 | 437 | |
|---|
| .. | .. |
|---|
| 388 | 464 | #define GITS_BASER_ENTRY_SIZE_MASK GENMASK_ULL(52, 48) |
|---|
| 389 | 465 | #define GITS_BASER_PHYS_52_to_48(phys) \ |
|---|
| 390 | 466 | (((phys) & GENMASK_ULL(47, 16)) | (((phys) >> 48) & 0xf) << 12) |
|---|
| 467 | +#define GITS_BASER_ADDR_48_to_52(baser) \ |
|---|
| 468 | + (((baser) & GENMASK_ULL(47, 16)) | (((baser) >> 12) & 0xf) << 48) |
|---|
| 469 | + |
|---|
| 391 | 470 | #define GITS_BASER_SHAREABILITY_SHIFT (10) |
|---|
| 392 | 471 | #define GITS_BASER_InnerShareable \ |
|---|
| 393 | 472 | GIC_BASER_SHAREABILITY(GITS_BASER, InnerShareable) |
|---|
| 394 | 473 | #define GITS_BASER_PAGE_SIZE_SHIFT (8) |
|---|
| 395 | | -#define GITS_BASER_PAGE_SIZE_4K (0ULL << GITS_BASER_PAGE_SIZE_SHIFT) |
|---|
| 396 | | -#define GITS_BASER_PAGE_SIZE_16K (1ULL << GITS_BASER_PAGE_SIZE_SHIFT) |
|---|
| 397 | | -#define GITS_BASER_PAGE_SIZE_64K (2ULL << GITS_BASER_PAGE_SIZE_SHIFT) |
|---|
| 398 | | -#define GITS_BASER_PAGE_SIZE_MASK (3ULL << GITS_BASER_PAGE_SIZE_SHIFT) |
|---|
| 474 | +#define __GITS_BASER_PSZ(sz) (GIC_PAGE_SIZE_ ## sz << GITS_BASER_PAGE_SIZE_SHIFT) |
|---|
| 475 | +#define GITS_BASER_PAGE_SIZE_4K __GITS_BASER_PSZ(4K) |
|---|
| 476 | +#define GITS_BASER_PAGE_SIZE_16K __GITS_BASER_PSZ(16K) |
|---|
| 477 | +#define GITS_BASER_PAGE_SIZE_64K __GITS_BASER_PSZ(64K) |
|---|
| 478 | +#define GITS_BASER_PAGE_SIZE_MASK __GITS_BASER_PSZ(MASK) |
|---|
| 399 | 479 | #define GITS_BASER_PAGES_MAX 256 |
|---|
| 400 | 480 | #define GITS_BASER_PAGES_SHIFT (0) |
|---|
| 401 | 481 | #define GITS_BASER_NR_PAGES(r) (((r) & 0xff) + 1) |
|---|
| .. | .. |
|---|
| 436 | 516 | #define GITS_CMD_VMAPTI GITS_CMD_GICv4(GITS_CMD_MAPTI) |
|---|
| 437 | 517 | #define GITS_CMD_VMOVI GITS_CMD_GICv4(GITS_CMD_MOVI) |
|---|
| 438 | 518 | #define GITS_CMD_VSYNC GITS_CMD_GICv4(GITS_CMD_SYNC) |
|---|
| 439 | | -/* VMOVP is the odd one, as it doesn't have a physical counterpart */ |
|---|
| 519 | +/* VMOVP, VSGI and INVDB are the odd ones, as they dont have a physical counterpart */ |
|---|
| 440 | 520 | #define GITS_CMD_VMOVP GITS_CMD_GICv4(2) |
|---|
| 521 | +#define GITS_CMD_VSGI GITS_CMD_GICv4(3) |
|---|
| 522 | +#define GITS_CMD_INVDB GITS_CMD_GICv4(0xe) |
|---|
| 441 | 523 | |
|---|
| 442 | 524 | /* |
|---|
| 443 | 525 | * ITS error numbers |
|---|
| .. | .. |
|---|
| 467 | 549 | #define ICC_CTLR_EL1_EOImode_MASK (1 << ICC_CTLR_EL1_EOImode_SHIFT) |
|---|
| 468 | 550 | #define ICC_CTLR_EL1_CBPR_SHIFT 0 |
|---|
| 469 | 551 | #define ICC_CTLR_EL1_CBPR_MASK (1 << ICC_CTLR_EL1_CBPR_SHIFT) |
|---|
| 552 | +#define ICC_CTLR_EL1_PMHE_SHIFT 6 |
|---|
| 553 | +#define ICC_CTLR_EL1_PMHE_MASK (1 << ICC_CTLR_EL1_PMHE_SHIFT) |
|---|
| 470 | 554 | #define ICC_CTLR_EL1_PRI_BITS_SHIFT 8 |
|---|
| 471 | 555 | #define ICC_CTLR_EL1_PRI_BITS_MASK (0x7 << ICC_CTLR_EL1_PRI_BITS_SHIFT) |
|---|
| 472 | 556 | #define ICC_CTLR_EL1_ID_BITS_SHIFT 11 |
|---|
| .. | .. |
|---|
| 476 | 560 | #define ICC_CTLR_EL1_A3V_SHIFT 15 |
|---|
| 477 | 561 | #define ICC_CTLR_EL1_A3V_MASK (0x1 << ICC_CTLR_EL1_A3V_SHIFT) |
|---|
| 478 | 562 | #define ICC_CTLR_EL1_RSS (0x1 << 18) |
|---|
| 563 | +#define ICC_CTLR_EL1_ExtRange (0x1 << 19) |
|---|
| 479 | 564 | #define ICC_PMR_EL1_SHIFT 0 |
|---|
| 480 | 565 | #define ICC_PMR_EL1_MASK (0xff << ICC_PMR_EL1_SHIFT) |
|---|
| 481 | 566 | #define ICC_BPR0_EL1_SHIFT 0 |
|---|
| .. | .. |
|---|
| 582 | 667 | |
|---|
| 583 | 668 | struct rdists { |
|---|
| 584 | 669 | struct { |
|---|
| 670 | + raw_spinlock_t rd_lock; |
|---|
| 585 | 671 | void __iomem *rd_base; |
|---|
| 586 | 672 | struct page *pend_page; |
|---|
| 587 | 673 | phys_addr_t phys_base; |
|---|
| 674 | + bool lpi_enabled; |
|---|
| 675 | + cpumask_t *vpe_table_mask; |
|---|
| 676 | + void *vpe_l1_base; |
|---|
| 588 | 677 | } __percpu *rdist; |
|---|
| 589 | | - struct page *prop_page; |
|---|
| 678 | + phys_addr_t prop_table_pa; |
|---|
| 679 | + void *prop_table_va; |
|---|
| 590 | 680 | u64 flags; |
|---|
| 591 | 681 | u32 gicd_typer; |
|---|
| 682 | + u32 gicd_typer2; |
|---|
| 592 | 683 | bool has_vlpis; |
|---|
| 684 | + bool has_rvpeid; |
|---|
| 593 | 685 | bool has_direct_lpi; |
|---|
| 686 | + bool has_vpend_valid_dirty; |
|---|
| 594 | 687 | }; |
|---|
| 595 | 688 | |
|---|
| 596 | 689 | struct irq_domain; |
|---|
| .. | .. |
|---|
| 599 | 692 | int its_init(struct fwnode_handle *handle, struct rdists *rdists, |
|---|
| 600 | 693 | struct irq_domain *domain); |
|---|
| 601 | 694 | int mbi_init(struct fwnode_handle *fwnode, struct irq_domain *parent); |
|---|
| 695 | + |
|---|
| 696 | +struct gic_chip_data { |
|---|
| 697 | + struct fwnode_handle *fwnode; |
|---|
| 698 | + void __iomem *dist_base; |
|---|
| 699 | + struct redist_region *redist_regions; |
|---|
| 700 | + struct rdists rdists; |
|---|
| 701 | + struct irq_domain *domain; |
|---|
| 702 | + u64 redist_stride; |
|---|
| 703 | + u32 nr_redist_regions; |
|---|
| 704 | + u64 flags; |
|---|
| 705 | + bool has_rss; |
|---|
| 706 | + unsigned int ppi_nr; |
|---|
| 707 | + struct partition_desc **ppi_descs; |
|---|
| 708 | +}; |
|---|
| 602 | 709 | |
|---|
| 603 | 710 | static inline bool gic_enable_sre(void) |
|---|
| 604 | 711 | { |
|---|
| .. | .. |
|---|
| 615 | 722 | return !!(val & ICC_SRE_EL1_SRE); |
|---|
| 616 | 723 | } |
|---|
| 617 | 724 | |
|---|
| 725 | +void gic_resume(void); |
|---|
| 726 | + |
|---|
| 618 | 727 | #endif |
|---|
| 619 | 728 | |
|---|
| 620 | 729 | #endif |
|---|