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>