Module Name:    src
Committed By:   matt
Date:           Sat Jul 30 06:29:28 UTC 2016

Modified Files:
        src/sys/arch/mips/mips: bus_dma.c

Log Message:
Supply lastvaddr to load_buffer.  Fix printf formats.


To generate a diff of this commit:
cvs rdiff -u -r1.36 -r1.37 src/sys/arch/mips/mips/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/mips/mips/bus_dma.c
diff -u src/sys/arch/mips/mips/bus_dma.c:1.36 src/sys/arch/mips/mips/bus_dma.c:1.37
--- src/sys/arch/mips/mips/bus_dma.c:1.36	Fri Jul 22 19:50:44 2016
+++ src/sys/arch/mips/mips/bus_dma.c	Sat Jul 30 06:29:28 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: bus_dma.c,v 1.36 2016/07/22 19:50:44 matt Exp $	*/
+/*	$NetBSD: bus_dma.c,v 1.37 2016/07/30 06:29:28 matt Exp $	*/
 
 /*-
  * Copyright (c) 1997, 1998, 2001 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
 
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.36 2016/07/22 19:50:44 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.37 2016/07/30 06:29:28 matt Exp $");
 
 #define _MIPS_BUS_DMA_PRIVATE
 
@@ -104,10 +104,10 @@ paddr_t kvtophys(vaddr_t);	/* XXX */
 static int
 _bus_dmamap_load_buffer(bus_dma_tag_t t, bus_dmamap_t map,
     void *buf, bus_size_t buflen, struct vmspace *vm, int flags,
-    int *segp, bool first)
+    int *segp, vaddr_t lastvaddr, bool first)
 {
 	paddr_t baddr, curaddr, lastaddr;
-	vaddr_t vaddr = (vaddr_t)buf, lastvaddr;
+	vaddr_t vaddr = (vaddr_t)buf;
 	bus_dma_segment_t *ds = &map->dm_segs[*segp];
 	bus_dma_segment_t * const eds = &map->dm_segs[map->_dm_segcnt];
 	const bus_addr_t bmask = ~(map->_dm_boundary - 1);
@@ -115,7 +115,6 @@ _bus_dmamap_load_buffer(bus_dma_tag_t t,
 	    (mips_options.mips_cpu_flags & CPU_MIPS_D_CACHE_COHERENT) != 0;
 
 	lastaddr = ds->ds_addr + ds->ds_len;
-	lastvaddr = ds->_ds_vaddr + ds->ds_len;
 
 	while (buflen > 0) {
 		/*
@@ -166,12 +165,8 @@ _bus_dmamap_load_buffer(bus_dma_tag_t t,
 		 * Insert chunk into a segment, coalescing with
 		 * the previous segment if possible.
 		 */
-		if (first) {
-			ds->ds_addr = curaddr;
-			ds->ds_len = sgsize;
-			ds->_ds_vaddr = vaddr;
-			first = false;
-		} else if (curaddr == lastaddr
+		if (!first
+		    && curaddr == lastaddr
 		    && (d_cache_coherent
 #ifndef __mips_o32
 			|| !MIPS_CACHE_VIRTUAL_ALIAS
@@ -182,11 +177,12 @@ _bus_dmamap_load_buffer(bus_dma_tag_t t,
 			|| ((ds->ds_addr ^ curaddr) & bmask) == 0)) {
 			ds->ds_len += sgsize;
 		} else {
-			if (++ds >= eds)
+			if (!first && ++ds >= eds)
 				break;
 			ds->ds_addr = curaddr;
 			ds->ds_len = sgsize;
-			ds->_ds_vaddr = vaddr;
+			ds->_ds_vaddr = (intptr_t)vaddr;
+			first = false;
 			/*
 			 * If this segment uses the correct color, try to see
 			 * if we can use a direct-mapped VA for the segment.
@@ -206,6 +202,9 @@ _bus_dmamap_load_buffer(bus_dma_tag_t t,
 				    MIPS_PHYS_TO_XKPHYS_CACHED(curaddr);
 #endif
 			}
+			/* Make sure this is a valid kernel address */
+			KASSERTMSG(ds->_ds_vaddr < 0,
+			    "_ds_vaddr %#"PRIxREGISTER, ds->_ds_vaddr);
 		}
 
 		lastaddr = curaddr + sgsize;
@@ -266,7 +265,7 @@ _bus_dma_load_bouncebuf(bus_dma_tag_t t,
 	cookie->id_buftype = buftype;
 	seg = 0;
 	error = _bus_dmamap_load_buffer(t, map, cookie->id_bouncebuf,
-	    buflen, vm, flags, &seg, true);
+	    buflen, vm, flags, &seg, 0, true);
 	if (error)
 		return (error);
 
@@ -457,7 +456,7 @@ _bus_dmamap_load(bus_dma_tag_t t, bus_dm
 
 	seg = 0;
 	error = _bus_dmamap_load_buffer(t, map, buf, buflen,
-	    vm, flags, &seg, true);
+	    vm, flags, &seg, 0, true);
 	if (error == 0) {
 		map->dm_mapsize = buflen;
 		map->dm_nsegs = seg + 1;
@@ -502,7 +501,6 @@ _bus_dmamap_load_mbuf(bus_dma_tag_t t, b
 	int seg, error;
 	struct mbuf *m;
 	struct vmspace * vm = vmspace_kernel();
-	bool first;
 
 	if (map->dm_nsegs > 0) {
 #ifdef _MIPS_NEED_BUS_DMA_BOUNCE
@@ -533,15 +531,17 @@ _bus_dmamap_load_mbuf(bus_dma_tag_t t, b
 	if (m0->m_pkthdr.len > map->_dm_size)
 		return (EINVAL);
 
-	first = true;
+	vaddr_t lastvaddr = 0;
+	bool first = true;
 	seg = 0;
 	error = 0;
 	for (m = m0; m != NULL && error == 0; m = m->m_next) {
 		if (m->m_len == 0)
 			continue;
 		error = _bus_dmamap_load_buffer(t, map, m->m_data, m->m_len,
-		    vm, flags, &seg, first);
+		    vm, flags, &seg, lastvaddr, first);
 		first = false;
+		lastvaddr = (vaddr_t)m->m_data + m->m_len;
 	}
 	if (error == 0) {
 		map->dm_mapsize = m0->m_pkthdr.len;
@@ -572,7 +572,6 @@ _bus_dmamap_load_uio(bus_dma_tag_t t, bu
     struct uio *uio, int flags)
 {
 	int seg, i, error;
-	bool first;
 	bus_size_t minlen, resid;
 	struct iovec *iov;
 	void *addr;
@@ -600,7 +599,8 @@ _bus_dmamap_load_uio(bus_dma_tag_t t, bu
 	resid = uio->uio_resid;
 	iov = uio->uio_iov;
 
-	first = true;
+	vaddr_t lastvaddr = 0;
+	bool first = true;
 	seg = 0;
 	error = 0;
 	for (i = 0; i < uio->uio_iovcnt && resid != 0 && error == 0; i++) {
@@ -612,8 +612,9 @@ _bus_dmamap_load_uio(bus_dma_tag_t t, bu
 		addr = (void *)iov[i].iov_base;
 
 		error = _bus_dmamap_load_buffer(t, map, addr, minlen,
-		    uio->uio_vmspace, flags, &seg, first);
+		    uio->uio_vmspace, flags, &seg, lastvaddr, first);
 		first = false;
+		lastvaddr = (vaddr_t)addr + minlen;
 
 		resid -= minlen;
 	}
@@ -650,6 +651,7 @@ _bus_dmamap_load_raw(bus_dma_tag_t t, bu
 	const bool coherent_p = (mips_options.mips_cpu_flags & CPU_MIPS_D_CACHE_COHERENT);
 	const bool cached_p = coherent_p || (flags & BUS_DMA_COHERENT) == 0;
 	bus_size_t mapsize = 0;
+	vaddr_t lastvaddr = 0;
 	bool first = true;
 	int curseg = 0;
 	int error = 0;
@@ -673,8 +675,9 @@ _bus_dmamap_load_raw(bus_dma_tag_t t, bu
 #endif	/* _LP64 */
 		mapsize += segs->ds_len;
 		error = _bus_dmamap_load_buffer(t, map, kva, segs->ds_len,
-		    vm, flags, &curseg, first);
+		    vm, flags, &curseg, lastvaddr, first);
 		first = false;
+		lastvaddr = (vaddr_t)kva + segs->ds_len;
 	}
 	if (error == 0) {
 		map->dm_mapsize = mapsize;
@@ -851,14 +854,14 @@ _bus_dmamap_sync(bus_dma_tag_t t, bus_dm
 		 * Now at the first segment to sync; nail each segment until we
 		 * have exhausted the length.
 		 */
-		register_t vaddr = (intptr_t)seg->_ds_vaddr + offset;
+		register_t vaddr = seg->_ds_vaddr + offset;
 		minlen = ulmin(len, seg->ds_len - offset);
 
 #ifdef BUS_DMA_DEBUG
-		printf("bus_dmamap_sync: flushing segment %p "
-		    "(0x%"PRIxBUSADDR"+%"PRIxBUSADDR
-		    ", 0x%"PRIxBUSADDR"+0x%"PRIxBUSADDR
-		    ") (olen = %"PRIxBUSADDR")...", seg,
+		printf("bus_dmamap_sync(op=%d: flushing segment %p "
+		    "(0x%"PRIxREGISTER"+%"PRIxBUSADDR
+		    ", 0x%"PRIxREGISTER"+0x%"PRIxBUSADDR
+		    ") (olen = %"PRIxBUSADDR")...", op, seg,
 		    vaddr - offset, offset,
 		    vaddr - offset, offset + minlen - 1, len);
 #endif

Reply via email to