busdma_bounce.c (191011) | busdma_bounce.c (191201) |
---|---|
1/*- 2 * Copyright (c) 1997, 1998 Justin T. Gibbs. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 11 unchanged lines hidden (view full) --- 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 */ 26 27#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 1997, 1998 Justin T. Gibbs. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 11 unchanged lines hidden (view full) --- 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 */ 26 27#include <sys/cdefs.h> |
28__FBSDID("$FreeBSD: head/sys/i386/i386/busdma_machdep.c 191011 2009-04-13 19:20:32Z kib $"); | 28__FBSDID("$FreeBSD: head/sys/i386/i386/busdma_machdep.c 191201 2009-04-17 13:22:18Z jhb $"); |
29 30#include <sys/param.h> 31#include <sys/kdb.h> 32#include <ddb/ddb.h> 33#include <ddb/db_output.h> 34#include <sys/systm.h> 35#include <sys/malloc.h> 36#include <sys/bus.h> --- 1113 unchanged lines hidden (view full) --- 1150 panic("add_bounce_page: free page list is empty"); 1151 1152 STAILQ_REMOVE_HEAD(&bz->bounce_page_list, links); 1153 bz->reserved_bpages--; 1154 bz->active_bpages++; 1155 mtx_unlock(&bounce_lock); 1156 1157 if (dmat->flags & BUS_DMA_KEEP_PG_OFFSET) { | 29 30#include <sys/param.h> 31#include <sys/kdb.h> 32#include <ddb/ddb.h> 33#include <ddb/db_output.h> 34#include <sys/systm.h> 35#include <sys/malloc.h> 36#include <sys/bus.h> --- 1113 unchanged lines hidden (view full) --- 1150 panic("add_bounce_page: free page list is empty"); 1151 1152 STAILQ_REMOVE_HEAD(&bz->bounce_page_list, links); 1153 bz->reserved_bpages--; 1154 bz->active_bpages++; 1155 mtx_unlock(&bounce_lock); 1156 1157 if (dmat->flags & BUS_DMA_KEEP_PG_OFFSET) { |
1158 /* page offset needs to be preserved */ 1159 bpage->vaddr &= ~PAGE_MASK; 1160 bpage->busaddr &= ~PAGE_MASK; | 1158 /* Page offset needs to be preserved. */ |
1161 bpage->vaddr |= vaddr & PAGE_MASK; 1162 bpage->busaddr |= vaddr & PAGE_MASK; 1163 } 1164 bpage->datavaddr = vaddr; 1165 bpage->datacount = size; 1166 STAILQ_INSERT_TAIL(&(map->bpages), bpage, links); 1167 return (bpage->busaddr); 1168} 1169 1170static void 1171free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage) 1172{ 1173 struct bus_dmamap *map; 1174 struct bounce_zone *bz; 1175 1176 bz = dmat->bounce_zone; 1177 bpage->datavaddr = 0; 1178 bpage->datacount = 0; | 1159 bpage->vaddr |= vaddr & PAGE_MASK; 1160 bpage->busaddr |= vaddr & PAGE_MASK; 1161 } 1162 bpage->datavaddr = vaddr; 1163 bpage->datacount = size; 1164 STAILQ_INSERT_TAIL(&(map->bpages), bpage, links); 1165 return (bpage->busaddr); 1166} 1167 1168static void 1169free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage) 1170{ 1171 struct bus_dmamap *map; 1172 struct bounce_zone *bz; 1173 1174 bz = dmat->bounce_zone; 1175 bpage->datavaddr = 0; 1176 bpage->datacount = 0; |
1177 if (dmat->flags & BUS_DMA_KEEP_PG_OFFSET) { 1178 /* 1179 * Reset the bounce page to start at offset 0. Other uses 1180 * of this bounce page may need to store a full page of 1181 * data and/or assume it starts on a page boundary. 1182 */ 1183 bpage->vaddr &= ~PAGE_MASK; 1184 bpage->busaddr &= ~PAGE_MASK; 1185 } |
|
1179 1180 mtx_lock(&bounce_lock); 1181 STAILQ_INSERT_HEAD(&bz->bounce_page_list, bpage, links); 1182 bz->free_bpages++; 1183 bz->active_bpages--; 1184 if ((map = STAILQ_FIRST(&bounce_map_waitinglist)) != NULL) { 1185 if (reserve_bounce_pages(map->dmat, map, 1) == 0) { 1186 STAILQ_REMOVE_HEAD(&bounce_map_waitinglist, links); --- 29 unchanged lines hidden --- | 1186 1187 mtx_lock(&bounce_lock); 1188 STAILQ_INSERT_HEAD(&bz->bounce_page_list, bpage, links); 1189 bz->free_bpages++; 1190 bz->active_bpages--; 1191 if ((map = STAILQ_FIRST(&bounce_map_waitinglist)) != NULL) { 1192 if (reserve_bounce_pages(map->dmat, map, 1) == 0) { 1193 STAILQ_REMOVE_HEAD(&bounce_map_waitinglist, links); --- 29 unchanged lines hidden --- |