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