add plumbing to support bus_space_mmap() with:

- write combining allowed via BUS_SPACE_MAP_PREFETCHABLE
- byte order translation via BUS_SPACE_MAP_LITTLE
This commit is contained in:
macallan 2016-11-04 05:41:01 +00:00
parent 374e459041
commit 7a874cfdc6
5 changed files with 40 additions and 24 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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;
}

View File

@ -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_long kernelend)
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_long kernelend)
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_long kernelend)
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, vm_prot_t prot, u_int flags)
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, paddr_t pa, vm_prot_t prot, u_int flags)
}
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",