Date: Fri, 7 Dec 2012 07:24:16 +0000 (UTC) From: Jeff Roberson <jeff@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r243979 - in projects/physbio/sys: arm/arm ia64/ia64 mips/mips powerpc/powerpc sparc64/sparc64 sys x86/x86 Message-ID: <201212070724.qB77OGiC045023@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jeff Date: Fri Dec 7 07:24:15 2012 New Revision: 243979 URL: http://svnweb.freebsd.org/changeset/base/243979 Log: - Make all of the _bus_dmamap_load_buffer routines identical. Re-arrange callers so that the argument order is the same. - In the sparc64 iommu move some common code into load_buffer() so that it will be easier to combine users with the other implementations. Sponsored by: EMC / Isilon Storage Division Modified: projects/physbio/sys/arm/arm/busdma_machdep-v6.c projects/physbio/sys/arm/arm/busdma_machdep.c projects/physbio/sys/ia64/ia64/busdma_machdep.c projects/physbio/sys/mips/mips/busdma_machdep.c projects/physbio/sys/powerpc/powerpc/busdma_machdep.c projects/physbio/sys/sparc64/sparc64/bus_machdep.c projects/physbio/sys/sparc64/sparc64/iommu.c projects/physbio/sys/sys/bus_dma.h projects/physbio/sys/x86/x86/busdma_machdep.c Modified: projects/physbio/sys/arm/arm/busdma_machdep-v6.c ============================================================================== --- projects/physbio/sys/arm/arm/busdma_machdep-v6.c Fri Dec 7 07:08:39 2012 (r243978) +++ projects/physbio/sys/arm/arm/busdma_machdep-v6.c Fri Dec 7 07:24:15 2012 (r243979) @@ -714,7 +714,7 @@ _bus_dmamap_count_pages(bus_dma_tag_t dm * Utility function to load a linear buffer. segp contains * the starting segment on entrace, and the ending segment on exit. */ -static __inline int +int _bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, bus_size_t buflen, Modified: projects/physbio/sys/arm/arm/busdma_machdep.c ============================================================================== --- projects/physbio/sys/arm/arm/busdma_machdep.c Fri Dec 7 07:08:39 2012 (r243978) +++ projects/physbio/sys/arm/arm/busdma_machdep.c Fri Dec 7 07:24:15 2012 (r243979) @@ -222,11 +222,6 @@ SYSINIT(busdma, SI_SUB_VM, SI_ORDER_ANY, */ static __inline int -bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dma_segment_t *segs, - bus_dmamap_t map, void *buf, bus_size_t buflen, struct pmap *pmap, - int flags, int *segp); - -static __inline int _bus_dma_can_bounce(vm_offset_t lowaddr, vm_offset_t highaddr) { int i; @@ -749,10 +744,10 @@ _bus_dmamap_count_pages(bus_dma_tag_t dm * Utility function to load a linear buffer. segp contains * the starting segment on entrance, and the ending segment on exit. */ -static __inline int -bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dma_segment_t *segs, - bus_dmamap_t map, void *buf, bus_size_t buflen, struct pmap *pmap, - int flags, int *segp) +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) { bus_size_t sgsize; bus_addr_t curaddr, baddr, bmask; @@ -915,9 +910,9 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_ map->flags |= DMAMAP_LINEAR|DMAMAP_COHERENT; map->buffer = buf; map->len = buflen; - error = bus_dmamap_load_buffer(dmat, - NULL, map, buf, buflen, kernel_pmap, - flags, &nsegs); + error = _bus_dmamap_load_buffer(dmat, + map, buf, buflen, kernel_pmap, + flags, NULL, &nsegs); if (error == EINPROGRESS) return (error); if (error) @@ -952,9 +947,9 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat, for (m = m0; m != NULL && error == 0; m = m->m_next) { if (m->m_len > 0) { - error = bus_dmamap_load_buffer(dmat, - NULL, map, m->m_data, m->m_len, - kernel_pmap, flags, &nsegs); + error = _bus_dmamap_load_buffer(dmat, + map, m->m_data, m->m_len, + kernel_pmap, flags, NULL, &nsegs); map->len += m->m_len; } } @@ -996,10 +991,10 @@ bus_dmamap_load_mbuf_sg(bus_dma_tag_t dm for (m = m0; m != NULL && error == 0; m = m->m_next) { if (m->m_len > 0) { - error = bus_dmamap_load_buffer(dmat, segs, map, + error = _bus_dmamap_load_buffer(dmat, map, m->m_data, m->m_len, kernel_pmap, flags, - nsegs); + segs, nsegs); map->len += m->m_len; } } @@ -1053,8 +1048,8 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, caddr_t addr = (caddr_t) iov[i].iov_base; if (minlen > 0) { - error = bus_dmamap_load_buffer(dmat, NULL, - map, addr, minlen, pmap, flags, &nsegs); + error = _bus_dmamap_load_buffer(dmat, + map, addr, minlen, pmap, flags, NULL, &nsegs); map->len += minlen; resid -= minlen; Modified: projects/physbio/sys/ia64/ia64/busdma_machdep.c ============================================================================== --- projects/physbio/sys/ia64/ia64/busdma_machdep.c Fri Dec 7 07:08:39 2012 (r243978) +++ projects/physbio/sys/ia64/ia64/busdma_machdep.c Fri Dec 7 07:24:15 2012 (r243979) @@ -484,7 +484,7 @@ bus_dmamem_free(bus_dma_tag_t dmat, void * Utility function to load a linear buffer. segp contains * the starting segment on entrace, and the ending segment on exit. */ -static int +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) Modified: projects/physbio/sys/mips/mips/busdma_machdep.c ============================================================================== --- projects/physbio/sys/mips/mips/busdma_machdep.c Fri Dec 7 07:08:39 2012 (r243978) +++ projects/physbio/sys/mips/mips/busdma_machdep.c Fri Dec 7 07:24:15 2012 (r243979) @@ -215,11 +215,6 @@ SYSINIT(busdma, SI_SUB_VM, SI_ORDER_ANY, */ static __inline int -bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dma_segment_t *segs, - bus_dmamap_t map, void *buf, bus_size_t buflen, struct pmap *pmap, - int flags, int *segp); - -static __inline int _bus_dma_can_bounce(vm_offset_t lowaddr, vm_offset_t highaddr) { int i; @@ -748,10 +743,10 @@ _bus_dmamap_count_pages(bus_dma_tag_t dm * the starting segment on entrance, and the ending segment on exit. * first indicates if this is the first invocation of this function. */ -static __inline int -bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dma_segment_t *segs, - bus_dmamap_t map, void *buf, bus_size_t buflen, struct pmap *pmap, - int flags, int *segp) +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) { bus_size_t sgsize; bus_addr_t curaddr, baddr, bmask; @@ -858,9 +853,8 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_ map->flags |= DMAMAP_LINEAR; map->buffer = buf; map->len = buflen; - error = bus_dmamap_load_buffer(dmat, - NULL, map, buf, buflen, kernel_pmap, - flags, &nsegs); + error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, kernel_pmap, + flags, NULL, &nsegs); if (error == EINPROGRESS) return (error); if (error) @@ -895,9 +889,9 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat, for (m = m0; m != NULL && error == 0; m = m->m_next) { if (m->m_len > 0) { - error = bus_dmamap_load_buffer(dmat, - NULL, map, m->m_data, m->m_len, - kernel_pmap, flags, &nsegs); + error = _bus_dmamap_load_buffer(dmat, + map, m->m_data, m->m_len, + kernel_pmap, flags, NULL, &nsegs); map->len += m->m_len; } } @@ -939,10 +933,10 @@ bus_dmamap_load_mbuf_sg(bus_dma_tag_t dm for (m = m0; m != NULL && error == 0; m = m->m_next) { if (m->m_len > 0) { - error = bus_dmamap_load_buffer(dmat, segs, map, + error = _bus_dmamap_load_buffer(dmat, map, m->m_data, m->m_len, kernel_pmap, flags, - nsegs); + segs, nsegs); map->len += m->m_len; } } @@ -997,8 +991,8 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, caddr_t addr = (caddr_t) iov[i].iov_base; if (minlen > 0) { - error = bus_dmamap_load_buffer(dmat, NULL, - map, addr, minlen, pmap, flags, &nsegs); + error = _bus_dmamap_load_buffer(dmat, map, addr, + minlen, pmap, flags, NULL, &nsegs); map->len += minlen; resid -= minlen; Modified: projects/physbio/sys/powerpc/powerpc/busdma_machdep.c ============================================================================== --- projects/physbio/sys/powerpc/powerpc/busdma_machdep.c Fri Dec 7 07:08:39 2012 (r243978) +++ projects/physbio/sys/powerpc/powerpc/busdma_machdep.c Fri Dec 7 07:24:15 2012 (r243979) @@ -568,7 +568,7 @@ bus_dmamem_free(bus_dma_tag_t dmat, void * Utility function to load a linear buffer. segp contains * the starting segment on entrance, and the ending segment on exit. */ -static __inline int +int _bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, bus_size_t buflen, Modified: projects/physbio/sys/sparc64/sparc64/bus_machdep.c ============================================================================== --- projects/physbio/sys/sparc64/sparc64/bus_machdep.c Fri Dec 7 07:08:39 2012 (r243978) +++ projects/physbio/sys/sparc64/sparc64/bus_machdep.c Fri Dec 7 07:24:15 2012 (r243979) @@ -330,9 +330,9 @@ nexus_dmamap_destroy(bus_dma_tag_t dmat, * the starting segment on entrace, and the ending segment on exit. */ static int -_nexus_dmamap_load_buffer(bus_dma_tag_t dmat, void *buf, bus_size_t buflen, - pmap_t pmap, int flags, - bus_dma_segment_t *segs, int *segp) +_nexus_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) { bus_size_t sgsize; bus_addr_t curaddr, baddr, bmask; @@ -423,7 +423,7 @@ nexus_dmamap_load(bus_dma_tag_t dmat, bu int error, nsegs; nsegs = -1; - error = _nexus_dmamap_load_buffer(dmat, buf, buflen, kernel_pmap, + error = _nexus_dmamap_load_buffer(dmat, map, buf, buflen, kernel_pmap, flags, NULL, &nsegs); if (error == 0) { @@ -453,7 +453,7 @@ nexus_dmamap_load_mbuf(bus_dma_tag_t dma for (m = m0; m != NULL && error == 0; m = m->m_next) { if (m->m_len > 0) { - error = _nexus_dmamap_load_buffer(dmat, + error = _nexus_dmamap_load_buffer(dmat, map, m->m_data, m->m_len, kernel_pmap, flags, NULL, &nsegs); } @@ -488,7 +488,7 @@ nexus_dmamap_load_mbuf_sg(bus_dma_tag_t for (m = m0; m != NULL && error == 0; m = m->m_next) { if (m->m_len > 0) { - error = _nexus_dmamap_load_buffer(dmat, + error = _nexus_dmamap_load_buffer(dmat, map, m->m_data, m->m_len, kernel_pmap, flags, segs, nsegs); } @@ -533,8 +533,8 @@ nexus_dmamap_load_uio(bus_dma_tag_t dmat caddr_t addr = (caddr_t) iov[i].iov_base; if (minlen > 0) { - error = _nexus_dmamap_load_buffer(dmat, addr, minlen, - pmap, flags, NULL, &nsegs); + error = _nexus_dmamap_load_buffer(dmat, map, addr, + minlen, pmap, flags, NULL, &nsegs); resid -= minlen; } } Modified: projects/physbio/sys/sparc64/sparc64/iommu.c ============================================================================== --- projects/physbio/sys/sparc64/sparc64/iommu.c Fri Dec 7 07:08:39 2012 (r243978) +++ projects/physbio/sys/sparc64/sparc64/iommu.c Fri Dec 7 07:24:15 2012 (r243979) @@ -850,17 +850,40 @@ iommu_dvmamap_destroy(bus_dma_tag_t dt, * IOMMU DVMA operations, common to PCI and SBus */ static int -iommu_dvmamap_load_buffer(bus_dma_tag_t dt, struct iommu_state *is, - bus_dmamap_t map, void *buf, bus_size_t buflen, pmap_t pmap, - int flags, bus_dma_segment_t *segs, int *segp) +iommu_dvmamap_load_buffer(bus_dma_tag_t dt, bus_dmamap_t map, void *buf, + bus_size_t buflen, pmap_t pmap, int flags, bus_dma_segment_t *segs, + int *segp) { bus_addr_t amask, dvmaddr, dvmoffs; bus_size_t sgsize, esize; + struct iommu_state *is; vm_offset_t vaddr, voffs; vm_paddr_t curaddr; int error, firstpg, sgcnt; + int first; u_int slot; + is = dt->dt_cookie; + if (*segp == -1) { + if ((map->dm_flags & DMF_LOADED) != 0) { +#ifdef DIAGNOSTIC + printf("%s: map still in use\n", __func__); +#endif + bus_dmamap_unload(dt, map); + } + + /* + * Make sure that the map is not on a queue so that the + * resource list may be safely accessed and modified without + * needing the lock to cover the whole operation. + */ + IS_LOCK(is); + iommu_map_remq(is, map); + IS_UNLOCK(is); + + amask = dt->dt_alignment - 1; + } else + amask = 0; KASSERT(buflen != 0, ("%s: buflen == 0!", __func__)); if (buflen > dt->dt_maxsize) return (EINVAL); @@ -870,7 +893,6 @@ iommu_dvmamap_load_buffer(bus_dma_tag_t vaddr = (vm_offset_t)buf; voffs = vaddr & IO_PAGE_MASK; - amask = (*segp == -1) ? dt->dt_alignment - 1 : 0; /* Try to find a slab that is large enough. */ error = iommu_dvma_vallocseg(dt, is, map, voffs, buflen, amask, @@ -956,22 +978,6 @@ iommu_dvmamap_load(bus_dma_tag_t dt, bus struct iommu_state *is = dt->dt_cookie; int error, seg = -1; - if ((map->dm_flags & DMF_LOADED) != 0) { -#ifdef DIAGNOSTIC - printf("%s: map still in use\n", __func__); -#endif - bus_dmamap_unload(dt, map); - } - - /* - * Make sure that the map is not on a queue so that the resource list - * may be safely accessed and modified without needing the lock to - * cover the whole operation. - */ - IS_LOCK(is); - iommu_map_remq(is, map); - IS_UNLOCK(is); - error = iommu_dvmamap_load_buffer(dt, is, map, buf, buflen, kernel_pmap, flags, NULL, &seg); @@ -1000,17 +1006,6 @@ iommu_dvmamap_load_mbuf(bus_dma_tag_t dt M_ASSERTPKTHDR(m0); - if ((map->dm_flags & DMF_LOADED) != 0) { -#ifdef DIAGNOSTIC - printf("%s: map still in use\n", __func__); -#endif - bus_dmamap_unload(dt, map); - } - - IS_LOCK(is); - iommu_map_remq(is, map); - IS_UNLOCK(is); - if (m0->m_pkthdr.len <= dt->dt_maxsize) { for (m = m0; m != NULL && error == 0; m = m->m_next) { if (m->m_len == 0) @@ -1048,16 +1043,6 @@ iommu_dvmamap_load_mbuf_sg(bus_dma_tag_t M_ASSERTPKTHDR(m0); *nsegs = -1; - if ((map->dm_flags & DMF_LOADED) != 0) { -#ifdef DIAGNOSTIC - printf("%s: map still in use\n", __func__); -#endif - bus_dmamap_unload(dt, map); - } - - IS_LOCK(is); - iommu_map_remq(is, map); - IS_UNLOCK(is); if (m0->m_pkthdr.len <= dt->dt_maxsize) { for (m = m0; m != NULL && error == 0; m = m->m_next) { @@ -1094,17 +1079,6 @@ iommu_dvmamap_load_uio(bus_dma_tag_t dt, int nsegs = -1, error = 0, i; pmap-t pmap; - if ((map->dm_flags & DMF_LOADED) != 0) { -#ifdef DIAGNOSTIC - printf("%s: map still in use\n", __func__); -#endif - bus_dmamap_unload(dt, map); - } - - IS_LOCK(is); - iommu_map_remq(is, map); - IS_UNLOCK(is); - resid = uio->uio_resid; iov = uio->uio_iov; Modified: projects/physbio/sys/sys/bus_dma.h ============================================================================== --- projects/physbio/sys/sys/bus_dma.h Fri Dec 7 07:08:39 2012 (r243978) +++ projects/physbio/sys/sys/bus_dma.h Fri Dec 7 07:24:15 2012 (r243979) @@ -282,4 +282,9 @@ void _bus_dmamap_unload(bus_dma_tag_t dm #endif /* __sparc64__ */ +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); + + #endif /* _BUS_DMA_H_ */ Modified: projects/physbio/sys/x86/x86/busdma_machdep.c ============================================================================== --- projects/physbio/sys/x86/x86/busdma_machdep.c Fri Dec 7 07:08:39 2012 (r243978) +++ projects/physbio/sys/x86/x86/busdma_machdep.c Fri Dec 7 07:24:15 2012 (r243979) @@ -648,9 +648,9 @@ _bus_dmamap_count_pages(bus_dma_tag_t dm * Utility function to load a linear buffer. segp contains * the starting segment on entrace, and the ending segment on exit. */ -static __inline int +int _bus_dmamap_load_buffer(bus_dma_tag_t dmat, - bus_dmamap_t map, + bus_dmamap_t map, void *buf, bus_size_t buflen, pmap_t pmap, int flags,
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201212070724.qB77OGiC045023>