Module Name: src Committed By: macallan Date: Thu Sep 22 05:08:52 UTC 2011
Modified Files: src/sys/arch/mips/include: cpu.h cpuregs.h mips3_pte.h pmap.h src/sys/arch/mips/mips: bus_space_alignstride_chipdep.c mips_machdep.c pmap.c Log Message: support BUS_SPACE_MAP_PREFETCH in order to allow mapping device memory and DMA buffers with cacheing disabled but things like write combining, relaxed ordering etc. allowed when the CPU supports it so far enabled only on Loongson, should work on R1xk and probably newer CPUs To generate a diff of this commit: cvs rdiff -u -r1.105 -r1.106 src/sys/arch/mips/include/cpu.h cvs rdiff -u -r1.86 -r1.87 src/sys/arch/mips/include/cpuregs.h cvs rdiff -u -r1.27 -r1.28 src/sys/arch/mips/include/mips3_pte.h cvs rdiff -u -r1.60 -r1.61 src/sys/arch/mips/include/pmap.h cvs rdiff -u -r1.15 -r1.16 \ src/sys/arch/mips/mips/bus_space_alignstride_chipdep.c cvs rdiff -u -r1.248 -r1.249 src/sys/arch/mips/mips/mips_machdep.c cvs rdiff -u -r1.203 -r1.204 src/sys/arch/mips/mips/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/mips/include/cpu.h diff -u src/sys/arch/mips/include/cpu.h:1.105 src/sys/arch/mips/include/cpu.h:1.106 --- src/sys/arch/mips/include/cpu.h:1.105 Tue Aug 16 06:58:15 2011 +++ src/sys/arch/mips/include/cpu.h Thu Sep 22 05:08:52 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.h,v 1.105 2011/08/16 06:58:15 matt Exp $ */ +/* $NetBSD: cpu.h,v 1.106 2011/09/22 05:08:52 macallan Exp $ */ /*- * Copyright (c) 1992, 1993 @@ -258,6 +258,7 @@ bool mips_has_llsc; u_int mips3_pg_shift; u_int mips3_pg_cached; + u_int mips3_cca_devmem; #ifdef MIPS3_PLUS #ifdef _LP64 uint64_t mips3_xkphys_cached; Index: src/sys/arch/mips/include/cpuregs.h diff -u src/sys/arch/mips/include/cpuregs.h:1.86 src/sys/arch/mips/include/cpuregs.h:1.87 --- src/sys/arch/mips/include/cpuregs.h:1.86 Sat Aug 27 13:23:52 2011 +++ src/sys/arch/mips/include/cpuregs.h Thu Sep 22 05:08:52 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: cpuregs.h,v 1.86 2011/08/27 13:23:52 bouyer Exp $ */ +/* $NetBSD: cpuregs.h,v 1.87 2011/09/22 05:08:52 macallan Exp $ */ /* * Copyright (c) 2009 Miodrag Vallat. @@ -135,6 +135,8 @@ #define MIPS_XKPHYS_START (0x2ULL << 62) #define MIPS_PHYS_TO_XKPHYS_UNCACHED(x) \ (MIPS_XKPHYS_START | ((uint64_t)(CCA_UNCACHED) << 59) | (x)) +#define MIPS_PHYS_TO_XKPHYS_ACC(x) \ + (MIPS_XKPHYS_START | ((uint64_t)(mips_options.mips3_cca_devmem) << 59) | (x)) #define MIPS_PHYS_TO_XKPHYS_CACHED(x) \ (mips_options.mips3_xkphys_cached | (x)) #define MIPS_PHYS_TO_XKPHYS(cca,x) \ @@ -146,6 +148,7 @@ #define CCA_UNCACHED 2 #define CCA_CACHEABLE 3 /* cacheable non-coherent */ +#define CCA_ACCEL 7 /* non-cached, write combining */ /* CPU dependent mtc0 hazard hook */ #if (MIPS32R2 + MIPS64R2) > 0 Index: src/sys/arch/mips/include/mips3_pte.h diff -u src/sys/arch/mips/include/mips3_pte.h:1.27 src/sys/arch/mips/include/mips3_pte.h:1.28 --- src/sys/arch/mips/include/mips3_pte.h:1.27 Sun Feb 20 07:45:47 2011 +++ src/sys/arch/mips/include/mips3_pte.h Thu Sep 22 05:08:52 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: mips3_pte.h,v 1.27 2011/02/20 07:45:47 matt Exp $ */ +/* $NetBSD: mips3_pte.h,v 1.28 2011/09/22 05:08:52 macallan Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -88,7 +88,11 @@ #define MIPS3_PG_TO_CCA(cca) (((cca) >> 3) & 7) #define MIPS3_XPHYS_UNCACHED MIPS_PHYS_TO_XKPHYS(2, 0) +#define MIPS3_XPHYS_ACC MIPS_PHYS_TO_XKPHYS(mips_options.mips3_cca_devmem, 0) + #define MIPS3_PG_UNCACHED MIPS3_CCA_TO_PG(2) +#define MIPS3_PG_WT MIPS3_CCA_TO_PG(5) +#define MIPS3_PG_ACC MIPS3_CCA_TO_PG(mips_options.mips3_cca_devmem) #ifdef HPCMIPS_L1CACHE_DISABLE /* MIPS3_L1CACHE_DISABLE */ #define MIPS3_DEFAULT_XKPHYS_CACHED MIPS3_DEFAULT_XKPHYS_UNCACHED #define MIPS3_PG_CACHED MIPS3_PG_UNCACHED /* XXX: brain damaged!!! */ @@ -108,12 +112,18 @@ /* Not wr-prot not clean not cached */ #define MIPS3_PG_RWNCPAGE (MIPS3_PG_V | MIPS3_PG_D | MIPS3_PG_UNCACHED) +/* Not wr-prot not clean not cached, accel */ +#define MIPS3_PG_RWAPAGE (MIPS3_PG_V | MIPS3_PG_D | MIPS3_PG_ACC) + /* Not wr-prot but clean */ #define MIPS3_PG_CWPAGE (MIPS3_PG_V | MIPS3_PG_CACHED) /* Not wr-prot but clean not cached*/ #define MIPS3_PG_CWNCPAGE (MIPS3_PG_V | MIPS3_PG_UNCACHED) +/* Not wr-prot but clean not cached, accel*/ +#define MIPS3_PG_CWAPAGE (MIPS3_PG_V | MIPS3_PG_ACC) + #define MIPS3_PG_IOPAGE(cca) \ (MIPS3_PG_G | MIPS3_PG_V | MIPS3_PG_D | MIPS3_CCA_TO_PG(cca)) #define MIPS3_PG_FRAME 0x3fffffc0 Index: src/sys/arch/mips/include/pmap.h diff -u src/sys/arch/mips/include/pmap.h:1.60 src/sys/arch/mips/include/pmap.h:1.61 --- src/sys/arch/mips/include/pmap.h:1.60 Sun Feb 20 07:45:47 2011 +++ src/sys/arch/mips/include/pmap.h Thu Sep 22 05:08:52 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.h,v 1.60 2011/02/20 07:45:47 matt Exp $ */ +/* $NetBSD: pmap.h,v 1.61 2011/09/22 05:08:52 macallan Exp $ */ /* * Copyright (c) 1992, 1993 @@ -311,6 +311,7 @@ #if defined(_MIPS_PADDR_T_64BIT) || defined(_LP64) #define PGC_NOCACHE 0x4000000000000000ULL +#define PGC_PREFETCH 0x2000000000000000ULL #endif #define __HAVE_VM_PAGE_MD Index: src/sys/arch/mips/mips/bus_space_alignstride_chipdep.c diff -u src/sys/arch/mips/mips/bus_space_alignstride_chipdep.c:1.15 src/sys/arch/mips/mips/bus_space_alignstride_chipdep.c:1.16 --- src/sys/arch/mips/mips/bus_space_alignstride_chipdep.c:1.15 Sun Jul 10 23:13:22 2011 +++ src/sys/arch/mips/mips/bus_space_alignstride_chipdep.c Thu Sep 22 05:08:52 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: bus_space_alignstride_chipdep.c,v 1.15 2011/07/10 23:13:22 matt Exp $ */ +/* $NetBSD: bus_space_alignstride_chipdep.c,v 1.16 2011/09/22 05:08:52 macallan Exp $ */ /*- * Copyright (c) 1998, 2000, 2001 The NetBSD Foundation, Inc. @@ -81,7 +81,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: bus_space_alignstride_chipdep.c,v 1.15 2011/07/10 23:13:22 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bus_space_alignstride_chipdep.c,v 1.16 2011/09/22 05:08:52 macallan Exp $"); #ifdef CHIP_EXTENT #include <sys/extent.h> @@ -354,6 +354,8 @@ #ifdef _LP64 if (flags & BUS_SPACE_MAP_CACHEABLE) *hp = MIPS_PHYS_TO_XKPHYS_CACHED(addr); + else if (flags & BUS_SPACE_MAP_PREFETCHABLE) + *hp = MIPS_PHYS_TO_XKPHYS_ACC(addr); else *hp = MIPS_PHYS_TO_XKPHYS_UNCACHED(addr); #else @@ -615,6 +617,7 @@ /* Not supported for I/O space. */ return (-1); #elif defined(CHIP_MEM) + paddr_t ret; struct mips_bus_space_translation mbst; int error; @@ -625,9 +628,13 @@ &mbst); if (error) return (-1); - - return (mips_btop(mbst.mbst_sys_start + - (addr - mbst.mbst_bus_start) + off)); + ret = mbst.mbst_sys_start + (addr - mbst.mbst_bus_start) + off; + if (flags & BUS_SPACE_MAP_PREFETCHABLE) { + printf("!"); + ret |= PGC_PREFETCH; + } + + return (mips_btop(ret)); #else # error must define one of CHIP_IO or CHIP_MEM #endif Index: src/sys/arch/mips/mips/mips_machdep.c diff -u src/sys/arch/mips/mips/mips_machdep.c:1.248 src/sys/arch/mips/mips/mips_machdep.c:1.249 --- src/sys/arch/mips/mips/mips_machdep.c:1.248 Sat Aug 27 16:54:14 2011 +++ src/sys/arch/mips/mips/mips_machdep.c Thu Sep 22 05:08:52 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: mips_machdep.c,v 1.248 2011/08/27 16:54:14 bouyer Exp $ */ +/* $NetBSD: mips_machdep.c,v 1.249 2011/09/22 05:08:52 macallan Exp $ */ /* * Copyright 2002 Wasabi Systems, Inc. @@ -112,7 +112,7 @@ #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ -__KERNEL_RCSID(0, "$NetBSD: mips_machdep.c,v 1.248 2011/08/27 16:54:14 bouyer Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mips_machdep.c,v 1.249 2011/09/22 05:08:52 macallan Exp $"); #define __INTR_PRIVATE #include "opt_cputype.h" @@ -719,7 +719,6 @@ /* Cache error handler */ extern char mips3_cache[]; - /* * Copy down exception vector code. */ @@ -1186,6 +1185,7 @@ #endif opts->mips3_pg_shift = MIPS3_DEFAULT_PG_SHIFT; + opts->mips3_cca_devmem = CCA_UNCACHED; if (opts->mips_cpu_flags & CPU_MIPS_HAVE_SPECIAL_CCA) { uint32_t cca; @@ -1265,6 +1265,7 @@ mips3_cp0_wired_write(pmap_tlb0_info.ti_wired); loongson2_vector_init(splsw); mips_locoresw = loongson2_locoresw; + opts->mips3_cca_devmem = CCA_ACCEL; break; } #endif /* MIPS3_LOONGSON2 */ @@ -1273,6 +1274,7 @@ mips3_vector_init(splsw); mips_locoresw = mips3_locoresw; break; + #endif /* MIPS3 */ #if defined(MIPS32) case CPU_ARCH_MIPS32: Index: src/sys/arch/mips/mips/pmap.c diff -u src/sys/arch/mips/mips/pmap.c:1.203 src/sys/arch/mips/mips/pmap.c:1.204 --- src/sys/arch/mips/mips/pmap.c:1.203 Wed Sep 21 16:37:54 2011 +++ src/sys/arch/mips/mips/pmap.c Thu Sep 22 05:08:52 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.203 2011/09/21 16:37:54 macallan Exp $ */ +/* $NetBSD: pmap.c,v 1.204 2011/09/22 05:08:52 macallan Exp $ */ /*- * Copyright (c) 1998, 2001 The NetBSD Foundation, Inc. @@ -67,7 +67,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.203 2011/09/21 16:37:54 macallan Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.204 2011/09/22 05:08:52 macallan Exp $"); /* * Manages physical address maps. @@ -1374,6 +1374,9 @@ struct vm_page *pg; bool cached = true; bool wired = (flags & PMAP_WIRED) != 0; +#if defined(_MIPS_PADDR_T_64BIT) || defined(_LP64) + bool prefetch = false; +#endif #ifdef DEBUG if (pmapdebug & (PDB_FOLLOW|PDB_ENTER)) @@ -1416,6 +1419,10 @@ cached = false; pa &= ~PGC_NOCACHE; } + if (pa & PGC_PREFETCH) { + prefetch = true; + pa &= ~PGC_PREFETCH; + } #endif pg = PHYS_TO_VM_PAGE(pa); @@ -1459,12 +1466,15 @@ * then it must be device memory which may be volatile. */ if (MIPS_HAS_R4K_MMU) { +#if defined(_MIPS_PADDR_T_64BIT) || defined(_LP64) + u_int cca = PMAP_CCA_FOR_PA(pa); + if (prefetch) cca = mips_options.mips3_cca_devmem; + npte = MIPS3_PG_IOPAGE(cca) & + ~MIPS3_PG_G; +#else npte = MIPS3_PG_IOPAGE(PMAP_CCA_FOR_PA(pa)) & ~MIPS3_PG_G; - if ((prot & VM_PROT_WRITE) == 0) { - npte |= MIPS3_PG_RO; - npte &= ~MIPS3_PG_D; - } +#endif } else { npte = (prot & VM_PROT_WRITE) ? (MIPS1_PG_D | MIPS1_PG_N) :