aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc Zyngier <marc.zyngier@arm.com>2019-07-23 16:00:04 +0100
committerMark Rutland <mark.rutland@arm.com>2019-07-23 16:47:59 +0100
commitc11fd1e6e65399244b14d3f3d9052e2e5b7b943d (patch)
treec7056f30547ace7517033362e943986da7d7e1b5
parented60963595855e66ffc06a8a543cbb429c7ede03 (diff)
downloadboot-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.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/gic-v3.c b/gic-v3.c
index 476f703..ae2d2bc 100644
--- a/gic-v3.c
+++ b/gic-v3.c
@@ -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)