svn commit: r299532 - head/sys/arm64/arm64
Andrew Turner
andrew at FreeBSD.org
Thu May 12 12:13:29 UTC 2016
Author: andrew
Date: Thu May 12 12:13:28 2016
New Revision: 299532
URL: https://svnweb.freebsd.org/changeset/base/299532
Log:
Restrict the memory barriers in bus_dmamap_sync to just the operations
where it's needed.
Obtained from: ABT Systems Ltd
Sponsored by: The FreeBSD Foundation
Modified:
head/sys/arm64/arm64/busdma_bounce.c
Modified: head/sys/arm64/arm64/busdma_bounce.c
==============================================================================
--- head/sys/arm64/arm64/busdma_bounce.c Thu May 12 12:03:27 2016 (r299531)
+++ head/sys/arm64/arm64/busdma_bounce.c Thu May 12 12:13:28 2016 (r299532)
@@ -799,12 +799,6 @@ bounce_bus_dmamap_sync(bus_dma_tag_t dma
struct bounce_page *bpage;
vm_offset_t datavaddr, tempvaddr;
- if ((bpage = STAILQ_FIRST(&map->bpages)) == NULL) {
- /* Wait for any memory access to complete */
- dsb(sy);
- return;
- }
-
/*
* XXX ARM64TODO:
* This bus_dma implementation requires IO-Coherent architecutre.
@@ -812,56 +806,63 @@ bounce_bus_dmamap_sync(bus_dma_tag_t dma
* added to this function.
*/
- CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x op 0x%x "
- "performing bounce", __func__, dmat, dmat->common.flags, op);
-
- if ((op & BUS_DMASYNC_PREWRITE) != 0) {
- while (bpage != NULL) {
- tempvaddr = 0;
- datavaddr = bpage->datavaddr;
- if (datavaddr == 0) {
- tempvaddr =
- pmap_quick_enter_page(bpage->datapage);
- datavaddr = tempvaddr | bpage->dataoffs;
- }
-
- bcopy((void *)datavaddr,
- (void *)bpage->vaddr, bpage->datacount);
- if (tempvaddr != 0)
- pmap_quick_remove_page(tempvaddr);
- bpage = STAILQ_NEXT(bpage, links);
- }
- dmat->bounce_zone->total_bounced++;
-
- /*
- * Wait for the bcopy to complete before any DMA operations.
- */
- dsb(sy);
- }
-
if ((op & BUS_DMASYNC_POSTREAD) != 0) {
/*
* Wait for any DMA operations to complete before the bcopy.
*/
dsb(sy);
+ }
- while (bpage != NULL) {
- tempvaddr = 0;
- datavaddr = bpage->datavaddr;
- if (datavaddr == 0) {
- tempvaddr =
- pmap_quick_enter_page(bpage->datapage);
- datavaddr = tempvaddr | bpage->dataoffs;
+ if ((bpage = STAILQ_FIRST(&map->bpages)) != NULL) {
+ CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x op 0x%x "
+ "performing bounce", __func__, dmat, dmat->common.flags,
+ op);
+
+ if ((op & BUS_DMASYNC_PREWRITE) != 0) {
+ while (bpage != NULL) {
+ tempvaddr = 0;
+ datavaddr = bpage->datavaddr;
+ if (datavaddr == 0) {
+ tempvaddr = pmap_quick_enter_page(
+ bpage->datapage);
+ datavaddr = tempvaddr | bpage->dataoffs;
+ }
+
+ bcopy((void *)datavaddr,
+ (void *)bpage->vaddr, bpage->datacount);
+ if (tempvaddr != 0)
+ pmap_quick_remove_page(tempvaddr);
+ bpage = STAILQ_NEXT(bpage, links);
}
+ dmat->bounce_zone->total_bounced++;
+ }
- bcopy((void *)bpage->vaddr,
- (void *)datavaddr, bpage->datacount);
-
- if (tempvaddr != 0)
- pmap_quick_remove_page(tempvaddr);
- bpage = STAILQ_NEXT(bpage, links);
+ if ((op & BUS_DMASYNC_POSTREAD) != 0) {
+ while (bpage != NULL) {
+ tempvaddr = 0;
+ datavaddr = bpage->datavaddr;
+ if (datavaddr == 0) {
+ tempvaddr = pmap_quick_enter_page(
+ bpage->datapage);
+ datavaddr = tempvaddr | bpage->dataoffs;
+ }
+
+ bcopy((void *)bpage->vaddr,
+ (void *)datavaddr, bpage->datacount);
+
+ if (tempvaddr != 0)
+ pmap_quick_remove_page(tempvaddr);
+ bpage = STAILQ_NEXT(bpage, links);
+ }
+ dmat->bounce_zone->total_bounced++;
}
- dmat->bounce_zone->total_bounced++;
+ }
+
+ if ((op & BUS_DMASYNC_PREWRITE) != 0) {
+ /*
+ * Wait for the bcopy to complete before any DMA operations.
+ */
+ dsb(sy);
}
}
More information about the svn-src-head
mailing list