Module Name:    src
Committed By:   palle
Date:           Mon Dec 16 20:17:35 UTC 2013

Modified Files:
        src/sys/arch/sparc64/conf: GENERIC files.sparc64
        src/sys/arch/sparc64/dev: ebus_mainbus.c
        src/sys/arch/sparc64/include: cpu.h ctlreg.h param.h pte.h
        src/sys/arch/sparc64/sparc64: cpu.c pmap.c

Log Message:
Updates to pmap_bootstrap() for sun4v - parts from OpenBSD - OK martin@


To generate a diff of this commit:
cvs rdiff -u -r1.169 -r1.170 src/sys/arch/sparc64/conf/GENERIC
cvs rdiff -u -r1.142 -r1.143 src/sys/arch/sparc64/conf/files.sparc64
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/sparc64/dev/ebus_mainbus.c
cvs rdiff -u -r1.105 -r1.106 src/sys/arch/sparc64/include/cpu.h
cvs rdiff -u -r1.59 -r1.60 src/sys/arch/sparc64/include/ctlreg.h
cvs rdiff -u -r1.51 -r1.52 src/sys/arch/sparc64/include/param.h
cvs rdiff -u -r1.23 -r1.24 src/sys/arch/sparc64/include/pte.h
cvs rdiff -u -r1.105 -r1.106 src/sys/arch/sparc64/sparc64/cpu.c
cvs rdiff -u -r1.281 -r1.282 src/sys/arch/sparc64/sparc64/pmap.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/sparc64/conf/GENERIC
diff -u src/sys/arch/sparc64/conf/GENERIC:1.169 src/sys/arch/sparc64/conf/GENERIC:1.170
--- src/sys/arch/sparc64/conf/GENERIC:1.169	Tue Sep 24 18:12:59 2013
+++ src/sys/arch/sparc64/conf/GENERIC	Mon Dec 16 20:17:34 2013
@@ -1,4 +1,4 @@
-# $NetBSD: GENERIC,v 1.169 2013/09/24 18:12:59 jdc Exp $
+# $NetBSD: GENERIC,v 1.170 2013/12/16 20:17:34 palle Exp $
 #
 # GENERIC machine description file
 #
@@ -22,7 +22,7 @@ include	"arch/sparc64/conf/std.sparc64"
 
 options 	INCLUDE_CONFIG_FILE	# embed config file in kernel binary
 
-#ident 		"GENERIC-$Revision: 1.169 $"
+#ident 		"GENERIC-$Revision: 1.170 $"
 
 maxusers	64
 
@@ -31,6 +31,7 @@ maxusers	64
 
 # Options for variants of the Sun SPARC architecure.
 options 	SUN4U		# sun4u - UltraSPARC
+options 	SUN4V		# sun4v - UltraSPARC T1/T2+/T3/T4/T5
 #options 	BLINK		# blink the system LED
 
 #### System options that are the same for all ports

Index: src/sys/arch/sparc64/conf/files.sparc64
diff -u src/sys/arch/sparc64/conf/files.sparc64:1.142 src/sys/arch/sparc64/conf/files.sparc64:1.143
--- src/sys/arch/sparc64/conf/files.sparc64:1.142	Tue Aug 27 13:11:12 2013
+++ src/sys/arch/sparc64/conf/files.sparc64	Mon Dec 16 20:17:34 2013
@@ -1,4 +1,4 @@
-#	$NetBSD: files.sparc64,v 1.142 2013/08/27 13:11:12 macallan Exp $
+#	$NetBSD: files.sparc64,v 1.143 2013/12/16 20:17:34 palle Exp $
 
 # @(#)files.sparc64	8.1 (Berkeley) 7/19/93
 # sparc64-specific configuration info
@@ -248,6 +248,7 @@ file	arch/sparc64/sparc64/trap.c
 file	arch/sparc64/sparc64/vm_machdep.c
 file	arch/sparc64/sparc64/ipifuncs.c		multiprocessor
 file	arch/sparc64/sparc64/lock_stubs.s
+file	arch/sparc64/sparc64/hvcall.S		sun4v
 
 file	arch/sparc64/sparc64/db_interface.c	ddb | kgdb
 file	arch/sparc64/sparc64/db_machdep.c	ddb

Index: src/sys/arch/sparc64/dev/ebus_mainbus.c
diff -u src/sys/arch/sparc64/dev/ebus_mainbus.c:1.11 src/sys/arch/sparc64/dev/ebus_mainbus.c:1.12
--- src/sys/arch/sparc64/dev/ebus_mainbus.c:1.11	Thu Sep 12 19:51:09 2013
+++ src/sys/arch/sparc64/dev/ebus_mainbus.c	Mon Dec 16 20:17:35 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: ebus_mainbus.c,v 1.11 2013/09/12 19:51:09 martin Exp $	*/
+/*	$NetBSD: ebus_mainbus.c,v 1.12 2013/12/16 20:17:35 palle Exp $	*/
 /*	$OpenBSD: ebus_mainbus.c,v 1.7 2010/11/11 17:58:23 miod Exp $	*/
 
 /*
@@ -18,7 +18,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ebus_mainbus.c,v 1.11 2013/09/12 19:51:09 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ebus_mainbus.c,v 1.12 2013/12/16 20:17:35 palle Exp $");
 
 #ifdef DEBUG
 #define	EDB_PROM	0x01
@@ -69,9 +69,11 @@ static void *ebus_mainbus_intr_establish
 static bus_space_tag_t ebus_mainbus_alloc_bus_tag(struct ebus_softc *,
 	bus_space_tag_t, int);
 #ifdef SUN4V
+#if 0
+XXX
 static void ebus_mainbus_intr_ack(struct intrhand *);
 #endif
-
+#endif
 int
 ebus_mainbus_match(device_t parent, cfdata_t cf, void *aux)
 {
@@ -280,6 +282,8 @@ ebus_mainbus_intr_establish(bus_space_ta
 	int ino;
 
 #ifdef SUN4V
+#if 0
+XXX
 	if (CPU_ISSUN4V) {
 		struct upa_reg reg;
 		u_int64_t devhandle, devino = INTINO(ihandle);
@@ -329,7 +333,7 @@ ebus_mainbus_intr_establish(bus_space_ta
 		return (ih);
 	}
 #endif
-
+#endif
 	ihandle |= sc->sc_ign;
 	ino = INTINO(ihandle);
 
@@ -372,11 +376,12 @@ ebus_mainbus_intr_establish(bus_space_ta
 }
 
 #ifdef SUN4V
-
+#if 0
+XXX
 static void
 ebus_mainbus_intr_ack(struct intrhand *ih)
 {
 	hv_intr_setstate(ih->ih_number, INTR_IDLE);
 }
-
+#endif
 #endif

Index: src/sys/arch/sparc64/include/cpu.h
diff -u src/sys/arch/sparc64/include/cpu.h:1.105 src/sys/arch/sparc64/include/cpu.h:1.106
--- src/sys/arch/sparc64/include/cpu.h:1.105	Sun Nov 10 00:50:13 2013
+++ src/sys/arch/sparc64/include/cpu.h	Mon Dec 16 20:17:35 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.h,v 1.105 2013/11/10 00:50:13 christos Exp $ */
+/*	$NetBSD: cpu.h,v 1.106 2013/12/16 20:17:35 palle Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -348,6 +348,9 @@ void	*sparc_softintr_establish(int, int 
 void	sparc_softintr_schedule(void *);
 void	sparc_softintr_disestablish(void *);
 
+/* cpu.c */
+int	cpu_myid(void);
+
 /* disksubr.c */
 struct dkbad;
 int isbad(struct dkbad *bt, int, int, int);

Index: src/sys/arch/sparc64/include/ctlreg.h
diff -u src/sys/arch/sparc64/include/ctlreg.h:1.59 src/sys/arch/sparc64/include/ctlreg.h:1.60
--- src/sys/arch/sparc64/include/ctlreg.h:1.59	Thu Nov  8 16:36:53 2012
+++ src/sys/arch/sparc64/include/ctlreg.h	Mon Dec 16 20:17:35 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: ctlreg.h,v 1.59 2012/11/08 16:36:53 nakayama Exp $ */
+/*	$NetBSD: ctlreg.h,v 1.60 2013/12/16 20:17:35 palle Exp $ */
 
 /*
  * Copyright (c) 1996-2002 Eduardo Horvath
@@ -663,6 +663,8 @@ SPARC64_LD_DEF(lduba, uint8_t, uint32_t)
 SPARC64_LD_DEF(lduha, uint16_t, uint32_t)
 /* load unsigned int from alternate address space */
 SPARC64_LD_DEF(lda, uint32_t, uint32_t)
+/* load unsigned word from alternate address space */
+SPARC64_LD_DEF(lduwa, uint32_t, uint32_t)
 /* load signed int from alternate address space */
 SPARC64_LD_DEF(ldswa, int, int)
 /* load 64-bit unsigned int from alternate address space */

Index: src/sys/arch/sparc64/include/param.h
diff -u src/sys/arch/sparc64/include/param.h:1.51 src/sys/arch/sparc64/include/param.h:1.52
--- src/sys/arch/sparc64/include/param.h:1.51	Thu Jan  3 09:40:55 2013
+++ src/sys/arch/sparc64/include/param.h	Mon Dec 16 20:17:35 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: param.h,v 1.51 2013/01/03 09:40:55 martin Exp $ */
+/*	$NetBSD: param.h,v 1.52 2013/12/16 20:17:35 palle Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -230,9 +230,15 @@ extern void	delay(unsigned int);
 
 extern int cputyp;
 
+#if defined (SUN4US) || defined (SUN4V)
 #define CPU_ISSUN4U     (cputyp == CPU_SUN4U)
 #define CPU_ISSUN4US    (cputyp == CPU_SUN4US)
 #define CPU_ISSUN4V     (cputyp == CPU_SUN4V)
+#else
+#define CPU_ISSUN4U	(1)
+#define CPU_ISSUN4US	(0)
+#define CPU_ISSUN4V	(0)
+#endif
 
 #endif /* _LOCORE */
 #endif /* _KERNEL */

Index: src/sys/arch/sparc64/include/pte.h
diff -u src/sys/arch/sparc64/include/pte.h:1.23 src/sys/arch/sparc64/include/pte.h:1.24
--- src/sys/arch/sparc64/include/pte.h:1.23	Sun Dec  8 14:41:28 2013
+++ src/sys/arch/sparc64/include/pte.h	Mon Dec 16 20:17:35 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: pte.h,v 1.23 2013/12/08 14:41:28 palle Exp $ */
+/*	$NetBSD: pte.h,v 1.24 2013/12/16 20:17:35 palle Exp $ */
 
 /*
  * Copyright (c) 1996-1999 Eduardo Horvath
@@ -176,7 +176,7 @@ typedef struct sun4u_tte pte_t;
 #define TLB_REAL_W		0x0000000000000400LL
 /* #define TLB_TSB_LOCK		0x0000000000000200LL */
 #define TLB_TSB_LOCK		0x0000000000001000LL
-#define TLB_EXEC		0x0000000000000100LL
+#define SUN4U_TLB_EXEC		0x0000000000000100LL
 #define TLB_EXEC_ONLY		0x0000000000000080LL
 /* H/W bits */
 #define TLB_L			0x0000000000000040LL
@@ -268,6 +268,8 @@ typedef struct sun4u_tte pte_t;
 ((ie)?SUN4V_TLB_IE:0LL))
 
 
+#define TLB_EXEC (CPU_ISSUN4V ? SUN4V_TLB_EXEC : SUN4U_TLB_EXEC)
+
 #define MMU_CACHE_VIRT	0x3
 #define MMU_CACHE_PHYS	0x2
 #define MMU_CACHE_NONE	0x0

Index: src/sys/arch/sparc64/sparc64/cpu.c
diff -u src/sys/arch/sparc64/sparc64/cpu.c:1.105 src/sys/arch/sparc64/sparc64/cpu.c:1.106
--- src/sys/arch/sparc64/sparc64/cpu.c:1.105	Fri Nov  8 15:44:26 2013
+++ src/sys/arch/sparc64/sparc64/cpu.c	Mon Dec 16 20:17:35 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.c,v 1.105 2013/11/08 15:44:26 nakayama Exp $ */
+/*	$NetBSD: cpu.c,v 1.106 2013/12/16 20:17:35 palle Exp $ */
 
 /*
  * Copyright (c) 1996
@@ -52,7 +52,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.105 2013/11/08 15:44:26 nakayama Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.106 2013/12/16 20:17:35 palle Exp $");
 
 #include "opt_multiprocessor.h"
 
@@ -73,6 +73,9 @@ __KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.10
 #include <machine/openfirm.h>
 
 #include <sparc64/sparc64/cache.h>
+#ifdef SUN4V
+#include <sparc64/hypervisor.h>
+#endif
 
 int ecache_min_line_size;
 
@@ -412,6 +415,37 @@ cpu_attach(device_t parent, device_t dev
 
 }
 
+int
+cpu_myid(void)
+{
+	char buf[32];
+	int impl;
+
+#ifdef SUN4V
+	if (CPU_ISSUN4V) {
+		uint64_t myid;
+		hv_cpu_myid(&myid);
+		return myid;
+	}
+#endif
+	if (OF_getprop(findroot(), "name", buf, sizeof(buf)) > 0 &&
+	    strcmp(buf, "SUNW,Ultra-Enterprise-10000") == 0)
+		return lduwa(0x1fff40000d0UL, ASI_PHYS_NON_CACHED);
+	impl = (getver() & VER_IMPL) >> VER_IMPL_SHIFT;
+	switch (impl) {
+		case IMPL_OLYMPUS_C:
+		case IMPL_JUPITER:
+			return CPU_JUPITERID;
+		case IMPL_CHEETAH:
+		case IMPL_CHEETAH_PLUS:
+		case IMPL_JAGUAR:
+		case IMPL_PANTHER:
+			return CPU_FIREPLANEID;
+		default:
+			return CPU_UPAID;
+	}
+}
+
 #if defined(MULTIPROCESSOR)
 vaddr_t cpu_spinup_trampoline;
 

Index: src/sys/arch/sparc64/sparc64/pmap.c
diff -u src/sys/arch/sparc64/sparc64/pmap.c:1.281 src/sys/arch/sparc64/sparc64/pmap.c:1.282
--- src/sys/arch/sparc64/sparc64/pmap.c:1.281	Wed Sep 11 18:27:44 2013
+++ src/sys/arch/sparc64/sparc64/pmap.c	Mon Dec 16 20:17:35 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.c,v 1.281 2013/09/11 18:27:44 martin Exp $	*/
+/*	$NetBSD: pmap.c,v 1.282 2013/12/16 20:17:35 palle Exp $	*/
 /*
  *
  * Copyright (C) 1996-1999 Eduardo Horvath.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.281 2013/09/11 18:27:44 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.282 2013/12/16 20:17:35 palle Exp $");
 
 #undef	NO_VCACHE /* Don't forget the locked TLB in dostart */
 #define	HWREF
@@ -60,6 +60,9 @@ __KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.2
 #include <machine/bootinfo.h>
 
 #include <sparc64/sparc64/cache.h>
+#ifdef SUN4V
+#include <sparc64/hypervisor.h>
+#endif
 
 #ifdef DDB
 #include <machine/db_machdep.h>
@@ -146,6 +149,10 @@ int tsbsize;		/* tsbents = 512 * 2^^tsbs
 #define TSBENTS (512<<tsbsize)
 #define	TSBSIZE	(TSBENTS * 16)
 
+#ifdef SUN4V
+struct tsb_desc *tsb_desc;
+#endif
+
 static struct pmap kernel_pmap_;
 struct pmap *const kernel_pmap_ptr = &kernel_pmap_;
 
@@ -1145,7 +1152,7 @@ pmap_bootstrap(u_long kernelstart, u_lon
 		cpus->ci_next = NULL;
 		cpus->ci_curlwp = &lwp0;
 		cpus->ci_flags = CPUF_PRIMARY;
-		cpus->ci_cpuid = CPU_UPAID;
+		cpus->ci_cpuid = cpu_myid();
 		cpus->ci_fplwp = NULL;
 		cpus->ci_eintstack = NULL;
 		cpus->ci_spinup = main; /* Call main when we're running. */
@@ -1233,6 +1240,26 @@ cpu_pmap_prepare(struct cpu_info *ci, bo
 		ci->ci_ctxbusy = curcpu()->ci_ctxbusy;
 	}
 
+#ifdef SUN4V
+	if (initial && CPU_ISSUN4V) {
+		tsb_desc = (struct tsb_desc *)kdata_alloc(
+			sizeof(struct tsb_desc), 16);
+		memset(tsb_desc, 0, sizeof(struct tsb_desc));
+		/* 8K page size used for TSB index computation */
+		tsb_desc->td_idxpgsz = 0;
+		tsb_desc->td_assoc = 1;
+		tsb_desc->td_size = TSBENTS;
+		tsb_desc->td_ctxidx = -1;
+		tsb_desc->td_pgsz = 0xf;
+		tsb_desc->td_pa = pmap_kextract((vaddr_t)ci->ci_tsb_dmmu);
+		BDPRINTF(PDB_BOOT1, ("cpu %d: TSB descriptor allocated at %p "
+		    "size %08x - td_pa at %p\n",
+		    ci->ci_index, tsb_desc, sizeof(struct tsb_desc),
+		    tsb_desc->td_pa));
+		
+	}
+#endif
+
 	BDPRINTF(PDB_BOOT1, ("cpu %d: TSB allocated at %p/%p size %08x\n",
 	    ci->ci_index, ci->ci_tsb_dmmu, ci->ci_tsb_immu, TSBSIZE));
 }
@@ -1250,11 +1277,8 @@ cpu_pmap_init(struct cpu_info *ci)
 	 * running for cpu0 yet..
 	 */
 	ci->ci_pmap_next_ctx = 1;
-#ifdef SUN4V
-#error find out if we have 16 or 13 bit context ids
-#else
-	ci->ci_numctx = 0x2000; /* all SUN4U use 13 bit contexts */
-#endif
+	/* all SUN4U use 13 bit contexts - SUN4V use at least 13 bit contexts */
+	ci->ci_numctx = 0x2000; 
 	ctxsize = sizeof(paddr_t)*ci->ci_numctx;
 	ci->ci_ctxbusy = (paddr_t *)kdata_alloc(ctxsize, sizeof(uint64_t));
 	memset(ci->ci_ctxbusy, 0, ctxsize);

Reply via email to