svn commit: r199951 - in user/kmacy/releng_8_fcs_buf_xen/sys:
i386/i386 sys
Kip Macy
kmacy at FreeBSD.org
Sun Nov 29 21:29:26 UTC 2009
Author: kmacy
Date: Sun Nov 29 21:29:25 2009
New Revision: 199951
URL: http://svn.freebsd.org/changeset/base/199951
Log:
add ability to handle minimum segment size in busdma to cope with highly defective
devices (virtual or otherwise)
Modified:
user/kmacy/releng_8_fcs_buf_xen/sys/i386/i386/busdma_machdep.c
user/kmacy/releng_8_fcs_buf_xen/sys/sys/bus_dma.h
Modified: user/kmacy/releng_8_fcs_buf_xen/sys/i386/i386/busdma_machdep.c
==============================================================================
--- user/kmacy/releng_8_fcs_buf_xen/sys/i386/i386/busdma_machdep.c Sun Nov 29 21:03:54 2009 (r199950)
+++ user/kmacy/releng_8_fcs_buf_xen/sys/i386/i386/busdma_machdep.c Sun Nov 29 21:29:25 2009 (r199951)
@@ -62,6 +62,7 @@ struct bounce_zone;
struct bus_dma_tag {
bus_dma_tag_t parent;
bus_size_t alignment;
+ bus_size_t minsegsz;
bus_size_t boundary;
bus_addr_t lowaddr;
bus_addr_t highaddr;
@@ -212,6 +213,16 @@ dflt_lock(void *arg, bus_dma_lock_op_t o
panic("driver error: busdma dflt_lock called");
}
+int
+bus_dma_tag_set(bus_dma_tag_t dmat, int op, bus_size_t arg)
+{
+ if (op != BUS_DMA_SET_MINSEGSZ)
+ return (EINVAL);
+
+ dmat->minsegsz = arg;
+ return (0);
+}
+
/*
* Allocate a device specific dma_tag.
*/
@@ -698,6 +709,11 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
sgsize = (baddr - curaddr);
}
+ if ((dmat->minsegsz > 0) &&
+ (sgsize % dmat->minsegsz))
+ sgsize -= (sgsize % dmat->minsegsz-1);
+
+
if (((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0) &&
map->pagesneeded != 0 && run_filter(dmat, curaddr))
curaddr = add_bounce_page(dmat, map, vaddr, sgsize);
Modified: user/kmacy/releng_8_fcs_buf_xen/sys/sys/bus_dma.h
==============================================================================
--- user/kmacy/releng_8_fcs_buf_xen/sys/sys/bus_dma.h Sun Nov 29 21:03:54 2009 (r199950)
+++ user/kmacy/releng_8_fcs_buf_xen/sys/sys/bus_dma.h Sun Nov 29 21:29:25 2009 (r199951)
@@ -82,6 +82,9 @@
* (yet) be included directly.
*/
+
+#define BUS_DMA_SET_MINSEGSZ 3
+
/*
* Flags used in various bus DMA methods.
*/
@@ -175,6 +178,8 @@ int bus_dma_tag_create(bus_dma_tag_t par
bus_size_t maxsegsz, int flags, bus_dma_lock_t *lockfunc,
void *lockfuncarg, bus_dma_tag_t *dmat);
+int bus_dma_tag_set(bus_dma_tag_t dmat, int op, bus_size_t arg);
+
int bus_dma_tag_destroy(bus_dma_tag_t dmat);
/*
More information about the svn-src-user
mailing list