From a70819d9adfb29cd096c3ef2e8cafe83a8ff21e1 Mon Sep 17 00:00:00 2001 From: Jan Kiszka Date: Sun, 26 Jun 2016 12:34:58 +0200 Subject: [PATCH] arm: Fold irqchip_root_cell_shrink into irqchip_cell_init Simplifies the code. Signed-off-by: Jan Kiszka --- hypervisor/arch/arm/control.c | 1 - hypervisor/arch/arm/include/asm/irqchip.h | 1 - hypervisor/arch/arm/irqchip.c | 32 +++++++++++------------ 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/hypervisor/arch/arm/control.c b/hypervisor/arch/arm/control.c index 918704c..b63b14b 100644 --- a/hypervisor/arch/arm/control.c +++ b/hypervisor/arch/arm/control.c @@ -359,7 +359,6 @@ int arch_cell_create(struct cell *cell) arch_mmu_cell_destroy(cell); return err; } - irqchip_root_cell_shrink(cell); register_smp_ops(cell); diff --git a/hypervisor/arch/arm/include/asm/irqchip.h b/hypervisor/arch/arm/include/asm/irqchip.h index 56b1b4a..eb78a58 100644 --- a/hypervisor/arch/arm/include/asm/irqchip.h +++ b/hypervisor/arch/arm/include/asm/irqchip.h @@ -64,7 +64,6 @@ void irqchip_cpu_shutdown(struct per_cpu *cpu_data); int irqchip_cell_init(struct cell *cell); void irqchip_cell_exit(struct cell *cell); -void irqchip_root_cell_shrink(struct cell *cell); int irqchip_send_sgi(struct sgi *sgi); void irqchip_handle_irq(struct per_cpu *cpu_data); diff --git a/hypervisor/arch/arm/irqchip.c b/hypervisor/arch/arm/irqchip.c index 47673dd..ef01791 100644 --- a/hypervisor/arch/arm/irqchip.c +++ b/hypervisor/arch/arm/irqchip.c @@ -152,7 +152,8 @@ void irqchip_cpu_shutdown(struct per_cpu *cpu_data) int irqchip_cell_init(struct cell *cell) { const struct jailhouse_irqchip *chip; - unsigned int n; + unsigned int n, pos; + int err; for_each_irqchip(chip, cell->config, n) { if (chip->address != (unsigned long)gicd_base) @@ -171,7 +172,20 @@ int irqchip_cell_init(struct cell *cell) cell->arch.irq_bitmap[0] = ~((1 << SGI_INJECT) | (1 << SGI_CPU_OFF) | (1 << MAINTENANCE_IRQ)); - return irqchip.cell_init(cell); + err = irqchip.cell_init(cell); + if (err) + return err; + + if (cell != &root_cell) + for_each_irqchip(chip, cell->config, n) { + if (chip->address != (unsigned long)gicd_base) + continue; + for (pos = 0; pos < ARRAY_SIZE(chip->pin_bitmap); pos++) + root_cell.arch.irq_bitmap[chip->pin_base/32] &= + ~chip->pin_bitmap[pos]; + } + + return 0; } void irqchip_cell_exit(struct cell *cell) @@ -206,20 +220,6 @@ void irqchip_cell_exit(struct cell *cell) irqchip.cell_exit(cell); } -void irqchip_root_cell_shrink(struct cell *cell) -{ - const struct jailhouse_irqchip *irqchip; - unsigned int n, pos; - - for_each_irqchip(irqchip, cell->config, n) { - if (irqchip->address != (unsigned long)gicd_base) - continue; - for (pos = 0; pos < ARRAY_SIZE(irqchip->pin_bitmap); pos++) - root_cell.arch.irq_bitmap[irqchip->pin_base / 32] &= - ~irqchip->pin_bitmap[pos]; - } -} - int irqchip_init(void) { int i, err; -- 2.39.2