busdma_machdep-v4.c (254025) | busdma_machdep-v4.c (257201) |
---|---|
1/*- 2 * Copyright (c) 2012 Ian Lepore 3 * Copyright (c) 2004 Olivier Houchard 4 * Copyright (c) 2002 Peter Grehan 5 * Copyright (c) 1997, 1998 Justin T. Gibbs. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 16 unchanged lines hidden (view full) --- 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * From i386/busdma_machdep.c,v 1.26 2002/04/19 22:58:09 alfred 30 */ 31 32#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2012 Ian Lepore 3 * Copyright (c) 2004 Olivier Houchard 4 * Copyright (c) 2002 Peter Grehan 5 * Copyright (c) 1997, 1998 Justin T. Gibbs. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 16 unchanged lines hidden (view full) --- 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * From i386/busdma_machdep.c,v 1.26 2002/04/19 22:58:09 alfred 30 */ 31 32#include <sys/cdefs.h> |
33__FBSDID("$FreeBSD: head/sys/arm/arm/busdma_machdep.c 254025 2013-08-07 06:21:20Z jeff $"); | 33__FBSDID("$FreeBSD: head/sys/arm/arm/busdma_machdep.c 257201 2013-10-27 03:13:26Z ian $"); |
34 35/* 36 * ARM bus dma support routines. 37 * 38 * XXX Things to investigate / fix some day... 39 * - What is the earliest that this API can be called? Could there be any 40 * fallout from changing the SYSINIT() order from SI_SUB_VM to SI_SUB_KMEM? 41 * - The manpage mentions the BUS_DMA_NOWAIT flag only in the context of the --- 75 unchanged lines hidden (view full) --- 117 * on first use. 118 */ 119 bus_dma_segment_t *segments; 120 bus_dma_segment_t tagsegs[2]; 121}; 122 123struct bounce_page { 124 vm_offset_t vaddr; /* kva of bounce buffer */ | 34 35/* 36 * ARM bus dma support routines. 37 * 38 * XXX Things to investigate / fix some day... 39 * - What is the earliest that this API can be called? Could there be any 40 * fallout from changing the SYSINIT() order from SI_SUB_VM to SI_SUB_KMEM? 41 * - The manpage mentions the BUS_DMA_NOWAIT flag only in the context of the --- 75 unchanged lines hidden (view full) --- 117 * on first use. 118 */ 119 bus_dma_segment_t *segments; 120 bus_dma_segment_t tagsegs[2]; 121}; 122 123struct bounce_page { 124 vm_offset_t vaddr; /* kva of bounce buffer */ |
125 vm_offset_t vaddr_nocache; /* kva of bounce buffer uncached */ | |
126 bus_addr_t busaddr; /* Physical address */ 127 vm_offset_t datavaddr; /* kva of client data */ 128 bus_addr_t dataaddr; /* client physical address */ 129 bus_size_t datacount; /* client data count */ 130 STAILQ_ENTRY(bounce_page) links; 131}; 132 133struct sync_list { --- 1057 unchanged lines hidden (view full) --- 1191static void 1192_bus_dmamap_sync_bp(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) 1193{ 1194 struct bounce_page *bpage; 1195 1196 STAILQ_FOREACH(bpage, &map->bpages, links) { 1197 if (op & BUS_DMASYNC_PREWRITE) { 1198 if (bpage->datavaddr != 0) | 125 bus_addr_t busaddr; /* Physical address */ 126 vm_offset_t datavaddr; /* kva of client data */ 127 bus_addr_t dataaddr; /* client physical address */ 128 bus_size_t datacount; /* client data count */ 129 STAILQ_ENTRY(bounce_page) links; 130}; 131 132struct sync_list { --- 1057 unchanged lines hidden (view full) --- 1190static void 1191_bus_dmamap_sync_bp(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) 1192{ 1193 struct bounce_page *bpage; 1194 1195 STAILQ_FOREACH(bpage, &map->bpages, links) { 1196 if (op & BUS_DMASYNC_PREWRITE) { 1197 if (bpage->datavaddr != 0) |
1199 bcopy((void *)bpage->datavaddr, 1200 (void *)(bpage->vaddr_nocache != 0 ? 1201 bpage->vaddr_nocache : 1202 bpage->vaddr), 1203 bpage->datacount); | 1198 bcopy((void *)bpage->datavaddr, 1199 (void *)bpage->vaddr, bpage->datacount); |
1204 else 1205 physcopyout(bpage->dataaddr, | 1200 else 1201 physcopyout(bpage->dataaddr, |
1206 (void *)(bpage->vaddr_nocache != 0 ? 1207 bpage->vaddr_nocache : 1208 bpage->vaddr), 1209 bpage->datacount); 1210 if (bpage->vaddr_nocache == 0) { 1211 cpu_dcache_wb_range(bpage->vaddr, 1212 bpage->datacount); 1213 cpu_l2cache_wb_range(bpage->vaddr, 1214 bpage->datacount); 1215 } | 1202 (void *)bpage->vaddr,bpage->datacount); 1203 cpu_dcache_wb_range(bpage->vaddr, bpage->datacount); 1204 cpu_l2cache_wb_range(bpage->vaddr, bpage->datacount); |
1216 dmat->bounce_zone->total_bounced++; 1217 } 1218 if (op & BUS_DMASYNC_POSTREAD) { | 1205 dmat->bounce_zone->total_bounced++; 1206 } 1207 if (op & BUS_DMASYNC_POSTREAD) { |
1219 if (bpage->vaddr_nocache == 0) { 1220 cpu_dcache_inv_range(bpage->vaddr, 1221 bpage->datacount); 1222 cpu_l2cache_inv_range(bpage->vaddr, 1223 bpage->datacount); 1224 } | 1208 cpu_dcache_inv_range(bpage->vaddr, bpage->datacount); 1209 cpu_l2cache_inv_range(bpage->vaddr, bpage->datacount); |
1225 if (bpage->datavaddr != 0) | 1210 if (bpage->datavaddr != 0) |
1226 bcopy((void *)(bpage->vaddr_nocache != 0 ? 1227 bpage->vaddr_nocache : bpage->vaddr), | 1211 bcopy((void *)bpage->vaddr, |
1228 (void *)bpage->datavaddr, bpage->datacount); 1229 else | 1212 (void *)bpage->datavaddr, bpage->datacount); 1213 else |
1230 physcopyin((void *)(bpage->vaddr_nocache != 0 ? 1231 bpage->vaddr_nocache : bpage->vaddr), | 1214 physcopyin((void *)bpage->vaddr, |
1232 bpage->dataaddr, bpage->datacount); 1233 dmat->bounce_zone->total_bounced++; 1234 } 1235 } 1236} 1237 1238void 1239_bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) --- 140 unchanged lines hidden (view full) --- 1380 bz->lowaddr, 1381 PAGE_SIZE, 1382 0); 1383 if (bpage->vaddr == 0) { 1384 free(bpage, M_DEVBUF); 1385 break; 1386 } 1387 bpage->busaddr = pmap_kextract(bpage->vaddr); | 1215 bpage->dataaddr, bpage->datacount); 1216 dmat->bounce_zone->total_bounced++; 1217 } 1218 } 1219} 1220 1221void 1222_bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) --- 140 unchanged lines hidden (view full) --- 1363 bz->lowaddr, 1364 PAGE_SIZE, 1365 0); 1366 if (bpage->vaddr == 0) { 1367 free(bpage, M_DEVBUF); 1368 break; 1369 } 1370 bpage->busaddr = pmap_kextract(bpage->vaddr); |
1388 bpage->vaddr_nocache = (vm_offset_t)arm_remap_nocache( 1389 (void *)bpage->vaddr, PAGE_SIZE); | |
1390 mtx_lock(&bounce_lock); 1391 STAILQ_INSERT_TAIL(&bz->bounce_page_list, bpage, links); 1392 total_bpages++; 1393 bz->total_bpages++; 1394 bz->free_bpages++; 1395 mtx_unlock(&bounce_lock); 1396 count++; 1397 numpages--; --- 119 unchanged lines hidden --- | 1371 mtx_lock(&bounce_lock); 1372 STAILQ_INSERT_TAIL(&bz->bounce_page_list, bpage, links); 1373 total_bpages++; 1374 bz->total_bpages++; 1375 bz->free_bpages++; 1376 mtx_unlock(&bounce_lock); 1377 count++; 1378 numpages--; --- 119 unchanged lines hidden --- |