Consolidating GIC per-cpu interrupts
Subsystems (8)
cover Consolidating GIC per-cpu interrupts
The current GIC per-cpu interrupt (aka PPIs) suffers from a number of problems:
- It uses a completely separate scheme to handle the interrupts, mostly because the PPI concept doesn't really match the kernel view of an interrupt.
- Some low-level code gets duplicated, as usual...
- At least one platform (msm) has started implementing its own alternative scheme.
The proposed solution is to let the GIC code expose the PPIs as something that the kernel can manage. Instead of having a single interrupt number shared on all cores, make the interrupt number be different on each CPU.
This enables the use of the normal kernel API (request_irq() and friends) and the elimination of some low level code.
This patch set is based on 2.6.39-rc4, and depends on Will Deacon's GIC fasteoi patches. Tested on VExpress, PB-11MP, Pandaboard and SMDK-S5PV310.
Marc Zyngier (12):
ARM: gic: add per-cpu interrupt multiplexer
ARM: smp_twd: add support for remapped PPI interrupts
ARM: omap4: use remapped PPI interrupts for local timer
ARM: versatile: use remapped PPI interrupts for local timer
ARM: shmobile: use remapped PPI interrupts for local timer
ARM: ux500: use remapped PPI interrupts for local timer
ARM: tegra: use remapped PPI interrupts for local timer
ARM: msm: use remapped PPI interrupts for local timer
ARM: exynos4: use remapped PPI interrupts for local timer
ARM: gic: remove previous local timer interrupt handling
ARM: gic: add compute_irqnr macro for exynos4
ARM: SMP: automatically select ARM_GIC_VPPI
arch/arm/Kconfig | 1 + arch/arm/common/Kconfig | 5 + arch/arm/common/gic.c | 144 ++++++++++++++++++-- arch/arm/include/asm/entry-macro-multi.S | 7 - arch/arm/include/asm/hardware/entry-macro-gic.S | 31 ++--- arch/arm/include/asm/hardware/gic.h | 12 ++- arch/arm/include/asm/localtimer.h | 7 +- arch/arm/kernel/irq.c | 8 +- arch/arm/kernel/smp.c | 9 +- arch/arm/kernel/smp_twd.c | 15 ++- arch/arm/mach-exynos4/include/mach/entry-macro.S | 70 +--------- arch/arm/mach-exynos4/localtimer.c | 3 +- arch/arm/mach-msm/include/mach/entry-macro-qgic.S | 73 +---------- arch/arm/mach-msm/timer.c | 38 +++--- arch/arm/mach-omap2/include/mach/entry-macro.S | 14 +-- arch/arm/mach-omap2/timer-mpu.c | 3 +- arch/arm/mach-shmobile/entry-intc.S | 3 - arch/arm/mach-shmobile/include/mach/entry-macro.S | 3 - arch/arm/mach-shmobile/localtimer.c | 3 +- arch/arm/mach-tegra/localtimer.c | 3 +- arch/arm/mach-ux500/localtimer.c | 3 +- arch/arm/plat-versatile/localtimer.c | 3 +- 22 files changed, 223 insertions(+), 235 deletions(-)
RFC PATCH 1/12 ARM: gic: add per-cpu interrupt multiplexer
The kernel doesn't handle very well the concept of per-cpu interrupt as implemented by the ARM architecture (the same interrupt level is exposed on each core).
To work around the problem, add another irq_chip to handle PPIs and remap them so that a single interrupt number is only used on a given CPU (for example, IRQ 29 and 30 get exposed as IRQ 128 and 129 on core 0, 130 and 131 on core 1...).
A helper function gic_ppi_to_vppi() is used to convert the PPI number to the per-processor IRQ.
--- arch/arm/common/Kconfig | 5 ++ arch/arm/common/gic.c | 134 +++++++++++++++++++++++++++++++++-- arch/arm/include/asm/hardware/gic.h | 11 +++ arch/arm/kernel/irq.c | 8 ++- 4 files changed, 152 insertions(+), 6 deletions(-)
arch/arm/common/Kconfig +5 -0
@@ -1,6 +1,11 @@ config ARM_GIC bool +config ARM_GIC_VPPI + depends on ARM_GIC + select SPARSE_IRQ + bool + config ARM_VIC bool
arch/arm/common/gic.c +129 -5
175 lines not on this page · raw message
arch/arm/include/asm/hardware/gic.h +11 -0
@@ -33,6 +33,8 @@#define GIC_DIST_SOFTINT 0xf00#ifndef __ASSEMBLY__ +#include <linux/cpumask.h> +extern void __iomem *gic_cpu_base_addr;extern struct irq_chip gic_arch_extn;
@@ -41,6 +43,15 @@ void gic_secondary_init(unsigned int);void gic_cascade_irq (unsigned int gic_nr,unsigned int irq);void gic_raise_softirq (const struct cpumask *mask,unsigned int irq);void gic_enable_ppi (unsigned int ); +#ifdef CONFIG_ARM_GIC_VPPI +unsigned int gic_ppi_to_vppi (unsigned int irq); +#else +static inline unsigned int gic_ppi_to_vppi (unsigned int irq) +{ +return irq; +} +#endif +#endif #endif
arch/arm/kernel/irq.c +7 -1
@@ -124,8 +124,14 @@ void __init init_IRQ(void)#ifdef CONFIG_SPARSE_IRQ int __init arch_probe_nr_irqs (void ) { +int initcnt; + nr_irqs = machine_desc->nr_irqs ? machine_desc->nr_irqs :NR_IRQS ; -return nr_irqs; + initcnt = nr_irqs; +#ifdef CONFIG_ARM_GIC_VPPI + nr_irqs +=16 *8 ;/* 16 PPIs, 8 CPUs */ +#endif +return initcnt; }#endif
Signature · 1 line
1.7.0.4
RFC PATCH 1/12 ARM: gic: add per-cpu interrupt multiplexer
Quoted 5 lines · Marc Zyngier
arch/arm/common/gic.c +0
-0
arch/arm/common/gic.c struct gic_chip_data { · line 50
Quoted 9 lines
arch/arm/common/gic.c +5
-0@@ -42,6 +42,11 @@ struct gic_chip_data {unsigned int irq_offset;void __iomem *dist_base;void __iomem *cpu_base; +#ifdef CONFIG_ARM_GIC_VPPI +int ppi_base; +int vppi_base; +u16 nrppis; +#endif };
Can you put some document around this struct? Mention that ppi_base, vppi_base and nrppis will be zero for non-primary gic.
Quoted 70 lines
arch/arm/common/gic.c +0
-0static void __init gic_dist_init (struct gic_chip_data *gic,unsigned int irq_start){
arch/arm/common/gic.c +37
-5-unsigned int gic_irqs, irq_limit, i; +unsigned int gic_irqs, irq_limit, i, nrvppis =0 ;void __iomem *base = gic->dist_base;u32 cpumask =1 <<smp_processor_id (); +u32 dist_ctr, nrcpus; cpumask |= cpumask <<8 ; cpumask |= cpumask <<16 ;@@ -278,11 +359,32 @@ static void __init gic_dist_init(struct gic_chip_data *gic,* Find out how many interrupts are supported. * The GIC only supports up to 1020 interrupt sources. */ - gic_irqs =readl (base +GIC_DIST_CTR ) &0x1f ; - gic_irqs = (gic_irqs +1 ) *32 ; + dist_ctr =readl (base +GIC_DIST_CTR ); + gic_irqs = ((dist_ctr &0x1f ) +1 ) *32 ;if (gic_irqs >1020 ) gic_irqs =1020 ; +/* Find out how many CPUs are supported (8 max). */ + nrcpus = ((dist_ctr >>5 ) &7 ) +1 ; + +#ifdef CONFIG_ARM_GIC_VPPI +/* +* Nobody would be insane enough to use PPIs on a secondary +* GIC, right? +*/ +if (gic == &gic_data[0 ]) { + gic->nrppis =16 - (irq_start %16 ); + gic->ppi_base = gic->irq_offset +32 - gic->nrppis; + nrvppis = gic->nrppis * nrcpus; + }else { + gic->ppi_base =0 ; + gic->vppi_base =0 ; + } +#endif + +pr_info ("Configuring GIC with %d sources (%d additional PPIs)\n" , + gic_irqs, nrvppis); +/* * Set all global interrupts to be level triggered, active low. */ @@ -312,17 +414,39 @@ static void __init gic_dist_init(struct gic_chip_data *gic,* Limit number of interrupts registered to the platform maximum */ irq_limit = gic->irq_offset + gic_irqs; -if (WARN_ON (irq_limit >NR_IRQS )) +if (WARN_ON ((irq_limit) >NR_IRQS )) irq_limit =NR_IRQS ;/* * Setup the Linux IRQ subsystem. */ for (i = irq_start; i < irq_limit; i++) { -irq_set_chip_and_handler (i, &gic_chip, handle_fasteoi_irq); +#ifdef CONFIG_ARM_GIC_VPPI +if (nrvppis &&gic_irq_is_ppi (gic, i)) +irq_set_chip_and_handler (i, &gic_chip, gic_handle_ppi); + else +#endif + { +irq_set_chip_and_handler (i, &gic_chip, + handle_fasteoi_irq); +set_irq_flags (i,IRQF_VALID |IRQF_PROBE ); + } +irq_set_chip_data (i, gic);
arch/arm/common/gic.c static void __init gic_dist_init(struct gic_chip_data *gic, · line 444
Quoted 10 lines
arch/arm/common/gic.c +10
-0+ } + +#ifdef CONFIG_ARM_GIC_VPPI +if (!nrvppis) + goto out; + gic->vppi_base =irq_alloc_descs (-1 ,0 , nrvppis,0 ); +if (unlikely (WARN_ON (gic->vppi_base <0 ))) + goto out; +for (i = gic->vppi_base; i < (gic->vppi_base + nrvppis); i++) { +irq_set_chip_and_handler (i, &gic_ppi_chip, handle_fasteoi_irq);
Can we do with handle_percpu_irq instead of handle_fasteoi_irq?
--
Sent by an employee of the Qualcomm Innovation Center, Inc. The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
RFC PATCH 1/12 ARM: gic: add per-cpu interrupt multiplexer
Quoted 10 lines · On Mon, 25 Apr 2011 13:17:01 -0700 Abhijeet Dharmapurikar…
Quoted 9 lines · Marc Zyngier
arch/arm/common/gic.c +1
-0@@ -42,6 +42,11 @@ struct gic_chip_data {unsigned int irq_offset;void __iomem *dist_base;void __iomem *cpu_base; +#ifdef CONFIG_ARM_GIC_VPPI
Quoted 8 lines
arch/arm/common/gic.c struct gic_chip_data { · line 50
Quoted 5 lines
arch/arm/common/gic.c +4
-0+int ppi_base; +int vppi_base; +u16 nrppis; +#endif };Can you put some document around this struct? Mention that
ppi_base,vppi_baseand nrppis will be zero for non-primary gic.
Sure.
Quoted 74 lines
Quoted 74 lines
arch/arm/common/gic.c +0
-0static void __init gic_dist_init (struct gic_chip_data *gic,unsigned int irq_start){
arch/arm/common/gic.c +41
-5-unsigned int gic_irqs, irq_limit, i; +unsigned int gic_irqs, irq_limit, i, nrvppis =0 ;void __iomem *base = gic->dist_base;u32 cpumask =1 <<smp_processor_id (); +u32 dist_ctr, nrcpus; cpumask |= cpumask <<8 ; cpumask |= cpumask <<16 ;@@ -278,11 +359,32 @@ static void __init gic_dist_init(struct gic_chip_data *gic,* Find out how many interrupts are supported. * The GIC only supports up to 1020 interrupt sources. */ - gic_irqs =readl (base +GIC_DIST_CTR ) &0x1f ; - gic_irqs = (gic_irqs +1 ) *32 ; + dist_ctr =readl (base +GIC_DIST_CTR ); + gic_irqs = ((dist_ctr &0x1f ) +1 ) *32 ;if (gic_irqs >1020 ) gic_irqs =1020 ; +/* Find out how many CPUs are supported (8 max). */ + nrcpus = ((dist_ctr >>5 ) &7 ) +1 ; + +#ifdef CONFIG_ARM_GIC_VPPI +/* +* Nobody would be insane enough to use PPIs on a secondary +* GIC, right? +*/ +if (gic == &gic_data[0 ]) { + gic->nrppis =16 - (irq_start %16 ); + gic->ppi_base = gic->irq_offset +32 - gic->nrppis; + nrvppis = gic->nrppis * nrcpus; + }else { + gic->ppi_base =0 ; + gic->vppi_base =0 ; + } +#endif + +pr_info ("Configuring GIC with %d sources (%d additional PPIs)\n" , + gic_irqs, nrvppis); +/* * Set all global interrupts to be level triggered, active low. */ @@ -312,17 +414,39 @@ static void __init gic_dist_init(struct gic_chip_data *gic,* Limit number of interrupts registered to the platform maximum */ irq_limit = gic->irq_offset + gic_irqs; -if (WARN_ON (irq_limit >NR_IRQS )) +if (WARN_ON ((irq_limit) >NR_IRQS )) irq_limit =NR_IRQS ;/* * Setup the Linux IRQ subsystem. */ for (i = irq_start; i < irq_limit; i++) { -irq_set_chip_and_handler (i, &gic_chip, handle_fasteoi_irq); +#ifdef CONFIG_ARM_GIC_VPPI +if (nrvppis &&gic_irq_is_ppi (gic, i)) +irq_set_chip_and_handler (i, &gic_chip, gic_handle_ppi); + else +#endif + { +irq_set_chip_and_handler (i, &gic_chip, + handle_fasteoi_irq); +set_irq_flags (i,IRQF_VALID |IRQF_PROBE ); + } +irq_set_chip_data (i, gic); + } + +#ifdef CONFIG_ARM_GIC_VPPI +if (!nrvppis)
Quoted 8 lines
arch/arm/common/gic.c static void __init gic_dist_init(struct gic_chip_data *gic, · line 444
Quoted 6 lines
arch/arm/common/gic.c +6
-0+ goto out; + gic->vppi_base =irq_alloc_descs (-1 ,0 , nrvppis,0 ); +if (unlikely (WARN_ON (gic->vppi_base <0 ))) + goto out; +for (i = gic->vppi_base; i < (gic->vppi_base + nrvppis); i++) { +irq_set_chip_and_handler (i, &gic_ppi_chip, handle_fasteoi_irq);Can we do with
handle_percpu_irqinstead ofhandle_fasteoi_irq?
Ah, very good point. Should work just fine. Thanks for the suggestion!
M.
Signature · 1 line
I'm the slime oozin' out from your TV set...
RFC PATCH 1/12 ARM: gic: add per-cpu interrupt multiplexer
In reply to Marc ZyngierJust minor comments. I'm not a GIC or IRQ expert (yet).
arch/arm/common/gic.c static void __init gic_dist_init(struct gic_chip_data *gic, · line 417
Quoted 6 lines · Marc Zyngier
arch/arm/common/gic.c +1
-1@@ -312,17 +414,39 @@ static void __init gic_dist_init(struct gic_chip_data *gic,* Limit number of interrupts registered to the platform maximum */ irq_limit = gic->irq_offset + gic_irqs; -if (WARN_ON (irq_limit >NR_IRQS )) +if (WARN_ON ((irq_limit) >NR_IRQS ))
() are RFC leftovers?
Quoted 15 lines
arch/arm/common/gic.c +8
-1irq_limit =NR_IRQS ;/* * Setup the Linux IRQ subsystem. */ for (i = irq_start; i < irq_limit; i++) { -irq_set_chip_and_handler (i, &gic_chip, handle_fasteoi_irq); +#ifdef CONFIG_ARM_GIC_VPPI +if (nrvppis &&gic_irq_is_ppi (gic, i)) +irq_set_chip_and_handler (i, &gic_chip, gic_handle_ppi); + else +#endif + { +irq_set_chip_and_handler (i, &gic_chip, + handle_fasteoi_irq);
arch/arm/common/gic.c static void __init gic_dist_init(struct gic_chip_data *gic, · line 441
Quoted 10 lines
arch/arm/common/gic.c +10
-0+set_irq_flags (i,IRQF_VALID |IRQF_PROBE ); + } +irq_set_chip_data (i, gic); + } + +#ifdef CONFIG_ARM_GIC_VPPI +if (!nrvppis) + goto out; + gic->vppi_base =irq_alloc_descs (-1 ,0 , nrvppis,0 ); +if (unlikely (WARN_ON (gic->vppi_base <0 )))
WARN_ON should already have an unlikely in it.
Signature · 2 lines
Sent by an employee of the Qualcomm Innovation Center, Inc. The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
RFC PATCH 1/12 ARM: gic: add per-cpu interrupt multiplexer
Quoted 11 lines · On Mon, 25 Apr 2011 21:00:33 -0700 Stephen Boyd <[email protected]> wrote:
Just minor comments. I'm not a GIC or IRQ expert (yet).
arch/arm/common/gic.c static void __init gic_dist_init(struct gic_chip_data *gic, · line 417
Quoted 6 lines · Marc Zyngier
arch/arm/common/gic.c +1
-1@@ -312,17 +414,39 @@ static void __init gic_dist_init(struct gic_chip_data *gic,* Limit number of interrupts registered to the platform maximum */ irq_limit = gic->irq_offset + gic_irqs; -if (WARN_ON (irq_limit >NR_IRQS )) +if (WARN_ON ((irq_limit) >NR_IRQS ))() are RFC leftovers?
Just a fossil dating back from an early version of the patch. Will fix.
Quoted 19 lines
Quoted 19 lines
arch/arm/common/gic.c +12
-1irq_limit =NR_IRQS ;/* * Setup the Linux IRQ subsystem. */ for (i = irq_start; i < irq_limit; i++) { -irq_set_chip_and_handler (i, &gic_chip, handle_fasteoi_irq); +#ifdef CONFIG_ARM_GIC_VPPI +if (nrvppis &&gic_irq_is_ppi (gic, i)) +irq_set_chip_and_handler (i, &gic_chip, gic_handle_ppi); + else +#endif + { +irq_set_chip_and_handler (i, &gic_chip, + handle_fasteoi_irq); +set_irq_flags (i,IRQF_VALID |IRQF_PROBE ); + } +irq_set_chip_data (i, gic); + }
Quoted 8 lines
arch/arm/common/gic.c static void __init gic_dist_init(struct gic_chip_data *gic, · line 441
Quoted 6 lines
arch/arm/common/gic.c +6
-0+ +#ifdef CONFIG_ARM_GIC_VPPI +if (!nrvppis) + goto out; + gic->vppi_base =irq_alloc_descs (-1 ,0 , nrvppis,0 ); +if (unlikely (WARN_ON (gic->vppi_base <0 )))
WARN_ONshould already have an unlikely in it.
Good point. Will fix as well.
Thanks for reviewing,
M.
Signature · 1 line
I'm the slime oozin' out from your TV set...
RFC PATCH 2/12 ARM: smp_twd: add support for remapped PPI interrupts
In reply to Marc ZyngierWhen CONFIG_ARM_GIC_VPPI is enabled, let smp_twd request interrupts the normal way (ie using request_irq()).
This involves letting PPIs go via the same code path as SPIs and having normal interrupt handler for the local timer code.
The previous ad-hoc code is still supported when CONFIG_ARM_GIC_VPPI is not defined.
--- arch/arm/include/asm/entry-macro-multi.S | 2 +- arch/arm/include/asm/hardware/entry-macro-gic.S | 19 ++++++++++++------- arch/arm/include/asm/localtimer.h | 6 ++++++ arch/arm/kernel/smp.c | 10 ++++++++++ arch/arm/kernel/smp_twd.c | 16 +++++++++++++++- 5 files changed, 44 insertions(+), 9 deletions(-)
arch/arm/include/asm/entry-macro-multi.S +1 -1
@@ -24,7 +24,7 @@ adrne lr, BSYM(1b) bne do_IPI -#ifdef CONFIG_LOCAL_TIMERS +#if defined(CONFIG_LOCAL_TIMERS) && !defined(CONFIG_ARM_GIC_VPPI) test_for_ltirq r0, r6, r5, lr movne r0, sp adrne lr, BSYM(1b)
arch/arm/include/asm/hardware/entry-macro-gic.S +12 -7
@@ -17,23 +17,26 @@ .endm #endif +#ifdef CONFIG_ARM_GIC_VPPI +#define DO_IRQ_BASE 16 +#else +#define DO_IRQ_BASE 30 +#endif + /* * The interrupt numbering scheme is defined in the * interrupt controller spec. To wit: * * Interrupts 0-15 are IPI - * 16-28 are reserved - * 29-31 are local. We allow 30 to be used for the watchdog. + * 16-31 are local. We allow 30 to be used for the watchdog. * 32-1020 are global * 1021-1022 are reserved * 1023 is "spurious" (no interrupt) * - * For now, we ignore all local interrupts so only return an interrupt if it's - * between 30 and 1020. The test_for_ipi routine below will pick up on IPIs. - * * A simple read from the controller will tell us the number of the highest * priority enabled interrupt. We then just need to check whether it is in the - * valid range for an IRQ (30-1020 inclusive). + * valid range for an IRQ (30-1020 inclusive). If CONFIG_ARM_GIC_VPPI is + * enabled, local interrupts are handled the same way as global ones. */ .macro get_irqnr_and_base, irqnr, irqstat, base, tmp
@@ -43,7 +46,7 @@ ldr \tmp, =1021 bic \irqnr, \irqstat, #0x1c00 - cmp \irqnr, #29 + cmp \irqnr, #(DO_IRQ_BASE - 1) cmpcc \irqnr, \irqnr cmpne \irqnr, \tmp cmpcs \irqnr, \irqnr
@@ -63,6 +66,7 @@ cmpcs \irqnr, \irqnr .endm +#ifndef CONFIG_ARM_GIC_VPPI /* As above, this assumes that irqstat and base are preserved.. */ .macro test_for_ltirq, irqnr, irqstat, base, tmp
@@ -73,3 +77,4 @@ streq \irqstat, [\base, #GIC_CPU_EOI] cmp \tmp, #0 .endm +#endif
arch/arm/include/asm/localtimer.h +6 -0
@@ -10,6 +10,8 @@#ifndef __ASM_ARM_LOCALTIMER_H#define __ASM_ARM_LOCALTIMER_H +#include <linux/interrupt.h> +struct clock_event_device ;/*
@@ -22,6 +24,10 @@ void percpu_timer_setup(void);*/ asmlinkage void do_local_timer(struct pt_regs *); +/* +* Per-cpu timer IRQ handler +*/ +irqreturn_t percpu_timer_handler (int irq,void *dev_id);#ifdef CONFIG_LOCAL_TIMERS
arch/arm/kernel/smp.c +10 -0
@@ -452,6 +452,16 @@ asmlinkage void __exception_irq_entry do_local_timer(struct pt_regs *regs)set_irq_regs (old_regs); } +irqreturn_t percpu_timer_handler (int irq,void *dev_id) +{ +if (local_timer_ack ()) { +ipi_timer (); +return IRQ_HANDLED ; + } + +return IRQ_NONE ; +} +void show_local_irqs (struct seq_file *p,int prec) {unsigned int cpu;
arch/arm/kernel/smp_twd.c +15 -1
@@ -15,10 +15,11 @@#include <linux/smp.h> #include <linux/jiffies.h> #include <linux/clockchips.h> -#include <linux/irq.h> +#include <linux/interrupt.h> #include <linux/io.h> #include <asm/smp_twd.h> +#include <asm/localtimer.h> #include <asm/hardware/gic.h> /* set up by the platform code */
@@ -124,6 +125,8 @@ static void __cpuinit twd_calibrate_rate(void)*/ void __cpuinit twd_timer_setup (struct clock_event_device *clk) { +int err; +twd_calibrate_rate (); clk->name ="local_timer" ;
@@ -137,8 +140,19 @@ void __cpuinit twd_timer_setup(struct clock_event_device *clk) clk->max_delta_ns =clockevent_delta2ns (0xffffffff , clk); clk->min_delta_ns =clockevent_delta2ns (0xf , clk); +#ifdef CONFIG_ARM_GIC_VPPI + err =request_irq (clk->irq, percpu_timer_handler, +IRQF_PERCPU |IRQF_NOBALANCING |IRQF_TIMER , + clk->name, clk); +if (err) { +pr_err ("%s: can't register interrupt %d on cpu %d (%d)\n" , + clk->name, clk->irq,smp_processor_id (), err); +return ; + } +#else /* Make sure our local interrupt controller has this enabled */ gic_enable_ppi (clk->irq); +#endif clockevents_register_device (clk); }
Signature · 1 line
1.7.0.4
RFC PATCH 2/12 ARM: smp_twd: add support for remapped PPI interrupts
Quoted 68 lines · Marc Zyngier
arch/arm/include/asm/entry-macro-multi.S +1
-1@@ -24,7 +24,7 @@ adrne lr, BSYM(1b) bne do_IPI -#ifdef CONFIG_LOCAL_TIMERS +#if defined(CONFIG_LOCAL_TIMERS) && !defined(CONFIG_ARM_GIC_VPPI) test_for_ltirq r0, r6, r5, lr movne r0, sp adrne lr, BSYM(1b)arch/arm/include/asm/hardware/entry-macro-gic.S +11
-7@@ -17,23 +17,26 @@ .endm #endif +#ifdef CONFIG_ARM_GIC_VPPI +#define DO_IRQ_BASE 16 +#else +#define DO_IRQ_BASE 30 +#endif + /* * The interrupt numbering scheme is defined in the * interrupt controller spec. To wit: * * Interrupts 0-15 are IPI - * 16-28 are reserved - * 29-31 are local. We allow 30 to be used for the watchdog. + * 16-31 are local. We allow 30 to be used for the watchdog. * 32-1020 are global * 1021-1022 are reserved * 1023 is "spurious" (no interrupt) * - * For now, we ignore all local interrupts so only return an interrupt if it's - * between 30 and 1020. The test_for_ipi routine below will pick up on IPIs. - * * A simple read from the controller will tell us the number of the highest * priority enabled interrupt. We then just need to check whether it is in the - * valid range for an IRQ (30-1020 inclusive). + * valid range for an IRQ (30-1020 inclusive). If CONFIG_ARM_GIC_VPPI is + * enabled, local interrupts are handled the same way as global ones. */ .macro get_irqnr_and_base, irqnr, irqstat, base, tmp@@ -43,7 +46,7 @@ ldr \tmp, =1021 bic \irqnr, \irqstat, #0x1c00 - cmp \irqnr, #29 + cmp \irqnr, #(DO_IRQ_BASE - 1) cmpcc \irqnr, \irqnr cmpne \irqnr, \tmp cmpcs \irqnr, \irqnr@@ -63,6 +66,7 @@ cmpcs \irqnr, \irqnr .endm +#ifndef CONFIG_ARM_GIC_VPPI /* As above, this assumes that irqstat and base are preserved.. */ .macro test_for_ltirq, irqnr, irqstat, base, tmp
arch/arm/include/asm/hardware/entry-macro-gic.S line 80
Quoted 4 lines
arch/arm/include/asm/hardware/entry-macro-gic.S +1
-0@@ -73,3 +77,4 @@ streq \irqstat, [\base, #GIC_CPU_EOI] cmp \tmp, #0 .endm +#endif
I would expect these bits to be part of the first patch in this series because they're necessary to actually use the CONFIG_ARM_GIC_VPPI option. Can you move them to the first patch?
Signature · 2 lines
Sent by an employee of the Qualcomm Innovation Center, Inc. The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
RFC PATCH 2/12 ARM: smp_twd: add support for remapped PPI interrupts
On Mon, 25 Apr 2011 10:04:17 -0700
Stephen Boyd <[email protected]> wrote:
Hi Stephen,
Quoted 67 lines · Marc Zyngier
Quoted 66 lines
arch/arm/include/asm/entry-macro-multi.S +1
-1@@ -24,7 +24,7 @@ adrne lr, BSYM(1b) bne do_IPI -#ifdef CONFIG_LOCAL_TIMERS +#if defined(CONFIG_LOCAL_TIMERS) && !defined(CONFIG_ARM_GIC_VPPI) test_for_ltirq r0, r6, r5, lr movne r0, sp adrne lr, BSYM(1b)arch/arm/include/asm/hardware/entry-macro-gic.S +11
-7@@ -17,23 +17,26 @@ .endm #endif +#ifdef CONFIG_ARM_GIC_VPPI +#define DO_IRQ_BASE 16 +#else +#define DO_IRQ_BASE 30 +#endif + /* * The interrupt numbering scheme is defined in the * interrupt controller spec. To wit: * * Interrupts 0-15 are IPI - * 16-28 are reserved - * 29-31 are local. We allow 30 to be used for the watchdog. + * 16-31 are local. We allow 30 to be used for the watchdog. * 32-1020 are global * 1021-1022 are reserved * 1023 is "spurious" (no interrupt) * - * For now, we ignore all local interrupts so only return an interrupt if it's - * between 30 and 1020. The test_for_ipi routine below will pick up on IPIs. - * * A simple read from the controller will tell us the number of the highest * priority enabled interrupt. We then just need to check whether it is in the - * valid range for an IRQ (30-1020 inclusive). + * valid range for an IRQ (30-1020 inclusive). If CONFIG_ARM_GIC_VPPI is + * enabled, local interrupts are handled the same way as global ones. */ .macro get_irqnr_and_base, irqnr, irqstat, base, tmp@@ -43,7 +46,7 @@ ldr \tmp, =1021 bic \irqnr, \irqstat, #0x1c00 - cmp \irqnr, #29 + cmp \irqnr, #(DO_IRQ_BASE - 1) cmpcc \irqnr, \irqnr cmpne \irqnr, \tmp cmpcs \irqnr, \irqnr@@ -63,6 +66,7 @@ cmpcs \irqnr, \irqnr .endm +#ifndef CONFIG_ARM_GIC_VPPI /* As above, this assumes that irqstat and base are preserved.. */
Quoted 10 lines
arch/arm/include/asm/hardware/entry-macro-gic.S line 80
Quoted 6 lines
arch/arm/include/asm/hardware/entry-macro-gic.S +1
-0.macro test_for_ltirq, irqnr, irqstat, base, tmp@@ -73,3 +77,4 @@ streq \irqstat, [\base, #GIC_CPU_EOI] cmp \tmp, #0 .endm +#endifI would expect these bits to be part of the first patch in this series because they're necessary to actually use the
CONFIG_ARM_GIC_VPPIoption. Can you move them to the first patch?
I'd tend to agree with you, though local timer being the only user of PPIs, it doesn't matter that much... ;-)
I'll move these changes to the first patch on the next iteration of the patch set.
Thanks,
M.
Signature · 1 line
I'm the slime oozin' out from your TV set...
RFC PATCH 2/12 ARM: smp_twd: add support for remapped PPI interrupts
Quoted 8 lines · Marc Zyngier
I'd tend to agree with you, though local timer being the only user of PPIs, it doesn't matter that much... ;-)
I'll move these changes to the first patch on the next iteration of the patch set.
Thanks. It mattered to me when I only pulled down the first patch and the MSM patch and tested it out and was confused why the timer tick wasn't happening. MSM doesn't have the ARM twd.
Signature · 2 lines
Sent by an employee of the Qualcomm Innovation Center, Inc. The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
RFC PATCH 2/12 ARM: smp_twd: add support for remapped PPI interrupts
Quoted 8 lines · On Tue, 26 Apr 2011 09:21:59 -0700 Stephen Boyd <[email protected]> wrote:
Quoted 3 lines · Marc Zyngier
I'll move these changes to the first patch on the next iteration of the patch set.
Thanks. It mattered to me when I only pulled down the first patch and the MSM patch and tested it out and was confused why the timer tick wasn't happening. MSM doesn't have the ARM twd.
D'oh! Of course, this is a good reason to move this code to the first patch.
Thanks,
M.
Signature · 1 line
I'm the slime oozin' out from your TV set...
RFC PATCH 3/12 ARM: omap4: use remapped PPI interrupts for local timer
In reply to Marc ZyngierUse the normal interrupt scheme for the local timers by using a remapped PPI interrupt.
Tested on a Pandaboard.
--- arch/arm/mach-omap2/Kconfig | 1 + arch/arm/mach-omap2/include/mach/entry-macro.S | 14 +------------- arch/arm/mach-omap2/timer-mpu.c | 3 ++- 3 files changed, 4 insertions(+), 14 deletions(-)
arch/arm/mach-omap2/Kconfig +1 -0
@@ -44,6 +44,7 @@ config ARCH_OMAP4 depends on ARCH_OMAP2PLUS select CPU_V7 select ARM_GIC + select ARM_GIC_VPPI select LOCAL_TIMERS if SMP select PL310_ERRATA_588369 select PL310_ERRATA_727915
arch/arm/mach-omap2/include/mach/entry-macro.S +1 -13
@@ -78,7 +78,7 @@ 4401: ldr \irqstat, [\base, #GIC_CPU_INTACK] ldr \tmp, =1021 bic \irqnr, \irqstat, #0x1c00 - cmp \irqnr, #29 + cmp \irqnr, #15 cmpcc \irqnr, \irqnr cmpne \irqnr, \tmp cmpcs \irqnr, \irqnr
@@ -101,18 +101,6 @@ it cs cmpcs \irqnr, \irqnr .endm - - /* As above, this assumes that irqstat and base are preserved */ - - .macro test_for_ltirq, irqnr, irqstat, base, tmp - bic \irqnr, \irqstat, #0x1c00 - mov \tmp, #0 - cmp \irqnr, #29 - itt eq - moveq \tmp, #1 - streq \irqstat, [\base, #GIC_CPU_EOI] - cmp \tmp, #0 - .endm #endif /* CONFIG_SMP */ #else /* MULTI_OMAP2 */
arch/arm/mach-omap2/timer-mpu.c +2 -1
@@ -22,6 +22,7 @@#include <asm/irq.h> #include <asm/smp_twd.h> #include <asm/localtimer.h> +#include <asm/hardware/gic.h> /* * Setup the local clock events for a CPU.
@@ -32,7 +33,7 @@ int __cpuinit local_timer_setup(struct clock_event_device *evt)if (omap_rev () ==OMAP4430_REV_ES1_0 )return -ENXIO ; - evt->irq =OMAP44XX_IRQ_LOCALTIMER ; + evt->irq =gic_ppi_to_vppi (OMAP44XX_IRQ_LOCALTIMER );twd_timer_setup (evt);return 0 ; }
Signature · 1 line
1.7.0.4
RFC PATCH 3/12 ARM: omap4: use remapped PPI interrupts for local timer
Marc,
Quoted 9 lines · Marc Zyngier
Use the normal interrupt scheme for the local timers by using a remapped PPI interrupt.
Tested on a Pandaboard.
Cc Tony Lindgren<[email protected]>Cc Santosh Shilimkar<[email protected]>Signed-off-by Marc Zyngier<[email protected]>---
Have reviewed and tested your series along with OMAP changes. It boots fine on OMAP4430 SDP.
# cat /proc/interrupts
CPU0 CPU1
.
410: 3678 0 GIC-PPI local_timer
413: 0 1042 GIC-PPI local_timer
.
LOC: 0 0 Local timer interrupts
.Though above output would be bit miss leading, this series removes the duplicate code from platforms and consolidate it at one place.
FWIW, you can add my
Regards
Santosh
RFC PATCH 3/12 ARM: omap4: use remapped PPI interrupts for local timer
On Fri, 2011-04-29 at 12:54 +0530, Santosh Shilimkar wrote:
Hi Santosh,
Quoted 23 lines · Marc Zyngier
Quoted 9 lines
Use the normal interrupt scheme for the local timers by using a remapped PPI interrupt.
Tested on a Pandaboard.
Cc Tony Lindgren<[email protected]>Cc Santosh Shilimkar<[email protected]>Signed-off-by Marc Zyngier<[email protected]>---
Have reviewed and tested your series along with OMAP changes. It boots fine on OMAP4430 SDP.
# cat /proc/interrupts CPU0 CPU1 . 410: 3678 0 GIC-PPI local_timer 413: 0 1042 GIC-PPI local_timer . LOC: 0 0 Local timer interrupts .
Quoted 3 lines
Though above output would be bit miss leading, this series removes the duplicate code from platforms and consolidate it at one place.
The LOC line is gone in the next iteration of the patch serie.
Quoted 4 lines
FWIW, you can add my
Reviewedd-by Santosh Shilimkar <[email protected]>Tested-by Santosh Shilimkar <[email protected]>
Thanks for testing.
M.
Signature · 1 line
Reality is an implementation detail.
RFC PATCH 4/12 ARM: versatile: use remapped PPI interrupts for local timer
In reply to Marc ZyngierUse the normal interrupt scheme for the local timers by using a remapped PPI interrupt.
Tested on VExpress and PB-11MP.
--- arch/arm/mach-realview/Kconfig | 2 ++ arch/arm/mach-vexpress/Kconfig | 1 + arch/arm/plat-versatile/localtimer.c | 3 ++- 3 files changed, 5 insertions(+), 1 deletions(-)
arch/arm/mach-realview/Kconfig +2 -0
@@ -38,6 +38,7 @@ config MACH_REALVIEW_PB11MP bool "Support RealView(R) Platform Baseboard for ARM11MPCore" select CPU_V6K select ARM_GIC + select ARM_GIC_VPPI select HAVE_PATA_PLATFORM select ARCH_HAS_BARRIERS if SMP help
@@ -76,6 +77,7 @@ config MACH_REALVIEW_PBA8 config MACH_REALVIEW_PBX bool "Support RealView(R) Platform Baseboard Explore" select ARM_GIC + select ARM_GIC_VPPI select HAVE_PATA_PLATFORM select ARCH_SPARSEMEM_ENABLE if CPU_V7 && !REALVIEW_HIGH_PHYS_OFFSET select ZONE_DMA if SPARSEMEM
arch/arm/mach-vexpress/Kconfig +1 -0
@@ -5,6 +5,7 @@ config ARCH_VEXPRESS_CA9X4 bool "Versatile Express Cortex-A9x4 tile" select CPU_V7 select ARM_GIC + select ARM_GIC_VPPI select ARM_ERRATA_720789 select ARM_ERRATA_751472 select ARM_ERRATA_753970
arch/arm/plat-versatile/localtimer.c +2 -1
@@ -14,6 +14,7 @@#include <asm/smp_twd.h> #include <asm/localtimer.h> +#include <asm/hardware/gic.h> #include <mach/irqs.h> /*
@@ -21,7 +22,7 @@*/ int __cpuinit local_timer_setup (struct clock_event_device *evt) { - evt->irq =IRQ_LOCALTIMER ; + evt->irq =gic_ppi_to_vppi (IRQ_LOCALTIMER );twd_timer_setup (evt);return 0 ; }
Signature · 1 line
1.7.0.4
RFC PATCH 5/12 ARM: shmobile: use remapped PPI interrupts for local timer
In reply to Marc ZyngierUse the normal interrupt scheme for the local timers by using a remapped PPI interrupt.
--- arch/arm/mach-shmobile/Kconfig | 1 + arch/arm/mach-shmobile/entry-intc.S | 3 --- arch/arm/mach-shmobile/include/mach/entry-macro.S | 3 --- arch/arm/mach-shmobile/localtimer.c | 3 ++- 4 files changed, 3 insertions(+), 7 deletions(-)
arch/arm/mach-shmobile/Kconfig +1 -0
@@ -26,6 +26,7 @@ config ARCH_SH73A0 select SH_CLK_CPG select ARCH_WANT_OPTIONAL_GPIOLIB select ARM_GIC + select ARM_GIC_VPPI comment "SH-Mobile Board Type"
arch/arm/mach-shmobile/entry-intc.S +0 -3
@@ -51,7 +51,4 @@ .macro test_for_ipi, irqnr, irqstat, base, tmp .endm - .macro test_for_ltirq, irqnr, irqstat, base, tmp - .endm - arch_irq_handler shmobile_handle_irq_intc
arch/arm/mach-shmobile/include/mach/entry-macro.S +0 -3
@@ -27,8 +27,5 @@ .macro test_for_ipi, irqnr, irqstat, base, tmp .endm - .macro test_for_ltirq, irqnr, irqstat, base, tmp - .endm - .macro arch_ret_to_user, tmp1, tmp2 .endm
arch/arm/mach-shmobile/localtimer.c +2 -1
@@ -14,13 +14,14 @@#include <linux/clockchips.h> #include <asm/smp_twd.h> #include <asm/localtimer.h> +#include <asm/hardware/gic.h> /* * Setup the local clock events for a CPU. */ int __cpuinit local_timer_setup (struct clock_event_device *evt) { - evt->irq =29 ; + evt->irq =gic_ppi_to_vppi (29 );twd_timer_setup (evt);return 0 ; }
Signature · 1 line
1.7.0.4
RFC PATCH 6/12 ARM: ux500: use remapped PPI interrupts for local timer
In reply to Marc ZyngierUse the normal interrupt scheme for the local timers by using a remapped PPI interrupt.
--- arch/arm/mach-ux500/Kconfig | 1 + arch/arm/mach-ux500/localtimer.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletions(-)
arch/arm/mach-ux500/Kconfig +1 -0
@@ -4,6 +4,7 @@ config UX500_SOC_COMMON bool default y select ARM_GIC + select ARM_GIC_VPPI select HAS_MTU select NOMADIK_GPIO select ARM_ERRATA_753970
arch/arm/mach-ux500/localtimer.c +2 -1
@@ -17,13 +17,14 @@#include <asm/irq.h> #include <asm/smp_twd.h> #include <asm/localtimer.h> +#include <asm/hardware/gic.h> /* * Setup the local clock events for a CPU. */ int __cpuinit local_timer_setup (struct clock_event_device *evt) { - evt->irq =IRQ_LOCALTIMER ; + evt->irq =gic_ppi_to_vppi (IRQ_LOCALTIMER );twd_timer_setup (evt);return 0 ; }
Signature · 1 line
1.7.0.4
RFC PATCH 6/12 ARM: ux500: use remapped PPI interrupts for local timer
Quoted 24 lines
-----Original Message-----
From: Marc Zyngier [mailto:marc.zyngier at arm.com]
Sent: Thursday, April 21, 2011 12:38 AM
To: LAK
Cc: Srinidhi KASAGAR; Linus WALLEIJ
Subject: [RFC PATCH 06/12] ARM: ux500: use remapped PPI interrupts for local timerUse the normal interrupt scheme for the local timers by using a remapped PPI interrupt.
Cc Srinidhi Kasagar <[email protected]>Cc Linus Walleij <[email protected]>Signed-off-by Marc Zyngier <[email protected]>--- arch/arm/mach-ux500/Kconfig | 1 + arch/arm/mach-ux500/localtimer.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletions(-)arch/arm/mach-ux500/Kconfig +0
-0
arch/arm/mach-ux500/Kconfig config UX500_SOC_COMMON · line 7
Quoted 4 lines
arch/arm/mach-ux500/Kconfig +1
-0@@ -4,6 +4,7 @@ config UX500_SOC_COMMON bool default y select ARM_GIC + select ARM_GIC_VPPI
Here you added VPPI and in the other patch 12/12 you remove this again and make it one time selectable based on CONFIG_SMP. is that done just for readability purpose?
Otherwise, for mach-ux500:
srinidhi
RFC PATCH 6/12 ARM: ux500: use remapped PPI interrupts for local timer
Quoted 19 lines · Srinidhi KASAGAR
Quoted 19 lines
-----Original Message-----
From: Marc Zyngier [mailto:marc.zyngier at arm.com]
Sent: Thursday, April 21, 2011 12:38 AM
To: LAK
Cc: Srinidhi KASAGAR; Linus WALLEIJ
Subject: [RFC PATCH 06/12] ARM: ux500: use remapped PPI interrupts for local timerUse the normal interrupt scheme for the local timers by using a remapped PPI interrupt.
Cc Srinidhi Kasagar <[email protected]>Cc Linus Walleij <[email protected]>Signed-off-by Marc Zyngier <[email protected]>--- arch/arm/mach-ux500/Kconfig | 1 + arch/arm/mach-ux500/localtimer.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletions(-)
Quoted 13 lines
arch/arm/mach-ux500/Kconfig config UX500_SOC_COMMON · line 7
Quoted 9 lines
arch/arm/mach-ux500/Kconfig +1
-0@@ -4,6 +4,7 @@ config UX500_SOC_COMMON bool default y select ARM_GIC + select ARM_GIC_VPPIHere you added VPPI and in the other patch 12/12 you remove this again and make it one time selectable based on
CONFIG_SMP. is that done just for readability purpose?
This is in the interest of having a bisectable tree. Because I convert each platform one at a time, I cannot immediately make CONFIG_SMP select VPPI (that would break all the not-yet-converted platforms). Once all platforms are using VPPI, patch #12 does the cleanup for configuration.
Quoted 2 lines
Otherwise, for mach-ux500:
Acked-by Srinidhi Kasagar <[email protected]>
Thanks,
M.
Signature · 1 line
Reality is an implementation detail.
RFC PATCH 7/12 ARM: tegra: use remapped PPI interrupts for local timer
In reply to Marc ZyngierUse the normal interrupt scheme for the local timers by using a remapped PPI interrupt.
--- arch/arm/mach-tegra/Kconfig | 1 + arch/arm/mach-tegra/localtimer.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletions(-)
arch/arm/mach-tegra/Kconfig +1 -0
@@ -9,6 +9,7 @@ config ARCH_TEGRA_2x_SOC bool "Tegra 2 family" select CPU_V7 select ARM_GIC + select ARM_GIC_VPPI select ARCH_REQUIRE_GPIOLIB select USB_ARCH_HAS_EHCI if USB_SUPPORT select USB_ULPI if USB_SUPPORT
arch/arm/mach-tegra/localtimer.c +2 -1
@@ -14,13 +14,14 @@#include <asm/irq.h> #include <asm/smp_twd.h> #include <asm/localtimer.h> +#include <asm/hardware/gic.h> /* * Setup the local clock events for a CPU. */ int __cpuinit local_timer_setup (struct clock_event_device *evt) { - evt->irq =IRQ_LOCALTIMER ; + evt->irq =gic_ppi_to_vppi (IRQ_LOCALTIMER );twd_timer_setup (evt);return 0 ; }
Signature · 1 line
1.7.0.4
RFC PATCH 8/12 ARM: msm: use remapped PPI interrupts for local timer
In reply to Marc ZyngierUse the normal interrupt scheme for the local timers by using a remapped PPI interrupt.
MSM already had a very similar scheme, though still mixing both GIC-specific and generic APIs.
--- arch/arm/mach-msm/Kconfig | 2 + arch/arm/mach-msm/include/mach/entry-macro-qgic.S | 73 +-------------------- arch/arm/mach-msm/timer.c | 38 ++++++------ 3 files changed, 22 insertions(+), 91 deletions(-)
arch/arm/mach-msm/Kconfig +2 -0
@@ -42,6 +42,7 @@ config ARCH_MSM8X60 && !MACH_MSM8X60_FFA) select ARCH_MSM_SCORPIONMP select ARM_GIC + select ARM_GIC_VPPI select CPU_V7 select MSM_V2_TLMM select MSM_GPIOMUX
@@ -52,6 +53,7 @@ config ARCH_MSM8960 select ARCH_MSM_SCORPIONMP select MACH_MSM8960_SIM if (!MACH_MSM8960_RUMI3) select ARM_GIC + select ARM_GIC_VPPI select CPU_V7 select MSM_V2_TLMM select MSM_GPIOMUX
arch/arm/mach-msm/include/mach/entry-macro-qgic.S +1 -72
82 lines not on this page · raw message
arch/arm/mach-msm/timer.c +19 -19
@@ -23,6 +23,7 @@#include <linux/io.h> #include <asm/mach/time.h> +#include <asm/hardware/gic.h> #include <mach/msm_iomap.h> #include <mach/cpu.h>
@@ -67,8 +68,8 @@ enum timer_location {struct msm_clock {struct clock_event_device clockevent;struct clocksource clocksource; -struct irqaction irq;void __iomem *regbase; +unsigned int irq;uint32_t freq;uint32_t shift;void __iomem *global_counter;
@@ -163,13 +164,7 @@ static struct msm_clock msm_clocks[] = { .mask = CLOCKSOURCE_MASK(32), .flags = CLOCK_SOURCE_IS_CONTINUOUS, }, - .irq = { - .name = "gp_timer", - .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_TRIGGER_RISING, - .handler = msm_timer_interrupt, - .dev_id = &msm_clocks[0].clockevent, - .irq =INT_GP_TIMER_EXP - }, + .irq = INT_GP_TIMER_EXP, .freq = GPT_HZ, }, [MSM_CLOCK_DGT] = {
@@ -188,13 +183,7 @@ static struct msm_clock msm_clocks[] = { .mask = CLOCKSOURCE_MASK((32 - MSM_DGT_SHIFT)), .flags = CLOCK_SOURCE_IS_CONTINUOUS, }, - .irq = { - .name = "dg_timer", - .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_TRIGGER_RISING, - .handler = msm_timer_interrupt, - .dev_id = &msm_clocks[1].clockevent, - .irq =INT_DEBUG_TIMER_EXP - }, + .irq = INT_DEBUG_TIMER_EXP, .freq = DGT_HZ >> MSM_DGT_SHIFT, .shift = MSM_DGT_SHIFT, }
@@ -232,6 +221,7 @@ static void __init msm_timer_init(void)struct msm_clock *clock = &msm_clocks[i];struct clock_event_device *ce = &clock->clockevent;struct clocksource *cs = &clock->clocksource; +int irq; clock->local_counter = clock->regbase +TIMER_COUNT_VAL ; clock->global_counter = clock->local_counter + global_offset;
@@ -253,10 +243,13 @@ static void __init msm_timer_init(void)printk (KERN_ERR "msm_timer_init: clocksource_register " "failed for %s\n" , cs->name); - res =setup_irq (clock->irq.irq, &clock->irq); + irq =gic_ppi_to_vppi (clock->irq); + res =request_irq (irq, msm_timer_interrupt, +IRQF_TIMER |IRQF_NOBALANCING |IRQF_TRIGGER_RISING , + clock->name, &clock->clockevent);if (res) -printk (KERN_ERR "msm_timer_init: setup_irq " -"failed for %s\n" , cs->name); +pr_err ("msm_timer_init: request_irq failed for %s\n" , + clock->name);clockevents_register_device (ce); }
@@ -292,7 +285,14 @@ int __cpuinit local_timer_setup(struct clock_event_device *evt) local_clock_event = evt; -gic_enable_ppi (clock->irq.irq); + res =request_irq (gic_ppi_to_vppi (irq), msm_timer_interrupt, +IRQF_TIMER |IRQF_NOBALANCING |IRQF_TRIGGER_RISING , + clock->name, &clock->clockevent); +if (res) { +pr_err ("local_timer_setup: request_irq failed for %s\n" , + clock->name); +return err; + }clockevents_register_device (evt);return 0 ;
Signature · 1 line
1.7.0.4
RFC PATCH 8/12 ARM: msm: use remapped PPI interrupts for local timer
Quoted 13 lines · Marc Zyngier
arch/arm/mach-msm/timer.c +1
-0@@ -23,6 +23,7 @@#include <linux/io.h> #include <asm/mach/time.h> +#include <asm/hardware/gic.h> #include <mach/msm_iomap.h> #include <mach/cpu.h>
arch/arm/mach-msm/timer.c enum timer_location { · line 72
Quoted 6 lines
arch/arm/mach-msm/timer.c +1
-1@@ -67,8 +68,8 @@ enum timer_location {struct msm_clock {struct clock_event_device clockevent;struct clocksource clocksource; -struct irqaction irq;void __iomem *regbase; +unsigned int irq;
I don't know why this moved down below regbase, but ok.
arch/arm/mach-msm/timer.c int __cpuinit local_timer_setup(struct clock_event_device *evt) · line 286
Quoted 3 lines
arch/arm/mach-msm/timer.c +0
-0@@ -292,7 +285,14 @@ int __cpuinit local_timer_setup(struct clock_event_device *evt) local_clock_event = evt;
I think we can get rid of this variable now. We should be able to pass evt to request_irq() and use that in the interrupt handler. See far below.
This patch doesn't compile for me though. I applied the below fixup:
8<---------------
arch/arm/mach-msm/timer.c +6 -8
@@ -246,10 +246,10 @@ static void __init msm_timer_init(void) irq =gic_ppi_to_vppi (clock->irq); res =request_irq (irq, msm_timer_interrupt,IRQF_TIMER |IRQF_NOBALANCING |IRQF_TRIGGER_RISING , - clock->name, &clock->clockevent); + ce->name, ce);if (res)pr_err ("msm_timer_init: request_irq failed for %s\n" , - clock->name); + ce->name);clockevents_register_device (ce); }
@@ -258,6 +258,7 @@ static void __init msm_timer_init(void)#ifdef CONFIG_SMP int __cpuinit local_timer_setup (struct clock_event_device *evt) { +int res;struct msm_clock *clock = &msm_clocks[MSM_GLOBAL_TIMER ];/* Use existing clock_event for cpu 0 */
@@ -271,7 +272,7 @@ int __cpuinit local_timer_setup(struct clock_event_device *evt)writel (0 , clock->regbase +TIMER_CLEAR );writel (~0 , clock->regbase +TIMER_MATCH_VAL ); } - evt->irq = clock->irq.irq; + evt->irq =gic_ppi_to_vppi (clock->irq); evt->name ="local_timer" ; evt->features =CLOCK_EVT_FEAT_ONESHOT ; evt->rating = clock->clockevent.rating;
@@ -285,13 +286,13 @@ int __cpuinit local_timer_setup(struct clock_event_device *evt) local_clock_event = evt; - res =request_irq (gic_ppi_to_vppi (irq), msm_timer_interrupt, + res =request_irq (evt->irq, msm_timer_interrupt,IRQF_TIMER |IRQF_NOBALANCING |IRQF_TRIGGER_RISING , - clock->name, &clock->clockevent); + clock->clockevent.name, &clock->clockevent);if (res) { pr_err("local_timer_setup: request_irq failed for %s\n", - clock->name); -return err; ----
And then I figured that we shouldn't be overriding the irq handler for the PPIs anymore in msm code so I applied this patch (not sure about handle_percpu_irq though, see Abhijeet's response):
8<--------------
arch/arm/mach-msm/board-msm8x60.c +0 -11
@@ -42,8 +42,6 @@ static struct platform_device *devices[] __initdata = {static void __init msm8x60_init_irq (void ) { -unsigned int i; -gic_init (0 ,GIC_PPI_START ,MSM_QGIC_DIST_BASE , (void *)MSM_QGIC_CPU_BASE );
@@ -55,15 +53,6 @@ static void __init msm8x60_init_irq(void)*/ if (!machine_is_msm8x60_sim ())writel (0x0000FFFF ,MSM_QGIC_DIST_BASE +GIC_DIST_ENABLE_SET ); - -/* FIXME: Not installing AVS_SVICINT and AVS_SVICINTSWDONE yet -* as they are configured as level, which does not play nice with -* handle_percpu_irq. -*/ -for (i =GIC_PPI_START ; i <GIC_SPI_START ; i++) { -if (i !=AVS_SVICINT && i !=AVS_SVICINTSWDONE ) -irq_set_handler (i, handle_percpu_irq); - } }
---
And then well I thought maybe we could apply this patch on top to actually pass the clockevent to msm_timer_interrupt() instead of statically limiting ourselves to one local clockevent (and only two cores):
8<------------
arch/arm/mach-msm/timer.c +4 -11
@@ -84,13 +84,10 @@ enum {static struct msm_clock msm_clocks[]; -static struct clock_event_device *local_clock_event;static irqreturn_t msm_timer_interrupt (int irq,void *dev_id) {struct clock_event_device *evt = dev_id; -if (smp_processor_id () !=0 ) - evt = local_clock_event;if (evt->event_handler ==NULL )return IRQ_HANDLED ; evt->event_handler (evt);
@@ -267,11 +264,9 @@ int __cpuinit local_timer_setup(struct clock_event_device *evt)writel (DGT_CLK_CTL_DIV_4 ,MSM_TMR_BASE +DGT_CLK_CTL ); -if (!local_clock_event) { -writel (0 , clock->regbase +TIMER_ENABLE ); -writel (0 , clock->regbase +TIMER_CLEAR ); -writel (~0 , clock->regbase +TIMER_MATCH_VAL ); - } +writel (0 , clock->regbase +TIMER_ENABLE ); +writel (0 , clock->regbase +TIMER_CLEAR ); +writel (~0 , clock->regbase +TIMER_MATCH_VAL ); evt->irq =gic_ppi_to_vppi (clock->irq); evt->name ="local_timer" ; evt->features =CLOCK_EVT_FEAT_ONESHOT ;
@@ -284,11 +279,9 @@ int __cpuinit local_timer_setup(struct clock_event_device *evt)clockevent_delta2ns (0xf0000000 >> clock->shift, evt); evt->min_delta_ns =clockevent_delta2ns (4 , evt); - local_clock_event = evt; - res =request_irq (evt->irq, msm_timer_interrupt,IRQF_TIMER |IRQF_NOBALANCING |IRQF_TRIGGER_RISING , - clock->clockevent.name, &clock->clockevent); + clock->clockevent.name, evt);if (res) {pr_err ("local_timer_setup: request_irq failed for %s\n" , clock->clockevent.name);
---
So after all that it looks like it sort of works (at least it boots and sits at a console). I actually wanted to do something like this a few days ago and by coincidence you've done it. Telepathy? Perhaps.
I found one issue. I don't quite understand it, but we call local_timer_setup() on each cpu hotplug add event, and thus the request_irq() call is going to fail the second time you hotplug add a cpu. Simplest fix I see is to have a flag so we don't do boot stuff more than once (similar to our check for !local_clock_event which I mistakenly dropped up there for the wrong reason!).
Why do we need to call local_timer_setup() on each CPU up though? It would be nice to be able to just add local timers for all possible CPUs at boot time and then have the clockevents core take care of enabling and disabling the events as appropriate without ARM code forcing the events to be UNUSED and then re-adding the events back on CPU up. I'm probably missing something really obvious here.
Signature · 2 lines
Sent by an employee of the Qualcomm Innovation Center, Inc. The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
RFC PATCH 8/12 ARM: msm: use remapped PPI interrupts for local timer
On Tue, 2011-04-26 at 10:13 -0700, Stephen Boyd wrote:
Hi Stephen,
Quoted 178 lines · Marc Zyngier
Quoted 13 lines
arch/arm/mach-msm/timer.c +1
-0@@ -23,6 +23,7 @@#include <linux/io.h> #include <asm/mach/time.h> +#include <asm/hardware/gic.h> #include <mach/msm_iomap.h> #include <mach/cpu.h> arch/arm/mach-msm/timer.c enum timer_location { · line 72
Quoted 6 lines
arch/arm/mach-msm/timer.c +1
-1@@ -67,8 +68,8 @@ enum timer_location {struct msm_clock {struct clock_event_device clockevent;struct clocksource clocksource; -struct irqaction irq;void __iomem *regbase; +unsigned int irq;I don't know why this moved down below regbase, but ok.
arch/arm/mach-msm/timer.c int __cpuinit local_timer_setup(struct clock_event_device *evt) · line 286
Quoted 3 lines
arch/arm/mach-msm/timer.c +0
-0@@ -292,7 +285,14 @@ int __cpuinit local_timer_setup(struct clock_event_device *evt) local_clock_event = evt;I think we can get rid of this variable now. We should be able to pass evt to
request_irq()and use that in the interrupt handler. See far below.This patch doesn't compile for me though. I applied the below fixup:
8<---------------
arch/arm/mach-msm/timer.c +6
-8@@ -246,10 +246,10 @@ static void __init msm_timer_init(void) irq =gic_ppi_to_vppi (clock->irq); res =request_irq (irq, msm_timer_interrupt,IRQF_TIMER |IRQF_NOBALANCING |IRQF_TRIGGER_RISING , - clock->name, &clock->clockevent); + ce->name, ce);if (res)pr_err ("msm_timer_init: request_irq failed for %s\n" , - clock->name); + ce->name);clockevents_register_device (ce); }@@ -258,6 +258,7 @@ static void __init msm_timer_init(void)#ifdef CONFIG_SMP int __cpuinit local_timer_setup (struct clock_event_device *evt) { +int res;struct msm_clock *clock = &msm_clocks[MSM_GLOBAL_TIMER ];/* Use existing clock_event for cpu 0 */ @@ -271,7 +272,7 @@ int __cpuinit local_timer_setup(struct clock_event_device *evt)writel (0 , clock->regbase +TIMER_CLEAR );writel (~0 , clock->regbase +TIMER_MATCH_VAL ); } - evt->irq = clock->irq.irq; + evt->irq =gic_ppi_to_vppi (clock->irq); evt->name ="local_timer" ; evt->features =CLOCK_EVT_FEAT_ONESHOT ; evt->rating = clock->clockevent.rating;@@ -285,13 +286,13 @@ int __cpuinit local_timer_setup(struct clock_event_device *evt) local_clock_event = evt; - res =request_irq (gic_ppi_to_vppi (irq), msm_timer_interrupt, + res =request_irq (evt->irq, msm_timer_interrupt,IRQF_TIMER |IRQF_NOBALANCING |IRQF_TRIGGER_RISING , - clock->name, &clock->clockevent); + clock->clockevent.name, &clock->clockevent);if (res) { pr_err("local_timer_setup: request_irq failed for %s\n", - clock->name); -return err; ----And then I figured that we shouldn't be overriding the irq handler for the PPIs anymore in msm code so I applied this patch (not sure about
handle_percpu_irqthough, see Abhijeet's response):8<--------------
arch/arm/mach-msm/board-msm8x60.c +0
-12@@ -42,8 +42,6 @@ static struct platform_device *devices[] __initdata = {static void __init msm8x60_init_irq (void ) { -unsigned int i; -gic_init (0 ,GIC_PPI_START ,MSM_QGIC_DIST_BASE , (void *)MSM_QGIC_CPU_BASE );@@ -55,15 +53,6 @@ static void __init msm8x60_init_irq(void)*/ if (!machine_is_msm8x60_sim ())writel (0x0000FFFF ,MSM_QGIC_DIST_BASE +GIC_DIST_ENABLE_SET ); - -/* FIXME: Not installing AVS_SVICINT and AVS_SVICINTSWDONE yet -* as they are configured as level, which does not play nice with -* handle_percpu_irq. -*/ -for (i =GIC_PPI_START ; i <GIC_SPI_START ; i++) { -if (i !=AVS_SVICINT && i !=AVS_SVICINTSWDONE ) -irq_set_handler (i, handle_percpu_irq); - } } ---And then well I thought maybe we could apply this patch on top to actually pass the clockevent to
msm_timer_interrupt()instead of statically limiting ourselves to one local clockevent (and only two cores):8<------------
arch/arm/mach-msm/timer.c +4
-12@@ -84,13 +84,10 @@ enum {static struct msm_clock msm_clocks[]; -static struct clock_event_device *local_clock_event;static irqreturn_t msm_timer_interrupt (int irq,void *dev_id) {struct clock_event_device *evt = dev_id; -if (smp_processor_id () !=0 ) - evt = local_clock_event;if (evt->event_handler ==NULL )return IRQ_HANDLED ; evt->event_handler (evt);@@ -267,11 +264,9 @@ int __cpuinit local_timer_setup(struct clock_event_device *evt)writel (DGT_CLK_CTL_DIV_4 ,MSM_TMR_BASE +DGT_CLK_CTL ); -if (!local_clock_event) { -writel (0 , clock->regbase +TIMER_ENABLE ); -writel (0 , clock->regbase +TIMER_CLEAR ); -writel (~0 , clock->regbase +TIMER_MATCH_VAL ); - } +writel (0 , clock->regbase +TIMER_ENABLE ); +writel (0 , clock->regbase +TIMER_CLEAR ); +writel (~0 , clock->regbase +TIMER_MATCH_VAL ); evt->irq =gic_ppi_to_vppi (clock->irq); evt->name ="local_timer" ; evt->features =CLOCK_EVT_FEAT_ONESHOT ;@@ -284,11 +279,9 @@ int __cpuinit local_timer_setup(struct clock_event_device *evt)clockevent_delta2ns (0xf0000000 >> clock->shift, evt); evt->min_delta_ns =clockevent_delta2ns (4 , evt); - local_clock_event = evt; - res =request_irq (evt->irq, msm_timer_interrupt,IRQF_TIMER |IRQF_NOBALANCING |IRQF_TRIGGER_RISING , - clock->clockevent.name, &clock->clockevent); + clock->clockevent.name, evt);if (res) {pr_err ("local_timer_setup: request_irq failed for %s\n" , clock->clockevent.name); ---
Quoted 3 lines
So after all that it looks like it sort of works (at least it boots and sits at a console). I actually wanted to do something like this a few days ago and by coincidence you've done it. Telepathy? Perhaps.
Thanks for having a look at all of this. I think the lack of an MSM platform shows here... Can I fold your patches into mine?
I think that this kind of cleanup crossed the mind of anyone having to deal with local timers on more than one platform. I just got fed up quicker... ;-)
Quoted 7 lines
I found one issue. I don't quite understand it, but we call
local_timer_setup()on each cpu hotplug add event, and thus therequest_irq()call is going to fail the second time you hotplug add a cpu. Simplest fix I see is to have a flag so we don't do boot stuff more than once (similar to our check for !local_clock_event which I mistakenly dropped up there for the wrong reason!).
Quoted 7 lines
Why do we need to call
local_timer_setup()on each CPU up though? It would be nice to be able to just add local timers for all possible CPUs at boot time and then have the clockevents core take care of enabling and disabling the events as appropriate without ARM code forcing the events to be UNUSED and then re-adding the events back on CPU up. I'm probably missing something really obvious here.
This need to be investigated indeed. I'm seeing a nice crash on my OMAP4 while bringing a CPU back up, and I suspect it might be the same root cause.
M.
Signature · 3 lines
Reality is an implementation detail. -- IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.
RFC PATCH 8/12 ARM: msm: use remapped PPI interrupts for local timer
Quoted 3 lines · Marc Zyngier
Thanks for having a look at all of this. I think the lack of an MSM platform shows here... Can I fold your patches into mine?
Sure, just leave out this hunk:
- if (!local_clock_event) {
- writel(0, clock->regbase + TIMER_ENABLE); - writel(0, clock->regbase + TIMER_CLEAR); - writel(~0, clock->regbase + TIMER_MATCH_VAL);
- }
and add a bool or something to make sure these lines don't get executed more than once. Hopefully you get the idea.
Signature · 2 lines
Sent by an employee of the Qualcomm Innovation Center, Inc. The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
RFC PATCH 8/12 ARM: msm: use remapped PPI interrupts for local timer
In reply to Stephen BoydQuoted 6 lines · Stephen Boyd
Why do we need to call
local_timer_setup()on each CPU up though? It would be nice to be able to just add local timers for all possible CPUs at boot time and then have the clockevents core take care of enabling and disabling the events as appropriate without ARM code forcing the events to be UNUSED and then re-adding the events back on CPU up. I'm probably missing something really obvious here.
Firstly, because you can't access the local timer registers from non- local CPUs. Secondly, when you offline a CPU, generic code unregisters the local timer, so whenever you online a CPU you have to add its local timer clockevent back again.
Thirdly, you may have a system where the local timer gets powered down when a CPU is offlined, and so it would need reinitialization when you online it again.
RFC PATCH 8/12 ARM: msm: use remapped PPI interrupts for local timer
Quoted 7 lines · Russell King - ARM Linux
Quoted 6 lines · Stephen Boyd
Why do we need to call
local_timer_setup()on each CPU up though? It would be nice to be able to just add local timers for all possible CPUs at boot time and then have the clockevents core take care of enabling and disabling the events as appropriate without ARM code forcing the events to be UNUSED and then re-adding the events back on CPU up. I'm probably missing something really obvious here.
Quoted 8 lines
Firstly, because you can't access the local timer registers from non- local CPUs. Secondly, when you offline a CPU, generic code unregisters the local timer, so whenever you online a CPU you have to add its local timer clockevent back again.
Thirdly, you may have a system where the local timer gets powered down when a CPU is offlined, and so it would need reinitialization when you online it again.
Ok that all sounds fine and good. Thanks.
I took a peek at the APB timer on x86 and I see that apbt_setup_irq() does an
if (system_state == SYSTEM_BOOTING) {
if (request_irq(adev->irq, apbt_interrupt_handler,which is probably exactly what we want to do to handle the crash I'm talking about. They also do a memcpy() of the clockevent and what looks like a disable_irq() on CPU_DEAD which might all be good ideas.
Signature · 2 lines
Sent by an employee of the Qualcomm Innovation Center, Inc. The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
RFC PATCH 8/12 ARM: msm: use remapped PPI interrupts for local timer
Quoted 10 lines · Stephen Boyd
I took a peek at the APB timer on x86 and I see that
apbt_setup_irq()does anif (system_state == SYSTEM_BOOTING) { if (request_irq(adev->irq, apbt_interrupt_handler,which is probably exactly what we want to do to handle the crash I'm talking about.
This won't work right with the maxcpus commandline option set to something lower than the number of cpus present on the system. This option controls how many cpus the system tries to bring up during boot, while still allowing one to hotplug the rest of them later. If you do hotplug them later, system_state will no longer be SYSTEM_BOOTING, and this code won't do what it needs to do.
Signature · 2 lines
Sent by an employee of the Qualcomm Innovation Center, Inc. The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
RFC PATCH 8/12 ARM: msm: use remapped PPI interrupts for local timer
Quoted 7 lines · Jeff Ohlstein
This won't work right with the maxcpus commandline option set to something lower than the number of cpus present on the system. This option controls how many cpus the system tries to bring up during boot, while still allowing one to hotplug the rest of them later. If you do hotplug them later,
system_statewill no longer beSYSTEM_BOOTING, and this code won't do what it needs to do.
Hmm the documentation isn't very clear there. I see in Documentation/cpu-hotplug.txt that maxcpus=n means:
Restrict boot time cpus to n. Say if you have 4 cpus, using maxcpus=2 will only boot 2. You can choose to bring the other cpus later online, read FAQ's for more info.
and then Documentation/kernel-parameters.txt says:
[SMP] Maximum number of processors that an SMP kernel should make use of. maxcpus=n : n >= 0 limits the kernel to using 'n' processors. n=0 is a special case, it is equivalent to "nosmp", which also disables the IO APIC.
which doesn't agree. That should be reconciled.
RFC PATCH 9/12 ARM: exynos4: use remapped PPI interrupts for local timer
In reply to Marc ZyngierUse the normal interrupt scheme for the local timers by using a remapped PPI interrupt.
Tested on a SMDK-S5PV310 board.
--- arch/arm/mach-exynos4/include/mach/entry-macro.S | 12 +----------- arch/arm/mach-exynos4/localtimer.c | 3 ++- arch/arm/plat-s5p/Kconfig | 1 + 3 files changed, 4 insertions(+), 12 deletions(-)
arch/arm/mach-exynos4/include/mach/entry-macro.S +1 -11
@@ -50,7 +50,7 @@ bic \irqnr, \irqstat, #0x1c00 - cmp \irqnr, #29 + cmp \irqnr, #15 cmpcc \irqnr, \irqnr cmpne \irqnr, \tmp cmpcs \irqnr, \irqnr
@@ -72,13 +72,3 @@ cmpcs \irqnr, \irqnr .endm - /* As above, this assumes that irqstat and base are preserved.. */ - - .macro test_for_ltirq, irqnr, irqstat, base, tmp - bic \irqnr, \irqstat, #0x1c00 - mov \tmp, #0 - cmp \irqnr, #29 - moveq \tmp, #1 - streq \irqstat, [\base, #GIC_CPU_EOI] - cmp \tmp, #0 - .endm
arch/arm/mach-exynos4/localtimer.c +2 -1
@@ -14,13 +14,14 @@#include <asm/irq.h> #include <asm/localtimer.h> +#include <asm/hardware/gic.h> /* * Setup the local clock events for a CPU. */ int __cpuinit local_timer_setup (struct clock_event_device *evt) { - evt->irq =IRQ_LOCALTIMER ; + evt->irq =gic_ppi_to_vppi (IRQ_LOCALTIMER );twd_timer_setup (evt);return 0 ; }
arch/arm/plat-s5p/Kconfig +1 -0
@@ -11,6 +11,7 @@ config PLAT_S5P default y select ARM_VIC if !ARCH_EXYNOS4 select ARM_GIC if ARCH_EXYNOS4 + select ARM_GIC_VPPI if ARCH_EXYNOS4 select NO_IOPORT select ARCH_REQUIRE_GPIOLIB select S3C_GPIO_TRACK
Signature · 1 line
1.7.0.4
RFC PATCH 10/12 ARM: gic: remove previous local timer interrupt handling
In reply to Marc ZyngierNow that all users of local timers are using CONFIG_ARM_GIC_VPPI, the now unused local timer infrastructure can be safely removed.
--- arch/arm/common/gic.c | 10 ---------- arch/arm/include/asm/entry-macro-multi.S | 7 ------- arch/arm/include/asm/hardware/entry-macro-gic.S | 13 ------------- arch/arm/include/asm/hardware/gic.h | 1 - arch/arm/include/asm/localtimer.h | 5 ----- arch/arm/kernel/smp.c | 13 ------------- arch/arm/kernel/smp_twd.c | 5 ----- 7 files changed, 0 insertions(+), 54 deletions(-)
arch/arm/common/gic.c +0 -10
@@ -500,16 +500,6 @@ void __cpuinit gic_secondary_init(unsigned int gic_nr)gic_cpu_init (&gic_data[gic_nr]); } -void __cpuinit gic_enable_ppi (unsigned int irq) -{ -unsigned long flags; - -local_irq_save (flags); -irq_set_status_flags (irq,IRQ_NOPROBE ); -gic_unmask_irq (irq_get_irq_data (irq)); -local_irq_restore (flags); -} -#ifdef CONFIG_SMP void gic_raise_softirq (const struct cpumask *mask,unsigned int irq) {
arch/arm/include/asm/entry-macro-multi.S +0 -7
@@ -23,13 +23,6 @@ movne r1, sp adrne lr, BSYM(1b) bne do_IPI - -#if defined(CONFIG_LOCAL_TIMERS) && !defined(CONFIG_ARM_GIC_VPPI) - test_for_ltirq r0, r6, r5, lr - movne r0, sp - adrne lr, BSYM(1b) - bne do_local_timer -#endif #endif 9997: .endm
arch/arm/include/asm/hardware/entry-macro-gic.S +0 -13
@@ -65,16 +65,3 @@ strcc \irqstat, [\base, #GIC_CPU_EOI] cmpcs \irqnr, \irqnr .endm - -#ifndef CONFIG_ARM_GIC_VPPI -/* As above, this assumes that irqstat and base are preserved.. */ - - .macro test_for_ltirq, irqnr, irqstat, base, tmp - bic \irqnr, \irqstat, #0x1c00 - mov \tmp, #0 - cmp \irqnr, #29 - moveq \tmp, #1 - streq \irqstat, [\base, #GIC_CPU_EOI] - cmp \tmp, #0 - .endm -#endif
arch/arm/include/asm/hardware/gic.h +0 -1
@@ -42,7 +42,6 @@ void gic_init(unsigned int, unsigned int, void __iomem *, void __iomem *);void gic_secondary_init (unsigned int );void gic_cascade_irq (unsigned int gic_nr,unsigned int irq);void gic_raise_softirq (const struct cpumask *mask,unsigned int irq); -void gic_enable_ppi (unsigned int );#ifdef CONFIG_ARM_GIC_VPPI unsigned int gic_ppi_to_vppi (unsigned int irq);#else
arch/arm/include/asm/localtimer.h +0 -5
@@ -20,11 +20,6 @@ struct clock_event_device;void percpu_timer_setup (void );/* -* Called from assembly, this is the local timer IRQ handler -*/ -asmlinkage void do_local_timer(struct pt_regs *); - -/* * Per-cpu timer IRQ handler */ irqreturn_t percpu_timer_handler (int irq,void *dev_id);
arch/arm/kernel/smp.c +0 -13
@@ -439,19 +439,6 @@ static void ipi_timer(void) }#ifdef CONFIG_LOCAL_TIMERS -asmlinkage void __exception_irq_entry do_local_timer(struct pt_regs *regs) -{ -struct pt_regs *old_regs =set_irq_regs (regs); -int cpu =smp_processor_id (); - -if (local_timer_ack ()) { -__inc_irq_stat (cpu, local_timer_irqs); -ipi_timer (); - } - -set_irq_regs (old_regs); -} -irqreturn_t percpu_timer_handler (int irq,void *dev_id) {if (local_timer_ack ()) {
arch/arm/kernel/smp_twd.c +0 -5
@@ -140,7 +140,6 @@ void __cpuinit twd_timer_setup(struct clock_event_device *clk) clk->max_delta_ns =clockevent_delta2ns (0xffffffff , clk); clk->min_delta_ns =clockevent_delta2ns (0xf , clk); -#ifdef CONFIG_ARM_GIC_VPPI err =request_irq (clk->irq, percpu_timer_handler,IRQF_PERCPU |IRQF_NOBALANCING |IRQF_TIMER , clk->name, clk);
@@ -149,10 +148,6 @@ void __cpuinit twd_timer_setup(struct clock_event_device *clk) clk->name, clk->irq, smp_processor_id(), err);return ; } -#else -/* Make sure our local interrupt controller has this enabled */ -gic_enable_ppi (clk->irq); -#endif clockevents_register_device (clk); }
Signature · 1 line
1.7.0.4
RFC PATCH 11/12 ARM: gic: add compute_irqnr macro for exynos4
In reply to Marc Zyngierexynos4 has a full copy of entry-macro-gic.S, just for the sake of an offset added to the IRQ number read from the GIC.
Add a compute_irqnr macro to entry-macro-gic.S so that any platform can add it's own hook without having to copy the whole file again.
--- arch/arm/include/asm/hardware/entry-macro-gic.S | 3 + arch/arm/mach-exynos4/include/mach/entry-macro.S | 60 ++-------------------- 2 files changed, 8 insertions(+), 55 deletions(-)
arch/arm/include/asm/hardware/entry-macro-gic.S +3 -0
@@ -50,6 +50,9 @@ cmpcc \irqnr, \irqnr cmpne \irqnr, \tmp cmpcs \irqnr, \irqnr +#ifdef HAVE_GIC_BASE_OFFSET + compute_irqnr \irqnr, \tmp +#endif .endm /* We assume that irqstat (the raw value of the IRQ acknowledge
arch/arm/mach-exynos4/include/mach/entry-macro.S +5 -55
71 lines not on this page · raw message
Signature · 1 line
1.7.0.4
RFC PATCH 12/12 ARM: SMP: automatically select ARM_GIC_VPPI
In reply to Marc ZyngierAll SMP platforms are selecting ARM_GIC_VPPI.
Instead, make SMP select ARM_GIC_VPPI and remove select statements from the platform code.
--- arch/arm/Kconfig | 1 + arch/arm/mach-msm/Kconfig | 2 -- arch/arm/mach-omap2/Kconfig | 1 - arch/arm/mach-realview/Kconfig | 2 -- arch/arm/mach-shmobile/Kconfig | 1 - arch/arm/mach-tegra/Kconfig | 1 - arch/arm/mach-ux500/Kconfig | 1 - arch/arm/mach-vexpress/Kconfig | 1 - arch/arm/plat-s5p/Kconfig | 1 - 9 files changed, 1 insertions(+), 10 deletions(-)
arch/arm/Kconfig +1 -0
@@ -1327,6 +1327,7 @@ config SMP ARCH_EXYNOS4 || ARCH_TEGRA || ARCH_U8500 || ARCH_VEXPRESS_CA9X4 || \ ARCH_MSM_SCORPIONMP || ARCH_SHMOBILE select USE_GENERIC_SMP_HELPERS + select ARM_GIC_VPPI select HAVE_ARM_SCU if !ARCH_MSM_SCORPIONMP help This enables support for systems with more than one CPU. If you have
arch/arm/mach-msm/Kconfig +0 -2
@@ -42,7 +42,6 @@ config ARCH_MSM8X60 && !MACH_MSM8X60_FFA) select ARCH_MSM_SCORPIONMP select ARM_GIC - select ARM_GIC_VPPI select CPU_V7 select MSM_V2_TLMM select MSM_GPIOMUX
@@ -53,7 +52,6 @@ config ARCH_MSM8960 select ARCH_MSM_SCORPIONMP select MACH_MSM8960_SIM if (!MACH_MSM8960_RUMI3) select ARM_GIC - select ARM_GIC_VPPI select CPU_V7 select MSM_V2_TLMM select MSM_GPIOMUX
arch/arm/mach-omap2/Kconfig +0 -1
@@ -44,7 +44,6 @@ config ARCH_OMAP4 depends on ARCH_OMAP2PLUS select CPU_V7 select ARM_GIC - select ARM_GIC_VPPI select LOCAL_TIMERS if SMP select PL310_ERRATA_588369 select PL310_ERRATA_727915
arch/arm/mach-realview/Kconfig +0 -2
@@ -38,7 +38,6 @@ config MACH_REALVIEW_PB11MP bool "Support RealView(R) Platform Baseboard for ARM11MPCore" select CPU_V6K select ARM_GIC - select ARM_GIC_VPPI select HAVE_PATA_PLATFORM select ARCH_HAS_BARRIERS if SMP help
@@ -77,7 +76,6 @@ config MACH_REALVIEW_PBA8 config MACH_REALVIEW_PBX bool "Support RealView(R) Platform Baseboard Explore" select ARM_GIC - select ARM_GIC_VPPI select HAVE_PATA_PLATFORM select ARCH_SPARSEMEM_ENABLE if CPU_V7 && !REALVIEW_HIGH_PHYS_OFFSET select ZONE_DMA if SPARSEMEM
arch/arm/mach-shmobile/Kconfig +0 -1
@@ -26,7 +26,6 @@ config ARCH_SH73A0 select SH_CLK_CPG select ARCH_WANT_OPTIONAL_GPIOLIB select ARM_GIC - select ARM_GIC_VPPI comment "SH-Mobile Board Type"
arch/arm/mach-tegra/Kconfig +0 -1
@@ -9,7 +9,6 @@ config ARCH_TEGRA_2x_SOC bool "Tegra 2 family" select CPU_V7 select ARM_GIC - select ARM_GIC_VPPI select ARCH_REQUIRE_GPIOLIB select USB_ARCH_HAS_EHCI if USB_SUPPORT select USB_ULPI if USB_SUPPORT
arch/arm/mach-ux500/Kconfig +0 -1
@@ -4,7 +4,6 @@ config UX500_SOC_COMMON bool default y select ARM_GIC - select ARM_GIC_VPPI select HAS_MTU select NOMADIK_GPIO select ARM_ERRATA_753970
arch/arm/mach-vexpress/Kconfig +0 -1
@@ -5,7 +5,6 @@ config ARCH_VEXPRESS_CA9X4 bool "Versatile Express Cortex-A9x4 tile" select CPU_V7 select ARM_GIC - select ARM_GIC_VPPI select ARM_ERRATA_720789 select ARM_ERRATA_751472 select ARM_ERRATA_753970
arch/arm/plat-s5p/Kconfig +0 -1
@@ -11,7 +11,6 @@ config PLAT_S5P default y select ARM_VIC if !ARCH_EXYNOS4 select ARM_GIC if ARCH_EXYNOS4 - select ARM_GIC_VPPI if ARCH_EXYNOS4 select NO_IOPORT select ARCH_REQUIRE_GPIOLIB select S3C_GPIO_TRACK
Signature · 1 line
1.7.0.4