Commit 93713e7f authored by achingupta's avatar achingupta
Browse files

Merge pull request #273 from achingupta/ag/genfw-389

Set group status of PPIs and SGIs correctly on GICv3 systems
parents 27a51c72 8cfc3fd2
...@@ -219,13 +219,10 @@ void arm_gic_cpuif_deactivate(void) ...@@ -219,13 +219,10 @@ void arm_gic_cpuif_deactivate(void)
******************************************************************************/ ******************************************************************************/
void arm_gic_pcpu_distif_setup(void) void arm_gic_pcpu_distif_setup(void)
{ {
unsigned int index, irq_num; unsigned int index, irq_num, sec_ppi_sgi_mask;
assert(g_gicd_base); assert(g_gicd_base);
/* Mark all 32 SGI+PPI interrupts as Group 1 (non-secure) */
gicd_write_igroupr(g_gicd_base, 0, ~0);
/* Setup PPI priorities doing four at a time */ /* Setup PPI priorities doing four at a time */
for (index = 0; index < 32; index += 4) { for (index = 0; index < 32; index += 4) {
gicd_write_ipriorityr(g_gicd_base, index, gicd_write_ipriorityr(g_gicd_base, index,
...@@ -233,16 +230,25 @@ void arm_gic_pcpu_distif_setup(void) ...@@ -233,16 +230,25 @@ void arm_gic_pcpu_distif_setup(void)
} }
assert(g_irq_sec_ptr); assert(g_irq_sec_ptr);
sec_ppi_sgi_mask = 0;
for (index = 0; index < g_num_irqs; index++) { for (index = 0; index < g_num_irqs; index++) {
irq_num = g_irq_sec_ptr[index]; irq_num = g_irq_sec_ptr[index];
if (irq_num < MIN_SPI_ID) { if (irq_num < MIN_SPI_ID) {
/* We have an SGI or a PPI */ /* We have an SGI or a PPI. They are Group0 at reset */
gicd_clr_igroupr(g_gicd_base, irq_num); sec_ppi_sgi_mask |= 1U << irq_num;
gicd_set_ipriorityr(g_gicd_base, irq_num, gicd_set_ipriorityr(g_gicd_base, irq_num,
GIC_HIGHEST_SEC_PRIORITY); GIC_HIGHEST_SEC_PRIORITY);
gicd_set_isenabler(g_gicd_base, irq_num); gicd_set_isenabler(g_gicd_base, irq_num);
} }
} }
/*
* Invert the bitmask to create a mask for non-secure PPIs and
* SGIs. Program the GICD_IGROUPR0 with this bit mask. This write will
* update the GICR_IGROUPR0 as well in case we are running on a GICv3
* system. This is critical if GICD_CTLR.ARE_NS=1.
*/
gicd_write_igroupr(g_gicd_base, 0, ~sec_ppi_sgi_mask);
} }
/******************************************************************************* /*******************************************************************************
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment