Page MenuHomeFreeBSD

D26494.id77255.diff
No OneTemporary

D26494.id77255.diff

Index: sys/arm64/arm64/busdma_bounce.c
===================================================================
--- sys/arm64/arm64/busdma_bounce.c
+++ sys/arm64/arm64/busdma_bounce.c
@@ -137,6 +137,7 @@
u_int flags;
#define DMAMAP_COULD_BOUNCE (1 << 0)
#define DMAMAP_FROM_DMAMEM (1 << 1)
+#define DMAMAP_COHERENT (1 << 2)
int sync_count;
struct sync_list slist[];
};
@@ -396,10 +397,13 @@
}
bz->map_count++;
}
- if (error == 0)
+ if (error == 0) {
dmat->map_count++;
- else
+ if ((dmat->bounce_flags & BF_COHERENT) != 0)
+ (*mapp)->flags |= DMAMAP_COHERENT;
+ } else {
free(*mapp, M_DEVBUF);
+ }
CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d",
__func__, dmat, dmat->common.flags, error);
return (error);
@@ -490,7 +494,16 @@
__func__, dmat, dmat->common.flags, ENOMEM);
return (ENOMEM);
}
- (*mapp)->flags = DMAMAP_FROM_DMAMEM;
+
+ /*
+ * Mark the map as coherent if we used uncacheable memory or the
+ * tag was already marked as coherent.
+ */
+ if (attr == VM_MEMATTR_UNCACHEABLE ||
+ (dmat->bounce_flags & BF_COHERENT) != 0)
+ (*mapp)->flags |= DMAMAP_COHERENT;
+
+ (*mapp)->flags |= DMAMAP_FROM_DMAMEM;
/*
* Allocate the buffer from the malloc(9) allocator if...
@@ -760,7 +773,7 @@
sgsize = MIN(sgsize, PAGE_SIZE - (curaddr & PAGE_MASK));
curaddr = add_bounce_page(dmat, map, 0, curaddr,
sgsize);
- } else if ((dmat->bounce_flags & BF_COHERENT) == 0) {
+ } else if ((map->flags & DMAMAP_COHERENT) == 0) {
if (map->sync_count > 0)
sl_end = sl->paddr + sl->datacount;
@@ -846,7 +859,7 @@
sgsize = MIN(sgsize, max_sgsize);
curaddr = add_bounce_page(dmat, map, kvaddr, curaddr,
sgsize);
- } else if ((dmat->bounce_flags & BF_COHERENT) == 0) {
+ } else if ((map->flags & DMAMAP_COHERENT) == 0) {
sgsize = MIN(sgsize, max_sgsize);
if (map->sync_count > 0) {
sl_pend = sl->paddr + sl->datacount;
@@ -1042,7 +1055,7 @@
(void *)bpage->vaddr, bpage->datacount);
if (tempvaddr != 0)
pmap_quick_remove_page(tempvaddr);
- if ((dmat->bounce_flags & BF_COHERENT) == 0)
+ if ((map->flags & DMAMAP_COHERENT) == 0)
cpu_dcache_wb_range(bpage->vaddr,
bpage->datacount);
bpage = STAILQ_NEXT(bpage, links);
@@ -1050,7 +1063,7 @@
dmat->bounce_zone->total_bounced++;
} else if ((op & BUS_DMASYNC_PREREAD) != 0) {
while (bpage != NULL) {
- if ((dmat->bounce_flags & BF_COHERENT) == 0)
+ if ((map->flags & DMAMAP_COHERENT) == 0)
cpu_dcache_wbinv_range(bpage->vaddr,
bpage->datacount);
bpage = STAILQ_NEXT(bpage, links);
@@ -1059,7 +1072,7 @@
if ((op & BUS_DMASYNC_POSTREAD) != 0) {
while (bpage != NULL) {
- if ((dmat->bounce_flags & BF_COHERENT) == 0)
+ if ((map->flags & DMAMAP_COHERENT) == 0)
cpu_dcache_inv_range(bpage->vaddr,
bpage->datacount);
tempvaddr = 0;

File Metadata

Mime Type
text/plain
Expires
Sat, Jul 11, 7:04 PM (2 h, 40 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
34970250
Default Alt Text
D26494.id77255.diff (2 KB)

Event Timeline