Module Name:src
Committed By: bouyer
Date: Sun Nov 15 20:52:15 UTC 2015
Modified Files:
src/sys/arch/x86/x86 [netbsd-6-1]: bus_dma.c
Log Message:
Pull up following revision(s) (requested by christos in ticket #1339):
sys/arch/x86/x86/bus_dma.c: revision 1.72
sys/arch/x86/x86/bus_dma.c: revision 1.73
sys/arch/x86/x86/bus_dma.c: revision 1.74
- If we succeeded allocating a buffer that did not need bouncing before, but
the buffer in the previous mapping did, clear the bounce bit. Fixes the
ld_virtio.c bug with machines 8GB and dd if=/dev/zero of=crash bs=1g count=4.
- Allocate with M_ZERO instead of doing memset
- The panic string can take a format, use it.
- When checking for the bounce buffer boundary check addr + len < limit, not
addr < limit.
make sure we have a cookie before we try to clear it.
fix operator precedence.
To generate a diff of this commit:
cvs rdiff -u -r1.68 -r1.68.16.1 src/sys/arch/x86/x86/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/x86/x86/bus_dma.c
diff -u src/sys/arch/x86/x86/bus_dma.c:1.68 src/sys/arch/x86/x86/bus_dma.c:1.68.16.1
--- src/sys/arch/x86/x86/bus_dma.c:1.68 Fri Oct 14 18:28:04 2011
+++ src/sys/arch/x86/x86/bus_dma.c Sun Nov 15 20:52:15 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: bus_dma.c,v 1.68 2011/10/14 18:28:04 bouyer Exp $ */
+/* $NetBSD: bus_dma.c,v 1.68.16.1 2015/11/15 20:52:15 bouyer Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998, 2007 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
*/
#include
-__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.68 2011/10/14 18:28:04 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.68.16.1 2015/11/15 20:52:15 bouyer Exp $");
/*
* The following is included because _bus_dma_uiomove is derived from
@@ -283,11 +283,10 @@ _bus_dmamap_create(bus_dma_tag_t t, bus_
error = 0;
mapsize = sizeof(struct x86_bus_dmamap) +
(sizeof(bus_dma_segment_t) * (nsegments - 1));
- if ((mapstore = malloc(mapsize, M_DMAMAP,
- (flags & BUS_DMA_NOWAIT) ? M_NOWAIT : M_WAITOK)) == NULL)
+ if ((mapstore = malloc(mapsize, M_DMAMAP, M_ZERO |
+ ((flags & BUS_DMA_NOWAIT) ? M_NOWAIT : M_WAITOK))) == NULL)
return (ENOMEM);
- memset(mapstore, 0, mapsize);
map = (struct x86_bus_dmamap *)mapstore;
map->_dm_size = size;
map->_dm_segcnt = nsegments;
@@ -323,12 +322,11 @@ _bus_dmamap_create(bus_dma_tag_t t, bus_
/*
* Allocate our cookie.
*/
- if ((cookiestore = malloc(cookiesize, M_DMAMAP,
- (flags & BUS_DMA_NOWAIT) ? M_NOWAIT : M_WAITOK)) == NULL) {
+ if ((cookiestore = malloc(cookiesize, M_DMAMAP, M_ZERO |
+ ((flags & BUS_DMA_NOWAIT) ? M_NOWAIT : M_WAITOK))) == NULL) {
error = ENOMEM;
goto out;
}
- memset(cookiestore, 0, cookiesize);
cookie = (struct x86_bus_dma_cookie *)cookiestore;
cookie->id_flags = cookieflags;
map->_dm_cookie = cookie;
@@ -391,6 +389,8 @@ _bus_dmamap_load(bus_dma_tag_t t, bus_dm
}
error = _bus_dmamap_load_buffer(t, map, buf, buflen, vm, flags);
if (error == 0) {
+ if (cookie != NULL)
+ cookie->id_flags &= ~X86_DMA_IS_BOUNCING;
map->dm_mapsize = buflen;
return 0;
}
@@ -789,7 +789,7 @@ _bus_dmamap_sync(bus_dma_tag_t t, bus_dm
*/
if ((ops & (BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE)) != 0 &&
(ops & (BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE)) != 0)
- panic("_bus_dmamap_sync: mix PRE and POST");
+ panic("%s: mix PRE and POST", __func__);
#ifdef DIAGNOSTIC
if ((ops & (BUS_DMASYNC_PREWRITE|BUS_DMASYNC_POSTREAD)) != 0) {
@@ -916,16 +916,17 @@ _bus_dmamap_sync(bus_dma_tag_t t, bus_dm
}
case X86_DMA_BUFTYPE_RAW:
- panic("_bus_dmamap_sync: X86_DMA_BUFTYPE_RAW");
+ panic("%s: X86_DMA_BUFTYPE_RAW", __func__);
break;
case X86_DMA_BUFTYPE_INVALID:
- panic("_bus_dmamap_sync: X86_DMA_BUFTYPE_INVALID");
+ panic("%s: X86_DMA_BUFTYPE_INVALID", __func__);
break;
default:
- printf("unknown buffer type %d\n", cookie->id_buftype);
- panic("_bus_dmamap_sync");
+ panic("%s: unknown buffer type %d", __func__,
+ cookie->id_buftype);
+ break;
}
end:
if (ops & (BUS_DMASYNC_PREWRITE|BUS_DMASYNC_POSTWRITE)) {
@@ -1233,19 +1234,20 @@ _bus_dmamap_load_buffer(bus_dma_tag_t t,
curaddr = _BUS_VIRT_TO_BUS(pmap, vaddr);
/*
+ * Compute the segment size, and adjust counts.
+ */
+ sgsize = PAGE_SIZE - ((u_long)vaddr & PGOFSET);
+ if (buflen < sgsize)
+ sgsize = buflen;
+
+ /*
* If we're beyond the bounce threshold, notify
* the caller.
*/
if (map->_dm_bounce_thresh != 0 &&
- curaddr >= map->_dm_bounce_thresh)
+ curaddr + sgsize >= map->_dm_bounce_thresh)
return (EINVAL);
- /*
- * Compute the segment size, and adjust counts.
- */
- sgsize = PAGE_SIZE - ((u_long)vaddr & PGOFSET);
- if (buflen < sgsize)
- sgsize = buflen;
error = _bus_dmamap_load_busaddr(t, map, curaddr, sgsize);
if (error)