ARM: GIC: remove direct use of gic_raise_softirq
In preparation of moving gic code to drivers/irqchip, remove the direct platform dependencies on gic_raise_softirq. Move the setup of smp_cross_call into the gic code and use arch_send_wakeup_ipi_mask function to trigger wake-up IPIs. Signed-off-by: Rob Herring <rob.herring@calxeda.com> Cc: Russell King <linux@arm.linux.org.uk> Cc: Kukjin Kim <kgene.kim@samsung.com> Cc: Sascha Hauer <kernel@pengutronix.de> Cc: David Brown <davidb@codeaurora.org> Cc: Daniel Walker <dwalker@fifo99.com> Cc: Bryan Huntsman <bryanh@codeaurora.org> Acked-by: Tony Lindgren <tony@atomide.com> Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.com> Cc: Paul Mundt <lethal@linux-sh.org> Cc: Magnus Damm <magnus.damm@gmail.com> Acked-by: Viresh Kumar <viresh.kumar@linaro.org> Cc: Shiraz Hashim <shiraz.hashim@st.com> Acked-by: Stephen Warren <swarren@nvidia.com> Cc: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com> Cc: Linus Walleij <linus.walleij@linaro.org> Acked-by: Olof Johansson <olof@lixom.net>
This commit is contained in:
parent
428fef8ad8
commit
b1cffebf10
|
@ -617,6 +617,27 @@ static void __init gic_pm_init(struct gic_chip_data *gic)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
void gic_raise_softirq(const struct cpumask *mask, unsigned int irq)
|
||||||
|
{
|
||||||
|
int cpu;
|
||||||
|
unsigned long map = 0;
|
||||||
|
|
||||||
|
/* Convert our logical CPU mask into a physical one. */
|
||||||
|
for_each_cpu(cpu, mask)
|
||||||
|
map |= 1 << cpu_logical_map(cpu);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Ensure that stores to Normal memory are visible to the
|
||||||
|
* other CPUs before issuing the IPI.
|
||||||
|
*/
|
||||||
|
dsb();
|
||||||
|
|
||||||
|
/* this always happens on GIC0 */
|
||||||
|
writel_relaxed(map << 16 | irq, gic_data_dist_base(&gic_data[0]) + GIC_DIST_SOFTINT);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int gic_irq_domain_map(struct irq_domain *d, unsigned int irq,
|
static int gic_irq_domain_map(struct irq_domain *d, unsigned int irq,
|
||||||
irq_hw_number_t hw)
|
irq_hw_number_t hw)
|
||||||
{
|
{
|
||||||
|
@ -743,6 +764,9 @@ void __init gic_init_bases(unsigned int gic_nr, int irq_start,
|
||||||
if (WARN_ON(!gic->domain))
|
if (WARN_ON(!gic->domain))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
set_smp_cross_call(gic_raise_softirq);
|
||||||
|
#endif
|
||||||
gic_chip.flags |= gic_arch_extn.flags;
|
gic_chip.flags |= gic_arch_extn.flags;
|
||||||
gic_dist_init(gic);
|
gic_dist_init(gic);
|
||||||
gic_cpu_init(gic);
|
gic_cpu_init(gic);
|
||||||
|
@ -756,27 +780,6 @@ void __cpuinit gic_secondary_init(unsigned int gic_nr)
|
||||||
gic_cpu_init(&gic_data[gic_nr]);
|
gic_cpu_init(&gic_data[gic_nr]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
|
||||||
void gic_raise_softirq(const struct cpumask *mask, unsigned int irq)
|
|
||||||
{
|
|
||||||
int cpu;
|
|
||||||
unsigned long map = 0;
|
|
||||||
|
|
||||||
/* Convert our logical CPU mask into a physical one. */
|
|
||||||
for_each_cpu(cpu, mask)
|
|
||||||
map |= gic_cpu_map[cpu];
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Ensure that stores to Normal memory are visible to the
|
|
||||||
* other CPUs before issuing the IPI.
|
|
||||||
*/
|
|
||||||
dsb();
|
|
||||||
|
|
||||||
/* this always happens on GIC0 */
|
|
||||||
writel_relaxed(map << 16 | irq, gic_data_dist_base(&gic_data[0]) + GIC_DIST_SOFTINT);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_OF
|
#ifdef CONFIG_OF
|
||||||
static int gic_cnt __initdata = 0;
|
static int gic_cnt __initdata = 0;
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,6 @@ int gic_of_init(struct device_node *node, struct device_node *parent);
|
||||||
void gic_secondary_init(unsigned int);
|
void gic_secondary_init(unsigned int);
|
||||||
void gic_handle_irq(struct pt_regs *regs);
|
void gic_handle_irq(struct pt_regs *regs);
|
||||||
void gic_cascade_irq(unsigned int gic_nr, unsigned int irq);
|
void gic_cascade_irq(unsigned int gic_nr, unsigned int irq);
|
||||||
void gic_raise_softirq(const struct cpumask *mask, unsigned int irq);
|
|
||||||
|
|
||||||
static inline void gic_init(unsigned int nr, int start,
|
static inline void gic_init(unsigned int nr, int start,
|
||||||
void __iomem *dist , void __iomem *cpu)
|
void __iomem *dist , void __iomem *cpu)
|
||||||
|
|
|
@ -416,6 +416,7 @@ static void (*smp_cross_call)(const struct cpumask *, unsigned int);
|
||||||
|
|
||||||
void __init set_smp_cross_call(void (*fn)(const struct cpumask *, unsigned int))
|
void __init set_smp_cross_call(void (*fn)(const struct cpumask *, unsigned int))
|
||||||
{
|
{
|
||||||
|
if (!smp_cross_call)
|
||||||
smp_cross_call = fn;
|
smp_cross_call = fn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -149,7 +149,7 @@ static int __cpuinit exynos_boot_secondary(unsigned int cpu, struct task_struct
|
||||||
|
|
||||||
__raw_writel(virt_to_phys(exynos4_secondary_startup),
|
__raw_writel(virt_to_phys(exynos4_secondary_startup),
|
||||||
cpu_boot_reg(phys_cpu));
|
cpu_boot_reg(phys_cpu));
|
||||||
gic_raise_softirq(cpumask_of(cpu), 0);
|
arch_send_wakeup_ipi_mask(cpumask_of(cpu));
|
||||||
|
|
||||||
if (pen_release == -1)
|
if (pen_release == -1)
|
||||||
break;
|
break;
|
||||||
|
@ -190,8 +190,6 @@ static void __init exynos_smp_init_cpus(void)
|
||||||
|
|
||||||
for (i = 0; i < ncores; i++)
|
for (i = 0; i < ncores; i++)
|
||||||
set_cpu_possible(i, true);
|
set_cpu_possible(i, true);
|
||||||
|
|
||||||
set_smp_cross_call(gic_raise_softirq);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init exynos_smp_prepare_cpus(unsigned int max_cpus)
|
static void __init exynos_smp_prepare_cpus(unsigned int max_cpus)
|
||||||
|
|
|
@ -33,7 +33,7 @@ static void __cpuinit highbank_secondary_init(unsigned int cpu)
|
||||||
static int __cpuinit highbank_boot_secondary(unsigned int cpu, struct task_struct *idle)
|
static int __cpuinit highbank_boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||||
{
|
{
|
||||||
highbank_set_cpu_jump(cpu, secondary_startup);
|
highbank_set_cpu_jump(cpu, secondary_startup);
|
||||||
gic_raise_softirq(cpumask_of(cpu), 0);
|
arch_send_wakeup_ipi_mask(cpumask_of(cpu));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,8 +56,6 @@ static void __init highbank_smp_init_cpus(void)
|
||||||
|
|
||||||
for (i = 0; i < ncores; i++)
|
for (i = 0; i < ncores; i++)
|
||||||
set_cpu_possible(i, true);
|
set_cpu_possible(i, true);
|
||||||
|
|
||||||
set_smp_cross_call(gic_raise_softirq);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init highbank_smp_prepare_cpus(unsigned int max_cpus)
|
static void __init highbank_smp_prepare_cpus(unsigned int max_cpus)
|
||||||
|
|
|
@ -71,8 +71,6 @@ static void __init imx_smp_init_cpus(void)
|
||||||
|
|
||||||
for (i = 0; i < ncores; i++)
|
for (i = 0; i < ncores; i++)
|
||||||
set_cpu_possible(i, true);
|
set_cpu_possible(i, true);
|
||||||
|
|
||||||
set_smp_cross_call(gic_raise_softirq);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void imx_smp_prepare(void)
|
void imx_smp_prepare(void)
|
||||||
|
|
|
@ -115,7 +115,7 @@ static int __cpuinit msm_boot_secondary(unsigned int cpu, struct task_struct *id
|
||||||
* the boot monitor to read the system wide flags register,
|
* the boot monitor to read the system wide flags register,
|
||||||
* and branch to the address found there.
|
* and branch to the address found there.
|
||||||
*/
|
*/
|
||||||
gic_raise_softirq(cpumask_of(cpu), 0);
|
arch_send_wakeup_ipi_mask(cpumask_of(cpu));
|
||||||
|
|
||||||
timeout = jiffies + (1 * HZ);
|
timeout = jiffies + (1 * HZ);
|
||||||
while (time_before(jiffies, timeout)) {
|
while (time_before(jiffies, timeout)) {
|
||||||
|
@ -153,8 +153,6 @@ static void __init msm_smp_init_cpus(void)
|
||||||
|
|
||||||
for (i = 0; i < ncores; i++)
|
for (i = 0; i < ncores; i++)
|
||||||
set_cpu_possible(i, true);
|
set_cpu_possible(i, true);
|
||||||
|
|
||||||
set_smp_cross_call(gic_raise_softirq);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init msm_smp_prepare_cpus(unsigned int max_cpus)
|
static void __init msm_smp_prepare_cpus(unsigned int max_cpus)
|
||||||
|
|
|
@ -157,7 +157,7 @@ static int __cpuinit omap4_boot_secondary(unsigned int cpu, struct task_struct *
|
||||||
booted = true;
|
booted = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
gic_raise_softirq(cpumask_of(cpu), 0);
|
arch_send_wakeup_ipi_mask(cpumask_of(cpu));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Now the secondary core is starting up let it run its
|
* Now the secondary core is starting up let it run its
|
||||||
|
@ -231,8 +231,6 @@ static void __init omap4_smp_init_cpus(void)
|
||||||
|
|
||||||
for (i = 0; i < ncores; i++)
|
for (i = 0; i < ncores; i++)
|
||||||
set_cpu_possible(i, true);
|
set_cpu_possible(i, true);
|
||||||
|
|
||||||
set_smp_cross_call(gic_raise_softirq);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init omap4_smp_prepare_cpus(unsigned int max_cpus)
|
static void __init omap4_smp_prepare_cpus(unsigned int max_cpus)
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
|
||||||
#include <mach/hardware.h>
|
#include <mach/hardware.h>
|
||||||
#include <asm/hardware/gic.h>
|
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/smp_scu.h>
|
#include <asm/smp_scu.h>
|
||||||
|
|
||||||
|
@ -59,8 +58,6 @@ static void __init realview_smp_init_cpus(void)
|
||||||
|
|
||||||
for (i = 0; i < ncores; i++)
|
for (i = 0; i < ncores; i++)
|
||||||
set_cpu_possible(i, true);
|
set_cpu_possible(i, true);
|
||||||
|
|
||||||
set_smp_cross_call(gic_raise_softirq);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init realview_smp_prepare_cpus(unsigned int max_cpus)
|
static void __init realview_smp_prepare_cpus(unsigned int max_cpus)
|
||||||
|
|
|
@ -26,6 +26,4 @@ void __init shmobile_smp_init_cpus(unsigned int ncores)
|
||||||
|
|
||||||
for (i = 0; i < ncores; i++)
|
for (i = 0; i < ncores; i++)
|
||||||
set_cpu_possible(i, true);
|
set_cpu_possible(i, true);
|
||||||
|
|
||||||
set_smp_cross_call(gic_raise_softirq);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,7 +100,7 @@ static int __cpuinit emev2_boot_secondary(unsigned int cpu, struct task_struct *
|
||||||
/* Tell ROM loader about our vector (in headsmp.S) */
|
/* Tell ROM loader about our vector (in headsmp.S) */
|
||||||
emev2_set_boot_vector(__pa(shmobile_secondary_vector));
|
emev2_set_boot_vector(__pa(shmobile_secondary_vector));
|
||||||
|
|
||||||
gic_raise_softirq(cpumask_of(cpu), 0);
|
arch_send_wakeup_ipi_mask(cpumask_of(cpu));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -83,8 +83,6 @@ static void __init socfpga_smp_init_cpus(void)
|
||||||
|
|
||||||
for (i = 0; i < ncores; i++)
|
for (i = 0; i < ncores; i++)
|
||||||
set_cpu_possible(i, true);
|
set_cpu_possible(i, true);
|
||||||
|
|
||||||
set_smp_cross_call(gic_raise_softirq);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init socfpga_smp_prepare_cpus(unsigned int max_cpus)
|
static void __init socfpga_smp_prepare_cpus(unsigned int max_cpus)
|
||||||
|
|
|
@ -104,8 +104,6 @@ static void __init spear13xx_smp_init_cpus(void)
|
||||||
|
|
||||||
for (i = 0; i < ncores; i++)
|
for (i = 0; i < ncores; i++)
|
||||||
set_cpu_possible(i, true);
|
set_cpu_possible(i, true);
|
||||||
|
|
||||||
set_smp_cross_call(gic_raise_softirq);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init spear13xx_smp_prepare_cpus(unsigned int max_cpus)
|
static void __init spear13xx_smp_prepare_cpus(unsigned int max_cpus)
|
||||||
|
|
|
@ -159,8 +159,6 @@ static void __init tegra_smp_init_cpus(void)
|
||||||
|
|
||||||
for (i = 0; i < ncores; i++)
|
for (i = 0; i < ncores; i++)
|
||||||
set_cpu_possible(i, true);
|
set_cpu_possible(i, true);
|
||||||
|
|
||||||
set_smp_cross_call(gic_raise_softirq);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init tegra_smp_prepare_cpus(unsigned int max_cpus)
|
static void __init tegra_smp_prepare_cpus(unsigned int max_cpus)
|
||||||
|
|
|
@ -91,7 +91,7 @@ static int __cpuinit ux500_boot_secondary(unsigned int cpu, struct task_struct *
|
||||||
*/
|
*/
|
||||||
write_pen_release(cpu_logical_map(cpu));
|
write_pen_release(cpu_logical_map(cpu));
|
||||||
|
|
||||||
gic_raise_softirq(cpumask_of(cpu), 0);
|
arch_send_wakeup_ipi_mask(cpumask_of(cpu));
|
||||||
|
|
||||||
timeout = jiffies + (1 * HZ);
|
timeout = jiffies + (1 * HZ);
|
||||||
while (time_before(jiffies, timeout)) {
|
while (time_before(jiffies, timeout)) {
|
||||||
|
@ -155,8 +155,6 @@ static void __init ux500_smp_init_cpus(void)
|
||||||
|
|
||||||
for (i = 0; i < ncores; i++)
|
for (i = 0; i < ncores; i++)
|
||||||
set_cpu_possible(i, true);
|
set_cpu_possible(i, true);
|
||||||
|
|
||||||
set_smp_cross_call(gic_raise_softirq);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init ux500_smp_prepare_cpus(unsigned int max_cpus)
|
static void __init ux500_smp_prepare_cpus(unsigned int max_cpus)
|
||||||
|
|
|
@ -182,8 +182,6 @@ static void __init ct_ca9x4_init_cpu_map(void)
|
||||||
|
|
||||||
for (i = 0; i < ncores; ++i)
|
for (i = 0; i < ncores; ++i)
|
||||||
set_cpu_possible(i, true);
|
set_cpu_possible(i, true);
|
||||||
|
|
||||||
set_smp_cross_call(gic_raise_softirq);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init ct_ca9x4_smp_enable(unsigned int max_cpus)
|
static void __init ct_ca9x4_smp_enable(unsigned int max_cpus)
|
||||||
|
|
|
@ -128,8 +128,6 @@ static void __init vexpress_dt_smp_init_cpus(void)
|
||||||
|
|
||||||
for (i = 0; i < ncores; ++i)
|
for (i = 0; i < ncores; ++i)
|
||||||
set_cpu_possible(i, true);
|
set_cpu_possible(i, true);
|
||||||
|
|
||||||
set_smp_cross_call(gic_raise_softirq);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init vexpress_dt_smp_prepare_cpus(unsigned int max_cpus)
|
static void __init vexpress_dt_smp_prepare_cpus(unsigned int max_cpus)
|
||||||
|
|
|
@ -79,7 +79,7 @@ int __cpuinit versatile_boot_secondary(unsigned int cpu, struct task_struct *idl
|
||||||
* the boot monitor to read the system wide flags register,
|
* the boot monitor to read the system wide flags register,
|
||||||
* and branch to the address found there.
|
* and branch to the address found there.
|
||||||
*/
|
*/
|
||||||
gic_raise_softirq(cpumask_of(cpu), 0);
|
arch_send_wakeup_ipi_mask(cpumask_of(cpu));
|
||||||
|
|
||||||
timeout = jiffies + (1 * HZ);
|
timeout = jiffies + (1 * HZ);
|
||||||
while (time_before(jiffies, timeout)) {
|
while (time_before(jiffies, timeout)) {
|
||||||
|
|
Loading…
Reference in New Issue