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 <julien.gr...@citrix.com> Acked-by: Ian Campbell <ian.campb...@citrix.com> --- Changes in v3: - Add missing signed-off-by - Typoes in the commit message - Add Ian's acked-by Changes in v2: - Patch added --- 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 ad1bb15..2d63e12 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 92a3ccf..b5249ff 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 2128d29..7bb4570 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; i<d->arch.vgic.nr_spis; i++) vgic_init_pending_irq(&d->arch.vgic.pending_irqs[i], i + 32); - for (i=0; i<DOMAIN_NR_RANKS(d); i++) - spin_lock_init(&d->arch.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 ff98913..ba74d0f 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.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel