Module Name: src Committed By: jmcneill Date: Sat Mar 8 21:00:45 UTC 2025
Modified Files: src/sys/arch/arm/arm32: bus_dma.c Log Message: arm: Support BUS_DMA_NOCACHE To generate a diff of this commit: cvs rdiff -u -r1.148 -r1.149 src/sys/arch/arm/arm32/bus_dma.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.148 src/sys/arch/arm/arm32/bus_dma.c:1.149 --- src/sys/arch/arm/arm32/bus_dma.c:1.148 Tue Dec 10 00:41:30 2024 +++ src/sys/arch/arm/arm32/bus_dma.c Sat Mar 8 21:00:45 2025 @@ -1,4 +1,4 @@ -/* $NetBSD: bus_dma.c,v 1.148 2024/12/10 00:41:30 msaitoh Exp $ */ +/* $NetBSD: bus_dma.c,v 1.149 2025/03/08 21:00:45 jmcneill Exp $ */ /*- * Copyright (c) 1996, 1997, 1998, 2020 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.148 2024/12/10 00:41:30 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.149 2025/03/08 21:00:45 jmcneill Exp $"); #include <sys/param.h> @@ -1429,7 +1429,8 @@ _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 && (flags & BUS_DMA_PREFETCHABLE) == 0) { + if (nsegs == 1 && + (flags & (BUS_DMA_PREFETCHABLE|BUS_DMA_NOCACHE)) == 0) { /* * If this is a non-COHERENT mapping, then the existing kernel * mapping is already compatible with it. @@ -1515,7 +1516,8 @@ _bus_dmamem_map(bus_dma_tag_t t, bus_dma for (pa = segs[curseg].ds_addr; 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 uncached = + (flags & (BUS_DMA_COHERENT | BUS_DMA_NOCACHE)) != 0; bool prefetchable = (flags & BUS_DMA_PREFETCHABLE); #ifdef DEBUG_DMA printf("wiring P%#" PRIxPADDR @@ -1530,7 +1532,8 @@ _bus_dmamem_map(bus_dma_tag_t t, bus_dma * If this dma region is coherent then there is * no need for an uncached mapping. */ - if (dr != NULL + if ((flags & BUS_DMA_NOCACHE) == 0 && + dr != NULL && (dr->dr_flags & _BUS_DMAMAP_COHERENT)) { uncached = false; }