Skip to content

Instantly share code, notes, and snippets.

@strejda
Created October 31, 2015 16:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save strejda/d5ca3ed202427a2e0557 to your computer and use it in GitHub Desktop.
Save strejda/d5ca3ed202427a2e0557 to your computer and use it in GitHub Desktop.
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