Deleted Added
full compact
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 ---