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

Reply via email to