Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/netbsd-9]: src/sys Pull up following revision(s) (requested by jmcneill ...



details:   https://anonhg.NetBSD.org/src/rev/10b5b7e923a9
branches:  netbsd-9
changeset: 460848:10b5b7e923a9
user:      martin <martin%NetBSD.org@localhost>
date:      Wed Nov 06 09:43:19 2019 +0000

description:
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

diffstat:

 sys/arch/arm/arm32/bus_dma.c                   |  15 +++++++++++----
 sys/external/bsd/drm2/drm/drm_gem_cma_helper.c |   7 ++++---
 2 files changed, 15 insertions(+), 7 deletions(-)

diffs (79 lines):

diff -r e7216a372605 -r 10b5b7e923a9 sys/arch/arm/arm32/bus_dma.c
--- a/sys/arch/arm/arm32/bus_dma.c      Mon Nov 04 14:49:31 2019 +0000
+++ b/sys/arch/arm/arm32/bus_dma.c      Wed Nov 06 09:43:19 2019 +0000
@@ -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 @@
         * 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 @@
                    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 @@
                                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());
diff -r e7216a372605 -r 10b5b7e923a9 sys/external/bsd/drm2/drm/drm_gem_cma_helper.c
--- a/sys/external/bsd/drm2/drm/drm_gem_cma_helper.c    Mon Nov 04 14:49:31 2019 +0000
+++ b/sys/external/bsd/drm2/drm/drm_gem_cma_helper.c    Wed Nov 06 09:43:19 2019 +0000
@@ -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 <jmcneill%invisible.ca@localhost>
@@ -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 @@
        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,



Home | Main Index | Thread Index | Old Index