Created
October 31, 2015 16:39
-
-
Save strejda/d5ca3ed202427a2e0557 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/sys/arm/arm/busdma_machdep-v6.c b/sys/arm/arm/busdma_machdep-v6.c | |
index d62522e..2831418 100644 | |
--- a/sys/arm/arm/busdma_machdep-v6.c | |
+++ b/sys/arm/arm/busdma_machdep-v6.c | |
@@ -1080,10 +1080,14 @@ _bus_dmamap_load_phys(bus_dma_tag_t dmat, bus_dmamap_t map, vm_paddr_t buf, | |
curaddr = add_bounce_page(dmat, map, 0, curaddr, | |
sgsize); | |
} else { | |
- if (map->sync_count > 0) | |
- sl_end = VM_PAGE_TO_PHYS(sl->pages) + | |
- sl->dataoffs + sl->datacount; | |
- | |
+ if (map->sync_count > 0) { | |
+ if (sl->vaddr == 0) | |
+ sl_end = VM_PAGE_TO_PHYS(sl->pages) + | |
+ sl->dataoffs + sl->datacount; | |
+ else | |
+ sl_end = pmap_kextract(sl->vaddr) + | |
+ sl->datacount; | |
+ } | |
if (map->sync_count == 0 || curaddr != sl_end) { | |
if (++map->sync_count > dmat->nsegments) | |
break; | |
@@ -1091,6 +1095,11 @@ _bus_dmamap_load_phys(bus_dma_tag_t dmat, bus_dmamap_t map, vm_paddr_t buf, | |
sl->vaddr = 0; | |
sl->datacount = sgsize; | |
sl->pages = PHYS_TO_VM_PAGE(curaddr); | |
+ if (sl->pages == NULL) { | |
+ panic("%s: attempt to start DMA from" | |
+ " not present memory: 0x%08lx", | |
+ __func__, curaddr); | |
+ } | |
sl->dataoffs = curaddr & PAGE_MASK; | |
} else | |
sl->datacount += sgsize; | |
@@ -1193,8 +1202,12 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, | |
sgsize); | |
} else { | |
if (map->sync_count > 0) { | |
- sl_pend = VM_PAGE_TO_PHYS(sl->pages) + | |
- sl->dataoffs + sl->datacount; | |
+ if (sl->vaddr == 0) | |
+ sl_pend = VM_PAGE_TO_PHYS(sl->pages) + | |
+ sl->dataoffs + sl->datacount; | |
+ else | |
+ sl_pend = pmap_kextract(sl->vaddr) + | |
+ sl->datacount; | |
sl_vend = sl->vaddr + sl->datacount; | |
} | |
@@ -1208,6 +1221,12 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, | |
sl->vaddr = kvaddr; | |
sl->datacount = sgsize; | |
sl->pages = PHYS_TO_VM_PAGE(curaddr); | |
+ if ((kvaddr == 0) && (sl->pages == NULL)) { | |
+ panic("%s: attempt load unmapped" | |
+ " DMA memory from not" | |
+ " present memory: 0x%08lx", | |
+ __func__, curaddr); | |
+ } | |
sl->dataoffs = curaddr & PAGE_MASK; | |
} else | |
sl->datacount += sgsize; | |
@@ -1307,7 +1326,10 @@ dma_dcache_sync(struct sync_list *sl, bus_dmasync_op_t op) | |
offset = sl->dataoffs; | |
m = sl->pages; | |
size = sl->datacount; | |
- pa = VM_PAGE_TO_PHYS(m) | offset; | |
+ if (sl->vaddr == 0) | |
+ pa = VM_PAGE_TO_PHYS(m) | offset; | |
+ else | |
+ pa = pmap_kextract(sl->vaddr); | |
for ( ; size != 0; size -= len, pa += len, offset = 0, ++m) { | |
tempva = 0; | |
@@ -1319,10 +1341,11 @@ dma_dcache_sync(struct sync_list *sl, bus_dmasync_op_t op) | |
len = sl->datacount; | |
va = sl->vaddr; | |
} | |
+#if 0 /* Remove me */ | |
KASSERT(pa == (VM_PAGE_TO_PHYS(m) | offset), | |
("unexpected vm_page_t phys: 0x%08x != 0x%08x", | |
VM_PAGE_TO_PHYS(m) | offset, pa)); | |
- | |
+#endif | |
switch (op) { | |
case BUS_DMASYNC_PREWRITE: | |
case BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD: |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment