[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 02/15] xen/arm: move vgic rank data to gic header file
From: Vijaya Kumar K <Vijaya.Kumar@xxxxxxxxxxxxxxxxxx> vgic_irq_rank structure contains gic specific data elements. Move this out of domain.h and allocate memory dynamically in vgic driver. Signed-off-by: Vijaya Kumar K <Vijaya.Kumar@xxxxxxxxxxxxxxxxxx> --- xen/arch/arm/domain.c | 1 + xen/arch/arm/smp.c | 1 + xen/arch/arm/vgic.c | 17 ++++++++++++++--- xen/include/asm-arm/domain.h | 13 +++---------- xen/include/asm-arm/gic.h | 10 ++++++++++ 5 files changed, 29 insertions(+), 13 deletions(-) diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c index e2f0cc4..3d7e685 100644 --- a/xen/arch/arm/domain.c +++ b/xen/arch/arm/domain.c @@ -495,6 +495,7 @@ int vcpu_initialise(struct vcpu *v) void vcpu_destroy(struct vcpu *v) { vcpu_timer_destroy(v); + vcpu_vgic_free(v); free_xenheap_pages(v->arch.stack, STACK_ORDER); } diff --git a/xen/arch/arm/smp.c b/xen/arch/arm/smp.c index 30203b8..3cfd6ac 100644 --- a/xen/arch/arm/smp.c +++ b/xen/arch/arm/smp.c @@ -3,6 +3,7 @@ #include <asm/smp.h> #include <asm/cpregs.h> #include <asm/page.h> +#include <xen/irq.h> #include <asm/gic.h> #include <asm/flushtlb.h> diff --git a/xen/arch/arm/vgic.c b/xen/arch/arm/vgic.c index 77b561e..d86bede 100644 --- a/xen/arch/arm/vgic.c +++ b/xen/arch/arm/vgic.c @@ -67,7 +67,7 @@ static struct vgic_irq_rank *vgic_irq_rank(struct vcpu *v, int b, int n) int rank = REG_RANK_NR(b, n); if ( rank == 0 ) - return &v->arch.vgic.private_irqs; + return v->arch.vgic.private_irqs; else if ( rank <= DOMAIN_NR_RANKS(v->domain) ) return &v->domain->arch.vgic.shared_irqs[rank - 1]; else @@ -121,9 +121,14 @@ void domain_vgic_free(struct domain *d) int vcpu_vgic_init(struct vcpu *v) { int i; + + v->arch.vgic.private_irqs = xzalloc(struct vgic_irq_rank); + if ( v->arch.vgic.private_irqs == NULL ) + return -ENOMEM; + memset(&v->arch.vgic.private_irqs, 0, sizeof(v->arch.vgic.private_irqs)); - spin_lock_init(&v->arch.vgic.private_irqs.lock); + spin_lock_init(&v->arch.vgic.private_irqs->lock); memset(&v->arch.vgic.pending_irqs, 0, sizeof(v->arch.vgic.pending_irqs)); for (i = 0; i < 32; i++) @@ -134,7 +139,7 @@ int vcpu_vgic_init(struct vcpu *v) /* For SGI and PPI the target is always this CPU */ for ( i = 0 ; i < 8 ; i++ ) - v->arch.vgic.private_irqs.itargets[i] = + v->arch.vgic.private_irqs->itargets[i] = (1<<(v->vcpu_id+0)) | (1<<(v->vcpu_id+8)) | (1<<(v->vcpu_id+16)) @@ -146,6 +151,12 @@ int vcpu_vgic_init(struct vcpu *v) return 0; } +int vcpu_vgic_free(struct vcpu *v) +{ + xfree(v->arch.vgic.private_irqs); + return 0; +} + #define vgic_lock(v) spin_lock_irq(&(v)->domain->arch.vgic.lock) #define vgic_unlock(v) spin_unlock_irq(&(v)->domain->arch.vgic.lock) diff --git a/xen/include/asm-arm/domain.h b/xen/include/asm-arm/domain.h index 23dac85..5b23d07 100644 --- a/xen/include/asm-arm/domain.h +++ b/xen/include/asm-arm/domain.h @@ -9,15 +9,8 @@ #include <asm/vfp.h> #include <public/hvm/params.h> #include <xen/serial.h> - -/* 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 */ - uint32_t ienable, iactive, ipend, pendsgi; - uint32_t icfg[2]; - uint32_t ipriority[8]; - uint32_t itargets[8]; -}; +#include <xen/irq.h> +#include <asm/gic.h> struct pending_irq { @@ -270,7 +263,7 @@ struct arch_vcpu * struct arch_domain. */ struct pending_irq pending_irqs[32]; - struct vgic_irq_rank private_irqs; + struct vgic_irq_rank *private_irqs; /* This list is ordered by IRQ priority and it is used to keep * track of the IRQs that the VGIC injected into the guest. diff --git a/xen/include/asm-arm/gic.h b/xen/include/asm-arm/gic.h index 5d8f7f1..dd7e891 100644 --- a/xen/include/asm-arm/gic.h +++ b/xen/include/asm-arm/gic.h @@ -160,10 +160,20 @@ #define DT_MATCH_GIC DT_MATCH_COMPATIBLE("arm,cortex-a15-gic"), \ DT_MATCH_COMPATIBLE("arm,cortex-a7-gic") +/* 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 */ + uint32_t ienable, iactive, ipend, pendsgi; + uint32_t icfg[2]; + uint32_t ipriority[8]; + uint32_t itargets[8]; +}; + extern int domain_vgic_init(struct domain *d); extern void domain_vgic_free(struct domain *d); extern int vcpu_vgic_init(struct vcpu *v); +extern int vcpu_vgic_free(struct vcpu *v); extern void vgic_vcpu_inject_irq(struct vcpu *v, unsigned int irq); extern void vgic_clear_pending_irqs(struct vcpu *v); -- 1.7.9.5 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |