[BACK]Return to dbdma.c CVS log [TXT][DIR] Up to [local] / sys / arch / macppc / dev

Annotation of sys/arch/macppc/dev/dbdma.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: dbdma.c,v 1.8 2006/01/13 19:25:44 miod Exp $  */
                      2: /*     $NetBSD: dbdma.c,v 1.2 1998/08/21 16:13:28 tsubai Exp $ */
                      3:
                      4: /*
                      5:  * Copyright 1991-1998 by Open Software Foundation, Inc.
                      6:  *              All Rights Reserved
                      7:  *
                      8:  * Permission to use, copy, modify, and distribute this software and
                      9:  * its documentation for any purpose and without fee is hereby granted,
                     10:  * provided that the above copyright notice appears in all copies and
                     11:  * that both the copyright notice and this permission notice appear in
                     12:  * supporting documentation.
                     13:  *
                     14:  * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
                     15:  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
                     16:  * FOR A PARTICULAR PURPOSE.
                     17:  *
                     18:  * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
                     19:  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
                     20:  * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
                     21:  * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
                     22:  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
                     23:  *
                     24:  */
                     25:
                     26: #include <sys/param.h>
                     27: #include <sys/malloc.h>
                     28: #include <sys/systm.h>
                     29:
                     30: #include <uvm/uvm_extern.h>
                     31:
                     32: #include <machine/bus.h>
                     33: #include <macppc/dev/dbdma.h>
                     34:
                     35: dbdma_command_t        *dbdma_alloc_commands = NULL;
                     36:
                     37: void
                     38: dbdma_start(dbdma_regmap_t *dmap, dbdma_t dt)
                     39: {
                     40:        u_int32_t addr = dt->d_paddr;
                     41:
                     42:        DBDMA_ST4_ENDIAN(&dmap->d_intselect, DBDMA_CLEAR_CNTRL((0xffff)));
                     43:        DBDMA_ST4_ENDIAN(&dmap->d_control, DBDMA_CLEAR_CNTRL((
                     44:            DBDMA_CNTRL_ACTIVE |
                     45:            DBDMA_CNTRL_DEAD |
                     46:            DBDMA_CNTRL_WAKE |
                     47:            DBDMA_CNTRL_FLUSH |
                     48:            DBDMA_CNTRL_PAUSE |
                     49:            DBDMA_CNTRL_RUN)));
                     50:
                     51:        /* XXX time-bind it? */
                     52:        do {
                     53:                delay(10);
                     54:        } while (DBDMA_LD4_ENDIAN(&dmap->d_status) & DBDMA_CNTRL_ACTIVE);
                     55:
                     56:
                     57:        DBDMA_ST4_ENDIAN(&dmap->d_cmdptrhi, 0); /* 64-bit not yet */
                     58:        DBDMA_ST4_ENDIAN(&dmap->d_cmdptrlo, addr);
                     59:
                     60:        DBDMA_ST4_ENDIAN(&dmap->d_control,
                     61:                DBDMA_SET_CNTRL(DBDMA_CNTRL_RUN|DBDMA_CNTRL_WAKE)|
                     62:                DBDMA_CLEAR_CNTRL(DBDMA_CNTRL_PAUSE|DBDMA_CNTRL_DEAD) );
                     63: }
                     64:
                     65: void
                     66: dbdma_stop(dbdma_regmap_t *dmap)
                     67: {
                     68:        DBDMA_ST4_ENDIAN(&dmap->d_control, DBDMA_CLEAR_CNTRL(DBDMA_CNTRL_RUN) |
                     69:                          DBDMA_SET_CNTRL(DBDMA_CNTRL_FLUSH));
                     70:
                     71:        while (DBDMA_LD4_ENDIAN(&dmap->d_status) &
                     72:                (DBDMA_CNTRL_ACTIVE|DBDMA_CNTRL_FLUSH));
                     73: }
                     74:
                     75: void
                     76: dbdma_flush(dbdma_regmap_t *dmap)
                     77: {
                     78:        DBDMA_ST4_ENDIAN(&dmap->d_control, DBDMA_SET_CNTRL(DBDMA_CNTRL_FLUSH));
                     79:
                     80:        /* XXX time-bind it? */
                     81:        while (DBDMA_LD4_ENDIAN(&dmap->d_status) & (DBDMA_CNTRL_FLUSH));
                     82: }
                     83:
                     84: void
                     85: dbdma_reset(dbdma_regmap_t *dmap)
                     86: {
                     87:        DBDMA_ST4_ENDIAN(&dmap->d_control,
                     88:                         DBDMA_CLEAR_CNTRL( (DBDMA_CNTRL_ACTIVE |
                     89:                                             DBDMA_CNTRL_DEAD   |
                     90:                                             DBDMA_CNTRL_WAKE   |
                     91:                                             DBDMA_CNTRL_FLUSH  |
                     92:                                             DBDMA_CNTRL_PAUSE  |
                     93:                                             DBDMA_CNTRL_RUN      )));
                     94:
                     95:        /* XXX time-bind it? */
                     96:        while (DBDMA_LD4_ENDIAN(&dmap->d_status) & DBDMA_CNTRL_RUN);
                     97: }
                     98:
                     99: void
                    100: dbdma_continue(dbdma_regmap_t *dmap)
                    101: {
                    102:        DBDMA_ST4_ENDIAN(&dmap->d_control,
                    103:                DBDMA_SET_CNTRL(DBDMA_CNTRL_RUN | DBDMA_CNTRL_WAKE) |
                    104:                DBDMA_CLEAR_CNTRL(DBDMA_CNTRL_PAUSE | DBDMA_CNTRL_DEAD));
                    105: }
                    106:
                    107: void
                    108: dbdma_pause(dbdma_regmap_t *dmap)
                    109: {
                    110:        DBDMA_ST4_ENDIAN(&dmap->d_control,DBDMA_SET_CNTRL(DBDMA_CNTRL_PAUSE));
                    111:
                    112:        /* XXX time-bind it? */
                    113:        while (DBDMA_LD4_ENDIAN(&dmap->d_status) & DBDMA_CNTRL_ACTIVE);
                    114: }
                    115:
                    116: dbdma_t
                    117: dbdma_alloc(bus_dma_tag_t dmat, int size)
                    118: {
                    119:        dbdma_t dt;
                    120:        int error;
                    121:
                    122:        dt = malloc(sizeof *dt, M_DEVBUF, M_NOWAIT);
                    123:        if (!dt)
                    124:                return (dt);
                    125:        bzero(dt, sizeof *dt);
                    126:
                    127:        dt->d_size = size *= sizeof(dbdma_command_t);
                    128:        dt->d_dmat = dmat;
                    129:        if ((error = bus_dmamem_alloc(dmat, size, NBPG, 0, dt->d_segs,
                    130:            1, &dt->d_nsegs, BUS_DMA_NOWAIT)) != 0) {
                    131:                printf("dbdma: unable to allocate dma, error = %d\n", error);
                    132:        } else if ((error = bus_dmamem_map(dmat, dt->d_segs, dt->d_nsegs, size,
                    133:            (caddr_t *)&dt->d_addr, BUS_DMA_NOWAIT | BUS_DMA_COHERENT)) != 0) {
                    134:                printf("dbdma: unable to map dma, error = %d\n", error);
                    135:        } else if ((error = bus_dmamap_create(dmat, dt->d_size, 1,
                    136:            dt->d_size, 0, BUS_DMA_NOWAIT, &dt->d_map)) != 0) {
                    137:                printf("dbdma: unable to create dma map, error = %d\n", error);
                    138:        } else if ((error = bus_dmamap_load_raw(dmat, dt->d_map,
                    139:            dt->d_segs, dt->d_nsegs, size, BUS_DMA_NOWAIT)) != 0) {
                    140:                printf("dbdma: unable to load dma map, error = %d\n", error);
                    141:        } else
                    142:                return dt;
                    143:
                    144:        dbdma_free(dt);
                    145:        return (NULL);
                    146: }
                    147:
                    148: void
                    149: dbdma_free(dbdma_t dt)
                    150: {
                    151:        if (dt->d_map)
                    152:                bus_dmamap_destroy(dt->d_dmat, dt->d_map);
                    153:        if (dt->d_addr)
                    154:                bus_dmamem_unmap(dt->d_dmat, (caddr_t)dt->d_addr, dt->d_size);
                    155:        if (dt->d_nsegs)
                    156:                bus_dmamem_free(dt->d_dmat, dt->d_segs, dt->d_nsegs);
                    157:        free(dt, M_DEVBUF);
                    158: }

CVSweb