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;
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;
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:
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:
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;
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 )
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);
/* 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];