[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     ! 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