busdma_machdep-v4.c (150860) | busdma_machdep-v4.c (150893) |
---|---|
1/*- 2 * Copyright (c) 2004 Olivier Houchard 3 * Copyright (c) 2002 Peter Grehan 4 * Copyright (c) 1997, 1998 Justin T. Gibbs. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions --- 15 unchanged lines hidden (view full) --- 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 * 28 * From i386/busdma_machdep.c,v 1.26 2002/04/19 22:58:09 alfred 29 */ 30 31#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2004 Olivier Houchard 3 * Copyright (c) 2002 Peter Grehan 4 * Copyright (c) 1997, 1998 Justin T. Gibbs. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions --- 15 unchanged lines hidden (view full) --- 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 * 28 * From i386/busdma_machdep.c,v 1.26 2002/04/19 22:58:09 alfred 29 */ 30 31#include <sys/cdefs.h> |
32__FBSDID("$FreeBSD: head/sys/arm/arm/busdma_machdep.c 150860 2005-10-03 14:07:57Z cognet $"); | 32__FBSDID("$FreeBSD: head/sys/arm/arm/busdma_machdep.c 150893 2005-10-03 22:44:54Z cognet $"); |
33 34/* 35 * MacPPC bus dma support routines 36 */ 37 38#define _ARM32_BUS_DMA_PRIVATE 39#include <sys/param.h> 40#include <sys/systm.h> --- 448 unchanged lines hidden (view full) --- 489 if (pte & L2_L_CACHE_MASK) { 490 map->flags &= 491 ~DMAMAP_COHERENT; 492 493 } 494 } else { 495 curaddr = (pte & L2_S_FRAME) | 496 (vaddr & L2_S_OFFSET); | 33 34/* 35 * MacPPC bus dma support routines 36 */ 37 38#define _ARM32_BUS_DMA_PRIVATE 39#include <sys/param.h> 40#include <sys/systm.h> --- 448 unchanged lines hidden (view full) --- 489 if (pte & L2_L_CACHE_MASK) { 490 map->flags &= 491 ~DMAMAP_COHERENT; 492 493 } 494 } else { 495 curaddr = (pte & L2_S_FRAME) | 496 (vaddr & L2_S_OFFSET); |
497 pmap_uncache(ptep); 498 map->flags |= DMAMAP_UNCACHED; 499#if 0 | |
500 if (pte & L2_S_CACHE_MASK) { 501 map->flags &= 502 ~DMAMAP_COHERENT; 503 } | 497 if (pte & L2_S_CACHE_MASK) { 498 map->flags &= 499 ~DMAMAP_COHERENT; 500 } |
504#endif | |
505 } 506 } 507 } else { 508 curaddr = pmap_extract(pmap, vaddr); 509 map->flags &= ~DMAMAP_COHERENT; 510 } 511 512 if (dmat->ranges) { --- 256 unchanged lines hidden (view full) --- 769 return (error); 770} 771 772/* 773 * Release the mapping held by map. 774 */ 775void 776_bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map) | 501 } 502 } 503 } else { 504 curaddr = pmap_extract(pmap, vaddr); 505 map->flags &= ~DMAMAP_COHERENT; 506 } 507 508 if (dmat->ranges) { --- 256 unchanged lines hidden (view full) --- 765 return (error); 766} 767 768/* 769 * Release the mapping held by map. 770 */ 771void 772_bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map) |
777{ 778 struct mbuf *m; 779 struct uio *uio; 780 int resid; 781 struct iovec *iov; 782 783 if (map->flags & DMAMAP_UNCACHED) { 784 switch(map->flags & DMAMAP_TYPE_MASK) { 785 case DMAMAP_LINEAR: 786 pmap_recache(map->buffer, len); 787 break; 788 case DMAMAP_MBUF: 789 m = map->buffer; 790 while (m) { 791 if (m->m_len > 0) 792 pmap_recache(m->m_data, len); 793 m = m->m_next; 794 } 795 break; 796 case DMAMAP_UIO: 797 uio = map->buffer; 798 iov = uio->uio_iov; 799 resid = uio->uio_resid; 800 for (int i = 0; i < uio->uio_iovcnt && resid != 0; i++) { 801 bus_size_t minlen = resid < iov[i].iov_len ? resid : 802 iov[i].iov_len; 803 if (minlen > 0) { 804 pmap_recache(iov[i].iov_base, minlen); 805 resid -= minlen; 806 } 807 } 808 break; 809 default: 810 break; 811 } 812 813 } | 773{ |
814 map->flags &= ~DMAMAP_TYPE_MASK; 815 return; 816} 817 818static __inline void 819bus_dmamap_sync_buf(void *buf, int len, bus_dmasync_op_t op) 820{ 821 --- 13 unchanged lines hidden (view full) --- 835{ 836 struct mbuf *m; 837 struct uio *uio; 838 int resid; 839 struct iovec *iov; 840 841 if (!(op & (BUS_DMASYNC_PREWRITE | BUS_DMASYNC_POSTREAD))) 842 return; | 774 map->flags &= ~DMAMAP_TYPE_MASK; 775 return; 776} 777 778static __inline void 779bus_dmamap_sync_buf(void *buf, int len, bus_dmasync_op_t op) 780{ 781 --- 13 unchanged lines hidden (view full) --- 795{ 796 struct mbuf *m; 797 struct uio *uio; 798 int resid; 799 struct iovec *iov; 800 801 if (!(op & (BUS_DMASYNC_PREWRITE | BUS_DMASYNC_POSTREAD))) 802 return; |
843 if (map->flags & DMAMAP_COHERENT) { 844 printf("COHERENT\n"); | 803 if (map->flags & DMAMAP_COHERENT) |
845 return; | 804 return; |
846 } | |
847 if ((op && BUS_DMASYNC_POSTREAD) && (map->len >= 2 * PAGE_SIZE)) { 848 cpu_dcache_wbinv_all(); 849 return; 850 } 851 CTR3(KTR_BUSDMA, "%s: op %x flags %x", __func__, op, map->flags); 852 switch(map->flags & DMAMAP_TYPE_MASK) { 853 case DMAMAP_LINEAR: 854 bus_dmamap_sync_buf(map->buffer, map->len, op); --- 28 unchanged lines hidden --- | 805 if ((op && BUS_DMASYNC_POSTREAD) && (map->len >= 2 * PAGE_SIZE)) { 806 cpu_dcache_wbinv_all(); 807 return; 808 } 809 CTR3(KTR_BUSDMA, "%s: op %x flags %x", __func__, op, map->flags); 810 switch(map->flags & DMAMAP_TYPE_MASK) { 811 case DMAMAP_LINEAR: 812 bus_dmamap_sync_buf(map->buffer, map->len, op); --- 28 unchanged lines hidden --- |