From: Markus Pfeiffer Date: Wed, 4 Jul 2012 13:31:38 +0000 (+0000) Subject: kernel - Add BUS_DMA_KEEP_PG_OFFSET (i386) X-Git-Tag: v3.2.0~692 X-Git-Url: http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff_plain/be46f3bf23325bf9536c44699d5423134d88c844 kernel - Add BUS_DMA_KEEP_PG_OFFSET (i386) Add BUS_DMA_KEEP_PG_OFFSET from FreeBSD in preparation of import of FreeBSD's USB stack --- diff --git a/sys/platform/pc32/i386/busdma_machdep.c b/sys/platform/pc32/i386/busdma_machdep.c index b6e7a8a..a8cff4e 100644 --- a/sys/platform/pc32/i386/busdma_machdep.c +++ b/sys/platform/pc32/i386/busdma_machdep.c @@ -1371,6 +1371,11 @@ 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); @@ -1386,6 +1391,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); STAILQ_INSERT_HEAD(&bz->bounce_page_list, bpage, links);