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

Annotation of sys/arch/vax/uba/uba_dma.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: uba_dma.c,v 1.4 2003/11/10 21:05:06 miod Exp $        */
                      2: /* $NetBSD: uba_dma.c,v 1.2 1999/06/20 00:59:55 ragge 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, SPEUBAL, 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: #include <uvm/uvm_extern.h>
                     48:
                     49: #define _VAX_BUS_DMA_PRIVATE
                     50: #include <machine/bus.h>
                     51: #include <machine/cpu.h>
                     52: #include <machine/sgmap.h>
                     53:
                     54: #include <arch/vax/qbus/ubavar.h>
                     55:
                     56: #include <arch/vax/uba/uba_common.h>
                     57:
                     58: int    uba_bus_dmamap_create_sgmap(bus_dma_tag_t, bus_size_t, int,
                     59:            bus_size_t, bus_size_t, int, bus_dmamap_t *);
                     60:
                     61: void   uba_bus_dmamap_destroy_sgmap(bus_dma_tag_t, bus_dmamap_t);
                     62:
                     63: int    uba_bus_dmamap_load_sgmap(bus_dma_tag_t, bus_dmamap_t, void *,
                     64:            bus_size_t, struct proc *, int);
                     65:
                     66: int    uba_bus_dmamap_load_mbuf_sgmap(bus_dma_tag_t, bus_dmamap_t,
                     67:            struct mbuf *, int);
                     68:
                     69: int    uba_bus_dmamap_load_uio_sgmap(bus_dma_tag_t, bus_dmamap_t,
                     70:            struct uio *, int);
                     71:
                     72: int    uba_bus_dmamap_load_raw_sgmap(bus_dma_tag_t, bus_dmamap_t,
                     73:            bus_dma_segment_t *, int, bus_size_t, int);
                     74:
                     75: void   uba_bus_dmamap_unload_sgmap(bus_dma_tag_t, bus_dmamap_t);
                     76:
                     77: void   uba_bus_dmamap_sync(bus_dma_tag_t, bus_dmamap_t, bus_addr_t,
                     78:            bus_size_t, int);
                     79:
                     80: void
                     81: uba_dma_init(sc)
                     82:        struct uba_vsoftc *sc;
                     83: {
                     84:        bus_dma_tag_t t;
                     85:        pt_entry_t *pte;
                     86:
                     87:        /*
                     88:         * Initialize the DMA tag used for sgmap-mapped DMA.
                     89:         */
                     90:        t = &sc->uv_dmat;
                     91:        t->_cookie = sc;
                     92:        t->_wbase = 0;
                     93:        t->_wsize = sc->uv_size;
                     94:        t->_boundary = 0;
                     95:        t->_sgmap = &sc->uv_sgmap;
                     96:        t->_dmamap_create = uba_bus_dmamap_create_sgmap;
                     97:        t->_dmamap_destroy = uba_bus_dmamap_destroy_sgmap;
                     98:        t->_dmamap_load = uba_bus_dmamap_load_sgmap;
                     99:        t->_dmamap_load_mbuf = uba_bus_dmamap_load_mbuf_sgmap;
                    100:        t->_dmamap_load_uio = uba_bus_dmamap_load_uio_sgmap;
                    101:        t->_dmamap_load_raw = uba_bus_dmamap_load_raw_sgmap;
                    102:        t->_dmamap_unload = uba_bus_dmamap_unload_sgmap;
                    103:        t->_dmamap_sync = uba_bus_dmamap_sync;
                    104:
                    105:        t->_dmamem_alloc = _bus_dmamem_alloc;
                    106:        t->_dmamem_free = _bus_dmamem_free;
                    107:        t->_dmamem_map = _bus_dmamem_map;
                    108:        t->_dmamem_unmap = _bus_dmamem_unmap;
                    109:        t->_dmamem_mmap = _bus_dmamem_mmap;
                    110:
                    111:        /*
                    112:         * Map in Unibus map registers.
                    113:         */
                    114:        pte = (pt_entry_t *)vax_map_physmem(sc->uv_addr, sc->uv_size/VAX_NBPG);
                    115:        if (pte == NULL)
                    116:                panic("uba_dma_init");
                    117:        /*
                    118:         * Initialize the SGMAP.
                    119:         */
                    120:        vax_sgmap_init(t, &sc->uv_sgmap, "uba_sgmap", 0, sc->uv_size, pte, 0);
                    121:
                    122: }
                    123:
                    124: /*
                    125:  * Create a UBA SGMAP-mapped DMA map.
                    126:  */
                    127: int
                    128: uba_bus_dmamap_create_sgmap(t, size, nsegments, maxsegsz, boundary,
                    129:     flags, dmamp)
                    130:        bus_dma_tag_t t;
                    131:        bus_size_t size;
                    132:        int nsegments;
                    133:        bus_size_t maxsegsz;
                    134:        bus_size_t boundary;
                    135:        int flags;
                    136:        bus_dmamap_t *dmamp;
                    137: {
                    138:        bus_dmamap_t map;
                    139:        int error;
                    140:
                    141:        error = _bus_dmamap_create(t, size, nsegments, maxsegsz,
                    142:            boundary, flags, dmamp);
                    143:        if (error)
                    144:                return (error);
                    145:
                    146:        map = *dmamp;
                    147:
                    148:        if (flags & BUS_DMA_ALLOCNOW) {
                    149:                error = vax_sgmap_alloc(map, vax_round_page(size),
                    150:                    t->_sgmap, flags);
                    151:                if (error)
                    152:                        uba_bus_dmamap_destroy_sgmap(t, map);
                    153:        }
                    154:
                    155:        return (error);
                    156: }
                    157:
                    158: /*
                    159:  * Destroy a UBA SGMAP-mapped DMA map.
                    160:  */
                    161: void
                    162: uba_bus_dmamap_destroy_sgmap(t, map)
                    163:        bus_dma_tag_t t;
                    164:        bus_dmamap_t map;
                    165: {
                    166:
                    167:        if (map->_dm_flags & DMAMAP_HAS_SGMAP)
                    168:                vax_sgmap_free(map, t->_sgmap);
                    169:
                    170:        _bus_dmamap_destroy(t, map);
                    171: }
                    172:
                    173: /*
                    174:  * Load a UBA SGMAP-mapped DMA map with a linear buffer.
                    175:  */
                    176: int
                    177: uba_bus_dmamap_load_sgmap(t, map, buf, buflen, p, flags)
                    178:        bus_dma_tag_t t;
                    179:        bus_dmamap_t map;
                    180:        void *buf;
                    181:        bus_size_t buflen;
                    182:        struct proc *p;
                    183:        int flags;
                    184: {
                    185:        int error;
                    186:
                    187:        error = vax_sgmap_load(t, map, buf, buflen, p, flags, t->_sgmap);
                    188:        /*
                    189:         * XXX - Set up BDPs.
                    190:         */
                    191:
                    192:        return (error);
                    193: }
                    194:
                    195: /*
                    196:  * Load a UBA SGMAP-mapped DMA map with an mbuf chain.
                    197:  */
                    198: int
                    199: uba_bus_dmamap_load_mbuf_sgmap(t, map, m, flags)
                    200:        bus_dma_tag_t t;
                    201:        bus_dmamap_t map;
                    202:        struct mbuf *m;
                    203:        int flags;
                    204: {
                    205:        int error;
                    206:
                    207:        error = vax_sgmap_load_mbuf(t, map, m, flags, t->_sgmap);
                    208:
                    209:        return (error);
                    210: }
                    211:
                    212: /*
                    213:  * Load a UBA SGMAP-mapped DMA map with a uio.
                    214:  */
                    215: int
                    216: uba_bus_dmamap_load_uio_sgmap(t, map, uio, flags)
                    217:        bus_dma_tag_t t;
                    218:        bus_dmamap_t map;
                    219:        struct uio *uio;
                    220:        int flags;
                    221: {
                    222:        int error;
                    223:
                    224:        error = vax_sgmap_load_uio(t, map, uio, flags, t->_sgmap);
                    225:
                    226:        return (error);
                    227: }
                    228:
                    229: /*
                    230:  * Load a UBA SGMAP-mapped DMA map with raw memory.
                    231:  */
                    232: int
                    233: uba_bus_dmamap_load_raw_sgmap(t, map, segs, nsegs, size, flags)
                    234:        bus_dma_tag_t t;
                    235:        bus_dmamap_t map;
                    236:        bus_dma_segment_t *segs;
                    237:        int nsegs;
                    238:        bus_size_t size;
                    239:        int flags;
                    240: {
                    241:        int error;
                    242:
                    243:        error = vax_sgmap_load_raw(t, map, segs, nsegs, size, flags,
                    244:            t->_sgmap);
                    245:
                    246:        return (error);
                    247: }
                    248:
                    249: /*
                    250:  * Unload a UBA DMA map.
                    251:  */
                    252: void
                    253: uba_bus_dmamap_unload_sgmap(t, map)
                    254:        bus_dma_tag_t t;
                    255:        bus_dmamap_t map;
                    256: {
                    257:
                    258:        /*
                    259:         * Invalidate any SGMAP page table entries used by this
                    260:         * mapping.
                    261:         */
                    262:        vax_sgmap_unload(t, map, t->_sgmap);
                    263:
                    264:        /*
                    265:         * Do the generic bits of the unload.
                    266:         */
                    267:        _bus_dmamap_unload(t, map);
                    268: }
                    269:
                    270: /*
                    271:  * Sync the bus map. This is only needed if BDP's are used.
                    272:  */
                    273: void
                    274: uba_bus_dmamap_sync(tag, dmam, offset, len, ops)
                    275:        bus_dma_tag_t tag;
                    276:        bus_dmamap_t dmam;
                    277:        bus_addr_t offset;
                    278:        bus_size_t len;
                    279:        int ops;
                    280: {
                    281:        /* Only BDP handling, but not yet. */
                    282: }

CVSweb