From 66fe5a06bc2465a3e7a438786ae72ad64af96673 Mon Sep 17 00:00:00 2001 From: Markus Pfeiffer Date: Wed, 4 Jul 2012 13:21:25 +0000 Subject: [PATCH] kernel - Add BUS_DMA_KEEP_PG_OFFSET (x86_64) 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 | 26 +++++++++++++++++++++++ sys/sys/bus_dma.h | 2 +- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/sys/platform/pc64/x86_64/busdma_machdep.c b/sys/platform/pc64/x86_64/busdma_machdep.c index 6035984f15..2abbf07523 100644 --- a/sys/platform/pc64/x86_64/busdma_machdep.c +++ b/sys/platform/pc64/x86_64/busdma_machdep.c @@ -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); diff --git a/sys/sys/bus_dma.h b/sys/sys/bus_dma.h index b63dbf0d5b..2a806528ac 100644 --- a/sys/sys/bus_dma.h +++ b/sys/sys/bus_dma.h @@ -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; -- 2.41.0