busdma_machdep-v6.c (289858) | busdma_machdep-v6.c (289865) |
---|---|
1/*- | 1/*- |
2 * Copyright (c) 2012-2014 Ian Lepore | 2 * Copyright (c) 2012-2015 Ian Lepore |
3 * Copyright (c) 2010 Mark Tinguely 4 * Copyright (c) 2004 Olivier Houchard 5 * Copyright (c) 2002 Peter Grehan 6 * Copyright (c) 1997, 1998 Justin T. Gibbs. 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions --- 15 unchanged lines hidden (view full) --- 26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28 * SUCH DAMAGE. 29 * 30 * From i386/busdma_machdep.c 191438 2009-04-23 20:24:19Z jhb 31 */ 32 33#include <sys/cdefs.h> | 3 * Copyright (c) 2010 Mark Tinguely 4 * Copyright (c) 2004 Olivier Houchard 5 * Copyright (c) 2002 Peter Grehan 6 * Copyright (c) 1997, 1998 Justin T. Gibbs. 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions --- 15 unchanged lines hidden (view full) --- 26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28 * SUCH DAMAGE. 29 * 30 * From i386/busdma_machdep.c 191438 2009-04-23 20:24:19Z jhb 31 */ 32 33#include <sys/cdefs.h> |
34__FBSDID("$FreeBSD: head/sys/arm/arm/busdma_machdep-v6.c 289858 2015-10-23 22:52:00Z ian $"); | 34__FBSDID("$FreeBSD: head/sys/arm/arm/busdma_machdep-v6.c 289865 2015-10-24 03:01:47Z ian $"); |
35 36#define _ARM32_BUS_DMA_PRIVATE 37#include <sys/param.h> | 35 36#define _ARM32_BUS_DMA_PRIVATE 37#include <sys/param.h> |
38#include <sys/kdb.h> 39#include <ddb/ddb.h> 40#include <ddb/db_output.h> | |
41#include <sys/systm.h> 42#include <sys/malloc.h> 43#include <sys/bus.h> 44#include <sys/busdma_bufalloc.h> 45#include <sys/counter.h> 46#include <sys/interrupt.h> 47#include <sys/kernel.h> 48#include <sys/ktr.h> --- 686 unchanged lines hidden (view full) --- 735 736/* 737 * Destroy a handle for mapping from kva/uva/physical 738 * address space into bus device space. 739 */ 740int 741bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map) 742{ | 38#include <sys/systm.h> 39#include <sys/malloc.h> 40#include <sys/bus.h> 41#include <sys/busdma_bufalloc.h> 42#include <sys/counter.h> 43#include <sys/interrupt.h> 44#include <sys/kernel.h> 45#include <sys/ktr.h> --- 686 unchanged lines hidden (view full) --- 732 733/* 734 * Destroy a handle for mapping from kva/uva/physical 735 * address space into bus device space. 736 */ 737int 738bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map) 739{ |
740 |
|
743 if (STAILQ_FIRST(&map->bpages) != NULL || map->sync_count != 0) { 744 CTR3(KTR_BUSDMA, "%s: tag %p error %d", 745 __func__, dmat, EBUSY); 746 return (EBUSY); 747 } 748 if (dmat->bounce_zone) 749 dmat->bounce_zone->map_count--; 750 if (map->flags & DMAMAP_COHERENT) 751 atomic_subtract_32(&maps_coherent, 1); 752 atomic_subtract_32(&maps_total, 1); 753 free(map, M_BUSDMA); 754 dmat->map_count--; 755 CTR2(KTR_BUSDMA, "%s: tag %p error 0", __func__, dmat); 756 return (0); 757} 758 | 741 if (STAILQ_FIRST(&map->bpages) != NULL || map->sync_count != 0) { 742 CTR3(KTR_BUSDMA, "%s: tag %p error %d", 743 __func__, dmat, EBUSY); 744 return (EBUSY); 745 } 746 if (dmat->bounce_zone) 747 dmat->bounce_zone->map_count--; 748 if (map->flags & DMAMAP_COHERENT) 749 atomic_subtract_32(&maps_coherent, 1); 750 atomic_subtract_32(&maps_total, 1); 751 free(map, M_BUSDMA); 752 dmat->map_count--; 753 CTR2(KTR_BUSDMA, "%s: tag %p error 0", __func__, dmat); 754 return (0); 755} 756 |
759 | |
760/* | 757/* |
761 * Allocate a piece of memory that can be efficiently mapped into 762 * bus device space based on the constraints lited in the dma tag. 763 * A dmamap to for use with dmamap_load is also allocated. | 758 * Allocate a piece of memory that can be efficiently mapped into bus device 759 * space based on the constraints listed in the dma tag. Returns a pointer to 760 * the allocated memory, and a pointer to an associated bus_dmamap. |
764 */ 765int | 761 */ 762int |
766bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, | 763bus_dmamem_alloc(bus_dma_tag_t dmat, void **vaddr, int flags, |
767 bus_dmamap_t *mapp) 768{ 769 busdma_bufalloc_t ba; 770 struct busdma_bufzone *bufzone; 771 bus_dmamap_t map; 772 vm_memattr_t memattr; 773 int mflags; 774 --- 49 unchanged lines hidden (view full) --- 824 dmat->alignment <= PAGE_SIZE && dmat->boundary == 0) { 825 *vaddr = (void *)kmem_alloc_attr(kernel_arena, dmat->maxsize, 826 mflags, 0, dmat->lowaddr, memattr); 827 } else { 828 *vaddr = (void *)kmem_alloc_contig(kernel_arena, dmat->maxsize, 829 mflags, 0, dmat->lowaddr, dmat->alignment, dmat->boundary, 830 memattr); 831 } | 764 bus_dmamap_t *mapp) 765{ 766 busdma_bufalloc_t ba; 767 struct busdma_bufzone *bufzone; 768 bus_dmamap_t map; 769 vm_memattr_t memattr; 770 int mflags; 771 --- 49 unchanged lines hidden (view full) --- 821 dmat->alignment <= PAGE_SIZE && dmat->boundary == 0) { 822 *vaddr = (void *)kmem_alloc_attr(kernel_arena, dmat->maxsize, 823 mflags, 0, dmat->lowaddr, memattr); 824 } else { 825 *vaddr = (void *)kmem_alloc_contig(kernel_arena, dmat->maxsize, 826 mflags, 0, dmat->lowaddr, dmat->alignment, dmat->boundary, 827 memattr); 828 } |
832 833 | |
834 if (*vaddr == NULL) { 835 CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", 836 __func__, dmat, dmat->flags, ENOMEM); 837 free(map, M_BUSDMA); 838 *mapp = NULL; 839 return (ENOMEM); 840 } 841 if (map->flags & DMAMAP_COHERENT) 842 atomic_add_32(&maps_coherent, 1); 843 atomic_add_32(&maps_dmamem, 1); 844 atomic_add_32(&maps_total, 1); 845 dmat->map_count++; 846 847 CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", 848 __func__, dmat, dmat->flags, 0); 849 return (0); 850} 851 852/* | 829 if (*vaddr == NULL) { 830 CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", 831 __func__, dmat, dmat->flags, ENOMEM); 832 free(map, M_BUSDMA); 833 *mapp = NULL; 834 return (ENOMEM); 835 } 836 if (map->flags & DMAMAP_COHERENT) 837 atomic_add_32(&maps_coherent, 1); 838 atomic_add_32(&maps_dmamem, 1); 839 atomic_add_32(&maps_total, 1); 840 dmat->map_count++; 841 842 CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", 843 __func__, dmat, dmat->flags, 0); 844 return (0); 845} 846 847/* |
853 * Free a piece of memory and it's allociated dmamap, that was allocated 854 * via bus_dmamem_alloc. Make the same choice for free/contigfree. | 848 * Free a piece of memory that was allocated via bus_dmamem_alloc, along with 849 * its associated map. |
855 */ 856void 857bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map) 858{ 859 struct busdma_bufzone *bufzone; 860 busdma_bufalloc_t ba; 861 862 if (map->flags & DMAMAP_COHERENT) --- 207 unchanged lines hidden (view full) --- 1070 1071 while (buflen > 0) { 1072 curaddr = buf; 1073 sgsize = MIN(buflen, dmat->maxsegsz); 1074 if (map->pagesneeded != 0 && must_bounce(dmat, map, curaddr, 1075 sgsize)) { 1076 sgsize = MIN(sgsize, PAGE_SIZE - (curaddr & PAGE_MASK)); 1077 curaddr = add_bounce_page(dmat, map, 0, curaddr, | 850 */ 851void 852bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map) 853{ 854 struct busdma_bufzone *bufzone; 855 busdma_bufalloc_t ba; 856 857 if (map->flags & DMAMAP_COHERENT) --- 207 unchanged lines hidden (view full) --- 1065 1066 while (buflen > 0) { 1067 curaddr = buf; 1068 sgsize = MIN(buflen, dmat->maxsegsz); 1069 if (map->pagesneeded != 0 && must_bounce(dmat, map, curaddr, 1070 sgsize)) { 1071 sgsize = MIN(sgsize, PAGE_SIZE - (curaddr & PAGE_MASK)); 1072 curaddr = add_bounce_page(dmat, map, 0, curaddr, |
1078 sgsize); | 1073 sgsize); |
1079 } else { 1080 if (map->sync_count > 0) 1081 sl_end = VM_PAGE_TO_PHYS(sl->pages) + 1082 sl->dataoffs + sl->datacount; 1083 1084 if (map->sync_count == 0 || curaddr != sl_end) { 1085 if (++map->sync_count > dmat->nsegments) 1086 break; --- 95 unchanged lines hidden (view full) --- 1182 if (sgsize > dmat->maxsegsz) 1183 sgsize = dmat->maxsegsz; 1184 if (buflen < sgsize) 1185 sgsize = buflen; 1186 1187 if (map->pagesneeded != 0 && must_bounce(dmat, map, curaddr, 1188 sgsize)) { 1189 curaddr = add_bounce_page(dmat, map, kvaddr, curaddr, | 1074 } else { 1075 if (map->sync_count > 0) 1076 sl_end = VM_PAGE_TO_PHYS(sl->pages) + 1077 sl->dataoffs + sl->datacount; 1078 1079 if (map->sync_count == 0 || curaddr != sl_end) { 1080 if (++map->sync_count > dmat->nsegments) 1081 break; --- 95 unchanged lines hidden (view full) --- 1177 if (sgsize > dmat->maxsegsz) 1178 sgsize = dmat->maxsegsz; 1179 if (buflen < sgsize) 1180 sgsize = buflen; 1181 1182 if (map->pagesneeded != 0 && must_bounce(dmat, map, curaddr, 1183 sgsize)) { 1184 curaddr = add_bounce_page(dmat, map, kvaddr, curaddr, |
1190 sgsize); | 1185 sgsize); |
1191 } else { 1192 if (map->sync_count > 0) { 1193 sl_pend = VM_PAGE_TO_PHYS(sl->pages) + 1194 sl->dataoffs + sl->datacount; 1195 sl_vend = sl->vaddr + sl->datacount; 1196 } 1197 1198 if (map->sync_count == 0 || --- 536 unchanged lines hidden --- | 1186 } else { 1187 if (map->sync_count > 0) { 1188 sl_pend = VM_PAGE_TO_PHYS(sl->pages) + 1189 sl->dataoffs + sl->datacount; 1190 sl_vend = sl->vaddr + sl->datacount; 1191 } 1192 1193 if (map->sync_count == 0 || --- 536 unchanged lines hidden --- |