From mboxrd@z Thu Jan 1 00:00:00 1970 From: vijay.kilari@gmail.com Subject: [PATCH v2 02/15] xen/arm: move vgic rank data to gic header file Date: Fri, 4 Apr 2014 17:26:20 +0530 Message-ID: <1396612593-443-3-git-send-email-vijay.kilari@gmail.com> References: <1396612593-443-1-git-send-email-vijay.kilari@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1396612593-443-1-git-send-email-vijay.kilari@gmail.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Ian.Campbell@citrix.com, julien.grall@linaro.org, stefano.stabellini@eu.citrix.com, stefano.stabellini@citrix.com, xen-devel@lists.xen.org Cc: Prasun.Kapoor@caviumnetworks.com, Vijaya Kumar K , vijay.kilari@gmail.com List-Id: xen-devel@lists.xenproject.org From: Vijaya Kumar K 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 --- 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 #include #include +#include #include #include 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 #include #include - -/* 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 +#include 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