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);