Module Name: src Committed By: skrll Date: Tue Jul 29 21:21:44 UTC 2014
Modified Files: src/sys/arch/cobalt/cobalt: bus.c mainbus.c src/sys/arch/cobalt/conf: files.cobalt src/sys/arch/cobalt/include: bus_defs.h bus_funcs.h pci_machdep.h src/sys/arch/cobalt/pci: pci_machdep.c Log Message: Convert cobalt to generic mips bus_dma. To generate a diff of this commit: cvs rdiff -u -r1.44 -r1.45 src/sys/arch/cobalt/cobalt/bus.c cvs rdiff -u -r1.18 -r1.19 src/sys/arch/cobalt/cobalt/mainbus.c cvs rdiff -u -r1.37 -r1.38 src/sys/arch/cobalt/conf/files.cobalt cvs rdiff -u -r1.1 -r1.2 src/sys/arch/cobalt/include/bus_defs.h \ src/sys/arch/cobalt/include/bus_funcs.h cvs rdiff -u -r1.13 -r1.14 src/sys/arch/cobalt/include/pci_machdep.h cvs rdiff -u -r1.35 -r1.36 src/sys/arch/cobalt/pci/pci_machdep.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/cobalt/cobalt/bus.c diff -u src/sys/arch/cobalt/cobalt/bus.c:1.44 src/sys/arch/cobalt/cobalt/bus.c:1.45 --- src/sys/arch/cobalt/cobalt/bus.c:1.44 Tue Oct 2 23:54:51 2012 +++ src/sys/arch/cobalt/cobalt/bus.c Tue Jul 29 21:21:43 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: bus.c,v 1.44 2012/10/02 23:54:51 christos Exp $ */ +/* $NetBSD: bus.c,v 1.45 2014/07/29 21:21:43 skrll Exp $ */ /* * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -31,9 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: bus.c,v 1.44 2012/10/02 23:54:51 christos Exp $"); - -#define _COBALT_BUS_DMA_PRIVATE +__KERNEL_RCSID(0, "$NetBSD: bus.c,v 1.45 2014/07/29 21:21:43 skrll Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -56,25 +54,6 @@ __KERNEL_RCSID(0, "$NetBSD: bus.c,v 1.44 #define __PB_TYPENAME_PREFIX(BITS) ___CONCAT(uint,BITS) #define __PB_TYPENAME(BITS) ___CONCAT(__PB_TYPENAME_PREFIX(BITS),_t) -static int _bus_dmamap_load_buffer(bus_dmamap_t, void *, bus_size_t, - struct vmspace *, int, vaddr_t *, int *, int); - -struct cobalt_bus_dma_tag cobalt_default_bus_dma_tag = { - _bus_dmamap_create, - _bus_dmamap_destroy, - _bus_dmamap_load, - _bus_dmamap_load_mbuf, - _bus_dmamap_load_uio, - _bus_dmamap_load_raw, - _bus_dmamap_unload, - _bus_dmamap_sync, - _bus_dmamem_alloc, - _bus_dmamem_free, - _bus_dmamem_map, - _bus_dmamem_unmap, - _bus_dmamem_mmap, -}; - /* * void bus_space_read_multi_N(bus_space_tag_t tag, * bus_space_handle_t bsh, bus_size_t offset, @@ -418,562 +397,3 @@ bus_space_mmap(bus_space_tag_t t, bus_ad /* XXX not implemented */ return -1; } - -/* - * Common function for DMA map creation. May be called by bus-specific - * DMA map creation functions. - */ -int -_bus_dmamap_create(bus_dma_tag_t t, bus_size_t size, int nsegments, - bus_size_t maxsegsz, bus_size_t boundary, int flags, bus_dmamap_t *dmamp) -{ - struct cobalt_bus_dmamap *map; - void *mapstore; - size_t mapsize; - - /* - * Allocate and initialize the DMA map. The end of the map - * is a variable-sized array of segments, so we allocate enough - * room for them in one shot. - * - * Note we don't preserve the WAITOK or NOWAIT flags. Preservation - * of ALLOCNOW notifies others that we've reserved these resources, - * and they are not to be freed. - * - * The bus_dmamap_t includes one bus_dma_segment_t, hence - * the (nsegments - 1). - */ - mapsize = sizeof(struct cobalt_bus_dmamap) + - (sizeof(bus_dma_segment_t) * (nsegments - 1)); - if ((mapstore = malloc(mapsize, M_DMAMAP, - (flags & BUS_DMA_NOWAIT) ? M_NOWAIT : M_WAITOK)) == NULL) - return ENOMEM; - - memset(mapstore, 0, mapsize); - map = (struct cobalt_bus_dmamap *)mapstore; - map->_dm_size = size; - map->_dm_segcnt = nsegments; - map->_dm_maxmaxsegsz = maxsegsz; - map->_dm_boundary = boundary; - map->_dm_flags = flags & ~(BUS_DMA_WAITOK|BUS_DMA_NOWAIT); - map->_dm_vmspace = NULL; - map->dm_maxsegsz = maxsegsz; - map->dm_mapsize = 0; /* no valid mappings */ - map->dm_nsegs = 0; - - *dmamp = map; - return 0; -} - -/* - * Common function for DMA map destruction. May be called by bus-specific - * DMA map destruction functions. - */ -void -_bus_dmamap_destroy(bus_dma_tag_t t, bus_dmamap_t map) -{ - - free(map, M_DMAMAP); -} - -extern paddr_t kvtophys(vaddr_t); /* XXX */ - -/* - * Utility function to load a linear buffer. lastaddrp holds state - * between invocations (for multiple-buffer loads). segp contains - * the starting segment on entrance, and the ending segment on exit. - * first indicates if this is the first invocation of this function. - */ -int -_bus_dmamap_load_buffer(bus_dmamap_t map, void *buf, bus_size_t buflen, - struct vmspace *vm, int flags, vaddr_t *lastaddrp, int *segp, int first) -{ - bus_size_t sgsize; - bus_addr_t curaddr, lastaddr, baddr, bmask; - vaddr_t vaddr = (vaddr_t)buf; - paddr_t pa; - int seg; - - lastaddr = *lastaddrp; - bmask = ~(map->_dm_boundary - 1); - - for (seg = *segp; buflen > 0 ; ) { - /* - * Get the physical address for this segment. - */ - if (!VMSPACE_IS_KERNEL_P(vm)) - (void)pmap_extract(vm_map_pmap(&vm->vm_map), - vaddr, &pa); - else - pa = kvtophys(vaddr); - curaddr = pa; - - /* - * Compute the segment size, and adjust counts. - */ - sgsize = PAGE_SIZE - (vaddr & PGOFSET); - if (buflen < sgsize) - sgsize = buflen; - - /* - * Make sure we don't cross any boundaries. - */ - if (map->_dm_boundary > 0) { - baddr = (curaddr + map->_dm_boundary) & bmask; - if (sgsize > (baddr - curaddr)) - sgsize = (baddr - curaddr); - } - - /* - * Insert chunk into a segment, coalescing with - * the previous segment if possible. - */ - if (first) { - map->dm_segs[seg].ds_addr = curaddr; - map->dm_segs[seg].ds_len = sgsize; - map->dm_segs[seg]._ds_vaddr = vaddr; - first = 0; - } else { - if (curaddr == lastaddr && - (map->dm_segs[seg].ds_len + sgsize) <= - map->dm_maxsegsz && - (map->_dm_boundary == 0 || - (map->dm_segs[seg].ds_addr & bmask) == - (curaddr & bmask))) - map->dm_segs[seg].ds_len += sgsize; - else { - if (++seg >= map->_dm_segcnt) - break; - map->dm_segs[seg].ds_addr = curaddr; - map->dm_segs[seg].ds_len = sgsize; - map->dm_segs[seg]._ds_vaddr = vaddr; - } - } - - lastaddr = curaddr + sgsize; - vaddr += sgsize; - buflen -= sgsize; - } - - *segp = seg; - *lastaddrp = lastaddr; - - /* - * Did we fit? - */ - if (buflen != 0) - return EFBIG; /* XXX Better return value here? */ - - return 0; -} - -/* - * Common function for loading a direct-mapped DMA map with a linear - * buffer. - */ -int -_bus_dmamap_load(bus_dma_tag_t t, bus_dmamap_t map, void *buf, - bus_size_t buflen, struct proc *p, int flags) -{ - vaddr_t lastaddr; - int seg, error; - struct vmspace *vm; - - /* - * Make sure that on error condition we return "no valid mappings". - */ - map->dm_mapsize = 0; - map->dm_nsegs = 0; - KASSERT(map->dm_maxsegsz <= map->_dm_maxmaxsegsz); - - if (buflen > map->_dm_size) - return EINVAL; - - if (p != NULL) { - vm = p->p_vmspace; - } else { - vm = vmspace_kernel(); - } - - seg = 0; - error = _bus_dmamap_load_buffer(map, buf, buflen, - vm, flags, &lastaddr, &seg, 1); - if (error == 0) { - map->dm_mapsize = buflen; - map->dm_nsegs = seg + 1; - map->_dm_vmspace = vm; - - /* - * For linear buffers, we support marking the mapping - * as COHERENT. - * - * XXX Check TLB entries for cache-inhibit bits? - */ - if (buf >= (void *)MIPS_KSEG1_START && - buf < (void *)MIPS_KSEG2_START) - map->_dm_flags |= COBALT_DMAMAP_COHERENT; - } - return error; -} - -/* - * Like _bus_dmamap_load(), but for mbufs. - */ -int -_bus_dmamap_load_mbuf(bus_dma_tag_t t, bus_dmamap_t map, struct mbuf *m0, - int flags) -{ - vaddr_t lastaddr; - int seg, error, first; - struct mbuf *m; - - /* - * Make sure that on error condition we return "no valid mappings." - */ - map->dm_mapsize = 0; - map->dm_nsegs = 0; - KASSERT(map->dm_maxsegsz <= map->_dm_maxmaxsegsz); - -#ifdef DIAGNOSTIC - if ((m0->m_flags & M_PKTHDR) == 0) - panic("_bus_dmamap_load_mbuf: no packet header"); -#endif - - if (m0->m_pkthdr.len > map->_dm_size) - return EINVAL; - - first = 1; - seg = 0; - error = 0; - for (m = m0; m != NULL && error == 0; m = m->m_next) { - if (m->m_len == 0) - continue; - error = _bus_dmamap_load_buffer(map, m->m_data, m->m_len, - vmspace_kernel(), flags, &lastaddr, &seg, first); - first = 0; - } - if (error == 0) { - map->dm_mapsize = m0->m_pkthdr.len; - map->dm_nsegs = seg + 1; - map->_dm_vmspace = vmspace_kernel(); /* always kernel */ - } - return error; -} - -/* - * Like _bus_dmamap_load(), but for uios. - */ -int -_bus_dmamap_load_uio(bus_dma_tag_t t, bus_dmamap_t map, struct uio *uio, - int flags) -{ - vaddr_t lastaddr; - int seg, i, error, first; - bus_size_t minlen, resid; - struct iovec *iov; - void *addr; - - /* - * Make sure that on error condition we return "no valid mappings." - */ - map->dm_mapsize = 0; - map->dm_nsegs = 0; - KASSERT(map->dm_maxsegsz <= map->_dm_maxmaxsegsz); - - resid = uio->uio_resid; - iov = uio->uio_iov; - - first = 1; - seg = 0; - error = 0; - for (i = 0; i < uio->uio_iovcnt && resid != 0 && error == 0; i++) { - /* - * Now at the first iovec to load. Load each iovec - * until we have exhausted the residual count. - */ - minlen = resid < iov[i].iov_len ? resid : iov[i].iov_len; - addr = (void *)iov[i].iov_base; - - error = _bus_dmamap_load_buffer(map, addr, minlen, - uio->uio_vmspace, flags, &lastaddr, &seg, first); - first = 0; - - resid -= minlen; - } - if (error == 0) { - map->dm_mapsize = uio->uio_resid; - map->dm_nsegs = seg + 1; - map->_dm_vmspace = uio->uio_vmspace; - } - return error; -} - -/* - * Like _bus_dmamap_load(), but for raw memory. - */ -int -_bus_dmamap_load_raw(bus_dma_tag_t t, bus_dmamap_t map, bus_dma_segment_t *segs, - int nsegs, bus_size_t size, int flags) -{ - - panic("_bus_dmamap_load_raw: not implemented"); -} - -/* - * Common function for unloading a DMA map. May be called by - * chipset-specific DMA map unload functions. - */ -void -_bus_dmamap_unload(bus_dma_tag_t t, bus_dmamap_t map) -{ - - /* - * No resources to free; just mark the mappings as - * invalid. - */ - map->dm_maxsegsz = map->_dm_maxmaxsegsz; - map->dm_mapsize = 0; - map->dm_nsegs = 0; - map->_dm_flags &= ~COBALT_DMAMAP_COHERENT; - map->_dm_vmspace = NULL; -} - -/* - * Common function for DMA map synchronization. May be called - * by chipset-specific DMA map synchronization functions. - * - * This version works with the virtually-indexed write-back - * cache found on Cobalt systems. - */ -void -_bus_dmamap_sync(bus_dma_tag_t t, bus_dmamap_t map, bus_addr_t offset, - bus_size_t len, int ops) -{ - bus_size_t minlen; - vaddr_t vaddr, start, end, preboundary, firstboundary, lastboundary; - int i, useindex; - - /* - * Mixing PRE and POST operations is not allowed. - */ - if ((ops & (BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE)) != 0 && - (ops & (BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE)) != 0) - panic("_bus_dmamap_sync: mix PRE and POST"); - -#ifdef DIAGNOSTIC - if (offset >= map->dm_mapsize) - panic("_bus_dmamap_sync: bad offset %lu (map size is %lu)", - offset, map->dm_mapsize); - if (len == 0 || (offset + len) > map->dm_mapsize) - panic("_bus_dmamap_sync: bad length"); -#endif - - /* - * The RM52xx cache is virtually-indexed, write-back. This means - * we need to do the following things: - * - * PREREAD -- Invalidate D-cache. Note we might have - * to also write-back here if we have to use an Index - * op, or if the buffer start/end is not cache-line aligned. - * - * PREWRITE -- Write-back the D-cache. If we have to use - * an Index op, we also have to invalidate. Note that if - * we are doing PREREAD|PREWRITE, we can collapse everything - * into a single op. - * - * POSTREAD -- Nothing. - * - * POSTWRITE -- Nothing. - */ - - /* - * Flush the write buffer. - * XXX Is this always necessary? - */ - wbflush(); - - ops &= (BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); - if (ops == 0) - return; - - /* - * If the mapping is of COHERENT DMA-safe memory, no cache - * flush is necessary. - */ - if (map->_dm_flags & COBALT_DMAMAP_COHERENT) - return; - - /* - * If the mapping belongs to the kernel, or if it belongs - * to the currently-running process (XXX actually, vmspace), - * then we can use Hit ops. Otherwise, Index ops. - * - * This should be true the vast majority of the time. - */ - if (__predict_true(VMSPACE_IS_KERNEL_P(map->_dm_vmspace) || - map->_dm_vmspace == curproc->p_vmspace)) - useindex = 0; - else - useindex = 1; - - for (i = 0; i < map->dm_nsegs && len != 0; i++) { - /* Find the beginning segment. */ - if (offset >= map->dm_segs[i].ds_len) { - offset -= map->dm_segs[i].ds_len; - continue; - } - - /* - * Now at the first segment to sync; nail - * each segment until we have exhausted the - * length. - */ - minlen = len < map->dm_segs[i].ds_len - offset ? - len : map->dm_segs[i].ds_len - offset; - - vaddr = map->dm_segs[i]._ds_vaddr; - -#ifdef BUS_DMA_DEBUG - printf("bus_dmamap_sync: flushing segment %d " - "(0x%lx..0x%lx) ...", i, vaddr + offset, - vaddr + offset + minlen - 1); -#endif - - /* - * If we are forced to use Index ops, it's always a - * Write-back,Invalidate, so just do one test. - */ - if (__predict_false(useindex)) { - mips_dcache_wbinv_range_index(vaddr + offset, minlen); -#ifdef BUS_DMA_DEBUG - printf("\n"); -#endif - offset = 0; - len -= minlen; - continue; - } - start = vaddr + offset; - - switch (ops) { - case BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE: - mips_dcache_wbinv_range(start, minlen); - break; - - case BUS_DMASYNC_PREREAD: { - struct mips_cache_info * const mci = &mips_cache_info; - end = start + minlen; - preboundary = start & ~mci->mci_dcache_align_mask; - firstboundary = (start + mci->mci_dcache_align_mask) - & ~mci->mci_dcache_align_mask; - lastboundary = end & ~mci->mci_dcache_align_mask; - if (preboundary < start && preboundary < lastboundary) - mips_dcache_wbinv_range(preboundary, - mci->mci_dcache_align); - if (firstboundary < lastboundary) - mips_dcache_inv_range(firstboundary, - lastboundary - firstboundary); - if (lastboundary < end) - mips_dcache_wbinv_range(lastboundary, - mci->mci_dcache_align); - break; - } - - case BUS_DMASYNC_PREWRITE: - mips_dcache_wb_range(start, minlen); - break; - } -#ifdef BUS_DMA_DEBUG - printf("\n"); -#endif - offset = 0; - len -= minlen; - } -} - -/* - * Common function for DMA-safe memory allocation. May be called - * by bus-specific DMA memory allocation functions. - */ -int -_bus_dmamem_alloc(bus_dma_tag_t t, bus_size_t size, bus_size_t alignment, - bus_size_t boundary, bus_dma_segment_t *segs, int nsegs, int *rsegs, - int flags) -{ - extern paddr_t mips_avail_start, mips_avail_end; - - return (_bus_dmamem_alloc_range_common(t, size, alignment, boundary, - segs, nsegs, rsegs, flags, - mips_avail_start /*low*/, mips_avail_end - PAGE_SIZE /*high*/)); -} - -/* - * Common function for freeing DMA-safe memory. May be called by - * bus-specific DMA memory free functions. - */ -void -_bus_dmamem_free(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs) -{ - - _bus_dmamem_free_common(t, segs, nsegs); -} - -/* - * Common function for mapping DMA-safe memory. May be called by - * bus-specific DMA memory map functions. - */ -int -_bus_dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs, - size_t size, void **kvap, int flags) -{ - - /* - * If we're only mapping 1 segment, use KSEG0 or KSEG1, to avoid - * TLB thrashing. - */ - if (nsegs == 1) { - if (flags & BUS_DMA_COHERENT) - *kvap = (void *)MIPS_PHYS_TO_KSEG1(segs[0].ds_addr); - else - *kvap = (void *)MIPS_PHYS_TO_KSEG0(segs[0].ds_addr); - return 0; - } - - /* XXX BUS_DMA_COHERENT */ - return (_bus_dmamem_map_common(t, segs, nsegs, size, kvap, flags, 0)); -} - -/* - * Common function for unmapping DMA-safe memory. May be called by - * bus-specific DMA memory unmapping functions. - */ -void -_bus_dmamem_unmap(bus_dma_tag_t t, void *kva, size_t size) -{ - - /* - * Nothing to do if we mapped it with KSEG0 or KSEG1 (i.e. - * not in KSEG2). - */ - if (kva >= (void *)MIPS_KSEG0_START && - kva < (void *)MIPS_KSEG2_START) - return; - - _bus_dmamem_unmap_common(t, kva, size); -} - -/* - * Common functin for mmap(2)'ing DMA-safe memory. May be called by - * bus-specific DMA mmap(2)'ing functions. - */ -paddr_t -_bus_dmamem_mmap(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs, - off_t off, int prot, int flags) -{ - bus_addr_t rv; - - rv = _bus_dmamem_mmap_common(t, segs, nsegs, off, prot, flags); - if (rv == (bus_addr_t)-1) - return (-1); - - return (mips_btop((char *)rv)); -} Index: src/sys/arch/cobalt/cobalt/mainbus.c diff -u src/sys/arch/cobalt/cobalt/mainbus.c:1.18 src/sys/arch/cobalt/cobalt/mainbus.c:1.19 --- src/sys/arch/cobalt/cobalt/mainbus.c:1.18 Fri May 9 10:59:55 2008 +++ src/sys/arch/cobalt/cobalt/mainbus.c Tue Jul 29 21:21:43 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: mainbus.c,v 1.18 2008/05/09 10:59:55 tsutsui Exp $ */ +/* $NetBSD: mainbus.c,v 1.19 2014/07/29 21:21:43 skrll Exp $ */ /* * Copyright (c) 2000 Soren S. Jorvang. All rights reserved. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.18 2008/05/09 10:59:55 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.19 2014/07/29 21:21:43 skrll Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -90,7 +90,7 @@ mainbus_print(void *aux, const char *pnp return QUIET; if (ma->ma_addr != MAINBUSCF_ADDR_DEFAULT) - aprint_normal(" addr 0x%lx", ma->ma_addr); + aprint_normal(" addr 0x%"PRIxBUSADDR, ma->ma_addr); if (ma->ma_level != MAINBUSCF_LEVEL_DEFAULT) aprint_normal(" level %d", ma->ma_level); if (ma->ma_irq != MAINBUSCF_IRQ_DEFAULT) Index: src/sys/arch/cobalt/conf/files.cobalt diff -u src/sys/arch/cobalt/conf/files.cobalt:1.37 src/sys/arch/cobalt/conf/files.cobalt:1.38 --- src/sys/arch/cobalt/conf/files.cobalt:1.37 Sun Jul 20 10:22:54 2014 +++ src/sys/arch/cobalt/conf/files.cobalt Tue Jul 29 21:21:44 2014 @@ -1,4 +1,4 @@ -# $NetBSD: files.cobalt,v 1.37 2014/07/20 10:22:54 alnsn Exp $ +# $NetBSD: files.cobalt,v 1.38 2014/07/29 21:21:44 skrll Exp $ maxpartitions 16 @@ -46,6 +46,8 @@ file arch/cobalt/cobalt/disksubr.c file arch/cobalt/cobalt/interrupt.c file arch/cobalt/cobalt/machdep.c +file arch/mips/mips/bus_dma.c + file dev/bus_dma/bus_dmamem_common.c file dev/md_root.c memory_disk_hooks Index: src/sys/arch/cobalt/include/bus_defs.h diff -u src/sys/arch/cobalt/include/bus_defs.h:1.1 src/sys/arch/cobalt/include/bus_defs.h:1.2 --- src/sys/arch/cobalt/include/bus_defs.h:1.1 Fri Jul 1 17:09:59 2011 +++ src/sys/arch/cobalt/include/bus_defs.h Tue Jul 29 21:21:44 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: bus_defs.h,v 1.1 2011/07/01 17:09:59 dyoung Exp $ */ +/* $NetBSD: bus_defs.h,v 1.2 2014/07/29 21:21:44 skrll Exp $ */ /* * Copyright (c) 1996, 1997, 1998, 2001 The NetBSD Foundation, Inc. @@ -36,8 +36,10 @@ /* * Bus address and size types */ -typedef u_long bus_addr_t; -typedef u_long bus_size_t; +typedef paddr_t bus_addr_t; +typedef psize_t bus_size_t; +#define PRIxBUSADDR PRIxPADDR +#define PRIxBUSSIZE PRIxPSIZE #include <mips/locore.h> @@ -58,117 +60,7 @@ typedef u_long bus_space_handle_t; #define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t) -/* - * Flags used in various bus DMA methods. - */ -#define BUS_DMA_WAITOK 0x000 /* safe to sleep (pseudo-flag) */ -#define BUS_DMA_NOWAIT 0x001 /* not safe to sleep */ -#define BUS_DMA_ALLOCNOW 0x002 /* perform resource allocation now */ -#define BUS_DMA_COHERENT 0x004 /* hint: map memory DMA coherent */ -#define BUS_DMA_STREAMING 0x008 /* hint: sequential, unidirectional */ -#define BUS_DMA_BUS1 0x010 /* placeholders for bus functions... */ -#define BUS_DMA_BUS2 0x020 -#define BUS_DMA_BUS3 0x040 -#define BUS_DMA_BUS4 0x080 -#define BUS_DMA_READ 0x100 /* mapping is device -> memory only */ -#define BUS_DMA_WRITE 0x200 /* mapping is memory -> device only */ -#define BUS_DMA_NOCACHE 0x400 /* hint: map non-cached memory */ - -#define COBALT_DMAMAP_COHERENT 0x10000 /* no cache flush necessary on sync */ - -/* Forwards needed by prototypes below. */ -struct mbuf; -struct uio; - -/* - * Operations performed by bus_dmamap_sync(). - */ -#define BUS_DMASYNC_PREREAD 0x01 /* pre-read synchronization */ -#define BUS_DMASYNC_POSTREAD 0x02 /* post-read synchronization */ -#define BUS_DMASYNC_PREWRITE 0x04 /* pre-write synchronization */ -#define BUS_DMASYNC_POSTWRITE 0x08 /* post-write synchronization */ - -typedef struct cobalt_bus_dma_tag *bus_dma_tag_t; -typedef struct cobalt_bus_dmamap *bus_dmamap_t; - -#define BUS_DMA_TAG_VALID(t) ((t) != (bus_dma_tag_t)0) - -/* - * bus_dma_segment_t - * - * Describes a single contiguous DMA transaction. Values - * are suitable for programming into DMA registers. - */ -struct cobalt_bus_dma_segment { - bus_addr_t ds_addr; /* DMA address */ - bus_size_t ds_len; /* length of transfer */ - vaddr_t _ds_vaddr; /* virtual address, 0 if invalid */ -}; -typedef struct cobalt_bus_dma_segment bus_dma_segment_t; - -/* - * bus_dma_tag_t - * - * A machine-dependent opaque type describing the implementation of - * DMA for a given bus. - */ - -struct cobalt_bus_dma_tag { - /* - * DMA mapping methods. - */ - int (*_dmamap_create)(bus_dma_tag_t, bus_size_t, int, - bus_size_t, bus_size_t, int, bus_dmamap_t *); - void (*_dmamap_destroy)(bus_dma_tag_t, bus_dmamap_t); - int (*_dmamap_load)(bus_dma_tag_t, bus_dmamap_t, void *, - bus_size_t, struct proc *, int); - int (*_dmamap_load_mbuf)(bus_dma_tag_t, bus_dmamap_t, - struct mbuf *, int); - int (*_dmamap_load_uio)(bus_dma_tag_t, bus_dmamap_t, - struct uio *, int); - int (*_dmamap_load_raw)(bus_dma_tag_t, bus_dmamap_t, - bus_dma_segment_t *, int, bus_size_t, int); - void (*_dmamap_unload)(bus_dma_tag_t, bus_dmamap_t); - void (*_dmamap_sync)(bus_dma_tag_t, bus_dmamap_t, - bus_addr_t, bus_size_t, int); - - /* - * DMA memory utility functions. - */ - int (*_dmamem_alloc)(bus_dma_tag_t, bus_size_t, bus_size_t, - bus_size_t, bus_dma_segment_t *, int, int *, int); - void (*_dmamem_free)(bus_dma_tag_t, - bus_dma_segment_t *, int); - int (*_dmamem_map)(bus_dma_tag_t, bus_dma_segment_t *, - int, size_t, void **, int); - void (*_dmamem_unmap)(bus_dma_tag_t, void *, size_t); - paddr_t (*_dmamem_mmap)(bus_dma_tag_t, bus_dma_segment_t *, - int, off_t, int, int); -}; - -/* - * bus_dmamap_t - * - * Describes a DMA mapping. - */ -struct cobalt_bus_dmamap { - /* - * PRIVATE MEMBERS: not for use my machine-independent code. - */ - bus_size_t _dm_size; /* largest DMA transfer mappable */ - int _dm_segcnt; /* number of segs this map can map */ - bus_size_t _dm_maxmaxsegsz; /* fixed largest possible segment */ - bus_size_t _dm_boundary; /* don't cross this */ - int _dm_flags; /* misc. flags */ - struct vmspace *_dm_vmspace; /* vmspace that owns this mapping */ - - /* - * PUBLIC MEMBERS: these are used by machine-independent code. - */ - bus_size_t dm_maxsegsz; /* largest possible segment */ - bus_size_t dm_mapsize; /* size of the mapping */ - int dm_nsegs; /* # valid segments in mapping */ - bus_dma_segment_t dm_segs[1]; /* segments; variable length */ -}; +#define _MIPS_NEED_BUS_DMA_BOUNCE +#include <mips/bus_dma_defs.h> #endif /* _COBALT_BUS_DEFS_H_ */ Index: src/sys/arch/cobalt/include/bus_funcs.h diff -u src/sys/arch/cobalt/include/bus_funcs.h:1.1 src/sys/arch/cobalt/include/bus_funcs.h:1.2 --- src/sys/arch/cobalt/include/bus_funcs.h:1.1 Fri Jul 1 17:09:59 2011 +++ src/sys/arch/cobalt/include/bus_funcs.h Tue Jul 29 21:21:44 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: bus_funcs.h,v 1.1 2011/07/01 17:09:59 dyoung Exp $ */ +/* $NetBSD: bus_funcs.h,v 1.2 2014/07/29 21:21:44 skrll Exp $ */ /* * Copyright (c) 1996, 1997, 1998, 2001 The NetBSD Foundation, Inc. @@ -167,75 +167,6 @@ do { \ ((void)((void)(t), (void)(h), (void)(o), (void)(l), (void)(f), \ wbflush())) -/* Forwards needed by prototypes below. */ -struct mbuf; -struct uio; - -#define bus_dmamap_create(t, s, n, m, b, f, p) \ - (*(t)->_dmamap_create)((t), (s), (n), (m), (b), (f), (p)) -#define bus_dmamap_destroy(t, p) \ - (*(t)->_dmamap_destroy)((t), (p)) -#define bus_dmamap_load(t, m, b, s, p, f) \ - (*(t)->_dmamap_load)((t), (m), (b), (s), (p), (f)) -#define bus_dmamap_load_mbuf(t, m, b, f) \ - (*(t)->_dmamap_load_mbuf)((t), (m), (b), (f)) -#define bus_dmamap_load_uio(t, m, u, f) \ - (*(t)->_dmamap_load_uio)((t), (m), (u), (f)) -#define bus_dmamap_load_raw(t, m, sg, n, s, f) \ - (*(t)->_dmamap_load_raw)((t), (m), (sg), (n), (s), (f)) -#define bus_dmamap_unload(t, p) \ - (*(t)->_dmamap_unload)((t), (p)) -#define bus_dmamap_sync(t, p, o, l, ops) \ - (*(t)->_dmamap_sync)((t), (p), (o), (l), (ops)) - -#define bus_dmamem_alloc(t, s, a, b, sg, n, r, f) \ - (*(t)->_dmamem_alloc)((t), (s), (a), (b), (sg), (n), (r), (f)) -#define bus_dmamem_free(t, sg, n) \ - (*(t)->_dmamem_free)((t), (sg), (n)) -#define bus_dmamem_map(t, sg, n, s, k, f) \ - (*(t)->_dmamem_map)((t), (sg), (n), (s), (k), (f)) -#define bus_dmamem_unmap(t, k, s) \ - (*(t)->_dmamem_unmap)((t), (k), (s)) -#define bus_dmamem_mmap(t, sg, n, o, p, f) \ - (*(t)->_dmamem_mmap)((t), (sg), (n), (o), (p), (f)) - -#define bus_dmatag_subregion(t, mna, mxa, nt, f) EOPNOTSUPP -#define bus_dmatag_destroy(t) - -#ifdef _COBALT_BUS_DMA_PRIVATE -int _bus_dmamap_create(bus_dma_tag_t, bus_size_t, int, bus_size_t, - bus_size_t, int, bus_dmamap_t *); -void _bus_dmamap_destroy(bus_dma_tag_t, bus_dmamap_t); -int _bus_dmamap_load(bus_dma_tag_t, bus_dmamap_t, void *, - bus_size_t, struct proc *, int); -int _bus_dmamap_load_mbuf(bus_dma_tag_t, bus_dmamap_t, - struct mbuf *, int); -int _bus_dmamap_load_uio(bus_dma_tag_t, bus_dmamap_t, - struct uio *, int); -int _bus_dmamap_load_raw(bus_dma_tag_t, bus_dmamap_t, - bus_dma_segment_t *, int, bus_size_t, int); -void _bus_dmamap_unload(bus_dma_tag_t, bus_dmamap_t); -void _bus_dmamap_sync(bus_dma_tag_t, bus_dmamap_t, bus_addr_t, - bus_size_t, int); - -int _bus_dmamem_alloc(bus_dma_tag_t tag, bus_size_t size, - bus_size_t alignment, bus_size_t boundary, - bus_dma_segment_t *segs, int nsegs, int *rsegs, int flags); -void _bus_dmamem_free(bus_dma_tag_t tag, bus_dma_segment_t *segs, - int nsegs); -int _bus_dmamem_map(bus_dma_tag_t tag, bus_dma_segment_t *segs, - int nsegs, size_t size, void **kvap, int flags); -void _bus_dmamem_unmap(bus_dma_tag_t tag, void *kva, - size_t size); -paddr_t _bus_dmamem_mmap(bus_dma_tag_t tag, bus_dma_segment_t *segs, - int nsegs, off_t off, int prot, int flags); - -int _bus_dmamem_alloc_range(bus_dma_tag_t tag, bus_size_t size, - bus_size_t alignment, bus_size_t boundary, - bus_dma_segment_t *segs, int nsegs, int *rsegs, int flags, - vaddr_t low, vaddr_t high); - -extern struct cobalt_bus_dma_tag cobalt_default_bus_dma_tag; -#endif /* _COBALT_BUS_DMA_PRIVATE */ +#include <mips/bus_dma_funcs.h> #endif /* _COBALT_BUS_FUNCS_H_ */ Index: src/sys/arch/cobalt/include/pci_machdep.h diff -u src/sys/arch/cobalt/include/pci_machdep.h:1.13 src/sys/arch/cobalt/include/pci_machdep.h:1.14 --- src/sys/arch/cobalt/include/pci_machdep.h:1.13 Sat Mar 29 19:28:27 2014 +++ src/sys/arch/cobalt/include/pci_machdep.h Tue Jul 29 21:21:44 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: pci_machdep.h,v 1.13 2014/03/29 19:28:27 christos Exp $ */ +/* $NetBSD: pci_machdep.h,v 1.14 2014/07/29 21:21:44 skrll Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All rights reserved. @@ -46,7 +46,7 @@ struct pci_attach_args; * NOT TO BE USED DIRECTLY BY MACHINE INDEPENDENT CODE. */ -extern struct cobalt_bus_dma_tag pci_bus_dma_tag; +extern struct mips_bus_dma_tag pci_bus_dma_tag; /* * Types provided to machine-independent PCI code Index: src/sys/arch/cobalt/pci/pci_machdep.c diff -u src/sys/arch/cobalt/pci/pci_machdep.c:1.35 src/sys/arch/cobalt/pci/pci_machdep.c:1.36 --- src/sys/arch/cobalt/pci/pci_machdep.c:1.35 Sat Mar 29 19:28:27 2014 +++ src/sys/arch/cobalt/pci/pci_machdep.c Tue Jul 29 21:21:44 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: pci_machdep.c,v 1.35 2014/03/29 19:28:27 christos Exp $ */ +/* $NetBSD: pci_machdep.c,v 1.36 2014/07/29 21:21:44 skrll Exp $ */ /* * Copyright (c) 2000 Soren S. Jorvang. All rights reserved. @@ -26,9 +26,9 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pci_machdep.c,v 1.35 2014/03/29 19:28:27 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pci_machdep.c,v 1.36 2014/07/29 21:21:44 skrll Exp $"); -#define _COBALT_BUS_DMA_PRIVATE +#define _MIPS_BUS_DMA_PRIVATE #include <sys/param.h> #include <sys/bus.h> @@ -51,20 +51,10 @@ __KERNEL_RCSID(0, "$NetBSD: pci_machdep. * PCI doesn't have any special needs; just use * the generic versions of these functions. */ -struct cobalt_bus_dma_tag pci_bus_dma_tag = { - _bus_dmamap_create, - _bus_dmamap_destroy, - _bus_dmamap_load, - _bus_dmamap_load_mbuf, - _bus_dmamap_load_uio, - _bus_dmamap_load_raw, - _bus_dmamap_unload, - _bus_dmamap_sync, - _bus_dmamem_alloc, - _bus_dmamem_free, - _bus_dmamem_map, - _bus_dmamem_unmap, - _bus_dmamem_mmap, +struct mips_bus_dma_tag pci_bus_dma_tag = { + ._dmamap_ops = _BUS_DMAMAP_OPS_INITIALIZER, + ._dmamem_ops = _BUS_DMAMEM_OPS_INITIALIZER, + ._dmatag_ops = _BUS_DMATAG_OPS_INITIALIZER, }; void