ARM: SMP: pass an ipi number to smp_cross_call()
authorRussell King <rmk+kernel@arm.linux.org.uk>
Mon, 15 Nov 2010 09:42:08 +0000 (09:42 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Fri, 3 Dec 2010 08:26:30 +0000 (08:26 +0000)
This allows us to use smp_cross_call() to trigger a number of different
software generated interrupts, rather than combining them all on one
SGI.  Recover the SGI number via do_IPI.

Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
15 files changed:
arch/arm/include/asm/smp.h
arch/arm/kernel/entry-armv.S
arch/arm/kernel/smp.c
arch/arm/mach-msm/include/mach/smp.h
arch/arm/mach-omap2/omap-smp.c
arch/arm/mach-realview/include/mach/smp.h
arch/arm/mach-realview/platsmp.c
arch/arm/mach-s5pv310/include/mach/smp.h
arch/arm/mach-s5pv310/platsmp.c
arch/arm/mach-tegra/include/mach/smp.h
arch/arm/mach-ux500/include/mach/smp.h
arch/arm/mach-ux500/platsmp.c
arch/arm/mach-vexpress/include/mach/smp.h
arch/arm/mach-vexpress/platsmp.c
arch/arm/plat-omap/include/plat/smp.h

index 3d05190797cbf515a9c85f33ac49f98818b76cb6..da7e7ca53cc1dc6b114225608ed532a1c8fa8da0 100644 (file)
@@ -38,7 +38,7 @@ extern void show_ipi_list(struct seq_file *p);
 /*
  * Called from assembly code, this handles an IPI.
  */
-asmlinkage void do_IPI(struct pt_regs *regs);
+asmlinkage void do_IPI(int ipinr, struct pt_regs *regs);
 
 /*
  * Setup the set of possible CPUs (via set_cpu_possible)
@@ -53,7 +53,7 @@ extern void smp_store_cpu_info(unsigned int cpuid);
 /*
  * Raise an IPI cross call on CPUs in callmap.
  */
-extern void smp_cross_call(const struct cpumask *mask);
+extern void smp_cross_call(const struct cpumask *mask, int ipi);
 
 /*
  * Boot a secondary CPU, and assign it the specified idle task.
index c09e3573c5deb5795042eb1073f210472b0eadbc..955cf5f539ed958b7fb0e625e16f187af909dd97 100644 (file)
@@ -48,7 +48,7 @@
         */
        ALT_SMP(test_for_ipi r0, r6, r5, lr)
        ALT_UP_B(9997f)
-       movne   r0, sp
+       movne   r1, sp
        adrne   lr, BSYM(1b)
        bne     do_IPI
 
index 8c1959590252e7161f1da38497eddba9b0538afb..7a236db03fb553f591408d8a8b0b2d5ec2ebb591 100644 (file)
@@ -404,7 +404,7 @@ static void send_ipi_message(const struct cpumask *mask, enum ipi_msg_type msg)
        /*
         * Call the platform specific cross-CPU call function.
         */
-       smp_cross_call(mask);
+       smp_cross_call(mask, 1);
 
        local_irq_restore(flags);
 }
@@ -537,14 +537,8 @@ static void ipi_cpu_stop(unsigned int cpu)
 
 /*
  * Main handler for inter-processor interrupts
- *
- * For ARM, the ipimask now only identifies a single
- * category of IPI (Bit 1 IPIs have been replaced by a
- * different mechanism):
- *
- *  Bit 0 - Inter-processor function call
  */
-asmlinkage void __exception do_IPI(struct pt_regs *regs)
+asmlinkage void __exception do_IPI(int ipinr, struct pt_regs *regs)
 {
        unsigned int cpu = smp_processor_id();
        struct ipi_data *ipi = &per_cpu(ipi_data, cpu);
index 3ff7bf5e679ec7b00efbd08a3a44af8d4cbebfc6..a95f7b9efe31b3d8e2e95a2d76c561df69d2e657 100644 (file)
@@ -31,9 +31,9 @@
 
 #include <asm/hardware/gic.h>
 
-static inline void smp_cross_call(const struct cpumask *mask)
+static inline void smp_cross_call(const struct cpumask *mask, int ipi)
 {
-       gic_raise_softirq(mask, 1);
+       gic_raise_softirq(mask, ipi);
 }
 
 #endif
index 9e9f70e18e3c95436cf6b957e2791175a3cdc90a..56a8bce247c89a8c39604e866dc8d1235dcbd1a0 100644 (file)
@@ -76,7 +76,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
        omap_modify_auxcoreboot0(0x200, 0xfffffdff);
        flush_cache_all();
        smp_wmb();
-       smp_cross_call(cpumask_of(cpu));
+       smp_cross_call(cpumask_of(cpu), 1);
 
        /*
         * Now the secondary core is starting up let it run its
index d3cd265cb058c4acf0d29c4a14a16e097aa1ee55..d1aa70415a4e13664e822f2a4c50da4646b99809 100644 (file)
@@ -7,9 +7,9 @@
 /*
  * We use IRQ1 as the IPI
  */
-static inline void smp_cross_call(const struct cpumask *mask)
+static inline void smp_cross_call(const struct cpumask *mask, int ipi)
 {
-       gic_raise_softirq(mask, 1);
+       gic_raise_softirq(mask, ipi);
 }
 
 #endif
index 009265818d55752aa401ad8bde837d59a6b89ea5..af3d9093390b6db6e3fc63003d35dcf55760a0fa 100644 (file)
@@ -116,7 +116,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
         * Use smp_cross_call() for this, since there's little
         * point duplicating the code here
         */
-       smp_cross_call(cpumask_of(cpu));
+       smp_cross_call(cpumask_of(cpu), 1);
 
        timeout = jiffies + (1 * HZ);
        while (time_before(jiffies, timeout)) {
index b7ec252384f47059f681ddad95c1d183ad8b39dc..2897747bcb07b6f23ee172294d6199b4b22adc2b 100644 (file)
@@ -14,9 +14,9 @@ extern void __iomem *gic_cpu_base_addr;
 /*
  * We use IRQ1 as the IPI
  */
-static inline void smp_cross_call(const struct cpumask *mask)
+static inline void smp_cross_call(const struct cpumask *mask, int ipi)
 {
-       gic_raise_softirq(mask, 1);
+       gic_raise_softirq(mask, ipi);
 }
 
 #endif
index d357c198edee308112bc3633256376ca69720abb..d474426f37b7549ba544b68f9da8f80d44d3624d 100644 (file)
@@ -97,7 +97,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
         * the boot monitor to read the system wide flags register,
         * and branch to the address found there.
         */
-       smp_cross_call(cpumask_of(cpu));
+       smp_cross_call(cpumask_of(cpu), 1);
 
        timeout = jiffies + (1 * HZ);
        while (time_before(jiffies, timeout)) {
index d3cd265cb058c4acf0d29c4a14a16e097aa1ee55..d1aa70415a4e13664e822f2a4c50da4646b99809 100644 (file)
@@ -7,9 +7,9 @@
 /*
  * We use IRQ1 as the IPI
  */
-static inline void smp_cross_call(const struct cpumask *mask)
+static inline void smp_cross_call(const struct cpumask *mask, int ipi)
 {
-       gic_raise_softirq(mask, 1);
+       gic_raise_softirq(mask, ipi);
 }
 
 #endif
index 197e8417375e17f38942e443a963a686cb90905b..bd57c50a5b86005f1996bff3aae2383e03bcfb67 100644 (file)
@@ -18,8 +18,8 @@ extern void u8500_secondary_startup(void);
 /*
  * We use IRQ1 as the IPI
  */
-static inline void smp_cross_call(const struct cpumask *mask)
+static inline void smp_cross_call(const struct cpumask *mask, int ipi)
 {
-       gic_raise_softirq(mask, 1);
+       gic_raise_softirq(mask, ipi);
 }
 #endif
index 9e4c678de78593a248c9010a4eb8e0edcb4cb4dc..b8987bd212497828a9b601410683e62826a4d38d 100644 (file)
@@ -78,7 +78,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
        __cpuc_flush_dcache_area((void *)&pen_release, sizeof(pen_release));
        outer_clean_range(__pa(&pen_release), __pa(&pen_release) + 1);
 
-       smp_cross_call(cpumask_of(cpu));
+       smp_cross_call(cpumask_of(cpu), 1);
 
        timeout = jiffies + (1 * HZ);
        while (time_before(jiffies, timeout)) {
index 5a6da4fd247e86268c660d82ff8c4a4325021ffa..721be0f0311da31daad4585d298c2054a4877979 100644 (file)
@@ -7,8 +7,8 @@
 /*
  * We use IRQ1 as the IPI
  */
-static inline void smp_cross_call(const struct cpumask *mask)
+static inline void smp_cross_call(const struct cpumask *mask, int ipi)
 {
-       gic_raise_softirq(mask, 1);
+       gic_raise_softirq(mask, ipi);
 }
 #endif
index 670970699ba93e09d2b270cdc0a061b17b64177b..276f916014c1cdb5cca2cc4a99346136b8c3473a 100644 (file)
@@ -92,7 +92,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
         * the boot monitor to read the system wide flags register,
         * and branch to the address found there.
         */
-       smp_cross_call(cpumask_of(cpu));
+       smp_cross_call(cpumask_of(cpu), 1);
 
        timeout = jiffies + (1 * HZ);
        while (time_before(jiffies, timeout)) {
index ecd6a488c497c28fda8aea2c3412a95b67e05cc7..e5541e5388be688538e5aa3185c3ebaa39d4d4fc 100644 (file)
@@ -29,9 +29,9 @@ extern u32 omap_read_auxcoreboot0(void);
 /*
  * We use Soft IRQ1 as the IPI
  */
-static inline void smp_cross_call(const struct cpumask *mask)
+static inline void smp_cross_call(const struct cpumask *mask, int ipi)
 {
-       gic_raise_softirq(mask, 1);
+       gic_raise_softirq(mask, ipi);
 }
 
 #endif