Module Name:    src
Committed By:   macallan
Date:           Fri Nov  4 05:41:01 UTC 2016

Modified Files:
        src/sys/arch/sparc64/include: bus_defs.h pmap.h pte.h
        src/sys/arch/sparc64/sparc64: machdep.c pmap.c

Log Message:
add plumbing to support bus_space_mmap() with:
- write combining allowed via BUS_SPACE_MAP_PREFETCHABLE
- byte order translation via BUS_SPACE_MAP_LITTLE


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/sparc64/include/bus_defs.h
cvs rdiff -u -r1.60 -r1.61 src/sys/arch/sparc64/include/pmap.h
cvs rdiff -u -r1.27 -r1.28 src/sys/arch/sparc64/include/pte.h
cvs rdiff -u -r1.285 -r1.286 src/sys/arch/sparc64/sparc64/machdep.c
cvs rdiff -u -r1.303 -r1.304 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/include/bus_defs.h
diff -u src/sys/arch/sparc64/include/bus_defs.h:1.3 src/sys/arch/sparc64/include/bus_defs.h:1.4
--- src/sys/arch/sparc64/include/bus_defs.h:1.3	Thu Jul  7 06:55:38 2016
+++ src/sys/arch/sparc64/include/bus_defs.h	Fri Nov  4 05:41:01 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: bus_defs.h,v 1.3 2016/07/07 06:55:38 msaitoh Exp $	*/
+/*	$NetBSD: bus_defs.h,v 1.4 2016/11/04 05:41:01 macallan Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997, 1998, 2001 The NetBSD Foundation, Inc.
@@ -171,6 +171,7 @@ struct sparc_bus_space_tag {
 #define	BUS_SPACE_MAP_BUS2		0x0200
 #define	BUS_SPACE_MAP_BUS3		0x0400
 #define	BUS_SPACE_MAP_BUS4		0x0800
+#define BUS_SPACE_MAP_LITTLE		0x1000
 /* sparc uses this, it's not supposed to do anything on sparc64 */
 #define BUS_SPACE_MAP_LARGE		0
 

Index: src/sys/arch/sparc64/include/pmap.h
diff -u src/sys/arch/sparc64/include/pmap.h:1.60 src/sys/arch/sparc64/include/pmap.h:1.61
--- src/sys/arch/sparc64/include/pmap.h:1.60	Sun Sep  6 23:48:39 2015
+++ src/sys/arch/sparc64/include/pmap.h	Fri Nov  4 05:41:01 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.h,v 1.60 2015/09/06 23:48:39 nakayama Exp $	*/
+/*	$NetBSD: pmap.h,v 1.61 2016/11/04 05:41:01 macallan Exp $	*/
 
 /*-
  * Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -164,7 +164,7 @@ struct prom_map {
 	uint64_t	tte;
 };
 
-#define PMAP_NC		0x001	/* Set the E bit in the page */
+#define PMAP_NC		0x001	/* Don't cache, set the E bit in the page */
 #define PMAP_NVC	0x002	/* Don't enable the virtual cache */
 #define PMAP_LITTLE	0x004	/* Map in little endian mode */
 /* Large page size hints --
@@ -177,6 +177,7 @@ struct prom_map {
 /* If these bits are different in va's to the same PA
    then there is an aliasing in the d$ */
 #define VA_ALIAS_MASK   (1 << 13)
+#define PMAP_WC		0x20	/* allow write combinimg */
 
 #ifdef	_KERNEL
 #ifdef PMAP_COUNT_DEBUG

Index: src/sys/arch/sparc64/include/pte.h
diff -u src/sys/arch/sparc64/include/pte.h:1.27 src/sys/arch/sparc64/include/pte.h:1.28
--- src/sys/arch/sparc64/include/pte.h:1.27	Fri Apr  3 10:07:57 2015
+++ src/sys/arch/sparc64/include/pte.h	Fri Nov  4 05:41:01 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: pte.h,v 1.27 2015/04/03 10:07:57 palle Exp $ */
+/*	$NetBSD: pte.h,v 1.28 2016/11/04 05:41:01 macallan Exp $ */
 
 /*
  * Copyright (c) 1996-1999 Eduardo Horvath
@@ -254,21 +254,21 @@ typedef struct sun4u_tte pte_t;
 #define SUN4V_TLB_W		0x0000000000000040LL
 #define SUN4V_TLB_G		0x0000000000000000LL
 
-#define SUN4U_TSB_DATA(g,sz,pa,priv,write,cache,aliased,valid,ie) \
+#define SUN4U_TSB_DATA(g,sz,pa,priv,write,cache,aliased,valid,ie,wc) \
 (((valid)?SUN4U_TLB_V:0LL)|SUN4U_TLB_SZ(sz)|(((uint64_t)(pa))&SUN4U_TLB_PA_MASK)|\
-((cache)?((aliased)?SUN4U_TLB_CP:SUN4U_TLB_CACHE_MASK):SUN4U_TLB_E)|\
+((cache)?((aliased)?SUN4U_TLB_CP:SUN4U_TLB_CACHE_MASK):((wc)?0LL:SUN4U_TLB_E))|\
 ((priv)?SUN4U_TLB_P:0LL)|((write)?SUN4U_TLB_W:0LL)|((g)?SUN4U_TLB_G:0LL)|((ie)?SUN4U_TLB_IE:0LL))
 
-#define SUN4V_TSB_DATA(g,sz,pa,priv,write,cache,aliased,valid,ie) \
+#define SUN4V_TSB_DATA(g,sz,pa,priv,write,cache,aliased,valid,ie,wc) \
 (((valid)?SUN4V_TLB_V:0LL)|SUN4V_TLB_SZ(sz)|\
 (((u_int64_t)(pa))&SUN4V_TLB_PA_MASK)|\
-((cache)?((aliased)?SUN4V_TLB_CP:SUN4V_TLB_CACHE_MASK):SUN4V_TLB_E)|\
+((cache)?((aliased)?SUN4V_TLB_CP:SUN4V_TLB_CACHE_MASK):((wc)?0LL:SUN4V_TLB_E))|\
 ((priv)?SUN4V_TLB_P:0LL)|((write)?SUN4V_TLB_W:0LL)|((g)?SUN4V_TLB_G:0LL)|\
 ((ie)?SUN4V_TLB_IE:0LL))
 
-#define TSB_DATA(g,sz,pa,priv,write,cache,aliased,valid,ie) \
-(CPU_ISSUN4V ? SUN4V_TSB_DATA(g,sz,pa,priv,write,cache,aliased,valid,ie) : \
-               SUN4U_TSB_DATA(g,sz,pa,priv,write,cache,aliased,valid,ie))
+#define TSB_DATA(g,sz,pa,priv,write,cache,aliased,valid,ie,wc) \
+(CPU_ISSUN4V ? SUN4V_TSB_DATA(g,sz,pa,priv,write,cache,aliased,valid,ie,wc) : \
+               SUN4U_TSB_DATA(g,sz,pa,priv,write,cache,aliased,valid,ie,wc))
 
 #define TLB_EXEC      (CPU_ISSUN4V ? SUN4V_TLB_EXEC      : SUN4U_TLB_EXEC)
 #define TLB_V         (CPU_ISSUN4V ? SUN4V_TLB_V         : SUN4U_TLB_V)
@@ -283,6 +283,7 @@ typedef struct sun4u_tte pte_t;
 #define TLB_EXEC_ONLY (CPU_ISSUN4V ? SUN4V_TLB_EXEC_ONLY : SUN4U_TLB_EXEC_ONLY)
 #define TLB_L         (CPU_ISSUN4V ? 0                   : SUN4U_TLB_L)
 #define TLB_CV        (CPU_ISSUN4V ? SUN4V_TLB_CV        : SUN4U_TLB_CV)
+#define TLB_IE        (CPU_ISSUN4V ? SUN4V_TLB_IE        : SUN4U_TLB_IE)
 
 #define MMU_CACHE_VIRT	0x3
 #define MMU_CACHE_PHYS	0x2

Index: src/sys/arch/sparc64/sparc64/machdep.c
diff -u src/sys/arch/sparc64/sparc64/machdep.c:1.285 src/sys/arch/sparc64/sparc64/machdep.c:1.286
--- src/sys/arch/sparc64/sparc64/machdep.c:1.285	Thu Jul  7 06:55:38 2016
+++ src/sys/arch/sparc64/sparc64/machdep.c	Fri Nov  4 05:41:01 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.285 2016/07/07 06:55:38 msaitoh Exp $ */
+/*	$NetBSD: machdep.c,v 1.286 2016/11/04 05:41:01 macallan Exp $ */
 
 /*-
  * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
@@ -71,7 +71,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.285 2016/07/07 06:55:38 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.286 2016/11/04 05:41:01 macallan Exp $");
 
 #include "opt_ddb.h"
 #include "opt_multiprocessor.h"
@@ -2357,8 +2357,14 @@ paddr_t
 sparc_bus_mmap(bus_space_tag_t t, bus_addr_t paddr, off_t off, int prot,
 	int flags)
 {
+	paddr_t pa;
 	/* Devices are un-cached... although the driver should do that */
-	return ((paddr+off)|PMAP_NC);
+	pa = (paddr + off) | PMAP_NC;
+	if (flags & BUS_SPACE_MAP_LITTLE)
+		pa |= PMAP_LITTLE;
+	if (flags & BUS_SPACE_MAP_PREFETCHABLE)
+		pa |= PMAP_WC;	
+	return pa;
 }
 
 

Index: src/sys/arch/sparc64/sparc64/pmap.c
diff -u src/sys/arch/sparc64/sparc64/pmap.c:1.303 src/sys/arch/sparc64/sparc64/pmap.c:1.304
--- src/sys/arch/sparc64/sparc64/pmap.c:1.303	Thu Jul  7 06:55:38 2016
+++ src/sys/arch/sparc64/sparc64/pmap.c	Fri Nov  4 05:41:01 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.c,v 1.303 2016/07/07 06:55:38 msaitoh Exp $	*/
+/*	$NetBSD: pmap.c,v 1.304 2016/11/04 05:41:01 macallan Exp $	*/
 /*
  *
  * Copyright (C) 1996-1999 Eduardo Horvath.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.303 2016/07/07 06:55:38 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.304 2016/11/04 05:41:01 macallan Exp $");
 
 #undef	NO_VCACHE /* Don't forget the locked TLB in dostart */
 #define	HWREF
@@ -560,7 +560,8 @@ pmap_mp_init(void)
 				1, /* cache */
 				1, /* aliased */
 				1, /* valid */
-				0 /* ie */);
+				0, /* ie */
+				0  /* wc */);
 		tp[i].data |= TLB_L | TLB_CV;
 
 		if (i >= kernel_itlb_slots) {
@@ -1076,7 +1077,8 @@ pmap_bootstrap(u_long kernelstart, u_lon
 			1 /* Cacheable */,
 			FORCE_ALIAS /* ALIAS -- Disable D$ */,
 			1 /* valid */,
-			0 /* IE */);
+			0 /* IE */,
+			0 /* wc */);
 		pmap_enter_kpage(va, data);
 		va += PAGE_SIZE;
 		msgbufsiz -= PAGE_SIZE;
@@ -1137,7 +1139,8 @@ pmap_bootstrap(u_long kernelstart, u_lon
 				1 /* Cacheable */,
 				FORCE_ALIAS /* ALIAS -- Disable D$ */,
 				1 /* valid */,
-				0 /* IE */);
+				0 /* ei */,
+				0 /* WC */);
 			pmap_enter_kpage(vmmap, data1);
 			vmmap += PAGE_SIZE;
 		}
@@ -1179,7 +1182,8 @@ pmap_bootstrap(u_long kernelstart, u_lon
 				1 /* Cacheable */,
 				FORCE_ALIAS /* ALIAS -- Disable D$ */,
 				1 /* valid */,
-				0 /* IE */);
+				0 /* IE */,
+				0 /* wc */);
 			pmap_enter_kpage(vmmap, data1);
 			vmmap += PAGE_SIZE;
 			pa += PAGE_SIZE;
@@ -1366,7 +1370,8 @@ pmap_init(void)
 			1 /* Cacheable */,
 			FORCE_ALIAS /* ALIAS -- Disable D$ */,
 			1 /* valid */,
-			0 /* IE */);
+			0 /* IE */,
+			0 /* wc */);
 		pmap_enter_kpage(va, data);
 		va += PAGE_SIZE;
 	}
@@ -1656,7 +1661,8 @@ pmap_kenter_pa(vaddr_t va, paddr_t pa, v
 
 	tte.data = TSB_DATA(0, PGSZ_8K, pa, 1 /* Privileged */,
 			    (VM_PROT_WRITE & prot),
-			    !(pa & PMAP_NC), pa & (PMAP_NVC), 1, 0);
+			    !(pa & PMAP_NC), pa & (PMAP_NVC), 1,
+			    pa & (PMAP_LITTLE), pa & PMAP_WC);
 	/* We don't track mod/ref here. */
 	if (prot & VM_PROT_WRITE)
 		tte.data |= TLB_REAL_W|TLB_W;
@@ -1879,7 +1885,7 @@ pmap_enter(struct pmap *pm, vaddr_t va, 
 	}
 	tte.data = TSB_DATA(0, size, pa, pm == pmap_kernel(),
 		flags & VM_PROT_WRITE, !(pa & PMAP_NC),
-		uncached, 1, pa & PMAP_LITTLE);
+		uncached, 1, pa & PMAP_LITTLE, pa & PMAP_WC);
 #ifdef HWREF
 	if (prot & VM_PROT_WRITE)
 		tte.data |= TLB_REAL_W;
@@ -3837,7 +3843,8 @@ pmap_setup_intstack_sun4v(paddr_t pa)
 	    1 /* Cacheable */,
 	    FORCE_ALIAS /* ALIAS -- Disable D$ */,
 	    1 /* valid */,
-	    0 /* IE */);
+	    0 /* IE */,
+	    0 /* wc */);
 	hv_rc = hv_mmu_map_perm_addr(INTSTACK, data, MAP_DTLB);
 	if ( hv_rc != H_EOK ) {
 		panic("hv_mmu_map_perm_addr() failed - rc = %" PRId64 "\n",

Reply via email to