ralink: backport various fixes from linux-mti
Signed-off-by: John Crispin <blogic@openwrt.org> SVN-Revision: 39329
This commit is contained in:
parent
a75b692557
commit
a818a3cf8f
4 changed files with 269 additions and 0 deletions
|
@ -0,0 +1,49 @@
|
|||
From 553ddf4f3f20c28ab03f87ac8c3cde5edf714675 Mon Sep 17 00:00:00 2001
|
||||
From: Tony Wu <tung7970@gmail.com>
|
||||
Date: Fri, 21 Jun 2013 10:13:08 +0000
|
||||
Subject: [PATCH 022/105] MIPS: GIC: Fix gic_set_affinity infinite loop
|
||||
|
||||
There is an infinite loop in gic_set_affinity. When irq_set_affinity
|
||||
gets called on gic controller, it blocks forever.
|
||||
|
||||
Signed-off-by: Tony Wu <tung7970@gmail.com>
|
||||
Cc: Steven J. Hill <Steven.Hill@imgtec.com>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Patchwork: https://patchwork.linux-mips.org/patch/5537/
|
||||
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
|
||||
(cherry picked from commit c214c03512b67e56dea3f4471705f8caae49553a)
|
||||
---
|
||||
arch/mips/kernel/irq-gic.c | 15 +++++++--------
|
||||
1 file changed, 7 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/arch/mips/kernel/irq-gic.c b/arch/mips/kernel/irq-gic.c
|
||||
index c01b307..5b5ddb2 100644
|
||||
--- a/arch/mips/kernel/irq-gic.c
|
||||
+++ b/arch/mips/kernel/irq-gic.c
|
||||
@@ -219,16 +219,15 @@ static int gic_set_affinity(struct irq_data *d, const struct cpumask *cpumask,
|
||||
|
||||
/* Assumption : cpumask refers to a single CPU */
|
||||
spin_lock_irqsave(&gic_lock, flags);
|
||||
- for (;;) {
|
||||
- /* Re-route this IRQ */
|
||||
- GIC_SH_MAP_TO_VPE_SMASK(irq, first_cpu(tmp));
|
||||
|
||||
- /* Update the pcpu_masks */
|
||||
- for (i = 0; i < NR_CPUS; i++)
|
||||
- clear_bit(irq, pcpu_masks[i].pcpu_mask);
|
||||
- set_bit(irq, pcpu_masks[first_cpu(tmp)].pcpu_mask);
|
||||
+ /* Re-route this IRQ */
|
||||
+ GIC_SH_MAP_TO_VPE_SMASK(irq, first_cpu(tmp));
|
||||
+
|
||||
+ /* Update the pcpu_masks */
|
||||
+ for (i = 0; i < NR_CPUS; i++)
|
||||
+ clear_bit(irq, pcpu_masks[i].pcpu_mask);
|
||||
+ set_bit(irq, pcpu_masks[first_cpu(tmp)].pcpu_mask);
|
||||
|
||||
- }
|
||||
cpumask_copy(d->affinity, cpumask);
|
||||
spin_unlock_irqrestore(&gic_lock, flags);
|
||||
|
||||
--
|
||||
1.7.10.4
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
From 184edf882ebb7885b49fa231a503205da94e78f0 Mon Sep 17 00:00:00 2001
|
||||
From: Markos Chandras <markos.chandras@imgtec.com>
|
||||
Date: Wed, 2 Oct 2013 12:40:26 -0500
|
||||
Subject: [PATCH 065/105] MIPS: Kconfig: CMP support needs to select SMP as
|
||||
well
|
||||
|
||||
The CMP code is only designed to work with SMP configurations.
|
||||
Fixes multiple build problems on certain randconfigs:
|
||||
|
||||
In file included from arch/mips/kernel/smp-cmp.c:34:0:
|
||||
arch/mips/include/asm/smp.h:28:0:
|
||||
error: "raw_smp_processor_id" redefined [-Werror]
|
||||
|
||||
In file included from include/linux/sched.h:30:0,
|
||||
from arch/mips/kernel/smp-cmp.c:22:
|
||||
include/linux/smp.h:135:0: note: this is the location of the
|
||||
previous definition
|
||||
|
||||
In file included from arch/mips/kernel/smp-cmp.c:34:0:
|
||||
arch/mips/include/asm/smp.h:57:20:
|
||||
error: redefinition of 'smp_send_reschedule'
|
||||
|
||||
In file included from include/linux/sched.h:30:0,
|
||||
from arch/mips/kernel/smp-cmp.c:22:
|
||||
include/linux/smp.h:179:20: note: previous
|
||||
definition of 'smp_send_reschedule' was here
|
||||
|
||||
In file included from arch/mips/kernel/smp-cmp.c:34:0:
|
||||
arch/mips/include/asm/smp.h: In function 'smp_send_reschedule':
|
||||
arch/mips/include/asm/smp.h:61:8:
|
||||
error: dereferencing pointer to incomplete type
|
||||
[...]
|
||||
|
||||
Signed-off-by: Markos Chandras <markos.chandras@imgtec.com>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Cc: Markos Chandras <markos.chandras@imgtec.com>
|
||||
Patchwork: https://patchwork.linux-mips.org/patch/5812/
|
||||
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
|
||||
---
|
||||
arch/mips/Kconfig | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
|
||||
index e82c066..b537fb1 100644
|
||||
--- a/arch/mips/Kconfig
|
||||
+++ b/arch/mips/Kconfig
|
||||
@@ -2010,6 +2010,7 @@ config MIPS_VPE_APSP_API
|
||||
config MIPS_CMP
|
||||
bool "MIPS CMP framework support"
|
||||
depends on SYS_SUPPORTS_MIPS_CMP
|
||||
+ select SMP
|
||||
select SYNC_R4K
|
||||
select SYS_SUPPORTS_SMP
|
||||
select SYS_SUPPORTS_SCHED_SMT if SMP
|
||||
--
|
||||
1.7.10.4
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
From c4d621e75e865fa5374946515ad0c5e060b9c446 Mon Sep 17 00:00:00 2001
|
||||
From: Leonid Yegoshin <Leonid.Yegoshin@imgtec.com>
|
||||
Date: Wed, 11 Sep 2013 14:17:47 -0500
|
||||
Subject: [PATCH 056/105] MIPS: Fix SMP core calculations when using MT
|
||||
support.
|
||||
|
||||
The TCBIND register is only available if the core has MT support. It
|
||||
should not be read otherwise. Secondly, the number of TCs (siblings)
|
||||
are calculated differently depending on if the kernel is configured
|
||||
as SMVP or SMTC.
|
||||
|
||||
Signed-off-by: Leonid Yegoshin <Leonid.Yegoshin@imgtec.com>
|
||||
Signed-off-by: Steven J. Hill <Steven.Hill@imgtec.com>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Patchwork: https://patchwork.linux-mips.org/patch/5822/
|
||||
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
|
||||
(cherry picked from commit 670bac3a8c201fc1f5f92ac6b4a8b42dc8172937)
|
||||
---
|
||||
arch/mips/kernel/smp-cmp.c | 13 +++++++++++--
|
||||
1 file changed, 11 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/arch/mips/kernel/smp-cmp.c b/arch/mips/kernel/smp-cmp.c
|
||||
index c2e5d74..5969f1e 100644
|
||||
--- a/arch/mips/kernel/smp-cmp.c
|
||||
+++ b/arch/mips/kernel/smp-cmp.c
|
||||
@@ -99,7 +99,9 @@ static void cmp_init_secondary(void)
|
||||
|
||||
c->core = (read_c0_ebase() >> 1) & 0x1ff;
|
||||
#if defined(CONFIG_MIPS_MT_SMP) || defined(CONFIG_MIPS_MT_SMTC)
|
||||
- c->vpe_id = (read_c0_tcbind() >> TCBIND_CURVPE_SHIFT) & TCBIND_CURVPE;
|
||||
+ if (cpu_has_mipsmt)
|
||||
+ c->vpe_id = (read_c0_tcbind() >> TCBIND_CURVPE_SHIFT) &
|
||||
+ TCBIND_CURVPE;
|
||||
#endif
|
||||
#ifdef CONFIG_MIPS_MT_SMTC
|
||||
c->tc_id = (read_c0_tcbind() & TCBIND_CURTC) >> TCBIND_CURTC_SHIFT;
|
||||
@@ -177,9 +179,16 @@ void __init cmp_smp_setup(void)
|
||||
}
|
||||
|
||||
if (cpu_has_mipsmt) {
|
||||
- unsigned int nvpe, mvpconf0 = read_c0_mvpconf0();
|
||||
+ unsigned int nvpe = 1;
|
||||
+#ifdef CONFIG_MIPS_MT_SMP
|
||||
+ unsigned int mvpconf0 = read_c0_mvpconf0();
|
||||
+
|
||||
+ nvpe = ((mvpconf0 & MVPCONF0_PVPE) >> MVPCONF0_PVPE_SHIFT) + 1;
|
||||
+#elif defined(CONFIG_MIPS_MT_SMTC)
|
||||
+ unsigned int mvpconf0 = read_c0_mvpconf0();
|
||||
|
||||
nvpe = ((mvpconf0 & MVPCONF0_PTC) >> MVPCONF0_PTC_SHIFT) + 1;
|
||||
+#endif
|
||||
smp_num_siblings = nvpe;
|
||||
}
|
||||
pr_info("Detected %i available secondary CPU(s)\n", ncpu);
|
||||
--
|
||||
1.7.10.4
|
||||
|
|
@ -0,0 +1,106 @@
|
|||
From 43334f8438704001deb258b6e7223699bd336c77 Mon Sep 17 00:00:00 2001
|
||||
From: "Steven J. Hill" <Steven.Hill@imgtec.com>
|
||||
Date: Wed, 25 Sep 2013 14:58:19 -0500
|
||||
Subject: [PATCH 093/105] MIPS: GIC: Send IPIs using the GIC.
|
||||
|
||||
If a GIC present, then use it to send IPIs between the cores.
|
||||
|
||||
Signed-off-by: Steven J. Hill <Steven.Hill@imgtec.com>
|
||||
---
|
||||
arch/mips/kernel/smp-mt.c | 32 ++++++++++++++++++++++++++++++++
|
||||
1 file changed, 32 insertions(+)
|
||||
|
||||
diff --git a/arch/mips/kernel/smp-mt.c b/arch/mips/kernel/smp-mt.c
|
||||
index 2f8c468..d057c84 100644
|
||||
--- a/arch/mips/kernel/smp-mt.c
|
||||
+++ b/arch/mips/kernel/smp-mt.c
|
||||
@@ -71,6 +71,7 @@ static unsigned int __init smvp_vpe_init(unsigned int tc, unsigned int mvpconf0,
|
||||
|
||||
/* Record this as available CPU */
|
||||
set_cpu_possible(tc, true);
|
||||
+ set_cpu_present(tc, true);
|
||||
__cpu_number_map[tc] = ++ncpu;
|
||||
__cpu_logical_map[ncpu] = tc;
|
||||
}
|
||||
@@ -112,12 +113,35 @@ static void __init smvp_tc_init(unsigned int tc, unsigned int mvpconf0)
|
||||
write_tc_c0_tchalt(TCHALT_H);
|
||||
}
|
||||
|
||||
+static void mp_send_ipi_single(int cpu, unsigned int action)
|
||||
+{
|
||||
+ unsigned long flags;
|
||||
+
|
||||
+ local_irq_save(flags);
|
||||
+
|
||||
+ switch (action) {
|
||||
+ case SMP_CALL_FUNCTION:
|
||||
+ gic_send_ipi(plat_ipi_call_int_xlate(cpu));
|
||||
+ break;
|
||||
+
|
||||
+ case SMP_RESCHEDULE_YOURSELF:
|
||||
+ gic_send_ipi(plat_ipi_resched_int_xlate(cpu));
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ local_irq_restore(flags);
|
||||
+}
|
||||
+
|
||||
static void vsmp_send_ipi_single(int cpu, unsigned int action)
|
||||
{
|
||||
int i;
|
||||
unsigned long flags;
|
||||
int vpflags;
|
||||
|
||||
+ if (gic_present) {
|
||||
+ mp_send_ipi_single(cpu, action);
|
||||
+ return;
|
||||
+ }
|
||||
local_irq_save(flags);
|
||||
|
||||
vpflags = dvpe(); /* can't access the other CPU's registers whilst MVPE enabled */
|
||||
@@ -164,6 +188,8 @@ static void __cpuinit vsmp_init_secondary(void)
|
||||
|
||||
static void __cpuinit vsmp_smp_finish(void)
|
||||
{
|
||||
+ pr_debug("SMPMT: CPU%d: vsmp_smp_finish\n", smp_processor_id());
|
||||
+
|
||||
/* CDFIXME: remove this? */
|
||||
write_c0_compare(read_c0_count() + (8* mips_hpt_frequency/HZ));
|
||||
|
||||
@@ -178,6 +204,7 @@ static void __cpuinit vsmp_smp_finish(void)
|
||||
|
||||
static void vsmp_cpus_done(void)
|
||||
{
|
||||
+ pr_debug("SMPMT: CPU%d: vsmp_cpus_done\n", smp_processor_id());
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -191,6 +218,8 @@ static void vsmp_cpus_done(void)
|
||||
static void __cpuinit vsmp_boot_secondary(int cpu, struct task_struct *idle)
|
||||
{
|
||||
struct thread_info *gp = task_thread_info(idle);
|
||||
+ pr_debug("SMPMT: CPU%d: vsmp_boot_secondary cpu %d\n",
|
||||
+ smp_processor_id(), cpu);
|
||||
dvpe();
|
||||
set_c0_mvpcontrol(MVPCONTROL_VPC);
|
||||
|
||||
@@ -232,6 +261,7 @@ static void __init vsmp_smp_setup(void)
|
||||
unsigned int mvpconf0, ntc, tc, ncpu = 0;
|
||||
unsigned int nvpe;
|
||||
|
||||
+ pr_debug("SMPMT: CPU%d: vsmp_smp_setup\n", smp_processor_id());
|
||||
#ifdef CONFIG_MIPS_MT_FPAFF
|
||||
/* If we have an FPU, enroll ourselves in the FPU-full mask */
|
||||
if (cpu_has_fpu)
|
||||
@@ -272,6 +302,8 @@ static void __init vsmp_smp_setup(void)
|
||||
|
||||
static void __init vsmp_prepare_cpus(unsigned int max_cpus)
|
||||
{
|
||||
+ pr_debug("SMPMT: CPU%d: vsmp_prepare_cpus %d\n",
|
||||
+ smp_processor_id(), max_cpus);
|
||||
mips_mt_set_cpuoptions();
|
||||
}
|
||||
|
||||
--
|
||||
1.7.10.4
|
||||
|
Loading…
Reference in a new issue