[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH V2 10/10] arm/vgic: Change fixed number of mmio handlers to variable number
Record the number of mmio handlers that are required for vGICv3/2 in variable 'arch_domain.vgic.mmio_count' in vgic_v3/v2_init(). Augment this variable number to a fixed number MAX_IO_HANDLER and pass it to domain_io_init() to allocate enough memory for handlers. New code path: domain_vgic_register() count = MAX_IO_HANDLER + d->arch.vgic.mmio_count; domain_io_init(count) domain_vgic_init() Signed-off-by: Shanker Donthineni <shankerd@xxxxxxxxxxxxxx> --- xen/arch/arm/domain.c | 11 +++++++---- xen/arch/arm/vgic-v2.c | 1 + xen/arch/arm/vgic-v3.c | 12 ++++++++++-- xen/arch/arm/vgic.c | 6 +----- xen/include/asm-arm/domain.h | 1 + xen/include/asm-arm/vgic.h | 1 + 6 files changed, 21 insertions(+), 11 deletions(-) diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c index 4010ff2..ebc12ac 100644 --- a/xen/arch/arm/domain.c +++ b/xen/arch/arm/domain.c @@ -550,10 +550,6 @@ int arch_domain_create(struct domain *d, unsigned int domcr_flags, share_xen_page_with_guest( virt_to_page(d->shared_info), d, XENSHARE_writable); - count = MAX_IO_HANDLER; - if ( (rc = domain_io_init(d, count)) != 0 ) - goto fail; - if ( (rc = p2m_alloc_table(d)) != 0 ) goto fail; @@ -590,6 +586,13 @@ int arch_domain_create(struct domain *d, unsigned int domcr_flags, goto fail; } + if ( (rc = domain_vgic_register(d)) != 0 ) + goto fail; + + count = MAX_IO_HANDLER + d->arch.vgic.mmio_count; + if ( (rc = domain_io_init(d, count)) != 0 ) + goto fail; + if ( (rc = domain_vgic_init(d, config->nr_spis)) != 0 ) goto fail; diff --git a/xen/arch/arm/vgic-v2.c b/xen/arch/arm/vgic-v2.c index f5778e6..d5367b3 100644 --- a/xen/arch/arm/vgic-v2.c +++ b/xen/arch/arm/vgic-v2.c @@ -721,6 +721,7 @@ int vgic_v2_init(struct domain *d) return -ENODEV; } + d->arch.vgic.mmio_count = 1; /* Only GICD region */ register_vgic_ops(d, &vgic_v2_ops); return 0; diff --git a/xen/arch/arm/vgic-v3.c b/xen/arch/arm/vgic-v3.c index e877e9e..472deac 100644 --- a/xen/arch/arm/vgic-v3.c +++ b/xen/arch/arm/vgic-v3.c @@ -1391,14 +1391,19 @@ static int vgic_v3_vcpu_init(struct vcpu *v) return 0; } +static inline unsigned int vgic_v3_rdist_count(struct domain *d) +{ + return is_hardware_domain(d) ? vgic_v3_hw.nr_rdist_regions : + GUEST_GICV3_RDIST_REGIONS; +} + static int vgic_v3_domain_init(struct domain *d) { struct vgic_rdist_region *rdist_regions; int rdist_count, i; /* Allocate memory for Re-distributor regions */ - rdist_count = is_hardware_domain(d) ? vgic_v3_hw.nr_rdist_regions : - GUEST_GICV3_RDIST_REGIONS; + rdist_count = vgic_v3_rdist_count(d); rdist_regions = xzalloc_array(struct vgic_rdist_region, rdist_count); if ( !rdist_regions ) @@ -1504,6 +1509,9 @@ int vgic_v3_init(struct domain *d) return -ENODEV; } + /* GICD region + number of Re-distributors */ + d->arch.vgic.mmio_count = vgic_v3_rdist_count(d) + 1; + register_vgic_ops(d, &v3_ops); return 0; diff --git a/xen/arch/arm/vgic.c b/xen/arch/arm/vgic.c index 7627eff..0658bfc 100644 --- a/xen/arch/arm/vgic.c +++ b/xen/arch/arm/vgic.c @@ -88,7 +88,7 @@ static void vgic_rank_init(struct vgic_irq_rank *rank, uint8_t index, rank->vcpu[i] = vcpu; } -static int domain_vgic_register(struct domain *d) +int domain_vgic_register(struct domain *d) { switch ( d->arch.vgic.version ) { @@ -124,10 +124,6 @@ int domain_vgic_init(struct domain *d, unsigned int nr_spis) d->arch.vgic.nr_spis = nr_spis; - ret = domain_vgic_register(d); - if ( ret < 0) - return ret; - spin_lock_init(&d->arch.vgic.lock); d->arch.vgic.shared_irqs = diff --git a/xen/include/asm-arm/domain.h b/xen/include/asm-arm/domain.h index 29346c6..b205461 100644 --- a/xen/include/asm-arm/domain.h +++ b/xen/include/asm-arm/domain.h @@ -111,6 +111,7 @@ struct arch_domain int nr_regions; /* Number of rdist regions */ uint32_t rdist_stride; /* Re-Distributor stride */ #endif + uint32_t mmio_count; /* Number of mmio handlers */ } vgic; struct vuart { diff --git a/xen/include/asm-arm/vgic.h b/xen/include/asm-arm/vgic.h index fbb763a..1ce441c 100644 --- a/xen/include/asm-arm/vgic.h +++ b/xen/include/asm-arm/vgic.h @@ -307,6 +307,7 @@ extern void register_vgic_ops(struct domain *d, const struct vgic_ops *ops); int vgic_v2_init(struct domain *d); int vgic_v3_init(struct domain *d); +extern int domain_vgic_register(struct domain *d); extern int vcpu_vgic_free(struct vcpu *v); extern int vgic_to_sgi(struct vcpu *v, register_t sgir, enum gic_sgi_mode irqmode, int virq, -- Qualcomm Technologies, Inc. on behalf of Qualcomm Innovation Center, Inc. Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |