[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v6 17/31] xen/arm: ITS: Store LPIs allocated and IRQ ID bits per domain
From: Vijaya Kumar K <Vijaya.Kumar@xxxxxxxxxxxxxxxxxx> Store number of lpis and number of id bits in vgic structure Signed-off-by: Vijaya Kumar K <Vijaya.Kumar@xxxxxxxxxxxxxxxxxx> --- xen/arch/arm/irq.c | 9 +++++++++ xen/arch/arm/vgic-v3-its.c | 2 ++ xen/arch/arm/vgic.c | 12 ++++++++++++ xen/include/asm-arm/domain.h | 3 +++ xen/include/asm-arm/irq.h | 3 +++ 5 files changed, 29 insertions(+) diff --git a/xen/arch/arm/irq.c b/xen/arch/arm/irq.c index 24c4f24..93e9411 100644 --- a/xen/arch/arm/irq.c +++ b/xen/arch/arm/irq.c @@ -31,6 +31,15 @@ static unsigned int local_irqs_type[NR_LOCAL_IRQS]; static DEFINE_SPINLOCK(local_irqs_type_lock); +/* Number of LPI supported in XEN */ +/* + * LPI number start from 8192. Minimum number of bits + * required to represent 8192 is 13 bits. So to Support LPIs minimum + * 14 bits are required which can represent maximum LPI 16384. + * 16384 - 8192 = 8192. Minimum number of LPIs supported is 8192 + */ +unsigned int nr_lpis = 8192; + /* Describe an IRQ assigned to a guest */ struct irq_guest { diff --git a/xen/arch/arm/vgic-v3-its.c b/xen/arch/arm/vgic-v3-its.c index fabbad0..cef6139 100644 --- a/xen/arch/arm/vgic-v3-its.c +++ b/xen/arch/arm/vgic-v3-its.c @@ -547,6 +547,8 @@ int vits_domain_init(struct domain *d) ASSERT(is_hardware_domain(d)); + d->arch.vgic.nr_lpis = nr_lpis; + d->arch.vgic.vits = xzalloc(struct vgic_its); if ( !d->arch.vgic.vits ) return -ENOMEM; diff --git a/xen/arch/arm/vgic.c b/xen/arch/arm/vgic.c index e28c30d..6b6bbce 100644 --- a/xen/arch/arm/vgic.c +++ b/xen/arch/arm/vgic.c @@ -72,8 +72,10 @@ int domain_vgic_init(struct domain *d, unsigned int nr_spis) { int i; int ret; + unsigned int irq_lines; d->arch.vgic.ctlr = 0; + d->arch.vgic.nr_lpis = 0; /* Limit the number of virtual SPIs supported to (1020 - 32) = 988 */ if ( nr_spis > (1020 - NR_LOCAL_IRQS) ) @@ -130,6 +132,16 @@ int domain_vgic_init(struct domain *d, unsigned int nr_spis) for ( i = 0; i < NR_GIC_SGI; i++ ) set_bit(i, d->arch.vgic.allocated_irqs); + irq_lines = d->arch.vgic.nr_spis + 32; + /* + * If LPIs are supported, then just overwrite nr_spis + * in computing id_bits. + */ + if ( d->arch.vgic.nr_lpis != 0 ) + irq_lines = d->arch.vgic.nr_lpis + FIRST_GIC_LPI; + + d->arch.vgic.id_bits = get_count_order(irq_lines); + return 0; } diff --git a/xen/include/asm-arm/domain.h b/xen/include/asm-arm/domain.h index 986a4d6..269e4bb 100644 --- a/xen/include/asm-arm/domain.h +++ b/xen/include/asm-arm/domain.h @@ -93,6 +93,9 @@ struct arch_domain spinlock_t lock; int ctlr; int nr_spis; /* Number of SPIs */ + int nr_lpis; /* Number of LPIs */ + /* Number of bits required to represent IRQs(SPIs+LPIs) */ + int id_bits; unsigned long *allocated_irqs; /* bitmap of IRQs allocated */ struct vgic_irq_rank *shared_irqs; /* diff --git a/xen/include/asm-arm/irq.h b/xen/include/asm-arm/irq.h index bddd1ea..ff37234 100644 --- a/xen/include/asm-arm/irq.h +++ b/xen/include/asm-arm/irq.h @@ -33,6 +33,9 @@ struct msi_desc { #define nr_static_irqs NR_LINE_IRQS #define arch_hwdom_irqs(domid) NR_LINE_IRQS +/* Number of LPI supported */ +extern unsigned int nr_lpis; + struct irq_desc; struct irqaction; -- 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 |