From 2c20224c72fbe40d22859b4e052d9c18eb89e42c Mon Sep 17 00:00:00 2001 From: Julien Grall Date: Wed, 7 Oct 2015 15:41:08 +0100 Subject: [PATCH] xen/arm: vgic: Introduce a new field to store the rank index and use it Having in hand the index for the rank is very handy to avoid computing it every time. For now, use it when enabling/disabling the vIRQs rather than a formula which is not obvious to understand. Also drop the comments which were wrong because a shift by DABT_WORD will not give the IRQ number but the index of the register. Signed-off-by: Julien Grall Acked-by: Ian Campbell --- xen/arch/arm/vgic-v2.c | 12 ++---------- xen/arch/arm/vgic-v3.c | 6 ++---- xen/arch/arm/vgic.c | 13 ++++++++++--- xen/include/asm-arm/vgic.h | 3 +++ 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/xen/arch/arm/vgic-v2.c b/xen/arch/arm/vgic-v2.c index ad1bb15eb8..2d63e12f5c 100644 --- a/xen/arch/arm/vgic-v2.c +++ b/xen/arch/arm/vgic-v2.c @@ -288,11 +288,7 @@ static int vgic_v2_distr_mmio_write(struct vcpu *v, mmio_info_t *info, vgic_lock_rank(v, rank, flags); tr = rank->ienable; rank->ienable |= r; - /* The virtual irq is derived from register offset. - * The register difference is word difference. So divide by 2(DABT_WORD) - * to get Virtual irq number */ - vgic_enable_irqs(v, r & (~tr), - (gicd_reg - GICD_ISENABLER) >> DABT_WORD); + vgic_enable_irqs(v, r & (~tr), rank->index); vgic_unlock_rank(v, rank, flags); return 1; @@ -303,11 +299,7 @@ static int vgic_v2_distr_mmio_write(struct vcpu *v, mmio_info_t *info, vgic_lock_rank(v, rank, flags); tr = rank->ienable; rank->ienable &= ~r; - /* The virtual irq is derived from register offset. - * The register difference is word difference. So divide by 2(DABT_WORD) - * to get Virtual irq number */ - vgic_disable_irqs(v, r & tr, - (gicd_reg - GICD_ICENABLER) >> DABT_WORD); + vgic_disable_irqs(v, r & tr, rank->index); vgic_unlock_rank(v, rank, flags); return 1; diff --git a/xen/arch/arm/vgic-v3.c b/xen/arch/arm/vgic-v3.c index 92a3ccfb94..b5249ff1cd 100644 --- a/xen/arch/arm/vgic-v3.c +++ b/xen/arch/arm/vgic-v3.c @@ -386,8 +386,7 @@ static int __vgic_v3_distr_common_mmio_write(const char *name, struct vcpu *v, vgic_lock_rank(v, rank, flags); tr = rank->ienable; rank->ienable |= r; - /* The irq number is extracted from offset. so shift by register size */ - vgic_enable_irqs(v, r & (~tr), (reg - GICD_ISENABLER) >> DABT_WORD); + vgic_enable_irqs(v, r & (~tr), rank->index); vgic_unlock_rank(v, rank, flags); return 1; case GICD_ICENABLER ... GICD_ICENABLERN: @@ -397,8 +396,7 @@ static int __vgic_v3_distr_common_mmio_write(const char *name, struct vcpu *v, vgic_lock_rank(v, rank, flags); tr = rank->ienable; rank->ienable &= ~r; - /* The irq number is extracted from offset. so shift by register size */ - vgic_disable_irqs(v, r & tr, (reg - GICD_ICENABLER) >> DABT_WORD); + vgic_disable_irqs(v, r & tr, rank->index); vgic_unlock_rank(v, rank, flags); return 1; case GICD_ISPENDR ... GICD_ISPENDRN: diff --git a/xen/arch/arm/vgic.c b/xen/arch/arm/vgic.c index 2128d2934e..7bb457075b 100644 --- a/xen/arch/arm/vgic.c +++ b/xen/arch/arm/vgic.c @@ -68,6 +68,13 @@ static void vgic_init_pending_irq(struct pending_irq *p, unsigned int virq) p->irq = virq; } +static void vgic_rank_init(struct vgic_irq_rank *rank, uint8_t index) +{ + spin_lock_init(&rank->lock); + + rank->index = index; +} + int domain_vgic_init(struct domain *d, unsigned int nr_spis) { int i; @@ -114,8 +121,8 @@ int domain_vgic_init(struct domain *d, unsigned int nr_spis) for (i=0; iarch.vgic.nr_spis; i++) vgic_init_pending_irq(&d->arch.vgic.pending_irqs[i], i + 32); - for (i=0; iarch.vgic.shared_irqs[i].lock); + for ( i = 0; i < DOMAIN_NR_RANKS(d); i++ ) + vgic_rank_init(&d->arch.vgic.shared_irqs[i], i + 1); ret = d->arch.vgic.handler->domain_init(d); if ( ret ) @@ -169,7 +176,7 @@ int vcpu_vgic_init(struct vcpu *v) if ( v->arch.vgic.private_irqs == NULL ) return -ENOMEM; - spin_lock_init(&v->arch.vgic.private_irqs->lock); + vgic_rank_init(v->arch.vgic.private_irqs, 0); v->domain->arch.vgic.handler->vcpu_init(v); diff --git a/xen/include/asm-arm/vgic.h b/xen/include/asm-arm/vgic.h index ff98913947..ba74d0f594 100644 --- a/xen/include/asm-arm/vgic.h +++ b/xen/include/asm-arm/vgic.h @@ -88,6 +88,9 @@ struct pending_irq /* Represents state corresponding to a block of 32 interrupts */ struct vgic_irq_rank { spinlock_t lock; /* Covers access to all other members of this struct */ + + uint8_t index; + uint32_t ienable; uint32_t icfg[2]; -- 2.39.5