Module Name: src
Committed By: cliff
Date: Fri Apr 16 23:50:30 UTC 2010
Modified Files:
src/sys/arch/mips/rmi [matt-nb5-mips64]: rmixl_cpu.c
Log Message:
- remove cpu_setup_trampoline_fmn()
- remove cpu_setup_trampoline_ipi()
- cpu_setup_trampoline_common() provides wakeup-method independent function,
used only by cpu_setup_trampoline_callback() for now
- PSB_TYPE_DELL firmware works with cpu_setup_trampoline_callback()
To generate a diff of this commit:
cvs rdiff -u -r1.1.2.9 -r1.1.2.10 src/sys/arch/mips/rmi/rmixl_cpu.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/mips/rmi/rmixl_cpu.c
diff -u src/sys/arch/mips/rmi/rmixl_cpu.c:1.1.2.9 src/sys/arch/mips/rmi/rmixl_cpu.c:1.1.2.10
--- src/sys/arch/mips/rmi/rmixl_cpu.c:1.1.2.9 Mon Mar 29 23:34:57 2010
+++ src/sys/arch/mips/rmi/rmixl_cpu.c Fri Apr 16 23:50:30 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: rmixl_cpu.c,v 1.1.2.9 2010/03/29 23:34:57 cliff Exp $ */
+/* $NetBSD: rmixl_cpu.c,v 1.1.2.10 2010/04/16 23:50:30 cliff Exp $ */
/*
* Copyright 2002 Wasabi Systems, Inc.
@@ -38,7 +38,7 @@
#include "locators.h"
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rmixl_cpu.c,v 1.1.2.9 2010/03/29 23:34:57 cliff Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rmixl_cpu.c,v 1.1.2.10 2010/04/16 23:50:30 cliff Exp $");
#include <sys/param.h>
#include <sys/device.h>
@@ -74,8 +74,8 @@
#if 0
static void cpu_setup_trampoline_ipi(struct device *, struct cpu_info *);
#endif
-static void cpu_setup_trampoline_callback(struct device *, struct cpu_info *);
-static void cpu_setup_trampoline_fmn(struct device *, struct cpu_info *);
+static int cpu_setup_trampoline_common(struct cpu_info *, struct rmixl_cpu_trampoline_args *);
+static void cpu_setup_trampoline_callback(struct cpu_info *);
#ifdef DEBUG
void rmixl_cpu_data_print(struct cpu_data *);
struct cpu_info *
@@ -145,10 +145,8 @@
switch (psb_type) {
case PSB_TYPE_RMI:
- cpu_setup_trampoline_callback(self, ci);
- break;
case PSB_TYPE_DELL:
- cpu_setup_trampoline_fmn(self, ci);
+ cpu_setup_trampoline_callback(ci);
break;
default:
aprint_error(": psb type=%s cpu_wakeup unsupported\n",
@@ -248,93 +246,10 @@
rmixl_fmn_init_core();
}
-#ifdef NOTYET
-static void
-cpu_setup_trampoline_ipi(struct device *self, struct cpu_info *ci)
-{
- volatile struct rmixlfw_cpu_wakeup_info *wip;
- u_int cpu, core, thread;
- uint32_t ipi;
- int32_t addr;
- uint64_t gp;
- uint64_t sp;
- uint32_t mask;
- volatile uint32_t *maskp;
- __cpu_simple_lock_t *llk;
- volatile uint32_t *xflag; /* ??? */
- extern void rmixl_cpu_trampoline(void *);
-
- cpu = ci->ci_cpuid;
- core = cpu >> 2;
- thread = cpu & __BITS(1,0);
-printf("\n%s: cpu %d, core %d, thread %d\n", __func__, cpu, core, thread);
-
- wip = &rmixl_configuration.rc_cpu_wakeup_info[cpu];
-printf("%s: wip %p\n", __func__, wip);
-
- llk = (__cpu_simple_lock_t *)(intptr_t)wip->loader_lock;
-printf("%s: llk %p: %#x\n", __func__, llk, *llk);
-
- /* XXX WTF */
- xflag = (volatile uint32_t *)(intptr_t)(wip->loader_lock + 0x2c);
-printf("%s: xflag %p, %#x\n", __func__, xflag, *xflag);
-
- ipi = (thread << RMIXL_PIC_IPIBASE_ID_THREAD_SHIFT)
- | (core << RMIXL_PIC_IPIBASE_ID_CORE_SHIFT)
- | RMIXLFW_IPI_WAKEUP;
-printf("%s: ipi %#x\n", __func__, ipi);
-
- /* entry addr must be uncached, use KSEG1 */
- addr = (int32_t)MIPS_PHYS_TO_KSEG1(
- MIPS_KSEG0_TO_PHYS(rmixl_cpu_trampoline));
-printf("%s: addr %#x\n", __func__, addr);
-
- __asm__ volatile("move %0, $gp\n" : "=r"(gp));
-printf("%s: gp %#"PRIx64"\n", __func__, gp);
-
- sp = (256 * 1024) - 32; /* XXX TMP FIXME */
- sp = MIPS_PHYS_TO_KSEG1(sp);
-printf("%s: sp %#"PRIx64"\n", __func__, sp);
-
- maskp = (uint32_t *)(intptr_t)wip->global_wakeup_mask;
-printf("%s: maskp %p\n", __func__, maskp);
-
- __cpu_simple_lock(llk);
-printf("%s: llk %p: %#x\n", __func__, llk, *llk);
-
- wip->entry.addr = addr;
- wip->entry.args = 0;
-if (0) {
- wip->entry.sp = sp;
- wip->entry.gp = gp;
-}
-
- mask = *maskp;
- mask |= 1 << cpu;
- *maskp = mask;
-
-#if 0
- *xflag = mask; /* XXX */
-#endif
-
- RMIXL_IOREG_WRITE(RMIXL_PIC_IPIBASE, ipi);
-
- __cpu_simple_unlock(llk);
-printf("%s: llk %p: %#x\n", __func__, llk, *llk);
-
- Debugger();
-}
-#endif /* NOTYET */
-
-
-static void
-cpu_setup_trampoline_callback(struct device *self, struct cpu_info *ci)
+static int
+cpu_setup_trampoline_common(struct cpu_info *ci, struct rmixl_cpu_trampoline_args *ta)
{
- void (*wakeup_cpu)(void *, void *, unsigned int);
- extern void rmixl_cpu_trampoline(void *);
- extern void rmixlfw_wakeup_cpu(void *, void *, u_int64_t, void *);
struct lwp *l = ci->ci_data.cpu_idlelwp;
- struct rmixl_cpu_trampoline_args *ta = &rmixl_cpu_trampoline_args;
uintptr_t stacktop;
#ifdef DIAGNOSTIC
@@ -364,7 +279,7 @@
* to avoid TLB fault in trampoline when loading args.
*
* Note:
- * RMI firmware only passes the lower half of 'ta'
+ * RMI firmware only passes the lower 32-bit half of 'ta'
* to rmixl_cpu_trampoline (the upper half is clear)
* so rmixl_cpu_trampoline must reconstruct the missing upper half
* rmixl_cpu_trampoline "knows" to use MIPS_KSEG0_START
@@ -373,7 +288,7 @@
KASSERT(MIPS_KSEG0_P(ta));
/*
- * marshall args for rmixl_cpu_trampoline,
+ * marshal args for rmixl_cpu_trampoline;
* note for non-LP64 kernel, use of intptr_t
* forces sign extension of 32 bit pointers
*/
@@ -383,45 +298,41 @@
ta->ta_lwp = (uint64_t)(intptr_t)l;
ta->ta_cpuinfo = (uint64_t)(intptr_t)ci;
-#if _LP64
- wakeup_cpu = (void *)rmixl_configuration.rc_psb_info.wakeup;
-#else
- wakeup_cpu = (void *)(intptr_t)
- (rmixl_configuration.rc_psb_info.wakeup & 0xffffffff);
+#ifdef DEBUG
+ printf("%s: sp %#"PRIx64", lwp %#"PRIx64", ci %#"PRIx64"\n",
+ __func__, ta->ta_sp, ta->ta_lwp, ta->ta_cpuinfo);
#endif
- rmixlfw_wakeup_cpu(rmixl_cpu_trampoline, (void *)ta,
- 1 << ci->ci_cpuid, wakeup_cpu);
+ return 0;
}
static void
-cpu_setup_trampoline_fmn(struct device *self, struct cpu_info *ci)
+cpu_setup_trampoline_callback(struct cpu_info *ci)
{
-#ifdef NOTYET
- rmixl_fmn_msg_t msg;
- intptr_t sp;
+ void (*wakeup_cpu)(void *, void *, unsigned int);
+ struct rmixl_cpu_trampoline_args *ta = &rmixl_cpu_trampoline_args;
extern void rmixl_cpu_trampoline(void *);
- static const uint64_t argv[4] = { 0x1234, 0x2345, 0x3456, 0x4567 }; /* XXX TMP */
+ extern void rmixlfw_wakeup_cpu(void *, void *, u_int64_t, void *);
+
+ cpu_setup_trampoline_common(ci, ta);
- sp = (intptr_t)malloc(4096, M_DEVBUF, M_NOWAIT);
- if (sp == 0)
- panic("%s: cannot malloc size 4096", __func__);
-
- msg.data[0] = (uint64_t)sp + 4096 - 32;
- msg.data[1] = (uint64_t)sp;
- msg.data[2] = (uint64_t)rmixl_cpu_trampoline;
- msg.data[3] = (uint64_t)argv; /* XXX TMP DEBUG */
-
- msg.data[0] |= 0xffffffff00000000ULL;
- msg.data[1] |= 0xffffffff00000000ULL;
- msg.data[2] |= 0xffffffff00000000ULL;
- msg.data[3] |= 0xffffffff00000000ULL;
+#if _LP64
+ wakeup_cpu = (void *)rmixl_configuration.rc_psb_info.wakeup;
+#else
+ wakeup_cpu = (void *)(intptr_t)
+ (rmixl_configuration.rc_psb_info.wakeup & 0xffffffff);
+#endif
- rmixl_fmn_msg_send(4, RMIXL_FMN_CODE_PSB_WAKEUP,
- RMIXL_FMN_CORE_DESTID(ci->ci_cpuid, 0), &msg); /* XXX FIXME */
+#ifdef DEBUG
+ printf("%s:%d: %p, %#"PRIx64"\n", __func__, __LINE__,
+ ta, (uint64_t)1 << ci->ci_cpuid);
#endif
+
+ rmixlfw_wakeup_cpu(rmixl_cpu_trampoline, (void *)ta,
+ (uint64_t)1 << ci->ci_cpuid, wakeup_cpu);
}
+
#ifdef DEBUG
void
rmixl_cpu_data_print(struct cpu_data *dp)