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

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

1.1       nbrk        1: /*     $OpenBSD: dbdma.h,v 1.4 2006/01/13 19:25:44 miod Exp $  */
                      2: /*     $NetBSD: dbdma.h,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 <machine/bus.h>
                     27: #include <machine/pio.h>
                     28:
                     29: #ifndef _POWERMAC_DBDMA_H_
                     30: #define _POWERMAC_DBDMA_H_
                     31:
                     32: #define        DBDMA_CMD_OUT_MORE      0
                     33: #define        DBDMA_CMD_OUT_LAST      1
                     34: #define        DBDMA_CMD_IN_MORE       2
                     35: #define        DBDMA_CMD_IN_LAST       3
                     36: #define        DBDMA_CMD_STORE_QUAD    4
                     37: #define        DBDMA_CMD_LOAD_QUAD     5
                     38: #define        DBDMA_CMD_NOP           6
                     39: #define        DBDMA_CMD_STOP          7
                     40:
                     41: /* Keys */
                     42:
                     43: #define        DBDMA_KEY_STREAM0       0
                     44: #define        DBDMA_KEY_STREAM1       1
                     45: #define        DBDMA_KEY_STREAM2       2
                     46: #define        DBDMA_KEY_STREAM3       3
                     47:
                     48: /* value 4 is reserved */
                     49: #define        DBDMA_KEY_REGS          5
                     50: #define        DBDMA_KEY_SYSTEM        6
                     51: #define        DBDMA_KEY_DEVICE        7
                     52:
                     53: #define        DBDMA_INT_NEVER         0
                     54: #define        DBDMA_INT_IF_TRUE       1
                     55: #define        DBDMA_INT_IF_FALSE      2
                     56: #define        DBDMA_INT_ALWAYS        3
                     57:
                     58: #define        DBDMA_BRANCH_NEVER      0
                     59: #define        DBDMA_BRANCH_IF_TRUE    1
                     60: #define        DBDMA_BRANCH_IF_FALSE   2
                     61: #define        DBDMA_BRANCH_ALWAYS     3
                     62:
                     63: #define        DBDMA_WAIT_NEVER        0
                     64: #define        DBDMA_WAIT_IF_TRUE      1
                     65: #define DBDMA_WAIT_IF_FALSE    2
                     66: #define        DBDMA_WAIT_ALWAYS       3
                     67:
                     68:
                     69: /* Channels */
                     70:
                     71: #define        DBDMA_SCSI0             0x0
                     72: #define        DBDMA_CURIO_SCSI        DBDMA_SCSI0
                     73: #define        DBDMA_FLOPPY            0x1
                     74: #define        DBDMA_ETHERNET_TX       0x2
                     75: #define        DBDMA_ETHERNET_RV       0x3
                     76: #define        DBDMA_SCC_XMIT_A        0x4
                     77: #define        DBDMA_SCC_RECV_A        0x5
                     78: #define        DBDMA_SCC_XMIT_B        0x6
                     79: #define        DBDMA_SCC_RECV_B        0x7
                     80: #define        DBDMA_AUDIO_OUT         0x8
                     81: #define        DBDMA_AUDIO_IN          0x9
                     82: #define        DBDMA_SCSI1             0xA
                     83:
                     84: /* Control register values (in little endian) */
                     85:
                     86: #define        DBDMA_STATUS_MASK       0x000000ff      /* Status Mask */
                     87: #define        DBDMA_CNTRL_BRANCH      0x00000100
                     88:                                /* 0x200 reserved */
                     89: #define        DBDMA_CNTRL_ACTIVE      0x00000400
                     90: #define        DBDMA_CNTRL_DEAD        0x00000800
                     91: #define        DBDMA_CNTRL_WAKE        0x00001000
                     92: #define        DBDMA_CNTRL_FLUSH       0x00002000
                     93: #define        DBDMA_CNTRL_PAUSE       0x00004000
                     94: #define        DBDMA_CNTRL_RUN         0x00008000
                     95:
                     96: #define        DBDMA_SET_CNTRL(x)      ( ((x) | (x) << 16) )
                     97: #define        DBDMA_CLEAR_CNTRL(x)    ( (x) << 16)
                     98:
                     99: #define        DBDMA_COUNT_MAX         0x8000
                    100:
                    101: #define        DBDMA_REGMAP(channel) \
                    102:                (dbdma_regmap_t *)((v_u_char *) POWERMAC_IO(PCI_DMA_BASE_PHYS) \
                    103:                                + (channel << 8))
                    104:
                    105: /* This struct is layout in little endian format */
                    106:
                    107: struct dbdma_command {
                    108:        u_int16_t       d_count;
                    109:        u_int16_t       d_command;
                    110:        u_int32_t       d_address;
                    111:        u_int32_t       d_cmddep;
                    112:        u_int16_t       d_resid;
                    113:        u_int16_t       d_status;
                    114: };
                    115:
                    116: typedef struct dbdma_command dbdma_command_t;
                    117:
                    118: #define        DBDMA_BUILD_CMD(d, cmd, key, interrupt, wait, branch) {         \
                    119:                dbdma_st16(&(d)->d_command,                             \
                    120:                                ((cmd) << 12) | ((key) << 8) |          \
                    121:                                ((interrupt) << 4) |                    \
                    122:                                ((branch) << 2) | (wait));              \
                    123:        }
                    124:
                    125: #define        DBDMA_BUILD(d, cmd, key, count, address, interrupt, wait, branch) { \
                    126:                dbdma_st16(&(d)->d_count, count);                       \
                    127:                dbdma_st32(&(d)->d_address, address);                   \
                    128:                (d)->d_resid = 0;                                       \
                    129:                (d)->d_status = 0;                                      \
                    130:                (d)->d_cmddep = 0;                                      \
                    131:                dbdma_st16(&(d)->d_command,                             \
                    132:                                ((cmd) << 12) | ((key) << 8) |          \
                    133:                                ((interrupt) << 4) |                    \
                    134:                                ((branch) << 2) | (wait));              \
                    135:        }
                    136:
                    137: #if 0
                    138: static __inline__ void
                    139: dbdma_st32(a, x)
                    140:        volatile u_int32_t *a;
                    141:        u_int32_t x;
                    142: {
                    143:        __asm__ volatile
                    144:                ("stwbrx %0,0,%1" : : "r" (x), "r" (a) : "memory");
                    145:        __asm__ volatile ("eieio");
                    146: }
                    147:
                    148: static __inline__ void
                    149: dbdma_st16(a, x)
                    150:        volatile u_int16_t *a;
                    151:        u_int16_t x;
                    152: {
                    153:        __asm__ volatile
                    154:                ("sthbrx %0,0,%1" : : "r" (x), "r" (a) : "memory");
                    155:        __asm__ volatile ("eieio");
                    156: }
                    157:
                    158: static __inline__ u_int32_t
                    159: dbdma_ld32(a)
                    160:        volatile u_int32_t *a;
                    161: {
                    162:        u_int32_t swap;
                    163:
                    164:        __asm__ volatile ("eieio");
                    165:        __asm__ volatile
                    166:                ("lwbrx %0,0,%1" :  "=r" (swap) : "r" (a));
                    167:
                    168:        return  swap;
                    169: }
                    170:
                    171: static __inline__ u_int16_t
                    172: dbdma_ld16(a)
                    173:        volatile u_int16_t *a;
                    174: {
                    175:        u_int16_t swap;
                    176:
                    177:        __asm__ volatile ("eieio");
                    178:        __asm__ volatile
                    179:                ("lhbrx %0,0,%1" :  "=r" (swap) : "r" (a));
                    180:
                    181:        return  swap;
                    182: }
                    183:
                    184: #define        DBDMA_LD4_ENDIAN(a)     dbdma_ld32(a)
                    185: #define        DBDMA_ST4_ENDIAN(a, x)  dbdma_st32(a, x)
                    186: #else
                    187: #define        DBDMA_LD4_ENDIAN(a)     in32rb(a)
                    188: #define        DBDMA_ST4_ENDIAN(a, x)  out32rb(a, x)
                    189: #define dbdma_st16(a,x)                out16rb((a),(x))
                    190: #define dbdma_ld16(a)          in16rb(a)
                    191: #define dbdma_st32(a,x)                out32rb((a),(x))
                    192: #define dbdma_ld32(a)          in32rb(a)
                    193: #endif
                    194:
                    195:
                    196: /*
                    197:  * DBDMA Channel layout
                    198:  *
                    199:  * NOTE - This structure is in little-endian format.
                    200:  */
                    201:
                    202: struct dbdma_regmap {
                    203:        u_int32_t       d_control;      /* Control Register */
                    204:        u_int32_t       d_status;       /* DBDMA Status Register */
                    205:        u_int32_t       d_cmdptrhi;     /* MSB of command pointer (not used yet) */
                    206:        u_int32_t       d_cmdptrlo;     /* LSB of command pointer */
                    207:        u_int32_t       d_intselect;    /* Interrupt Select */
                    208:        u_int32_t       d_branch;       /* Branch selection */
                    209:        u_int32_t       d_wait;         /* Wait selection */
                    210:        u_int32_t       d_transmode;    /* Transfer modes */
                    211:        u_int32_t       d_dataptrhi;    /* MSB of Data Pointer */
                    212:        u_int32_t       d_dataptrlo;    /* LSB of Data Pointer */
                    213:        u_int32_t       d_reserved;     /* Reserved for the moment */
                    214:        u_int32_t       d_branchptrhi;  /* MSB of Branch Pointer */
                    215:        u_int32_t       d_branchptrlo;  /* LSB of Branch Pointer */
                    216:        /* The remaining fields are undefinied and unimplemented */
                    217: };
                    218:
                    219: typedef volatile struct dbdma_regmap dbdma_regmap_t;
                    220:
                    221: /* DBDMA routines */
                    222: typedef
                    223: struct dbdma_desc {
                    224:        bus_dma_tag_t d_dmat;
                    225:        bus_dmamap_t d_map;
                    226:        dbdma_command_t *d_addr;
                    227: #define        d_paddr d_segs->ds_addr
                    228:        bus_dma_segment_t d_segs[1];
                    229:        int d_nsegs;
                    230:        size_t d_size;
                    231: } *dbdma_t;
                    232:
                    233: dbdma_t        dbdma_alloc(bus_dma_tag_t, int); /* Allocate command structures */
                    234: void   dbdma_free(dbdma_t);    /* Dispose command structures */
                    235: void   dbdma_start(dbdma_regmap_t *channel, dbdma_t dt);
                    236: void   dbdma_stop(dbdma_regmap_t *channel);
                    237: void   dbdma_flush(dbdma_regmap_t *channel);
                    238: void   dbdma_reset(dbdma_regmap_t *channel);
                    239: void   dbdma_continue(dbdma_regmap_t *channel);
                    240: void   dbdma_pause(dbdma_regmap_t *channel);
                    241:
                    242:
                    243: #endif /* !defined(_POWERMAC_DBDMA_H_) */

CVSweb