kernel - Add BUS_DMA_KEEP_PG_OFFSET (x86_64)
authorMarkus Pfeiffer <markus.pfeiffer@morphism.de>
Wed, 4 Jul 2012 13:21:25 +0000 (13:21 +0000)
committerMarkus Pfeiffer <markus.pfeiffer@morphism.de>
Wed, 4 Jul 2012 13:21:25 +0000 (13:21 +0000)
Add BUS_DMA_KEEP_PG_OFFSET from FreeBSD in preparation of import of
FreeBSD's USB stack

sys/platform/pc64/x86_64/busdma_machdep.c
sys/sys/bus_dma.h

index 6035984..2abbf07 100644 (file)
@@ -1244,6 +1244,16 @@ free_bounce_pages_all(bus_dma_tag_t dmat)
        struct bounce_zone *bz = dmat->bounce_zone;
        struct bounce_page *bpage;
 
+    if (dmat->flags & BUS_DMA_KEEP_PG_OFFSET) {
+             /*
+              * Reset the bounce page to start at offset 0.  Other uses
+              * of this bounce page may need to store a full page of
+              * data and/or assume it starts on a page boundary.
+              */
+        bpage->vaddr &= ~PAGE_MASK;
+        bpage->busaddr &= ~PAGE_MASK;
+    }
+
        BZ_LOCK(bz);
 
        while ((bpage = STAILQ_FIRST(&bz->bounce_page_list)) != NULL) {
@@ -1371,6 +1381,12 @@ add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr,
 
        BZ_UNLOCK(bz);
 
+    if (dmat->flags & BUS_DMA_KEEP_PG_OFFSET) {
+        /* Page offset needs to be preserved. */
+        bpage->vaddr |= vaddr & PAGE_MASK;
+        bpage->busaddr |= vaddr & PAGE_MASK;
+    }
+
        bpage->datavaddr = vaddr;
        bpage->datacount = size;
        STAILQ_INSERT_TAIL(&map->bpages, bpage, links);
@@ -1385,6 +1401,16 @@ free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage)
 
        bpage->datavaddr = 0;
        bpage->datacount = 0;
+       if (dmat->flags & BUS_DMA_KEEP_PG_OFFSET) {
+    /*
+     * Reset the bounce page to start at offset 0.  Other uses
+     * of this bounce page may need to store a full page of
+     * data and/or assume it starts on a page boundary.
+     */
+               bpage->vaddr &= ~PAGE_MASK;
+               bpage->busaddr &= ~PAGE_MASK;
+    }
 
        BZ_LOCK(bz);
 
index b63dbf0..2a80652 100644 (file)
@@ -97,7 +97,7 @@
 #define BUS_DMA_ALLOCALL       0x0800  /* allocate all needed resources */
 #define BUS_DMA_PROTECTED      0x1000  /* all busdma functions are already
                                         * protected */
-
+#define BUS_DMA_KEEP_PG_OFFSET 0x2000
 /* Forwards needed by prototypes below. */
 struct mbuf;
 struct uio;