[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v8 22/28] xen/arm: ITS: Allocate irq descriptors for LPIs
From: Vijaya Kumar K <Vijaya.Kumar@xxxxxxxxxxxxxxxxxx> Allocate dynamically irq descriptors for LPIs Signed-off-by: Vijaya Kumar K <Vijaya.Kumar@xxxxxxxxxxxxxxxxxx> --- v8: - Use gic_nr_irq_ids() instead of nr_lpis v6: - Add separate patch for irq_pending structures - renamed and moved is_domain_lpi to vgic - Updated __irq_to_domain --- xen/arch/arm/gic-v3-its.c | 4 ++++ xen/arch/arm/irq.c | 37 ++++++++++++++++++++++++++++++++++++- xen/include/asm-arm/irq.h | 1 + 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/xen/arch/arm/gic-v3-its.c b/xen/arch/arm/gic-v3-its.c index e495d4d..1dcfc39 100644 --- a/xen/arch/arm/gic-v3-its.c +++ b/xen/arch/arm/gic-v3-its.c @@ -1496,6 +1496,10 @@ int __init its_init(struct rdist_prop *rdists) its_alloc_lpi_tables(); its_lpi_init(rdists->id_bits); + /* Allocate irq descriptors for LPIs */ + if ( init_lpi() ) + return -ENOMEM; + its = list_first_entry(&its_nodes, struct its_node, entry); /* * As per vITS design spec, Xen exposes only one virtual ITS per domain. diff --git a/xen/arch/arm/irq.c b/xen/arch/arm/irq.c index 3baac5d..e4c6019 100644 --- a/xen/arch/arm/irq.c +++ b/xen/arch/arm/irq.c @@ -31,6 +31,8 @@ static unsigned int local_irqs_type[NR_LOCAL_IRQS]; static DEFINE_SPINLOCK(local_irqs_type_lock); +static irq_desc_t *irq_desc_lpi; + /* Describe an IRQ assigned to a guest */ struct irq_guest { @@ -61,7 +63,15 @@ static DEFINE_PER_CPU(irq_desc_t[NR_LOCAL_IRQS], local_irq_desc); irq_desc_t *__irq_to_desc(int irq) { if (irq < NR_LOCAL_IRQS) return &this_cpu(local_irq_desc)[irq]; - return &irq_desc[irq-NR_LOCAL_IRQS]; + else if ( gic_is_lpi(irq) ) + { + ASSERT(irq_desc_lpi != NULL); + return &irq_desc_lpi[irq - FIRST_GIC_LPI]; + } + else + return &irq_desc[irq - NR_LOCAL_IRQS]; + + return NULL; } int __init arch_init_one_irq_desc(struct irq_desc *desc) @@ -111,6 +121,31 @@ static int init_local_irq_data(void) return 0; } +int init_lpi(void) +{ + struct irq_desc *desc; + unsigned int i, nr_lpis; + + nr_lpis = gic_nr_irq_ids() - FIRST_GIC_LPI; + ASSERT(nr_lpis >= 0); + + /* Allocate LPI irq descriptors */ + irq_desc_lpi = xzalloc_array(struct irq_desc, nr_lpis); + if ( !irq_desc_lpi ) + return -ENOMEM; + + for ( i = 0; i < nr_lpis; i++ ) + { + desc = &irq_desc_lpi[i]; + init_one_irq_desc(desc); + desc->irq = FIRST_GIC_LPI + i; + desc->arch.type = DT_IRQ_TYPE_EDGE_BOTH; + desc->action = NULL; + } + + return 0; +} + void __init init_IRQ(void) { int irq; diff --git a/xen/include/asm-arm/irq.h b/xen/include/asm-arm/irq.h index 4bb9464..323f6c0 100644 --- a/xen/include/asm-arm/irq.h +++ b/xen/include/asm-arm/irq.h @@ -65,6 +65,7 @@ int platform_get_irq(const struct dt_device_node *device, int index); void irq_set_affinity(struct irq_desc *desc, const cpumask_t *cpu_mask); void irq_set_msi_desc(struct irq_desc *desc, struct msi_desc *msi); struct msi_desc *irq_get_msi_desc(struct irq_desc *desc); +int init_lpi(void); #endif /* _ASM_HW_IRQ_H */ /* -- 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 |