mirror of
https://github.com/torvalds/linux
synced 2024-10-15 15:59:15 +00:00
MIPS: Move GIC IPI functions out of smp-cmp.c
The GIC IPI functions aren't necessarily specific to the "CMP framework" SMP implementation, and will be used elsewhere in a subsequent commit. This patch adds cleaned up GIC IPI functions to a separate file which is compiled when a new CONFIG_MIPS_GIC_IPI Kconfig symbol is selected, and selects that symbol for CONFIG_MIPS_CMP. Signed-off-by: Paul Burton <paul.burton@imgtec.com> Cc: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/6359/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
parent
1d68808748
commit
72e20142b2
|
@ -1996,12 +1996,16 @@ config MIPS_VPE_APSP_API_MT
|
||||||
config MIPS_CMP
|
config MIPS_CMP
|
||||||
bool "MIPS CMP support"
|
bool "MIPS CMP support"
|
||||||
depends on SYS_SUPPORTS_MIPS_CMP && MIPS_MT_SMP
|
depends on SYS_SUPPORTS_MIPS_CMP && MIPS_MT_SMP
|
||||||
|
select MIPS_GIC_IPI
|
||||||
select SYNC_R4K
|
select SYNC_R4K
|
||||||
select WEAK_ORDERING
|
select WEAK_ORDERING
|
||||||
default n
|
default n
|
||||||
help
|
help
|
||||||
Enable Coherency Manager processor (CMP) support.
|
Enable Coherency Manager processor (CMP) support.
|
||||||
|
|
||||||
|
config MIPS_GIC_IPI
|
||||||
|
bool
|
||||||
|
|
||||||
config SB1_PASS_1_WORKAROUNDS
|
config SB1_PASS_1_WORKAROUNDS
|
||||||
bool
|
bool
|
||||||
depends on CPU_SB1_PASS_1
|
depends on CPU_SB1_PASS_1
|
||||||
|
|
|
@ -58,6 +58,9 @@ static inline void register_smp_ops(struct plat_smp_ops *ops)
|
||||||
|
|
||||||
#endif /* !CONFIG_SMP */
|
#endif /* !CONFIG_SMP */
|
||||||
|
|
||||||
|
extern void gic_send_ipi_single(int cpu, unsigned int action);
|
||||||
|
extern void gic_send_ipi_mask(const struct cpumask *mask, unsigned int action);
|
||||||
|
|
||||||
static inline int register_up_smp_ops(void)
|
static inline int register_up_smp_ops(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_SMP_UP
|
#ifdef CONFIG_SMP_UP
|
||||||
|
|
|
@ -53,6 +53,7 @@ obj-$(CONFIG_MIPS_MT_FPAFF) += mips-mt-fpaff.o
|
||||||
obj-$(CONFIG_MIPS_MT_SMTC) += smtc.o smtc-asm.o smtc-proc.o
|
obj-$(CONFIG_MIPS_MT_SMTC) += smtc.o smtc-asm.o smtc-proc.o
|
||||||
obj-$(CONFIG_MIPS_MT_SMP) += smp-mt.o
|
obj-$(CONFIG_MIPS_MT_SMP) += smp-mt.o
|
||||||
obj-$(CONFIG_MIPS_CMP) += smp-cmp.o
|
obj-$(CONFIG_MIPS_CMP) += smp-cmp.o
|
||||||
|
obj-$(CONFIG_MIPS_GIC_IPI) += smp-gic.o
|
||||||
obj-$(CONFIG_CPU_MIPSR2) += spram.o
|
obj-$(CONFIG_CPU_MIPSR2) += spram.o
|
||||||
|
|
||||||
obj-$(CONFIG_MIPS_VPE_LOADER) += vpe.o
|
obj-$(CONFIG_MIPS_VPE_LOADER) += vpe.o
|
||||||
|
|
|
@ -39,54 +39,6 @@
|
||||||
#include <asm/amon.h>
|
#include <asm/amon.h>
|
||||||
#include <asm/gic.h>
|
#include <asm/gic.h>
|
||||||
|
|
||||||
static void ipi_call_function(unsigned int cpu)
|
|
||||||
{
|
|
||||||
pr_debug("CPU%d: %s cpu %d status %08x\n",
|
|
||||||
smp_processor_id(), __func__, cpu, read_c0_status());
|
|
||||||
|
|
||||||
gic_send_ipi(plat_ipi_call_int_xlate(cpu));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void ipi_resched(unsigned int cpu)
|
|
||||||
{
|
|
||||||
pr_debug("CPU%d: %s cpu %d status %08x\n",
|
|
||||||
smp_processor_id(), __func__, cpu, read_c0_status());
|
|
||||||
|
|
||||||
gic_send_ipi(plat_ipi_resched_int_xlate(cpu));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* FIXME: This isn't restricted to CMP
|
|
||||||
* The SMVP kernel could use GIC interrupts if available
|
|
||||||
*/
|
|
||||||
void cmp_send_ipi_single(int cpu, unsigned int action)
|
|
||||||
{
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
local_irq_save(flags);
|
|
||||||
|
|
||||||
switch (action) {
|
|
||||||
case SMP_CALL_FUNCTION:
|
|
||||||
ipi_call_function(cpu);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SMP_RESCHEDULE_YOURSELF:
|
|
||||||
ipi_resched(cpu);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
local_irq_restore(flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void cmp_send_ipi_mask(const struct cpumask *mask, unsigned int action)
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
for_each_cpu(i, mask)
|
|
||||||
cmp_send_ipi_single(i, action);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void cmp_init_secondary(void)
|
static void cmp_init_secondary(void)
|
||||||
{
|
{
|
||||||
struct cpuinfo_mips *c = ¤t_cpu_data;
|
struct cpuinfo_mips *c = ¤t_cpu_data;
|
||||||
|
@ -210,8 +162,8 @@ void __init cmp_prepare_cpus(unsigned int max_cpus)
|
||||||
}
|
}
|
||||||
|
|
||||||
struct plat_smp_ops cmp_smp_ops = {
|
struct plat_smp_ops cmp_smp_ops = {
|
||||||
.send_ipi_single = cmp_send_ipi_single,
|
.send_ipi_single = gic_send_ipi_single,
|
||||||
.send_ipi_mask = cmp_send_ipi_mask,
|
.send_ipi_mask = gic_send_ipi_mask,
|
||||||
.init_secondary = cmp_init_secondary,
|
.init_secondary = cmp_init_secondary,
|
||||||
.smp_finish = cmp_smp_finish,
|
.smp_finish = cmp_smp_finish,
|
||||||
.cpus_done = cmp_cpus_done,
|
.cpus_done = cmp_cpus_done,
|
||||||
|
|
53
arch/mips/kernel/smp-gic.c
Normal file
53
arch/mips/kernel/smp-gic.c
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2013 Imagination Technologies
|
||||||
|
* Author: Paul Burton <paul.burton@imgtec.com>
|
||||||
|
*
|
||||||
|
* Based on smp-cmp.c:
|
||||||
|
* Copyright (C) 2007 MIPS Technologies, Inc.
|
||||||
|
* Author: Chris Dearman (chris@mips.com)
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by the
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
* option) any later version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/printk.h>
|
||||||
|
|
||||||
|
#include <asm/gic.h>
|
||||||
|
#include <asm/smp-ops.h>
|
||||||
|
|
||||||
|
void gic_send_ipi_single(int cpu, unsigned int action)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
unsigned int intr;
|
||||||
|
|
||||||
|
pr_debug("CPU%d: %s cpu %d action %u status %08x\n",
|
||||||
|
smp_processor_id(), __func__, cpu, action, read_c0_status());
|
||||||
|
|
||||||
|
local_irq_save(flags);
|
||||||
|
|
||||||
|
switch (action) {
|
||||||
|
case SMP_CALL_FUNCTION:
|
||||||
|
intr = plat_ipi_call_int_xlate(cpu);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SMP_RESCHEDULE_YOURSELF:
|
||||||
|
intr = plat_ipi_resched_int_xlate(cpu);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
BUG();
|
||||||
|
}
|
||||||
|
|
||||||
|
gic_send_ipi(intr);
|
||||||
|
local_irq_restore(flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
void gic_send_ipi_mask(const struct cpumask *mask, unsigned int action)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
for_each_cpu(i, mask)
|
||||||
|
gic_send_ipi_single(i, action);
|
||||||
|
}
|
Loading…
Reference in a new issue