Message ID | 1484648454-21216-12-git-send-email-marc.zyngier@arm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Tue, 17 Jan 2017, Marc Zyngier wrote: > Just as for the property table, let's move the pending table > allocation to a separate function. > > Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Hi Marc, On 01/17/2017 04:20 AM, Marc Zyngier wrote: > Just as for the property table, let's move the pending table > allocation to a separate function. > > Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> > --- > drivers/irqchip/irq-gic-v3-its.c | 29 ++++++++++++++++++++--------- > 1 file changed, 20 insertions(+), 9 deletions(-) > > diff --git a/drivers/irqchip/irq-gic-v3-its.c > b/drivers/irqchip/irq-gic-v3-its.c > index 14305db1..dce8f8c 100644 > --- a/drivers/irqchip/irq-gic-v3-its.c > +++ b/drivers/irqchip/irq-gic-v3-its.c > @@ -1188,6 +1188,24 @@ static int its_alloc_collections(struct its_node > *its) > return 0; > } > > +static struct page *its_allocate_pending_table(gfp_t gfp_flags) > +{ PEND and PROP table sizes are defined as compile time macros, but as per ITS spec implementation 24bit LPI space is also possible. It would be nicer to parametrize both the tables sizes so that it would easier to enable 24bit LPI later. Actually Qualcomm server chips support 24bit IDBITS.
Hi Marc, On 17/01/2017 11:20, Marc Zyngier wrote: > Just as for the property table, let's move the pending table > allocation to a separate function. > > Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> Reviewed-by: Eric Auger <eric.auger@redhat.com> Thanks Eric > --- > drivers/irqchip/irq-gic-v3-its.c | 29 ++++++++++++++++++++--------- > 1 file changed, 20 insertions(+), 9 deletions(-) > > diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c > index 14305db1..dce8f8c 100644 > --- a/drivers/irqchip/irq-gic-v3-its.c > +++ b/drivers/irqchip/irq-gic-v3-its.c > @@ -1188,6 +1188,24 @@ static int its_alloc_collections(struct its_node *its) > return 0; > } > > +static struct page *its_allocate_pending_table(gfp_t gfp_flags) > +{ > + struct page *pend_page; > + /* > + * The pending pages have to be at least 64kB aligned, > + * hence the 'max(LPI_PENDBASE_SZ, SZ_64K)' below. > + */ > + pend_page = alloc_pages(gfp_flags | __GFP_ZERO, > + get_order(max(LPI_PENDBASE_SZ, SZ_64K))); > + if (!pend_page) > + return NULL; > + > + /* Make sure the GIC will observe the zero-ed page */ > + gic_flush_dcache_to_poc(page_address(pend_page), LPI_PENDBASE_SZ); > + > + return pend_page; > +} > + > static void its_cpu_init_lpis(void) > { > void __iomem *rbase = gic_data_rdist_rd_base(); > @@ -1198,21 +1216,14 @@ static void its_cpu_init_lpis(void) > pend_page = gic_data_rdist()->pend_page; > if (!pend_page) { > phys_addr_t paddr; > - /* > - * The pending pages have to be at least 64kB aligned, > - * hence the 'max(LPI_PENDBASE_SZ, SZ_64K)' below. > - */ > - pend_page = alloc_pages(GFP_NOWAIT | __GFP_ZERO, > - get_order(max(LPI_PENDBASE_SZ, SZ_64K))); > + > + pend_page = its_allocate_pending_table(GFP_NOWAIT); > if (!pend_page) { > pr_err("Failed to allocate PENDBASE for CPU%d\n", > smp_processor_id()); > return; > } > > - /* Make sure the GIC will observe the zero-ed page */ > - gic_flush_dcache_to_poc(page_address(pend_page), LPI_PENDBASE_SZ); > - > paddr = page_to_phys(pend_page); > pr_info("CPU%d: using LPI pending table @%pa\n", > smp_processor_id(), &paddr); >
diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c index 14305db1..dce8f8c 100644 --- a/drivers/irqchip/irq-gic-v3-its.c +++ b/drivers/irqchip/irq-gic-v3-its.c @@ -1188,6 +1188,24 @@ static int its_alloc_collections(struct its_node *its) return 0; } +static struct page *its_allocate_pending_table(gfp_t gfp_flags) +{ + struct page *pend_page; + /* + * The pending pages have to be at least 64kB aligned, + * hence the 'max(LPI_PENDBASE_SZ, SZ_64K)' below. + */ + pend_page = alloc_pages(gfp_flags | __GFP_ZERO, + get_order(max(LPI_PENDBASE_SZ, SZ_64K))); + if (!pend_page) + return NULL; + + /* Make sure the GIC will observe the zero-ed page */ + gic_flush_dcache_to_poc(page_address(pend_page), LPI_PENDBASE_SZ); + + return pend_page; +} + static void its_cpu_init_lpis(void) { void __iomem *rbase = gic_data_rdist_rd_base(); @@ -1198,21 +1216,14 @@ static void its_cpu_init_lpis(void) pend_page = gic_data_rdist()->pend_page; if (!pend_page) { phys_addr_t paddr; - /* - * The pending pages have to be at least 64kB aligned, - * hence the 'max(LPI_PENDBASE_SZ, SZ_64K)' below. - */ - pend_page = alloc_pages(GFP_NOWAIT | __GFP_ZERO, - get_order(max(LPI_PENDBASE_SZ, SZ_64K))); + + pend_page = its_allocate_pending_table(GFP_NOWAIT); if (!pend_page) { pr_err("Failed to allocate PENDBASE for CPU%d\n", smp_processor_id()); return; } - /* Make sure the GIC will observe the zero-ed page */ - gic_flush_dcache_to_poc(page_address(pend_page), LPI_PENDBASE_SZ); - paddr = page_to_phys(pend_page); pr_info("CPU%d: using LPI pending table @%pa\n", smp_processor_id(), &paddr);
Just as for the property table, let's move the pending table allocation to a separate function. Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> --- drivers/irqchip/irq-gic-v3-its.c | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-)