Module Name: src Committed By: skrll Date: Wed Mar 26 16:07:15 UTC 2014
Modified Files: src/sys/external/bsd/vchiq/dist/interface/vchiq_arm: vchiq_2835_arm.c Log Message: Correct some bus_dma operations. To generate a diff of this commit: cvs rdiff -u -r1.9 -r1.10 \ src/sys/external/bsd/vchiq/dist/interface/vchiq_arm/vchiq_2835_arm.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/external/bsd/vchiq/dist/interface/vchiq_arm/vchiq_2835_arm.c diff -u src/sys/external/bsd/vchiq/dist/interface/vchiq_arm/vchiq_2835_arm.c:1.9 src/sys/external/bsd/vchiq/dist/interface/vchiq_arm/vchiq_2835_arm.c:1.10 --- src/sys/external/bsd/vchiq/dist/interface/vchiq_arm/vchiq_2835_arm.c:1.9 Sun Apr 28 20:57:26 2013 +++ src/sys/external/bsd/vchiq/dist/interface/vchiq_arm/vchiq_2835_arm.c Wed Mar 26 16:07:15 2014 @@ -100,7 +100,7 @@ vchiq_platform_init(VCHIQ_STATE_T *state dma_nsegs = __arraycount(dma_segs); err = bus_dmamem_alloc(&bcm2835_bus_dma_tag, g_slot_mem_size + frag_mem_size, PAGE_SIZE, 0, - dma_segs, dma_nsegs, &dma_nsegs, BUS_DMA_COHERENT | BUS_DMA_WAITOK); + dma_segs, dma_nsegs, &dma_nsegs, BUS_DMA_WAITOK); if (err) { vchiq_log_error(vchiq_core_log_level, "Unable to allocate channel memory"); err = -ENOMEM; @@ -289,7 +289,7 @@ vchiq_prepare_bulk_data(VCHIQ_BULK_T *bu goto fail1; ret = bus_dmamem_map(&bcm2835_bus_dma_tag, bi->pagelist_sgs, nsegs, - bi->pagelist_size, &bi->pagelist, BUS_DMA_WAITOK); + bi->pagelist_size, &bi->pagelist, BUS_DMA_COHERENT | BUS_DMA_WAITOK); if (ret != 0) goto fail2; @@ -378,7 +378,7 @@ vchiq_prepare_bulk_data(VCHIQ_BULK_T *bu bulk->remote_data = bi; bus_dmamap_sync(&bcm2835_bus_dma_tag, bi->pagelist_map, 0, - bi->pagelist_size, BUS_DMASYNC_PREREAD); + bi->pagelist_size, BUS_DMASYNC_PREWRITE); bus_dmamap_sync(&bcm2835_bus_dma_tag, bi->dmamap, 0, bi->size, pagelist->type == PAGELIST_WRITE ? @@ -420,6 +420,13 @@ vchiq_complete_bulk(VCHIQ_BULK_T *bulk) BULKINFO_T *bi = bulk->remote_data; PAGELIST_T *pagelist = bi->pagelist; + bus_dmamap_sync(&bcm2835_bus_dma_tag, bi->pagelist_map, 0, + bi->pagelist_size, BUS_DMASYNC_POSTWRITE); + + bus_dmamap_sync(&bcm2835_bus_dma_tag, bi->dmamap, 0, bi->size, + pagelist->type == PAGELIST_WRITE ? + BUS_DMASYNC_POSTWRITE : BUS_DMASYNC_POSTREAD); + /* Deal with any partial cache lines (fragments) */ if (pagelist->type >= PAGELIST_READ_WITH_FRAGMENTS) { FRAGMENTS_T *fragments = g_fragments_base + @@ -469,13 +476,6 @@ vchiq_complete_bulk(VCHIQ_BULK_T *bulk) up(&g_free_fragments_mutex); up(&g_free_fragments_sema); } - bus_dmamap_sync(&bcm2835_bus_dma_tag, bi->pagelist_map, 0, - bi->pagelist_size, BUS_DMASYNC_POSTREAD); - - bus_dmamap_sync(&bcm2835_bus_dma_tag, bi->dmamap, 0, bi->size, - pagelist->type == PAGELIST_WRITE ? - BUS_DMASYNC_POSTWRITE : BUS_DMASYNC_POSTREAD); - bus_dmamap_unload(&bcm2835_bus_dma_tag, bi->dmamap); bus_dmamap_destroy(&bcm2835_bus_dma_tag, bi->dmamap); if (IS_USER_ADDRESS(bi->buf))