From eb36b1d0bc5f7ece94083e6e509da41117a76566 Mon Sep 17 00:00:00 2001 From: "Jason A. Harmening" Date: Sat, 1 Jul 2017 05:35:29 +0000 Subject: Clean up MD pollution of bus_dma.h: --Remove special-case handling of sparc64 bus_dmamap* functions. Replace with a more generic mechanism that allows MD busdma implementations to generate inline mapping functions by defining WANT_INLINE_DMAMAP in . This is currently useful for sparc64, x86, and arm64, which all implement non-load dmamap operations as simple wrappers around map objects which may be bus- or device-specific. --Remove NULL-checked bus_dmamap macros. Implement the equivalent NULL checks in the inlined x86 implementation. For non-x86 platforms, these checks are a minor pessimization as those platforms do not currently allow NULL maps. NULL maps were originally allowed on arm64, which appears to have been the motivation behind adding arm[64]-specific barriers to bus_dma.h, but that support was removed in r299463. --Simplify the internal interface used by the bus_dmamap_load* variants and move it to bus_dma_internal.h --Fix some drivers that directly include sys/bus_dma.h despite the recommendations of bus_dma(9) Reviewed by: kib (previous revision), marius Differential Revision: https://reviews.freebsd.org/D10729 --- sys/amd64/include/bus_dma.h | 2 +- sys/arm/arm/busdma_machdep-v4.c | 10 +- sys/arm/arm/busdma_machdep-v6.c | 10 +- sys/arm/include/bus_dma.h | 1 + sys/arm64/arm64/busdma_machdep.c | 130 ----------------- sys/arm64/include/bus_dma.h | 133 +++++++++++++++++ sys/arm64/include/bus_dma_impl.h | 2 +- sys/dev/aac/aac.c | 1 - sys/dev/aacraid/aacraid.c | 1 - sys/dev/bnxt/bnxt.h | 6 +- sys/dev/cxgb/cxgb_adapter.h | 1 - sys/dev/cxgb/cxgb_main.c | 1 - sys/dev/cxgb/cxgb_sge.c | 1 - sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb.c | 1 - sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cm.c | 1 - sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cq.c | 1 - sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_dbg.c | 1 - sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_ev.c | 1 - sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_hal.c | 1 - sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_mem.c | 1 - sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_provider.c | 1 - sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_qp.c | 1 - sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_resource.c | 1 - sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c | 1 - sys/dev/mfi/mfi.c | 1 - sys/dev/mfi/mfi_cam.c | 1 - sys/dev/tsec/if_tsec.c | 1 - sys/dev/xdma/xdma.c | 1 - sys/dev/xen/blkfront/blkfront.c | 1 - sys/i386/include/bus_dma.h | 2 +- sys/mips/include/bus_dma.h | 1 + sys/mips/mips/busdma_machdep.c | 10 +- sys/net/iflib.h | 1 - sys/powerpc/include/bus_dma.h | 1 + sys/powerpc/powerpc/busdma_machdep.c | 6 +- sys/riscv/include/bus_dma.h | 1 + sys/riscv/riscv/busdma_machdep.c | 6 +- sys/sparc64/include/bus_dma.h | 115 +++++++++++---- sys/sys/bus_dma.h | 82 ++--------- sys/sys/bus_dma_internal.h | 59 ++++++++ sys/x86/include/bus_dma.h | 183 ++++++++++++++++++++++++ sys/x86/include/busdma_impl.h | 2 +- sys/x86/iommu/busdma_dmar.c | 2 + sys/x86/x86/busdma_bounce.c | 4 + sys/x86/x86/busdma_machdep.c | 142 ------------------ 45 files changed, 517 insertions(+), 415 deletions(-) create mode 100644 sys/sys/bus_dma_internal.h create mode 100644 sys/x86/include/bus_dma.h diff --git a/sys/amd64/include/bus_dma.h b/sys/amd64/include/bus_dma.h index bc8bdf4881e2..113b03531591 100644 --- a/sys/amd64/include/bus_dma.h +++ b/sys/amd64/include/bus_dma.h @@ -29,6 +29,6 @@ #ifndef _AMD64_BUS_DMA_H_ #define _AMD64_BUS_DMA_H_ -#include +#include #endif /* _AMD64_BUS_DMA_H_ */ diff --git a/sys/arm/arm/busdma_machdep-v4.c b/sys/arm/arm/busdma_machdep-v4.c index 9e98b4ac2bb6..2a446aca8e27 100644 --- a/sys/arm/arm/busdma_machdep-v4.c +++ b/sys/arm/arm/busdma_machdep-v4.c @@ -1008,7 +1008,7 @@ _bus_dmamap_load_phys(bus_dma_tag_t dmat, bus_dmamap_t map, vm_paddr_t buf, * Did we fit? */ if (buflen != 0) { - _bus_dmamap_unload(dmat, map); + bus_dmamap_unload(dmat, map); return (EFBIG); /* XXX better return value here? */ } return (0); @@ -1129,14 +1129,14 @@ cleanup: * Did we fit? */ if (buflen != 0) { - _bus_dmamap_unload(dmat, map); + bus_dmamap_unload(dmat, map); return (EFBIG); /* XXX better return value here? */ } return (0); } void -__bus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map, struct memdesc *mem, +_bus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map, struct memdesc *mem, bus_dmamap_callback_t *callback, void *callback_arg) { @@ -1161,7 +1161,7 @@ _bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map, * Release the mapping held by map. */ void -_bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map) +bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map) { struct bounce_page *bpage; struct bounce_zone *bz; @@ -1334,7 +1334,7 @@ _bus_dmamap_sync_bp(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) } void -_bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) +bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) { struct sync_list *sl, *end; int bufaligned; diff --git a/sys/arm/arm/busdma_machdep-v6.c b/sys/arm/arm/busdma_machdep-v6.c index ea717cfc64a8..194b18719549 100644 --- a/sys/arm/arm/busdma_machdep-v6.c +++ b/sys/arm/arm/busdma_machdep-v6.c @@ -1070,7 +1070,7 @@ _bus_dmamap_load_phys(bus_dma_tag_t dmat, bus_dmamap_t map, vm_paddr_t buf, * Did we fit? */ if (buflen != 0) { - _bus_dmamap_unload(dmat, map); + bus_dmamap_unload(dmat, map); return (EFBIG); /* XXX better return value here? */ } return (0); @@ -1195,14 +1195,14 @@ cleanup: * Did we fit? */ if (buflen != 0) { - _bus_dmamap_unload(dmat, map); + bus_dmamap_unload(dmat, map); return (EFBIG); /* XXX better return value here? */ } return (0); } void -__bus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map, struct memdesc *mem, +_bus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map, struct memdesc *mem, bus_dmamap_callback_t *callback, void *callback_arg) { @@ -1226,7 +1226,7 @@ _bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map, * Release the mapping held by map. */ void -_bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map) +bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map) { struct bounce_page *bpage; struct bounce_zone *bz; @@ -1326,7 +1326,7 @@ dma_dcache_sync(struct sync_list *sl, bus_dmasync_op_t op) } void -_bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) +bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) { struct bounce_page *bpage; struct sync_list *sl, *end; diff --git a/sys/arm/include/bus_dma.h b/sys/arm/include/bus_dma.h index 129511871f42..fed6bd372dff 100644 --- a/sys/arm/include/bus_dma.h +++ b/sys/arm/include/bus_dma.h @@ -67,6 +67,7 @@ #define _ARM_BUS_DMA_H #include +#include /* Bus Space DMA macros */ diff --git a/sys/arm64/arm64/busdma_machdep.c b/sys/arm64/arm64/busdma_machdep.c index df7a8be04a7c..9dced7093459 100644 --- a/sys/arm64/arm64/busdma_machdep.c +++ b/sys/arm64/arm64/busdma_machdep.c @@ -223,133 +223,3 @@ bus_dma_tag_destroy(bus_dma_tag_t dmat) return (tc->impl->tag_destroy(dmat)); } -/* - * Allocate a handle for mapping from kva/uva/physical - * address space into bus device space. - */ -int -bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp) -{ - struct bus_dma_tag_common *tc; - - tc = (struct bus_dma_tag_common *)dmat; - return (tc->impl->map_create(dmat, flags, mapp)); -} - -/* - * Destroy a handle for mapping from kva/uva/physical - * address space into bus device space. - */ -int -bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map) -{ - struct bus_dma_tag_common *tc; - - tc = (struct bus_dma_tag_common *)dmat; - return (tc->impl->map_destroy(dmat, map)); -} - - -/* - * Allocate a piece of memory that can be efficiently mapped into - * bus device space based on the constraints listed in the dma tag. - * A dmamap to for use with dmamap_load is also allocated. - */ -int -bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, - bus_dmamap_t *mapp) -{ - struct bus_dma_tag_common *tc; - - tc = (struct bus_dma_tag_common *)dmat; - return (tc->impl->mem_alloc(dmat, vaddr, flags, mapp)); -} - -/* - * Free a piece of memory and it's allociated dmamap, that was allocated - * via bus_dmamem_alloc. Make the same choice for free/contigfree. - */ -void -bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map) -{ - struct bus_dma_tag_common *tc; - - tc = (struct bus_dma_tag_common *)dmat; - tc->impl->mem_free(dmat, vaddr, map); -} - -int -_bus_dmamap_load_phys(bus_dma_tag_t dmat, bus_dmamap_t map, vm_paddr_t buf, - bus_size_t buflen, int flags, bus_dma_segment_t *segs, int *segp) -{ - struct bus_dma_tag_common *tc; - - tc = (struct bus_dma_tag_common *)dmat; - return (tc->impl->load_phys(dmat, map, buf, buflen, flags, segs, - segp)); -} - -int -_bus_dmamap_load_ma(bus_dma_tag_t dmat, bus_dmamap_t map, struct vm_page **ma, - bus_size_t tlen, int ma_offs, int flags, bus_dma_segment_t *segs, - int *segp) -{ - struct bus_dma_tag_common *tc; - - tc = (struct bus_dma_tag_common *)dmat; - return (tc->impl->load_ma(dmat, map, ma, tlen, ma_offs, flags, - segs, segp)); -} - -int -_bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, - bus_size_t buflen, pmap_t pmap, int flags, bus_dma_segment_t *segs, - int *segp) -{ - struct bus_dma_tag_common *tc; - - tc = (struct bus_dma_tag_common *)dmat; - return (tc->impl->load_buffer(dmat, map, buf, buflen, pmap, flags, segs, - segp)); -} - -void -__bus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map, - struct memdesc *mem, bus_dmamap_callback_t *callback, void *callback_arg) -{ - struct bus_dma_tag_common *tc; - - tc = (struct bus_dma_tag_common *)dmat; - tc->impl->map_waitok(dmat, map, mem, callback, callback_arg); -} - -bus_dma_segment_t * -_bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dma_segment_t *segs, int nsegs, int error) -{ - struct bus_dma_tag_common *tc; - - tc = (struct bus_dma_tag_common *)dmat; - return (tc->impl->map_complete(dmat, map, segs, nsegs, error)); -} - -/* - * Release the mapping held by map. - */ -void -_bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map) -{ - struct bus_dma_tag_common *tc; - - tc = (struct bus_dma_tag_common *)dmat; - tc->impl->map_unload(dmat, map); -} - -void -_bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) -{ - struct bus_dma_tag_common *tc; - - tc = (struct bus_dma_tag_common *)dmat; - tc->impl->map_sync(dmat, map, op); -} diff --git a/sys/arm64/include/bus_dma.h b/sys/arm64/include/bus_dma.h index b07d0f7a58a2..c4ed711ed1a9 100644 --- a/sys/arm64/include/bus_dma.h +++ b/sys/arm64/include/bus_dma.h @@ -3,6 +3,139 @@ #ifndef _MACHINE_BUS_DMA_H_ #define _MACHINE_BUS_DMA_H_ +#define WANT_INLINE_DMAMAP #include +#include + +/* + * Allocate a handle for mapping from kva/uva/physical + * address space into bus device space. + */ +static inline int +bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp) +{ + struct bus_dma_tag_common *tc; + + tc = (struct bus_dma_tag_common *)dmat; + return (tc->impl->map_create(dmat, flags, mapp)); +} + +/* + * Destroy a handle for mapping from kva/uva/physical + * address space into bus device space. + */ +static inline int +bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map) +{ + struct bus_dma_tag_common *tc; + + tc = (struct bus_dma_tag_common *)dmat; + return (tc->impl->map_destroy(dmat, map)); +} + +/* + * Allocate a piece of memory that can be efficiently mapped into + * bus device space based on the constraints listed in the dma tag. + * A dmamap to for use with dmamap_load is also allocated. + */ +static inline int +bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, + bus_dmamap_t *mapp) +{ + struct bus_dma_tag_common *tc; + + tc = (struct bus_dma_tag_common *)dmat; + return (tc->impl->mem_alloc(dmat, vaddr, flags, mapp)); +} + +/* + * Free a piece of memory and it's allociated dmamap, that was allocated + * via bus_dmamem_alloc. Make the same choice for free/contigfree. + */ +static inline void +bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map) +{ + struct bus_dma_tag_common *tc; + + tc = (struct bus_dma_tag_common *)dmat; + tc->impl->mem_free(dmat, vaddr, map); +} + +/* + * Release the mapping held by map. + */ +static inline void +bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map) +{ + struct bus_dma_tag_common *tc; + + tc = (struct bus_dma_tag_common *)dmat; + tc->impl->map_unload(dmat, map); +} + +static inline void +bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) +{ + struct bus_dma_tag_common *tc; + + tc = (struct bus_dma_tag_common *)dmat; + tc->impl->map_sync(dmat, map, op); +} + +static inline int +_bus_dmamap_load_phys(bus_dma_tag_t dmat, bus_dmamap_t map, vm_paddr_t buf, + bus_size_t buflen, int flags, bus_dma_segment_t *segs, int *segp) +{ + struct bus_dma_tag_common *tc; + + tc = (struct bus_dma_tag_common *)dmat; + return (tc->impl->load_phys(dmat, map, buf, buflen, flags, segs, + segp)); +} + +static inline int +_bus_dmamap_load_ma(bus_dma_tag_t dmat, bus_dmamap_t map, struct vm_page **ma, + bus_size_t tlen, int ma_offs, int flags, bus_dma_segment_t *segs, + int *segp) +{ + struct bus_dma_tag_common *tc; + + tc = (struct bus_dma_tag_common *)dmat; + return (tc->impl->load_ma(dmat, map, ma, tlen, ma_offs, flags, + segs, segp)); +} + +static inline int +_bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, + bus_size_t buflen, struct pmap *pmap, int flags, bus_dma_segment_t *segs, + int *segp) +{ + struct bus_dma_tag_common *tc; + + tc = (struct bus_dma_tag_common *)dmat; + return (tc->impl->load_buffer(dmat, map, buf, buflen, pmap, flags, segs, + segp)); +} + +static inline void +_bus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map, + struct memdesc *mem, bus_dmamap_callback_t *callback, void *callback_arg) +{ + struct bus_dma_tag_common *tc; + + tc = (struct bus_dma_tag_common *)dmat; + tc->impl->map_waitok(dmat, map, mem, callback, callback_arg); +} + +static inline bus_dma_segment_t * +_bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map, + bus_dma_segment_t *segs, int nsegs, int error) +{ + struct bus_dma_tag_common *tc; + + tc = (struct bus_dma_tag_common *)dmat; + return (tc->impl->map_complete(dmat, map, segs, nsegs, error)); +} + #endif /* !_MACHINE_BUS_DMA_H_ */ diff --git a/sys/arm64/include/bus_dma_impl.h b/sys/arm64/include/bus_dma_impl.h index 354290e73e26..64bac5410294 100644 --- a/sys/arm64/include/bus_dma_impl.h +++ b/sys/arm64/include/bus_dma_impl.h @@ -70,7 +70,7 @@ struct bus_dma_impl { vm_paddr_t buf, bus_size_t buflen, int flags, bus_dma_segment_t *segs, int *segp); int (*load_buffer)(bus_dma_tag_t dmat, bus_dmamap_t map, - void *buf, bus_size_t buflen, pmap_t pmap, int flags, + void *buf, bus_size_t buflen, struct pmap *pmap, int flags, bus_dma_segment_t *segs, int *segp); void (*map_waitok)(bus_dma_tag_t dmat, bus_dmamap_t map, struct memdesc *mem, bus_dmamap_callback_t *callback, diff --git a/sys/dev/aac/aac.c b/sys/dev/aac/aac.c index 2d7996fc535f..838267774828 100644 --- a/sys/dev/aac/aac.c +++ b/sys/dev/aac/aac.c @@ -55,7 +55,6 @@ __FBSDID("$FreeBSD$"); #include #include -#include #include #include diff --git a/sys/dev/aacraid/aacraid.c b/sys/dev/aacraid/aacraid.c index 42a16c420393..a1af1008fff3 100644 --- a/sys/dev/aacraid/aacraid.c +++ b/sys/dev/aacraid/aacraid.c @@ -56,7 +56,6 @@ __FBSDID("$FreeBSD$"); #include #include -#include #include #include diff --git a/sys/dev/bnxt/bnxt.h b/sys/dev/bnxt/bnxt.h index aa88d503cc3f..0e6582532f5c 100644 --- a/sys/dev/bnxt/bnxt.h +++ b/sys/dev/bnxt/bnxt.h @@ -32,13 +32,13 @@ __FBSDID("$FreeBSD$"); #ifndef _BNXT_H #define _BNXT_H -#include -#include -#include +#include #include #include #include +#include + #include #include #include diff --git a/sys/dev/cxgb/cxgb_adapter.h b/sys/dev/cxgb/cxgb_adapter.h index 08ca6c1129b6..e13c50b3c2ec 100644 --- a/sys/dev/cxgb/cxgb_adapter.h +++ b/sys/dev/cxgb/cxgb_adapter.h @@ -54,7 +54,6 @@ $FreeBSD$ #include #include -#include #include #include diff --git a/sys/dev/cxgb/cxgb_main.c b/sys/dev/cxgb/cxgb_main.c index c03d70c099ce..582f8b59410a 100644 --- a/sys/dev/cxgb/cxgb_main.c +++ b/sys/dev/cxgb/cxgb_main.c @@ -41,7 +41,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include diff --git a/sys/dev/cxgb/cxgb_sge.c b/sys/dev/cxgb/cxgb_sge.c index 9981d00ae8cf..e854d1e80562 100644 --- a/sys/dev/cxgb/cxgb_sge.c +++ b/sys/dev/cxgb/cxgb_sge.c @@ -41,7 +41,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb.c b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb.c index 7b21daa04f50..489930a746b2 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb.c +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb.c @@ -39,7 +39,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cm.c b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cm.c index 09c5a6f72942..5a838194538b 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cm.c +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cm.c @@ -40,7 +40,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cq.c b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cq.c index 9ad6ed9a1d67..9ed5b9134a0f 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cq.c +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cq.c @@ -41,7 +41,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_dbg.c b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_dbg.c index f5f59a3fb2f6..b7002b3f8763 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_dbg.c +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_dbg.c @@ -40,7 +40,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_ev.c b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_ev.c index 65b7a2d97dbc..0b1c3bd326a3 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_ev.c +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_ev.c @@ -40,7 +40,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_hal.c b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_hal.c index 4267e2554b20..5e741fa02918 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_hal.c +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_hal.c @@ -40,7 +40,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_mem.c b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_mem.c index 0ccb70fcac8b..8b82b230cfc0 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_mem.c +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_mem.c @@ -40,7 +40,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_provider.c b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_provider.c index c2b508039a47..0b0e5f4f46ba 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_provider.c +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_provider.c @@ -40,7 +40,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_qp.c b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_qp.c index 3e8e6b3c9ef7..9d36f3c4cab0 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_qp.c +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_qp.c @@ -40,7 +40,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_resource.c b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_resource.c index a99bf664199a..407649ca4219 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_resource.c +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_resource.c @@ -40,7 +40,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include diff --git a/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c b/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c index 5d6279e8d269..5b93554fdfdb 100644 --- a/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c +++ b/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c @@ -62,7 +62,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include diff --git a/sys/dev/mfi/mfi.c b/sys/dev/mfi/mfi.c index e1737c030b08..28054d9bf7d8 100644 --- a/sys/dev/mfi/mfi.c +++ b/sys/dev/mfi/mfi.c @@ -67,7 +67,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include diff --git a/sys/dev/mfi/mfi_cam.c b/sys/dev/mfi/mfi_cam.c index c1c25752a1ad..49150f9b0b14 100644 --- a/sys/dev/mfi/mfi_cam.c +++ b/sys/dev/mfi/mfi_cam.c @@ -39,7 +39,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include diff --git a/sys/dev/tsec/if_tsec.c b/sys/dev/tsec/if_tsec.c index 37350fc0f3ab..5ca9f4087c19 100644 --- a/sys/dev/tsec/if_tsec.c +++ b/sys/dev/tsec/if_tsec.c @@ -37,7 +37,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include diff --git a/sys/dev/xdma/xdma.c b/sys/dev/xdma/xdma.c index b0800c25f385..98e17972dbd3 100644 --- a/sys/dev/xdma/xdma.c +++ b/sys/dev/xdma/xdma.c @@ -45,7 +45,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include diff --git a/sys/dev/xen/blkfront/blkfront.c b/sys/dev/xen/blkfront/blkfront.c index 3473b64f8e82..2477d783d5fc 100644 --- a/sys/dev/xen/blkfront/blkfront.c +++ b/sys/dev/xen/blkfront/blkfront.c @@ -49,7 +49,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include diff --git a/sys/i386/include/bus_dma.h b/sys/i386/include/bus_dma.h index 95e98a7e43c2..db54a3bb92fc 100644 --- a/sys/i386/include/bus_dma.h +++ b/sys/i386/include/bus_dma.h @@ -29,6 +29,6 @@ #ifndef _I386_BUS_DMA_H_ #define _I386_BUS_DMA_H_ -#include +#include #endif /* _I386_BUS_DMA_H_ */ diff --git a/sys/mips/include/bus_dma.h b/sys/mips/include/bus_dma.h index 35dfba26ebd2..2525000179f3 100644 --- a/sys/mips/include/bus_dma.h +++ b/sys/mips/include/bus_dma.h @@ -30,5 +30,6 @@ #define _MIPS_BUS_DMA_H_ #include +#include #endif /* _MIPS_BUS_DMA_H_ */ diff --git a/sys/mips/mips/busdma_machdep.c b/sys/mips/mips/busdma_machdep.c index d8cf8cb85828..90cc376a4e17 100644 --- a/sys/mips/mips/busdma_machdep.c +++ b/sys/mips/mips/busdma_machdep.c @@ -930,7 +930,7 @@ _bus_dmamap_load_phys(bus_dma_tag_t dmat, bus_dmamap_t map, * Did we fit? */ if (buflen != 0) { - _bus_dmamap_unload(dmat, map); + bus_dmamap_unload(dmat, map); return (EFBIG); /* XXX better return value here? */ } return (0); @@ -1028,14 +1028,14 @@ cleanup: * Did we fit? */ if (buflen != 0) { - _bus_dmamap_unload(dmat, map); + bus_dmamap_unload(dmat, map); error = EFBIG; /* XXX better return value here? */ } return (error); } void -__bus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map, +_bus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map, struct memdesc *mem, bus_dmamap_callback_t *callback, void *callback_arg) { @@ -1060,7 +1060,7 @@ _bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map, * Release the mapping held by map. */ void -_bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map) +bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map) { struct bounce_page *bpage; @@ -1233,7 +1233,7 @@ _bus_dmamap_sync_bp(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) } void -_bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) +bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) { struct sync_list *sl, *end; int aligned; diff --git a/sys/net/iflib.h b/sys/net/iflib.h index 8bd20bfcca71..bcf34e2da1d9 100644 --- a/sys/net/iflib.h +++ b/sys/net/iflib.h @@ -33,7 +33,6 @@ #include #include #include -#include #include #include diff --git a/sys/powerpc/include/bus_dma.h b/sys/powerpc/include/bus_dma.h index e070a9423815..15bbc1cacc59 100644 --- a/sys/powerpc/include/bus_dma.h +++ b/sys/powerpc/include/bus_dma.h @@ -29,6 +29,7 @@ #define _POWERPC_BUS_DMA_H_ #include +#include struct device; diff --git a/sys/powerpc/powerpc/busdma_machdep.c b/sys/powerpc/powerpc/busdma_machdep.c index 3037307c3e3d..8b9baa1cced0 100644 --- a/sys/powerpc/powerpc/busdma_machdep.c +++ b/sys/powerpc/powerpc/busdma_machdep.c @@ -841,7 +841,7 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dmat, } void -__bus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map, +_bus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map, struct memdesc *mem, bus_dmamap_callback_t *callback, void *callback_arg) { @@ -879,7 +879,7 @@ _bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map, * Release the mapping held by map. */ void -_bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map) +bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map) { struct bounce_page *bpage; @@ -895,7 +895,7 @@ _bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map) } void -_bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) +bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) { struct bounce_page *bpage; vm_offset_t datavaddr, tempvaddr; diff --git a/sys/riscv/include/bus_dma.h b/sys/riscv/include/bus_dma.h index b07d0f7a58a2..248a4b9c52b5 100644 --- a/sys/riscv/include/bus_dma.h +++ b/sys/riscv/include/bus_dma.h @@ -4,5 +4,6 @@ #define _MACHINE_BUS_DMA_H_ #include +#include #endif /* !_MACHINE_BUS_DMA_H_ */ diff --git a/sys/riscv/riscv/busdma_machdep.c b/sys/riscv/riscv/busdma_machdep.c index ec0fea91252f..34c76a927fa0 100644 --- a/sys/riscv/riscv/busdma_machdep.c +++ b/sys/riscv/riscv/busdma_machdep.c @@ -69,7 +69,7 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, } void -__bus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map, +_bus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map, struct memdesc *mem, bus_dmamap_callback_t *callback, void *callback_arg) { @@ -88,14 +88,14 @@ _bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map, * Release the mapping held by map. */ void -_bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map) +bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map) { panic("busdma"); } void -_bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) +bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) { panic("busdma"); diff --git a/sys/sparc64/include/bus_dma.h b/sys/sparc64/include/bus_dma.h index 7d74419cc6fc..be3f94f63b5f 100644 --- a/sys/sparc64/include/bus_dma.h +++ b/sys/sparc64/include/bus_dma.h @@ -68,6 +68,7 @@ #ifndef _SPARC64_BUS_DMA_H #define _SPARC64_BUS_DMA_H +#define WANT_INLINE_DMAMAP #include /* DMA support */ @@ -124,29 +125,95 @@ struct bus_dma_tag { struct bus_dma_methods *dt_mt; }; -#define bus_dmamap_create(t, f, p) \ - ((t)->dt_mt->dm_dmamap_create((t), (f), (p))) -#define bus_dmamap_destroy(t, p) \ - ((t)->dt_mt->dm_dmamap_destroy((t), (p))) -#define _bus_dmamap_load_phys(t, m, b, l, f, s, sp) \ - ((t)->dt_mt->dm_dmamap_load_phys((t), (m), (b), (l), \ - (f), (s), (sp))) -#define _bus_dmamap_load_buffer(t, m, b, l, p, f, s, sp) \ - ((t)->dt_mt->dm_dmamap_load_buffer((t), (m), (b), (l), (p), \ - (f), (s), (sp))) -#define _bus_dmamap_waitok(t, m, mem, c, ca) \ - ((t)->dt_mt->dm_dmamap_waitok((t), (m), (mem), (c), (ca))) -#define _bus_dmamap_complete(t, m, s, n, e) \ - ((t)->dt_mt->dm_dmamap_complete((t), (m), (s), (n), (e))) -#define bus_dmamap_unload(t, p) \ - ((t)->dt_mt->dm_dmamap_unload((t), (p))) -#define bus_dmamap_sync(t, m, op) \ - ((t)->dt_mt->dm_dmamap_sync((t), (m), (op))) -#define bus_dmamem_alloc(t, v, f, m) \ - ((t)->dt_mt->dm_dmamem_alloc((t), (v), (f), (m))) -#define bus_dmamem_free(t, v, m) \ - ((t)->dt_mt->dm_dmamem_free((t), (v), (m))) -#define _bus_dmamap_load_ma(t, m, a, tt, o, f, s, p) \ - bus_dmamap_load_ma_triv((t), (m), (a), (tt), (o), (f), (s), (p)) +static inline int +bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp) +{ + + return (dmat->dt_mt->dm_dmamap_create(dmat, flags, mapp)); +} + +static inline int +bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map) +{ + + return (dmat->dt_mt->dm_dmamap_destroy(dmat, map)); +} + +static inline void +bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) +{ + + dmat->dt_mt->dm_dmamap_sync(dmat, map, op); +} + +static inline void +bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map) +{ + + dmat->dt_mt->dm_dmamap_unload(dmat, map); +} + +static inline int +bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, bus_dmamap_t *mapp) +{ + + return (dmat->dt_mt->dm_dmamem_alloc(dmat, vaddr, flags, mapp)); +} + +static inline void +bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map) +{ + + dmat->dt_mt->dm_dmamem_free(dmat, vaddr, map); +} + +static inline bus_dma_segment_t* +_bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map, + bus_dma_segment_t *segs, int nsegs, int error) +{ + + return (dmat->dt_mt->dm_dmamap_complete(dmat, map, segs, + nsegs, error)); +} + +static inline int +_bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, + void *buf, bus_size_t buflen, struct pmap *pmap, + int flags, bus_dma_segment_t *segs, int *segp) +{ + + return (dmat->dt_mt->dm_dmamap_load_buffer(dmat, map, buf, buflen, + pmap, flags, segs, segp)); +} + +static inline int +_bus_dmamap_load_ma(bus_dma_tag_t dmat, bus_dmamap_t map, + struct vm_page **ma, bus_size_t tlen, int ma_offs, + int flags, bus_dma_segment_t *segs, int *segp) +{ + + return (bus_dmamap_load_ma_triv(dmat, map, ma, tlen, ma_offs, flags, + segs, segp)); +} + +static inline int +_bus_dmamap_load_phys(bus_dma_tag_t dmat, bus_dmamap_t map, + vm_paddr_t paddr, bus_size_t buflen, + int flags, bus_dma_segment_t *segs, int *segp) +{ + + return (dmat->dt_mt->dm_dmamap_load_phys(dmat, map, paddr, buflen, + flags, segs, segp)); +} + +static inline void +_bus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map, + struct memdesc *mem, bus_dmamap_callback_t *callback, + void *callback_arg) +{ + + return (dmat->dt_mt->dm_dmamap_waitok(dmat, map, mem, callback, + callback_arg)); +} #endif /* !_SPARC64_BUS_DMA_H_ */ diff --git a/sys/sys/bus_dma.h b/sys/sys/bus_dma.h index 1a2ecd6b54b0..04dbe0cb5969 100644 --- a/sys/sys/bus_dma.h +++ b/sys/sys/bus_dma.h @@ -248,105 +248,49 @@ int bus_dmamap_load_ma_triv(bus_dma_tag_t dmat, bus_dmamap_t map, struct vm_page **ma, bus_size_t tlen, int ma_offs, int flags, bus_dma_segment_t *segs, int *segp); -/* - * XXX sparc64 uses the same interface, but a much different implementation. - * for the sparc64 arch contains the equivalent - * declarations. - */ -#if !defined(__sparc64__) +#ifdef WANT_INLINE_DMAMAP +#define BUS_DMAMAP_OP static inline +#else +#define BUS_DMAMAP_OP +#endif /* * Allocate a handle for mapping from kva/uva/physical * address space into bus device space. */ -int bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp); +BUS_DMAMAP_OP int bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp); /* * Destroy a handle for mapping from kva/uva/physical * address space into bus device space. */ -int bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map); +BUS_DMAMAP_OP int bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map); /* * Allocate a piece of memory that can be efficiently mapped into * bus device space based on the constraints listed in the dma tag. * A dmamap to for use with dmamap_load is also allocated. */ -int bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, +BUS_DMAMAP_OP int bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, bus_dmamap_t *mapp); /* * Free a piece of memory and its allocated dmamap, that was allocated * via bus_dmamem_alloc. */ -void bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map); +BUS_DMAMAP_OP void bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map); /* * Perform a synchronization operation on the given map. If the map - * is NULL we have a fully IO-coherent system. On every ARM architecture - * there must be a memory barrier placed to ensure that all data - * accesses are visible before going any further. + * is NULL we have a fully IO-coherent system. */ -void _bus_dmamap_sync(bus_dma_tag_t, bus_dmamap_t, bus_dmasync_op_t); -#if defined(__arm__) - #define __BUS_DMAMAP_SYNC_DEFAULT mb() -#elif defined(__aarch64__) - #define __BUS_DMAMAP_SYNC_DEFAULT dmb(sy) -#else - #define __BUS_DMAMAP_SYNC_DEFAULT do {} while (0) -#endif -#define bus_dmamap_sync(dmat, dmamap, op) \ - do { \ - if ((dmamap) != NULL) \ - _bus_dmamap_sync(dmat, dmamap, op); \ - else \ - __BUS_DMAMAP_SYNC_DEFAULT; \ - } while (0) +BUS_DMAMAP_OP void bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t dmamap, bus_dmasync_op_t op); /* * Release the mapping held by map. */ -void _bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map); -#define bus_dmamap_unload(dmat, dmamap) \ - do { \ - if ((dmamap) != NULL) \ - _bus_dmamap_unload(dmat, dmamap); \ - } while (0) - -/* - * The following functions define the interface between the MD and MI - * busdma layers. These are not intended for consumption by driver - * software. - */ -void __bus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map, - struct memdesc *mem, - bus_dmamap_callback_t *callback, - void *callback_arg); - -#define _bus_dmamap_waitok(dmat, map, mem, callback, callback_arg) \ - do { \ - if ((map) != NULL) \ - __bus_dmamap_waitok(dmat, map, mem, callback, \ - callback_arg); \ - } while (0); - -int _bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, - void *buf, bus_size_t buflen, struct pmap *pmap, - int flags, bus_dma_segment_t *segs, int *segp); - -int _bus_dmamap_load_phys(bus_dma_tag_t dmat, bus_dmamap_t map, - vm_paddr_t paddr, bus_size_t buflen, - int flags, bus_dma_segment_t *segs, int *segp); - -int _bus_dmamap_load_ma(bus_dma_tag_t dmat, bus_dmamap_t map, - struct vm_page **ma, bus_size_t tlen, int ma_offs, int flags, - bus_dma_segment_t *segs, int *segp); - -bus_dma_segment_t *_bus_dmamap_complete(bus_dma_tag_t dmat, - bus_dmamap_t map, - bus_dma_segment_t *segs, - int nsegs, int error); +BUS_DMAMAP_OP void bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t dmamap); -#endif /* __sparc64__ */ +#undef BUS_DMAMAP_OP #endif /* _BUS_DMA_H_ */ diff --git a/sys/sys/bus_dma_internal.h b/sys/sys/bus_dma_internal.h new file mode 100644 index 000000000000..4a12f730c7b6 --- /dev/null +++ b/sys/sys/bus_dma_internal.h @@ -0,0 +1,59 @@ +/*- + * Copyright (c) 2017 Jason A. Harmening. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _BUS_DMA_INTERNAL_H_ +#define _BUS_DMA_INTERNAL_H_ + +/* + * The following functions define the interface between the MD and MI + * busdma layers. These are not intended for consumption by driver + * software. + */ + +bus_dma_segment_t *_bus_dmamap_complete(bus_dma_tag_t dmat, + bus_dmamap_t map, bus_dma_segment_t *segs, + int nsegs, int error); + +int _bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, + void *buf, bus_size_t buflen, struct pmap *pmap, + int flags, bus_dma_segment_t *segs, int *segp); + +int _bus_dmamap_load_ma(bus_dma_tag_t dmat, bus_dmamap_t map, + struct vm_page **ma, bus_size_t tlen, int ma_offs, + int flags, bus_dma_segment_t *segs, int *segp); + +int _bus_dmamap_load_phys(bus_dma_tag_t dmat, bus_dmamap_t map, + vm_paddr_t paddr, bus_size_t buflen, + int flags, bus_dma_segment_t *segs, int *segp); + +void _bus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map, + struct memdesc *mem, bus_dmamap_callback_t *callback, + void *callback_arg); + +#endif /* !_BUS_DMA_INTERNAL_H_ */ + diff --git a/sys/x86/include/bus_dma.h b/sys/x86/include/bus_dma.h new file mode 100644 index 000000000000..f8a75682c6b4 --- /dev/null +++ b/sys/x86/include/bus_dma.h @@ -0,0 +1,183 @@ +/*- + * Copyright (c) 2017 Jason A. Harmening. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _X86_BUS_DMA_H_ +#define _X86_BUS_DMA_H_ + +#define WANT_INLINE_DMAMAP +#include +#include + +#include + +/* + * Allocate a handle for mapping from kva/uva/physical + * address space into bus device space. + */ +static inline int +bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp) +{ + struct bus_dma_tag_common *tc; + + tc = (struct bus_dma_tag_common *)dmat; + return (tc->impl->map_create(dmat, flags, mapp)); +} + +/* + * Destroy a handle for mapping from kva/uva/physical + * address space into bus device space. + */ +static inline int +bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map) +{ + struct bus_dma_tag_common *tc; + + tc = (struct bus_dma_tag_common *)dmat; + return (tc->impl->map_destroy(dmat, map)); +} + +/* + * Allocate a piece of memory that can be efficiently mapped into + * bus device space based on the constraints lited in the dma tag. + * A dmamap to for use with dmamap_load is also allocated. + */ +static inline int +bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, + bus_dmamap_t *mapp) +{ + struct bus_dma_tag_common *tc; + + tc = (struct bus_dma_tag_common *)dmat; + return (tc->impl->mem_alloc(dmat, vaddr, flags, mapp)); +} + +/* + * Free a piece of memory and it's allociated dmamap, that was allocated + * via bus_dmamem_alloc. Make the same choice for free/contigfree. + */ +static inline void +bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map) +{ + struct bus_dma_tag_common *tc; + + tc = (struct bus_dma_tag_common *)dmat; + tc->impl->mem_free(dmat, vaddr, map); +} + +/* + * Release the mapping held by map. + */ +static inline void +bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map) +{ + struct bus_dma_tag_common *tc; + + if (map != NULL) { + tc = (struct bus_dma_tag_common *)dmat; + tc->impl->map_unload(dmat, map); + } +} + +static inline void +bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) +{ + struct bus_dma_tag_common *tc; + + if (map != NULL) { + tc = (struct bus_dma_tag_common *)dmat; + tc->impl->map_sync(dmat, map, op); + } +} + +/* + * Utility function to load a physical buffer. segp contains + * the starting segment on entrace, and the ending segment on exit. + */ +static inline int +_bus_dmamap_load_phys(bus_dma_tag_t dmat, bus_dmamap_t map, vm_paddr_t buf, + bus_size_t buflen, int flags, bus_dma_segment_t *segs, int *segp) +{ + struct bus_dma_tag_common *tc; + + tc = (struct bus_dma_tag_common *)dmat; + return (tc->impl->load_phys(dmat, map, buf, buflen, flags, segs, + segp)); +} + +static inline int +_bus_dmamap_load_ma(bus_dma_tag_t dmat, bus_dmamap_t map, struct vm_page **ma, + bus_size_t tlen, int ma_offs, int flags, bus_dma_segment_t *segs, + int *segp) +{ + struct bus_dma_tag_common *tc; + + tc = (struct bus_dma_tag_common *)dmat; + return (tc->impl->load_ma(dmat, map, ma, tlen, ma_offs, flags, + segs, segp)); +} + +/* + * Utility function to load a linear buffer. segp contains + * the starting segment on entrace, and the ending segment on exit. + */ +static inline int +_bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, + bus_size_t buflen, struct pmap *pmap, int flags, bus_dma_segment_t *segs, + int *segp) +{ + struct bus_dma_tag_common *tc; + + tc = (struct bus_dma_tag_common *)dmat; + return (tc->impl->load_buffer(dmat, map, buf, buflen, pmap, flags, segs, + segp)); +} + +static inline void +_bus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map, + struct memdesc *mem, bus_dmamap_callback_t *callback, void *callback_arg) +{ + struct bus_dma_tag_common *tc; + + if (map != NULL) { + tc = (struct bus_dma_tag_common *)dmat; + tc->impl->map_waitok(dmat, map, mem, callback, callback_arg); + } +} + +static inline bus_dma_segment_t * +_bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map, + bus_dma_segment_t *segs, int nsegs, int error) +{ + struct bus_dma_tag_common *tc; + + tc = (struct bus_dma_tag_common *)dmat; + return (tc->impl->map_complete(dmat, map, segs, nsegs, error)); +} + +#endif /* !_X86_BUS_DMA_H_ */ + diff --git a/sys/x86/include/busdma_impl.h b/sys/x86/include/busdma_impl.h index b851e7a60798..8e9e2d19cbd4 100644 --- a/sys/x86/include/busdma_impl.h +++ b/sys/x86/include/busdma_impl.h @@ -70,7 +70,7 @@ struct bus_dma_impl { vm_paddr_t buf, bus_size_t buflen, int flags, bus_dma_segment_t *segs, int *segp); int (*load_buffer)(bus_dma_tag_t dmat, bus_dmamap_t map, - void *buf, bus_size_t buflen, pmap_t pmap, int flags, + void *buf, bus_size_t buflen, struct pmap *pmap, int flags, bus_dma_segment_t *segs, int *segp); void (*map_waitok)(bus_dma_tag_t dmat, bus_dmamap_t map, struct memdesc *mem, bus_dmamap_callback_t *callback, diff --git a/sys/x86/iommu/busdma_dmar.c b/sys/x86/iommu/busdma_dmar.c index 73bf8b292b9e..dd1ce80db8f6 100644 --- a/sys/x86/iommu/busdma_dmar.c +++ b/sys/x86/iommu/busdma_dmar.c @@ -361,6 +361,8 @@ dmar_bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp) struct bus_dma_tag_dmar *tag; struct bus_dmamap_dmar *map; + WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL, "%s", __func__); + tag = (struct bus_dma_tag_dmar *)dmat; map = malloc(sizeof(*map), M_DMAR_DMAMAP, M_NOWAIT | M_ZERO); if (map == NULL) { diff --git a/sys/x86/x86/busdma_bounce.c b/sys/x86/x86/busdma_bounce.c index bed0cdb36ee3..d793cfaa5bde 100644 --- a/sys/x86/x86/busdma_bounce.c +++ b/sys/x86/x86/busdma_bounce.c @@ -262,6 +262,8 @@ bounce_bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp) struct bounce_zone *bz; int error, maxpages, pages; + WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL, "%s", __func__); + error = 0; if (dmat->segments == NULL) { @@ -371,6 +373,8 @@ bounce_bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, vm_memattr_t attr; int mflags; + WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL, "%s", __func__); + if (flags & BUS_DMA_NOWAIT) mflags = M_NOWAIT; else diff --git a/sys/x86/x86/busdma_machdep.c b/sys/x86/x86/busdma_machdep.c index aa9e36d3e977..f67dc0db8049 100644 --- a/sys/x86/x86/busdma_machdep.c +++ b/sys/x86/x86/busdma_machdep.c @@ -221,145 +221,3 @@ bus_dma_tag_destroy(bus_dma_tag_t dmat) return (tc->impl->tag_destroy(dmat)); } -/* - * Allocate a handle for mapping from kva/uva/physical - * address space into bus device space. - */ -int -bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp) -{ - struct bus_dma_tag_common *tc; - - WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL, "%s", __func__); - - tc = (struct bus_dma_tag_common *)dmat; - return (tc->impl->map_create(dmat, flags, mapp)); -} - -/* - * Destroy a handle for mapping from kva/uva/physical - * address space into bus device space. - */ -int -bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map) -{ - struct bus_dma_tag_common *tc; - - tc = (struct bus_dma_tag_common *)dmat; - return (tc->impl->map_destroy(dmat, map)); -} - - -/* - * Allocate a piece of memory that can be efficiently mapped into - * bus device space based on the constraints lited in the dma tag. - * A dmamap to for use with dmamap_load is also allocated. - */ -int -bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, - bus_dmamap_t *mapp) -{ - struct bus_dma_tag_common *tc; - - WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL, "%s", __func__); - - tc = (struct bus_dma_tag_common *)dmat; - return (tc->impl->mem_alloc(dmat, vaddr, flags, mapp)); -} - -/* - * Free a piece of memory and it's allociated dmamap, that was allocated - * via bus_dmamem_alloc. Make the same choice for free/contigfree. - */ -void -bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map) -{ - struct bus_dma_tag_common *tc; - - tc = (struct bus_dma_tag_common *)dmat; - tc->impl->mem_free(dmat, vaddr, map); -} - -/* - * Utility function to load a physical buffer. segp contains - * the starting segment on entrace, and the ending segment on exit. - */ -int -_bus_dmamap_load_phys(bus_dma_tag_t dmat, bus_dmamap_t map, vm_paddr_t buf, - bus_size_t buflen, int flags, bus_dma_segment_t *segs, int *segp) -{ - struct bus_dma_tag_common *tc; - - tc = (struct bus_dma_tag_common *)dmat; - return (tc->impl->load_phys(dmat, map, buf, buflen, flags, segs, - segp)); -} - -int -_bus_dmamap_load_ma(bus_dma_tag_t dmat, bus_dmamap_t map, struct vm_page **ma, - bus_size_t tlen, int ma_offs, int flags, bus_dma_segment_t *segs, - int *segp) -{ - struct bus_dma_tag_common *tc; - - tc = (struct bus_dma_tag_common *)dmat; - return (tc->impl->load_ma(dmat, map, ma, tlen, ma_offs, flags, - segs, segp)); -} - -/* - * Utility function to load a linear buffer. segp contains - * the starting segment on entrace, and the ending segment on exit. - */ -int -_bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, - bus_size_t buflen, pmap_t pmap, int flags, bus_dma_segment_t *segs, - int *segp) -{ - struct bus_dma_tag_common *tc; - - tc = (struct bus_dma_tag_common *)dmat; - return (tc->impl->load_buffer(dmat, map, buf, buflen, pmap, flags, segs, - segp)); -} - -void -__bus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map, - struct memdesc *mem, bus_dmamap_callback_t *callback, void *callback_arg) -{ - struct bus_dma_tag_common *tc; - - tc = (struct bus_dma_tag_common *)dmat; - tc->impl->map_waitok(dmat, map, mem, callback, callback_arg); -} - -bus_dma_segment_t * -_bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map, - bus_dma_segment_t *segs, int nsegs, int error) -{ - struct bus_dma_tag_common *tc; - - tc = (struct bus_dma_tag_common *)dmat; - return (tc->impl->map_complete(dmat, map, segs, nsegs, error)); -} - -/* - * Release the mapping held by map. - */ -void -_bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map) -{ - struct bus_dma_tag_common *tc; - - tc = (struct bus_dma_tag_common *)dmat; - tc->impl->map_unload(dmat, map); -} - -void -_bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) -{ - struct bus_dma_tag_common *tc; - - tc = (struct bus_dma_tag_common *)dmat; - tc->impl->map_sync(dmat, map, op); -} -- cgit v1.2.3