Module Name: src
Committed By: cliff
Date: Sun Jan 17 00:02:00 UTC 2010
Modified Files:
src/sys/arch/evbmips/rmixl [matt-nb5-mips64]: machdep.c
Log Message:
- get cpu wakeup info from firmware
- reserve the cpu_wakeup_info shared memory area from uvm
- initialize cpu_model from mycpu->cpu_name
- dont disable all non-0 threads if MULTIPROCESSOR
To generate a diff of this commit:
cvs rdiff -u -r1.1.2.13 -r1.1.2.14 src/sys/arch/evbmips/rmixl/machdep.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/evbmips/rmixl/machdep.c
diff -u src/sys/arch/evbmips/rmixl/machdep.c:1.1.2.13 src/sys/arch/evbmips/rmixl/machdep.c:1.1.2.14
--- src/sys/arch/evbmips/rmixl/machdep.c:1.1.2.13 Fri Jan 8 08:01:22 2010
+++ src/sys/arch/evbmips/rmixl/machdep.c Sun Jan 17 00:02:00 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.1.2.13 2010/01/08 08:01:22 cliff Exp $ */
+/* $NetBSD: machdep.c,v 1.1.2.14 2010/01/17 00:02:00 cliff Exp $ */
/*
* Copyright 2001, 2002 Wasabi Systems, Inc.
@@ -112,7 +112,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.1.2.13 2010/01/08 08:01:22 cliff Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.1.2.14 2010/01/17 00:02:00 cliff Exp $");
#include "opt_ddb.h"
#include "opt_com.h"
@@ -251,6 +251,13 @@
static u_int ram_seg_resv(phys_ram_seg_t *, u_int, u_quad_t, u_quad_t);
void rmixlfw_mmap_print(rmixlfw_mmap_t *);
+#ifdef MULTIPROCESSOR
+void rmixl_get_wakeup_info(struct rmixl_config *);
+#ifdef MACHDEP_DEBUG
+static void rmixl_wakeup_info_print(volatile rmixlfw_cpu_wakeup_info_t *);
+#endif
+#endif
+
/*
* safepri is a safe priority for sleep to set for a spin-wait during
@@ -272,7 +279,9 @@
phys_ram_seg_t vm_clusters[VM_PHYSSEG_MAX];
extern char edata[], end[];
+#ifndef MULTIPROCESSOR
rmixl_mtcr(0, 1); /* disable all threads except #0 */
+#endif
r = rmixl_mfcr(0x300);
r &= ~__BIT(14); /* disabled Unaligned Access */
@@ -297,6 +306,10 @@
*/
mips_vector_init();
+ /* mips_vector_init initialized mycpu */
+ strcpy(cpu_model, mycpu->cpu_name);
+
+ /* get system info from firmware */
memsize = rmixlfw_init(infop);
/* set the VM page size */
@@ -314,6 +327,14 @@
printf("\nNetBSD/rmixl\n");
printf("memsize = %#lx\n", memsize);
+#if defined(MULTIPROCESSOR) && defined(MACHDEP_DEBUG)
+ rmixl_wakeup_info_print(rcp->rc_cpu_wakeup_info);
+ rmixl_wakeup_info_print(rcp->rc_cpu_wakeup_info + 1);
+ printf("cpu_wakeup_info %p, cpu_wakeup_end %p\n",
+ rcp->rc_cpu_wakeup_info,
+ rcp->rc_cpu_wakeup_end);
+#endif
+
rmixl_physaddr_init();
/*
@@ -376,6 +397,19 @@
vm_cluster_cnt = ram_seg_resv(vm_clusters, vm_cluster_cnt,
0x1FC00000, 0x1FC00000+NBPG);
+#ifdef MULTIPROCEESOR
+ /* reserve the cpu_wakeup_info area */
+ vm_cluster_cnt = ram_seg_resv(vm_clusters, vm_cluster_cnt,
+ (u_quad_t)trunc_page(rcp->rc_cpu_wakeup_info),
+ (u_quad_t)round_page(rcp->rc_cpu_wakeup_end));
+#endif
+
+#if 0
+ /* reserve everything > 4GB */
+ vm_cluster_cnt = ram_seg_resv(vm_clusters, vm_cluster_cnt,
+ 0x100000000, (u_quad_t)~0);
+#endif
+
/*
* Load vm_clusters[] into the VM system.
*/
@@ -585,7 +619,9 @@
{
struct rmixl_config *rcp = &rmixl_configuration;
- strcpy(cpu_model, "RMI XLS616ATX VIIA"); /* XXX */
+#ifdef MULTIPROCESSOR
+ rmixl_get_wakeup_info(rcp);
+#endif
infop |= MIPS_KSEG0_START;
rmixlfw_info = *(rmixlfw_info_t *)(intptr_t)infop;
@@ -777,6 +813,107 @@
return sum;
}
+#ifdef MULTIPROCESSOR
+/*
+ * firmware passes wakeup info structure in CP0 OS Scratch reg #7
+ * they do not explicitly give us the size of the wakeup area.
+ * we "know" that firmware loader sets wip->gp thusly:
+ * gp = stack_start[vcpu] = round_page(wakeup_end) + (vcpu * (PAGE_SIZE * 2))
+ * so
+ * round_page(wakeup_end) == gp - (vcpu * (PAGE_SIZE * 2))
+ * Only the "master" cpu runs this function, so
+ * vcpu = wip->master_cpu
+ */
+void
+rmixl_get_wakeup_info(struct rmixl_config *rcp)
+{
+ volatile rmixlfw_cpu_wakeup_info_t *wip;
+ int32_t scratch_7;
+ intptr_t end;
+
+ __asm__ volatile(
+ ".set push" "\n"
+ ".set noreorder" "\n"
+ ".set mips64" "\n"
+ "dmfc0 %0, $22, 7" "\n"
+ ".set pop" "\n"
+ : "=r"(scratch_7));
+
+ wip = (volatile rmixlfw_cpu_wakeup_info_t *)
+ (intptr_t)scratch_7;
+ end = wip->entry.gp - (wip->master_cpu & (PAGE_SIZE * 2));;
+
+ if (wip->valid == 1) {
+ rcp->rc_cpu_wakeup_end = (const void *)end;
+ rcp->rc_cpu_wakeup_info = wip;
+ }
+};
+
+#ifdef MACHDEP_DEBUG
+static void
+rmixl_wakeup_info_print(volatile rmixlfw_cpu_wakeup_info_t *wip)
+{
+ int i;
+
+ printf("%s: wip %p\n", __func__, wip);
+
+ printf("cpu_status %#x\n", wip->cpu_status);
+ printf("valid: %d\n", wip->valid);
+ printf("entry: addr %#x, args %#x, sp %#"PRIx64", gp %#"PRIx64"\n",
+ wip->entry.addr,
+ wip->entry.args,
+ wip->entry.sp,
+ wip->entry.gp);
+ printf("master_cpu %d\n", wip->master_cpu);
+ printf("master_cpu_mask %#x\n", wip->master_cpu_mask);
+ printf("buddy_cpu_mask %#x\n", wip->buddy_cpu_mask);
+ printf("psb_os_cpu_map %#x\n", wip->psb_os_cpu_map);
+ printf("argc %d\n", wip->argc);
+ printf("argv:");
+ for (i=0; i < wip->argc; i++)
+ printf(" %#x", wip->argv[i]);
+ printf("\n");
+ printf("valid_tlb_entries %d\n", wip->valid_tlb_entries);
+ printf("tlb_map:\n");
+ for (i=0; i < wip->valid_tlb_entries; i++) {
+ volatile const struct lib_cpu_tlb_mapping *m =
+ &wip->tlb_map[i];
+ printf(" %d", m->page_size);
+ printf(", %d", m->asid);
+ printf(", %d", m->coherency);
+ printf(", %d", m->coherency);
+ printf(", %d", m->attr);
+ printf(", %#x", m->virt);
+ printf(", %#"PRIx64"\n", m->phys);
+ }
+ printf("elf segs:\n");
+ for (i=0; i < MAX_ELF_SEGMENTS; i++) {
+ volatile const struct core_segment_info *e =
+ &wip->seg_info[i];
+ printf(" %#"PRIx64"", e->vaddr);
+ printf(", %#"PRIx64"", e->memsz);
+ printf(", %#x\n", e->flags);
+ }
+ printf("envc %d\n", wip->envc);
+ for (i=0; i < wip->envc; i++)
+ printf(" %#x \"%s\"", wip->envs[i],
+ (char *)(intptr_t)(int32_t)(wip->envs[i]));
+ printf("\n");
+ printf("app_mode %d\n", wip->app_mode);
+ printf("printk_lock %#x\n", wip->printk_lock);
+ printf("kseg_master %d\n", wip->kseg_master);
+ printf("kuseg_reentry_function %#x\n", wip->kuseg_reentry_function);
+ printf("kuseg_reentry_args %#x\n", wip->kuseg_reentry_args);
+ printf("app_shared_mem_addr %#"PRIx64"\n", wip->app_shared_mem_addr);
+ printf("app_shared_mem_size %#"PRIx64"\n", wip->app_shared_mem_size);
+ printf("app_shared_mem_orig %#"PRIx64"\n", wip->app_shared_mem_orig);
+ printf("loader_lock %#x\n", wip->loader_lock);
+ printf("global_wakeup_mask %#x\n", wip->global_wakeup_mask);
+ printf("unused_0 %#x\n", wip->unused_0);
+}
+#endif /* MACHDEP_DEBUG */
+#endif /* MULTIPROCESSOR */
+
void
consinit(void)
{