Module Name:    src
Committed By:   kiyohara
Date:           Sat Oct 20 14:53:38 UTC 2012

Modified Files:
        src/sys/arch/bebox/bebox: cpu.c locore.S
        src/sys/arch/bebox/conf: files.bebox
        src/sys/arch/bebox/include: cpu.h intr.h
Added Files:
        src/sys/arch/bebox/bebox: ipi_bebox.c
        src/sys/arch/bebox/conf: GENERIC.MP

Log Message:
Add experimental support GENERIC.MP.


To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/bebox/bebox/cpu.c
cvs rdiff -u -r0 -r1.1 src/sys/arch/bebox/bebox/ipi_bebox.c
cvs rdiff -u -r1.27 -r1.28 src/sys/arch/bebox/bebox/locore.S
cvs rdiff -u -r0 -r1.1 src/sys/arch/bebox/conf/GENERIC.MP
cvs rdiff -u -r1.56 -r1.57 src/sys/arch/bebox/conf/files.bebox
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/bebox/include/cpu.h
cvs rdiff -u -r1.32 -r1.33 src/sys/arch/bebox/include/intr.h

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/bebox/bebox/cpu.c
diff -u src/sys/arch/bebox/bebox/cpu.c:1.11 src/sys/arch/bebox/bebox/cpu.c:1.12
--- src/sys/arch/bebox/bebox/cpu.c:1.11	Fri Jul  1 20:34:52 2011
+++ src/sys/arch/bebox/bebox/cpu.c	Sat Oct 20 14:53:37 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.c,v 1.11 2011/07/01 20:34:52 dyoung Exp $	*/
+/*	$NetBSD: cpu.c,v 1.12 2012/10/20 14:53:37 kiyohara Exp $	*/
 
 /*-
  * Copyright (c) 2000, 2001 The NetBSD Foundation, Inc.
@@ -30,21 +30,29 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.11 2011/07/01 20:34:52 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.12 2012/10/20 14:53:37 kiyohara Exp $");
+
+#include "opt_multiprocessor.h"
 
 #include <sys/param.h>
+#include <sys/bus.h>
 #include <sys/systm.h>
 #include <sys/device.h>
 
 #include <machine/autoconf.h>
-#include <sys/bus.h>
 #include <machine/cpu.h>
 
+#include <powerpc/oea/hid.h>
+#include <powerpc/oea/spr.h>
+#include <powerpc/spr.h>
+
+#include <uvm/uvm.h>
+
+
 int cpumatch(device_t, cfdata_t, void *);
 void cpuattach(device_t, device_t, void *);
 
-CFATTACH_DECL_NEW(cpu, 0,
-    cpumatch, cpuattach, NULL, NULL);
+CFATTACH_DECL_NEW(cpu, 0, cpumatch, cpuattach, NULL, NULL);
 
 extern struct cfdriver cpu_cd;
 
@@ -52,16 +60,126 @@ int
 cpumatch(device_t parent, cfdata_t cfdata, void *aux)
 {
 	struct confargs *ca = aux;
-  
+
 	if (strcmp(ca->ca_name, cpu_cd.cd_name) != 0)
-		return (0);
-	if (cpu_info[0].ci_dev != NULL)
-		return (0);
-	return (1);
+		return 0;
+	return 1;
 }
 
 void
 cpuattach(device_t parent, device_t self, void *aux)
 {
-	(void) cpu_attach_common(self, 0);
+	struct confargs *ca = aux;
+	struct cpu_info *ci;
+	int id = ca->ca_node;
+
+	ci = cpu_attach_common(self, id);
+	if (ci == NULL)
+		return;
+
+#ifdef MULTIPROCESSOR
+	if (id > 0)
+		cpu_spinup(self, ci);
+#endif
+}
+
+
+#ifdef MULTIPROCESSOR
+
+extern volatile u_int cpu_spinstart_ack, cpu_spinstart_cpunum;
+
+int
+md_setup_trampoline(volatile struct cpu_hatch_data *h, struct cpu_info *ci)
+{
+	int blocks, i;
+	extern void cache_flush_invalidate_all(int blocks);
+
+	/*
+	 * Our CPU(603e) supports control protocol for cache only MEI
+	 * (Modified/Exclusive/Invalid).  Flush dirty caches myself.
+	 */
+
+	h->hatch_running = -1;
+	cpu_spinstart_ack = -1;
+
+	/* Flush-invalidate all blocks */
+	blocks = curcpu()->ci_ci.dcache_size / curcpu()->ci_ci.dcache_line_size;
+	cache_flush_invalidate_all(blocks);
+
+	cpu_spinstart_cpunum = ci->ci_cpuid;
+	__asm volatile("dcbf 0,%0"::"r"(&cpu_spinstart_cpunum):"memory");
+
+	for (i = 0; i < 100000000; i++) {
+		if (cpu_spinstart_ack != -1)
+			break;
+		__asm volatile("dcbi 0,%0"::"r"(&cpu_spinstart_ack):"memory");
+		__asm volatile("sync; isync");
+	}
+	return 1;
+}
+
+void
+md_presync_timebase(volatile struct cpu_hatch_data *h)
+{
+	uint64_t tb;
+
+	/* Sync timebase. */
+	tb = mftb();
+	tb += 1000000;	/* 30ms @ 33MHz */
+
+	h->hatch_tbu = tb >> 32;
+	h->hatch_tbl = tb & 0xffffffff;
+
+	while (tb > mftb())
+		;
+
+	h->hatch_running = 0;
+
+	delay(500000);
 }
+
+void
+md_start_timebase(volatile struct cpu_hatch_data *h)
+{
+	/* Nothing */
+}
+
+void
+md_sync_timebase(volatile struct cpu_hatch_data *h)
+{
+	u_int tbu, tbl;
+
+	do {
+		__asm volatile("dcbi 0,%0"::"r"(&h->hatch_running):"memory");
+		__asm volatile("sync; isync");
+
+		__asm volatile("dcbst 0,%0"::"r"(&h->hatch_running):"memory");
+		__asm volatile("sync; isync");
+	} while (h->hatch_running == -1);
+
+	__asm volatile("dcbi 0,%0"::"r"(&h->hatch_tbu):"memory");
+	__asm volatile("dcbi 0,%0"::"r"(&h->hatch_tbl):"memory");
+	__asm volatile("sync; isync");
+	__asm volatile("dcbst 0,%0"::"r"(&h->hatch_tbu):"memory");
+	__asm volatile("dcbst 0,%0"::"r"(&h->hatch_tbl):"memory");
+	__asm volatile("sync; isync");
+
+	/* Sync timebase. */
+	tbu = h->hatch_tbu;
+	tbl = h->hatch_tbl;
+	__asm volatile ("sync; isync");
+	__asm volatile ("mttbl %0" :: "r"(0));
+	__asm volatile ("mttbu %0" :: "r"(tbu));
+	__asm volatile ("mttbl %0" :: "r"(tbl));
+}
+
+void
+md_setup_interrupts(void)
+{
+
+	CLEAR_BEBOX_REG(CPU1_INT_MASK, BEBOX_INTR_MASK);
+
+	/* XXXXXX: We can handle interrupts on CPU0 only now. */
+}
+
+#endif /* MULTIPROCESSOR */

Index: src/sys/arch/bebox/bebox/locore.S
diff -u src/sys/arch/bebox/bebox/locore.S:1.27 src/sys/arch/bebox/bebox/locore.S:1.28
--- src/sys/arch/bebox/bebox/locore.S:1.27	Sat Oct 20 12:45:22 2012
+++ src/sys/arch/bebox/bebox/locore.S	Sat Oct 20 14:53:37 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: locore.S,v 1.27 2012/10/20 12:45:22 kiyohara Exp $	*/
+/*	$NetBSD: locore.S,v 1.28 2012/10/20 14:53:37 kiyohara Exp $	*/
 /*	$OpenBSD: locore.S,v 1.4 1997/01/26 09:06:38 rahnds Exp $	*/
 
 /*
@@ -178,6 +178,23 @@ __start_cpu0:
 
 loop:	b	loop			/* XXX not reached */
 
+
+	.globl	_C_LABEL(cache_flush_invalidate_all)
+_C_LABEL(cache_flush_invalidate_all):
+	mtctr	3
+	li	4,0x0
+loop1:	lwz	5,0(4)
+	addi	4,4,32
+	bdnz	loop1
+
+	mtctr	3
+	li	4,0x0
+loop2:	dcbf	0,4
+	addi	4,4,32
+	bdnz	loop2
+
+	blr
+
 	.globl	_C_LABEL(debug_led)
 _C_LABEL(debug_led):
 	lis	4, 0x8000

Index: src/sys/arch/bebox/conf/files.bebox
diff -u src/sys/arch/bebox/conf/files.bebox:1.56 src/sys/arch/bebox/conf/files.bebox:1.57
--- src/sys/arch/bebox/conf/files.bebox:1.56	Wed Jun 22 18:06:32 2011
+++ src/sys/arch/bebox/conf/files.bebox	Sat Oct 20 14:53:37 2012
@@ -1,4 +1,4 @@
-#	$NetBSD: files.bebox,v 1.56 2011/06/22 18:06:32 matt Exp $
+#	$NetBSD: files.bebox,v 1.57 2012/10/20 14:53:37 kiyohara Exp $
 #
 # First try for bebox specific configuration info
 #
@@ -7,6 +7,7 @@ maxpartitions 8
 maxusers 2 8 64
 
 include "arch/powerpc/pic/files.pic"
+include "arch/powerpc/pic/files.ipi"
 
 file	arch/bebox/bebox/autoconf.c
 file	arch/bebox/bebox/machdep.c
@@ -16,6 +17,7 @@ file	arch/powerpc/powerpc/bus_dma.c
 file	arch/powerpc/powerpc/bus_space.c
 file	arch/powerpc/powerpc/procfs_machdep.c	procfs
 file    arch/bebox/bebox/pic_bebox.c
+file    arch/bebox/bebox/ipi_bebox.c		multiprocessor
 
 # General files
 file	dev/cons.c

Index: src/sys/arch/bebox/include/cpu.h
diff -u src/sys/arch/bebox/include/cpu.h:1.13 src/sys/arch/bebox/include/cpu.h:1.14
--- src/sys/arch/bebox/include/cpu.h:1.13	Mon Jun 20 06:35:39 2011
+++ src/sys/arch/bebox/include/cpu.h	Sat Oct 20 14:53:37 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.h,v 1.13 2011/06/20 06:35:39 matt Exp $	*/
+/*	$NetBSD: cpu.h,v 1.14 2012/10/20 14:53:37 kiyohara Exp $	*/
 
 /*
  * Copyright (C) 1995-1997 Wolfgang Solfrank.
@@ -38,6 +38,24 @@
 extern char bootpath[];
 #endif
 
+#ifdef MULTIPROCESSOR
+#define MD_TLBSYNC()	bebox_tlbisync()
+#endif
+
+#include <machine/bebox.h>
+
 #include <powerpc/cpu.h>
 
+static __inline void
+bebox_tlbisync(void)
+{
+	int cpuid = curcpu()->ci_index;
+
+	/* Assert #TLBISYNC for other CPU */
+	CLEAR_BEBOX_REG(CPU_CONTROL, TLBISYNC_FROM(cpuid));
+
+	/* Deassert #TLBISYNC */
+	SET_BEBOX_REG(CPU_CONTROL, TLBISYNC_FROM(cpuid));
+}
+
 #endif	/* _BEBOX_CPU_H_ */

Index: src/sys/arch/bebox/include/intr.h
diff -u src/sys/arch/bebox/include/intr.h:1.32 src/sys/arch/bebox/include/intr.h:1.33
--- src/sys/arch/bebox/include/intr.h:1.32	Sat Oct 20 12:13:46 2012
+++ src/sys/arch/bebox/include/intr.h	Sat Oct 20 14:53:37 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: intr.h,v 1.32 2012/10/20 12:13:46 kiyohara Exp $	*/
+/*	$NetBSD: intr.h,v 1.33 2012/10/20 14:53:37 kiyohara Exp $	*/
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -41,6 +41,8 @@
 #define IRQ_SLAVE		2
 #define LEGAL_HWIRQ_P(x)	((u_int)(x) < ICU_LEN && (x) != IRQ_SLAVE)
 
+void setup_bebox_ipi(void);
+
 #endif /* !_LOCORE */
 
 #endif /* !_BEBOX_INTR_H_ */

Added files:

Index: src/sys/arch/bebox/bebox/ipi_bebox.c
diff -u /dev/null src/sys/arch/bebox/bebox/ipi_bebox.c:1.1
--- /dev/null	Sat Oct 20 14:53:38 2012
+++ src/sys/arch/bebox/bebox/ipi_bebox.c	Sat Oct 20 14:53:37 2012
@@ -0,0 +1,86 @@
+/* $NetBSD: ipi_bebox.c,v 1.1 2012/10/20 14:53:37 kiyohara Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Tim Rightnour
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: ipi_bebox.c,v 1.1 2012/10/20 14:53:37 kiyohara Exp $");
+
+#include <sys/atomic.h>
+#include <sys/cpu.h>
+
+#include <powerpc/pic/picvar.h>
+#include <powerpc/pic/ipivar.h>
+
+
+static void bebox_send_ipi(cpuid_t, uint32_t);
+static void bebox_establish_ipi(int, int, void *);
+
+void
+setup_bebox_ipi(void)
+{
+
+	ipiops.ppc_send_ipi = bebox_send_ipi;
+	ipiops.ppc_establish_ipi = bebox_establish_ipi;
+	ipiops.ppc_ipi_vector = IPI_VECTOR;
+}
+
+static void
+bebox_send_ipi(cpuid_t target, uint32_t mesg)
+{
+	struct cpu_info * const ci = curcpu();
+	int i;
+
+	switch (target) {
+	case IPI_DST_ALL:
+	case IPI_DST_NOTME:
+		for (i = 0; i < ncpu; i++) {
+			struct cpu_info * const dst_ci = cpu_lookup(i);
+
+			if (target == IPI_DST_ALL || dst_ci != ci) {
+				atomic_or_32(&dst_ci->ci_pending_ipis, mesg);
+			}
+		}
+		break;
+
+	default:
+	    {
+		struct cpu_info * const dst_ci = cpu_lookup(target);
+
+		atomic_or_32(&dst_ci->ci_pending_ipis, mesg);
+		break;
+	    }
+	}
+}
+
+static void
+bebox_establish_ipi(int type, int level, void *ih_args)
+{
+	/* XXXXX: nothing? */
+}

Index: src/sys/arch/bebox/conf/GENERIC.MP
diff -u /dev/null src/sys/arch/bebox/conf/GENERIC.MP:1.1
--- /dev/null	Sat Oct 20 14:53:38 2012
+++ src/sys/arch/bebox/conf/GENERIC.MP	Sat Oct 20 14:53:37 2012
@@ -0,0 +1,7 @@
+# $NetBSD: GENERIC.MP,v 1.1 2012/10/20 14:53:37 kiyohara Exp $
+
+include 	"arch/bebox/conf/GENERIC"
+
+# SMP options
+options 	MULTIPROCESSOR
+options 	CACHE_PROTO_MEI			# require PPC 603e

Reply via email to