[BACK]Return to vsbus_dma.c CVS log [TXT][DIR] Up to [local] / sys / arch / vax / vsa

Annotation of sys/arch/vax/vsa/vsbus_dma.c, Revision 1.1.1.1

1.1       nbrk        1: /* $OpenBSD: vsbus_dma.c,v 1.4 2003/11/10 21:05:06 miod Exp $ */
                      2: /* $NetBSD: vsbus_dma.c,v 1.7 2000/07/26 21:50:49 matt Exp $ */
                      3:
                      4: /*-
                      5:  * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
                      6:  * All rights reserved.
                      7:  *
                      8:  * This code is derived from software contributed to The NetBSD Foundation
                      9:  * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
                     10:  * NASA Ames Research Center.
                     11:  *
                     12:  * Redistribution and use in source and binary forms, with or without
                     13:  * modification, are permitted provided that the following conditions
                     14:  * are met:
                     15:  * 1. Redistributions of source code must retain the above copyright
                     16:  *    notice, this list of conditions and the following disclaimer.
                     17:  * 2. Redistributions in binary form must reproduce the above copyright
                     18:  *    notice, this list of conditions and the following disclaimer in the
                     19:  *    documentation and/or other materials provided with the distribution.
                     20:  * 3. All advertising materials mentioning features or use of this software
                     21:  *    must display the following acknowledgement:
                     22:  *     This product includes software developed by the NetBSD
                     23:  *     Foundation, Inc. and its contributors.
                     24:  * 4. Neither the name of The NetBSD Foundation nor the names of its
                     25:  *    contributors may be used to endorse or promote products derived
                     26:  *    from this software without specific prior written permission.
                     27:  *
                     28:  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
                     29:  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
                     30:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
                     31:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
                     32:  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
                     33:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
                     34:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
                     35:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
                     36:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
                     37:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     38:  * POSSIBILITY OF SUCH DAMAGE.
                     39:  */
                     40:
                     41:
                     42: #include <sys/param.h>
                     43: #include <sys/systm.h>
                     44: #include <sys/kernel.h>
                     45: #include <sys/device.h>
                     46: #include <sys/malloc.h>
                     47:
                     48: #include <uvm/uvm_extern.h>
                     49:
                     50: #define _VAX_BUS_DMA_PRIVATE
                     51: #include <machine/bus.h>
                     52: #include <machine/cpu.h>
                     53: #include <machine/sid.h>
                     54: #include <machine/sgmap.h>
                     55: #include <machine/vsbus.h>
                     56:
                     57: static int vsbus_bus_dmamap_create_sgmap(bus_dma_tag_t, bus_size_t, int,
                     58:            bus_size_t, bus_size_t, int, bus_dmamap_t *);
                     59:
                     60: static void vsbus_bus_dmamap_destroy_sgmap(bus_dma_tag_t, bus_dmamap_t);
                     61:
                     62: static int vsbus_bus_dmamap_load_sgmap(bus_dma_tag_t, bus_dmamap_t, void *,
                     63:            bus_size_t, struct proc *, int);
                     64:
                     65: static int vsbus_bus_dmamap_load_mbuf_sgmap(bus_dma_tag_t, bus_dmamap_t,
                     66:            struct mbuf *, int);
                     67:
                     68: static int vsbus_bus_dmamap_load_uio_sgmap(bus_dma_tag_t, bus_dmamap_t,
                     69:            struct uio *, int);
                     70:
                     71: static int vsbus_bus_dmamap_load_raw_sgmap(bus_dma_tag_t, bus_dmamap_t,
                     72:            bus_dma_segment_t *, int, bus_size_t, int);
                     73:
                     74: static void vsbus_bus_dmamap_unload_sgmap(bus_dma_tag_t, bus_dmamap_t);
                     75:
                     76: static void vsbus_bus_dmamap_sync(bus_dma_tag_t, bus_dmamap_t, bus_addr_t,
                     77:            bus_size_t, int);
                     78:
                     79: void
                     80: vsbus_dma_init(sc, ptecnt)
                     81:        struct vsbus_softc *sc;
                     82:        unsigned ptecnt;
                     83: {
                     84:        bus_dma_tag_t t;
                     85:        bus_dma_segment_t segs[1];
                     86:        pt_entry_t *pte;
                     87:        int nsegs, error;
                     88:        unsigned mapsize = ptecnt * sizeof(pt_entry_t);
                     89:
                     90:        /*
                     91:         * Initialize the DMA tag used for sgmap-mapped DMA.
                     92:         */
                     93:        t = &sc->sc_dmatag;
                     94:        t->_cookie = sc;
                     95:        t->_wbase = 0;
                     96:        t->_wsize = ptecnt * VAX_NBPG;
                     97:        t->_boundary = 0;
                     98:        t->_sgmap = &sc->sc_sgmap;
                     99:        t->_dmamap_create = vsbus_bus_dmamap_create_sgmap;
                    100:        t->_dmamap_destroy = vsbus_bus_dmamap_destroy_sgmap;
                    101:        t->_dmamap_load = vsbus_bus_dmamap_load_sgmap;
                    102:        t->_dmamap_load_mbuf = vsbus_bus_dmamap_load_mbuf_sgmap;
                    103:        t->_dmamap_load_uio = vsbus_bus_dmamap_load_uio_sgmap;
                    104:        t->_dmamap_load_raw = vsbus_bus_dmamap_load_raw_sgmap;
                    105:        t->_dmamap_unload = vsbus_bus_dmamap_unload_sgmap;
                    106:        t->_dmamap_sync = vsbus_bus_dmamap_sync;
                    107:
                    108:        t->_dmamem_alloc = _bus_dmamem_alloc;
                    109:        t->_dmamem_free = _bus_dmamem_free;
                    110:        t->_dmamem_map = _bus_dmamem_map;
                    111:        t->_dmamem_unmap = _bus_dmamem_unmap;
                    112:        t->_dmamem_mmap = _bus_dmamem_mmap;
                    113:
                    114:        if (vax_boardtype == VAX_BTYP_46 || vax_boardtype == VAX_BTYP_48) {
                    115:                /*
                    116:                 * Allocate and map the VS4000 scatter gather map.
                    117:                 */
                    118:                error = bus_dmamem_alloc(t, mapsize, mapsize, mapsize,
                    119:                    segs, 1, &nsegs, BUS_DMA_NOWAIT);
                    120:                if (error) {
                    121:                        panic("vsbus_dma_init: error allocating memory for "
                    122:                            "hw sgmap: error=%d", error);
                    123:                }
                    124:
                    125:                error = bus_dmamem_map(t, segs, nsegs, mapsize,
                    126:                   (caddr_t *) &pte, BUS_DMA_NOWAIT|BUS_DMA_COHERENT);
                    127:                if (error) {
                    128:                        panic("vsbus_dma_init: error mapping memory for "
                    129:                            "hw sgmap: error=%d", error);
                    130:                }
                    131:                memset(pte, 0, mapsize);
                    132:                *(int *) (sc->sc_vsregs + 8) = segs->ds_addr;   /* set MAP BASE 0x2008008 */
                    133:        } else {
                    134:                pte = (pt_entry_t *) vax_map_physmem(KA49_SCSIMAP, mapsize / VAX_NBPG);
                    135:                for (nsegs = ptecnt; nsegs > 0; ) {
                    136:                        ((u_int32_t *) pte)[--nsegs] = 0;
                    137:                }
                    138:                segs->ds_addr = KA49_SCSIMAP;
                    139:        }
                    140:        printf("%s: %uK entry DMA SGMAP at PA 0x%lx (VA %p)\n",
                    141:                sc->sc_dev.dv_xname, ptecnt / 1024, segs->ds_addr, pte);
                    142:
                    143:        /*
                    144:         * Initialize the SGMAP.
                    145:         */
                    146:        vax_sgmap_init(t, &sc->sc_sgmap, "vsbus_sgmap", t->_wbase, t->_wsize, pte, 0);
                    147:
                    148: }
                    149:
                    150: /*
                    151:  * Create a VSBUS SGMAP-mapped DMA map.
                    152:  */
                    153: int
                    154: vsbus_bus_dmamap_create_sgmap(t, size, nsegments, maxsegsz, boundary,
                    155:     flags, dmamp)
                    156:        bus_dma_tag_t t;
                    157:        bus_size_t size;
                    158:        int nsegments;
                    159:        bus_size_t maxsegsz;
                    160:        bus_size_t boundary;
                    161:        int flags;
                    162:        bus_dmamap_t *dmamp;
                    163: {
                    164:        bus_dmamap_t map;
                    165:        int error;
                    166:
                    167:        error = _bus_dmamap_create(t, size, nsegments, maxsegsz,
                    168:            boundary, flags, dmamp);
                    169:        if (error)
                    170:                return (error);
                    171:
                    172:        map = *dmamp;
                    173:
                    174:        if (flags & BUS_DMA_ALLOCNOW) {
                    175:                error = vax_sgmap_alloc(map, vax_round_page(size),
                    176:                    t->_sgmap, flags);
                    177:                if (error)
                    178:                        vsbus_bus_dmamap_destroy_sgmap(t, map);
                    179:        }
                    180:
                    181:        return (error);
                    182: }
                    183:
                    184: /*
                    185:  * Destroy a VSBUS SGMAP-mapped DMA map.
                    186:  */
                    187: static void
                    188: vsbus_bus_dmamap_destroy_sgmap(t, map)
                    189:        bus_dma_tag_t t;
                    190:        bus_dmamap_t map;
                    191: {
                    192:
                    193:        if (map->_dm_flags & DMAMAP_HAS_SGMAP)
                    194:                vax_sgmap_free(map, t->_sgmap);
                    195:
                    196:        _bus_dmamap_destroy(t, map);
                    197: }
                    198:
                    199: /*
                    200:  * Load a VSBUS SGMAP-mapped DMA map with a linear buffer.
                    201:  */
                    202: static int
                    203: vsbus_bus_dmamap_load_sgmap(t, map, buf, buflen, p, flags)
                    204:        bus_dma_tag_t t;
                    205:        bus_dmamap_t map;
                    206:        void *buf;
                    207:        bus_size_t buflen;
                    208:        struct proc *p;
                    209:        int flags;
                    210: {
                    211:        return vax_sgmap_load(t, map, buf, buflen, p, flags, t->_sgmap);
                    212: }
                    213:
                    214: /*
                    215:  * Load a VSBUS SGMAP-mapped DMA map with an mbuf chain.
                    216:  */
                    217: static int
                    218: vsbus_bus_dmamap_load_mbuf_sgmap(t, map, m, flags)
                    219:        bus_dma_tag_t t;
                    220:        bus_dmamap_t map;
                    221:        struct mbuf *m;
                    222:        int flags;
                    223: {
                    224:        return vax_sgmap_load_mbuf(t, map, m, flags, t->_sgmap);
                    225: }
                    226:
                    227: /*
                    228:  * Load a VSBUS SGMAP-mapped DMA map with a uio.
                    229:  */
                    230: static int
                    231: vsbus_bus_dmamap_load_uio_sgmap(t, map, uio, flags)
                    232:        bus_dma_tag_t t;
                    233:        bus_dmamap_t map;
                    234:        struct uio *uio;
                    235:        int flags;
                    236: {
                    237:        return vax_sgmap_load_uio(t, map, uio, flags, t->_sgmap);
                    238: }
                    239:
                    240: /*
                    241:  * Load a VSBUS SGMAP-mapped DMA map with raw memory.
                    242:  */
                    243: static int
                    244: vsbus_bus_dmamap_load_raw_sgmap(t, map, segs, nsegs, size, flags)
                    245:        bus_dma_tag_t t;
                    246:        bus_dmamap_t map;
                    247:        bus_dma_segment_t *segs;
                    248:        int nsegs;
                    249:        bus_size_t size;
                    250:        int flags;
                    251: {
                    252:        return vax_sgmap_load_raw(t, map, segs, nsegs, size, flags, t->_sgmap);
                    253: }
                    254:
                    255: /*
                    256:  * Unload a VSBUS DMA map.
                    257:  */
                    258: static void
                    259: vsbus_bus_dmamap_unload_sgmap(t, map)
                    260:        bus_dma_tag_t t;
                    261:        bus_dmamap_t map;
                    262: {
                    263:        /*
                    264:         * Invalidate any SGMAP page table entries used by this
                    265:         * mapping.
                    266:         */
                    267:        vax_sgmap_unload(t, map, t->_sgmap);
                    268:
                    269:        /*
                    270:         * Do the generic bits of the unload.
                    271:         */
                    272:        _bus_dmamap_unload(t, map);
                    273: }
                    274:
                    275: /*
                    276:  * Sync the bus map.
                    277:  */
                    278: static void
                    279: vsbus_bus_dmamap_sync(tag, dmam, offset, len, ops)
                    280:        bus_dma_tag_t tag;
                    281:        bus_dmamap_t dmam;
                    282:        bus_addr_t offset;
                    283:        bus_size_t len;
                    284:        int ops;
                    285: {
                    286:        /* not needed */
                    287: }

CVSweb