Module Name:    src
Committed By:   martin
Date:           Wed Nov  6 09:43:20 UTC 2019

Modified Files:
        src/sys/arch/arm/arm32 [netbsd-9]: bus_dma.c
        src/sys/external/bsd/drm2/drm [netbsd-9]: drm_gem_cma_helper.c

Log Message:
Pull up following revision(s) (requested by jmcneill in ticket #399):

        sys/arch/arm/arm32/bus_dma.c: revision 1.117
        sys/arch/arm/arm32/bus_dma.c: revision 1.118
        sys/external/bsd/drm2/drm/drm_gem_cma_helper.c: revision 1.8

bus_dmamem_map: honour BUS_DMA_PREFETCHABLE hint

Map buffer objects with BUS_DMA_PREFETCHABLE.

Do not try to use direct map for prefetchable mappings


To generate a diff of this commit:
cvs rdiff -u -r1.115.2.1 -r1.115.2.2 src/sys/arch/arm/arm32/bus_dma.c
cvs rdiff -u -r1.7 -r1.7.4.1 \
    src/sys/external/bsd/drm2/drm/drm_gem_cma_helper.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/arm/arm32/bus_dma.c
diff -u src/sys/arch/arm/arm32/bus_dma.c:1.115.2.1 src/sys/arch/arm/arm32/bus_dma.c:1.115.2.2
--- src/sys/arch/arm/arm32/bus_dma.c:1.115.2.1	Tue Sep 24 02:52:09 2019
+++ src/sys/arch/arm/arm32/bus_dma.c	Wed Nov  6 09:43:19 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: bus_dma.c,v 1.115.2.1 2019/09/24 02:52:09 martin Exp $	*/
+/*	$NetBSD: bus_dma.c,v 1.115.2.2 2019/11/06 09:43:19 martin Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
 #include "opt_cputypes.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.115.2.1 2019/09/24 02:52:09 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.115.2.2 2019/11/06 09:43:19 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -1339,7 +1339,7 @@ _bus_dmamem_map(bus_dma_tag_t t, bus_dma
 	 * contiguous area then this area is already mapped.  Let's see if we
 	 * avoid having a separate mapping for it.
 	 */
-	if (nsegs == 1) {
+	if (nsegs == 1 && (flags & BUS_DMA_PREFETCHABLE) == 0) {
 		/*
 		 * If this is a non-COHERENT mapping, then the existing kernel
 		 * mapping is already compatible with it.
@@ -1426,6 +1426,7 @@ _bus_dmamem_map(bus_dma_tag_t t, bus_dma
 		    pa < (segs[curseg].ds_addr + segs[curseg].ds_len);
 		    pa += PAGE_SIZE, va += PAGE_SIZE, size -= PAGE_SIZE) {
 			bool uncached = (flags & BUS_DMA_COHERENT);
+			bool prefetchable = (flags & BUS_DMA_PREFETCHABLE);
 #ifdef DEBUG_DMA
 			printf("wiring p%lx to v%lx", pa, va);
 #endif	/* DEBUG_DMA */
@@ -1443,8 +1444,14 @@ _bus_dmamem_map(bus_dma_tag_t t, bus_dma
 				uncached = false;
 			}
 
+			u_int pmap_flags = PMAP_WIRED;
+			if (prefetchable)
+				pmap_flags |= PMAP_WRITE_COMBINE;
+			else if (uncached)
+				pmap_flags |= PMAP_NOCACHE;
+
 			pmap_kenter_pa(va, pa, VM_PROT_READ | VM_PROT_WRITE,
-			    PMAP_WIRED | (uncached ? PMAP_NOCACHE : 0));
+			    pmap_flags);
 		}
 	}
 	pmap_update(pmap_kernel());

Index: src/sys/external/bsd/drm2/drm/drm_gem_cma_helper.c
diff -u src/sys/external/bsd/drm2/drm/drm_gem_cma_helper.c:1.7 src/sys/external/bsd/drm2/drm/drm_gem_cma_helper.c:1.7.4.1
--- src/sys/external/bsd/drm2/drm/drm_gem_cma_helper.c:1.7	Fri Mar  8 02:53:22 2019
+++ src/sys/external/bsd/drm2/drm/drm_gem_cma_helper.c	Wed Nov  6 09:43:20 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: drm_gem_cma_helper.c,v 1.7 2019/03/08 02:53:22 mrg Exp $ */
+/* $NetBSD: drm_gem_cma_helper.c,v 1.7.4.1 2019/11/06 09:43:20 martin Exp $ */
 
 /*-
  * Copyright (c) 2015-2017 Jared McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_gem_cma_helper.c,v 1.7 2019/03/08 02:53:22 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_gem_cma_helper.c,v 1.7.4.1 2019/11/06 09:43:20 martin Exp $");
 
 #include <drm/drmP.h>
 #include <drm/drm_gem_cma_helper.h>
@@ -55,7 +55,8 @@ drm_gem_cma_create_internal(struct drm_d
 	if (error)
 		goto failed;
 	error = bus_dmamem_map(obj->dmat, obj->dmasegs, nsegs,
-	    obj->dmasize, &obj->vaddr, BUS_DMA_WAITOK | BUS_DMA_COHERENT);
+	    obj->dmasize, &obj->vaddr,
+	    BUS_DMA_WAITOK | BUS_DMA_PREFETCHABLE);
 	if (error)
 		goto free;
 	error = bus_dmamap_create(obj->dmat, obj->dmasize, 1,

Reply via email to