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 <[email protected]>
@@ -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,