summaryrefslogtreecommitdiffstats
path: root/bsps/include/dev/irq/arm-gicv3.h
diff options
context:
space:
mode:
Diffstat (limited to 'bsps/include/dev/irq/arm-gicv3.h')
-rw-r--r--bsps/include/dev/irq/arm-gicv3.h27
1 files changed, 27 insertions, 0 deletions
diff --git a/bsps/include/dev/irq/arm-gicv3.h b/bsps/include/dev/irq/arm-gicv3.h
index de15b5cc81..73ad05a507 100644
--- a/bsps/include/dev/irq/arm-gicv3.h
+++ b/bsps/include/dev/irq/arm-gicv3.h
@@ -279,6 +279,33 @@ static void gicv3_init_dist(volatile gic_dist *dist)
}
}
+static void gicv3_init_cpu_interface(uint32_t cpu_index)
+{
+ uint32_t sre_value = 0x7;
+ WRITE_SR(ICC_SRE, sre_value);
+ WRITE_SR(ICC_PMR, GIC_CPUIF_ICCPMR_PRIORITY(0xff));
+ WRITE_SR(ICC_BPR0, GIC_CPUIF_ICCBPR_BINARY_POINT(0x0));
+
+ volatile gic_redist *redist = gicv3_get_redist(cpu_index);
+ uint32_t waker = redist->icrwaker;
+ uint32_t waker_mask = GIC_REDIST_ICRWAKER_PROCESSOR_SLEEP;
+ waker &= ~waker_mask;
+ redist->icrwaker = waker;
+
+ volatile gic_sgi_ppi *sgi_ppi = gicv3_get_sgi_ppi(cpu_index);
+ /* Set G1NS */
+ sgi_ppi->icspigrpr[0] = 0xffffffff;
+ sgi_ppi->icspigrpmodr[0] = 0;
+ for (int id = 0; id < 32; id++) {
+ sgi_ppi->icspiprior[id] = PRIORITY_DEFAULT;
+ }
+
+ /* Enable interrupt groups 0 and 1 */
+ WRITE_SR(ICC_IGRPEN0, 0x1);
+ WRITE_SR(ICC_IGRPEN1, 0x1);
+ WRITE_SR(ICC_CTLR, 0x0);
+}
+
#ifdef __cplusplus
}
#endif