[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 6/9] 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 everytime. For now, use it when enabling/disabling the vIRQs rather than a formula which is not obvious to understand. Also drop the comments which where wrong because a shift by DABT_WORD will not give the IRQ number but the index of the register. --- Changes in v3: - 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@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |