diff options
author | Marc Zyngier <marc.zyngier@arm.com> | 2019-07-23 16:00:04 +0100 |
---|---|---|
committer | Mark Rutland <mark.rutland@arm.com> | 2019-07-23 16:47:59 +0100 |
commit | c11fd1e6e65399244b14d3f3d9052e2e5b7b943d (patch) | |
tree | c7056f30547ace7517033362e943986da7d7e1b5 | |
parent | ed60963595855e66ffc06a8a543cbb429c7ede03 (diff) | |
download | boot-wrapper-aarch64-c11fd1e6e65399244b14d3f3d9052e2e5b7b943d.tar.gz |
Make GICv3.1 extended ranges available to non-secure
If we have a GICv3.1-capable system, configure the EPPI/ESPI ranges
to be accessible from the non-secure world.
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
-rw-r--r-- | gic-v3.c | 14 |
1 files changed, 12 insertions, 2 deletions
@@ -17,6 +17,8 @@ #define GICD_TYPER 0x4 #define GICD_IGROUP0 0x80 #define GICD_IGRPMOD0 0xd00 +#define GICD_IGROUPR0E 0x1000 +#define GICD_IGRPMODR0E 0x3400 #define GICD_CTLR_EnableGrp0 (1 << 0) #define GICD_CTLR_EnableGrp1ns (1 << 1) @@ -24,10 +26,12 @@ #define GICD_CTLR_ARE_S (1 << 4) #define GICD_CTLR_ARE_NS (1 << 5) #define GICD_TYPER_ITLineNumber 0x1f +#define GICD_TYPER_ESPI_range(r) (((r) >> 27) & 0x1f) #define GICR_WAKER 0x14 #define GICR_TYPER 0x8 +#define GICR_TYPER_PPInum(r) (((r) >> 27) & 0x1f) #define GICR_IGROUP0 0x80 #define GICR_IGRPMOD0 0xD00 @@ -72,8 +76,10 @@ void gic_secure_init_primary(void) typer = raw_readl(gicr_ptr + GICR_TYPER); gicr_ptr += 0x10000; /* Go to SGI_Base */ - raw_writel(~0x0, gicr_ptr + GICR_IGROUP0); - raw_writel(0x0, gicr_ptr + GICR_IGRPMOD0); + for (i = 0; i < (1 + GICR_TYPER_PPInum(typer)); i++) { + raw_writel(~0x0, gicr_ptr + GICR_IGROUP0 + i * 4); + raw_writel(0x0, gicr_ptr + GICR_IGRPMOD0 + i * 4); + } /* Next redist */ gicr_ptr += 0x10000; @@ -87,6 +93,10 @@ void gic_secure_init_primary(void) raw_writel(~0x0, gicd_base + GICD_IGROUP0 + i * 4); raw_writel(0x0, gicd_base + GICD_IGRPMOD0 + i * 4); } + for (i = 0; i < GICD_TYPER_ESPI_range(typer); i++) { + raw_writel(~0x0, gicd_base + GICD_IGROUPR0E + i * 4); + raw_writel(0x0, gicd_base + GICD_IGRPMODR0E + i * 4); + } } void gic_secure_init(void) |