Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 29 Nov 2009 21:29:25 +0000 (UTC)
From:      Kip Macy <kmacy@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r199951 - in user/kmacy/releng_8_fcs_buf_xen/sys: i386/i386 sys
Message-ID:  <200911292129.nATLTPR4010115@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);
 
 /*



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200911292129.nATLTPR4010115>