APRP is supposed to be platform independent, however, this patch is needed
for Malta for various reasons, see code and code comments.
Signed-off-by: Deng-Cheng Zhu <dczhu@mips.com>
---
.../include/asm/mach-malta/cpu-feature-overrides.h | 3 ++
arch/mips/kernel/vpe-cmp.c | 17 +++++++++++++++
arch/mips/mti-malta/malta-int.c | 22 +++++++++++++++++++-
3 files changed, 41 insertions(+), 1 deletions(-)
diff --git a/arch/mips/include/asm/mach-malta/cpu-feature-overrides.h
b/arch/mips/include/asm/mach-malta/cpu-feature-overrides.h
index 37e3583..0bf3872 100644
--- a/arch/mips/include/asm/mach-malta/cpu-feature-overrides.h
+++ b/arch/mips/include/asm/mach-malta/cpu-feature-overrides.h
@@ -17,6 +17,9 @@
#define cpu_has_tlb 1
#define cpu_has_4kex 1
#define cpu_has_4k_cache 1
+#ifdef CONFIG_MIPS_SP_FP_INTENSIVE
+#define cpu_has_fpu 0
+#endif
/* #define cpu_has_fpu ? */
/* #define cpu_has_32fpr ? */
#define cpu_has_counter 1
diff --git a/arch/mips/kernel/vpe-cmp.c b/arch/mips/kernel/vpe-cmp.c
index 9d0c375..20f4497 100644
--- a/arch/mips/kernel/vpe-cmp.c
+++ b/arch/mips/kernel/vpe-cmp.c
@@ -25,7 +25,24 @@
static int major;
+#ifdef CONFIG_MIPS_MALTA
+#include <asm/amon.h>
+
+int vpe_run(struct vpe *v)
+{
+ struct vpe_notifications *n;
+
+ if (amon_cpu_start(aprp_cpu_index(), v->__start, 0, 0, 0) < 0)
+ return -1;
+
+ list_for_each_entry(n, &v->notify, list)
+ n->start(VPE_MODULE_MINOR);
+
+ return 0;
+}
+#else
#error CMP vpe_run() not implemented!
+#endif
void cleanup_tc(struct tc *tc)
{
diff --git a/arch/mips/mti-malta/malta-int.c b/arch/mips/mti-malta/malta-int.c
index 647b863..cddda99 100644
--- a/arch/mips/mti-malta/malta-int.c
+++ b/arch/mips/mti-malta/malta-int.c
@@ -1,6 +1,6 @@
/*
* Carsten Langgaard, carstenl@mips.com
- * Copyright (C) 2000, 2001, 2004 MIPS Technologies, Inc.
+ * Copyright (C) 2000, 2001, 2004, 2012 MIPS Technologies, Inc.
* Copyright (C) 2001 Ralf Baechle
*
* This program is free software; you can distribute it and/or modify it
@@ -45,6 +45,9 @@
#include <asm/gic.h>
#include <asm/gcmpregs.h>
#include <asm/setup.h>
+#ifdef CONFIG_MIPS_VPE_APSP_API
+#include <asm/rtlx.h>
+#endif
int gcmp_present = -1;
int gic_present;
@@ -128,6 +131,15 @@ static void malta_hw0_irqdispatch(void)
}
do_IRQ(MALTA_INT_BASE + irq);
+
+#if defined(CONFIG_MIPS_VPE_APSP_API) && !defined(CONFIG_MIPS_CMP)
+ /*
+ * When sw0 gets set, a spurious hw interrupt is signaled as well.
+ * The sw0 will not be handled until the hw interrupt is cleared.
+ * We use the hook to handle sw0 and the hw interrupt gets cleared.
+ */
+ aprp_hook();
+#endif
}
static void malta_ipi_irqdispatch(void)
@@ -312,6 +324,10 @@ static void ipi_call_dispatch(void)
static irqreturn_t ipi_resched_interrupt(int irq, void *dev_id)
{
+#if defined(CONFIG_MIPS_VPE_APSP_API) && defined(CONFIG_MIPS_CMP)
+ aprp_hook();
+#endif
+
scheduler_ipi();
return IRQ_HANDLED;
@@ -622,6 +638,10 @@ void __init arch_init_irq(void)
arch_init_ipiirq(cpu_ipi_call_irq, &irq_call);
#endif
}
+
+#ifdef CONFIG_MIPS_VPE_APSP_API
+ aprp_hook = null_aprp_hook;
+#endif
}
void malta_be_init(void)
--
1.7.1
|