1 1.6 macallan /* $NetBSD: dbdma.h,v 1.6 2016/07/15 21:08:27 macallan Exp $ */ 2 1.2 tsubai 3 1.1 tsubai /* 4 1.2 tsubai * Copyright 1991-1998 by Open Software Foundation, Inc. 5 1.1 tsubai * All Rights Reserved 6 1.1 tsubai * 7 1.1 tsubai * Permission to use, copy, modify, and distribute this software and 8 1.1 tsubai * its documentation for any purpose and without fee is hereby granted, 9 1.1 tsubai * provided that the above copyright notice appears in all copies and 10 1.1 tsubai * that both the copyright notice and this permission notice appear in 11 1.1 tsubai * supporting documentation. 12 1.1 tsubai * 13 1.1 tsubai * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE 14 1.1 tsubai * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 15 1.1 tsubai * FOR A PARTICULAR PURPOSE. 16 1.1 tsubai * 17 1.1 tsubai * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR 18 1.1 tsubai * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 19 1.1 tsubai * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, 20 1.1 tsubai * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 21 1.1 tsubai * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 22 1.1 tsubai * 23 1.1 tsubai */ 24 1.1 tsubai 25 1.1 tsubai #ifndef _POWERMAC_DBDMA_H_ 26 1.1 tsubai #define _POWERMAC_DBDMA_H_ 27 1.1 tsubai 28 1.1 tsubai #define DBDMA_CMD_OUT_MORE 0 29 1.1 tsubai #define DBDMA_CMD_OUT_LAST 1 30 1.1 tsubai #define DBDMA_CMD_IN_MORE 2 31 1.1 tsubai #define DBDMA_CMD_IN_LAST 3 32 1.1 tsubai #define DBDMA_CMD_STORE_QUAD 4 33 1.1 tsubai #define DBDMA_CMD_LOAD_QUAD 5 34 1.1 tsubai #define DBDMA_CMD_NOP 6 35 1.1 tsubai #define DBDMA_CMD_STOP 7 36 1.1 tsubai 37 1.1 tsubai /* Keys */ 38 1.1 tsubai 39 1.1 tsubai #define DBDMA_KEY_STREAM0 0 40 1.1 tsubai #define DBDMA_KEY_STREAM1 1 41 1.1 tsubai #define DBDMA_KEY_STREAM2 2 42 1.1 tsubai #define DBDMA_KEY_STREAM3 3 43 1.1 tsubai 44 1.1 tsubai /* value 4 is reserved */ 45 1.1 tsubai #define DBDMA_KEY_REGS 5 46 1.1 tsubai #define DBDMA_KEY_SYSTEM 6 47 1.1 tsubai #define DBDMA_KEY_DEVICE 7 48 1.1 tsubai 49 1.1 tsubai #define DBDMA_INT_NEVER 0 50 1.1 tsubai #define DBDMA_INT_IF_TRUE 1 51 1.1 tsubai #define DBDMA_INT_IF_FALSE 2 52 1.1 tsubai #define DBDMA_INT_ALWAYS 3 53 1.1 tsubai 54 1.1 tsubai #define DBDMA_BRANCH_NEVER 0 55 1.1 tsubai #define DBDMA_BRANCH_IF_TRUE 1 56 1.1 tsubai #define DBDMA_BRANCH_IF_FALSE 2 57 1.1 tsubai #define DBDMA_BRANCH_ALWAYS 3 58 1.1 tsubai 59 1.1 tsubai #define DBDMA_WAIT_NEVER 0 60 1.1 tsubai #define DBDMA_WAIT_IF_TRUE 1 61 1.1 tsubai #define DBDMA_WAIT_IF_FALSE 2 62 1.1 tsubai #define DBDMA_WAIT_ALWAYS 3 63 1.1 tsubai 64 1.1 tsubai 65 1.1 tsubai /* Channels */ 66 1.1 tsubai 67 1.1 tsubai #define DBDMA_SCSI0 0x0 68 1.1 tsubai #define DBDMA_CURIO_SCSI DBDMA_SCSI0 69 1.1 tsubai #define DBDMA_FLOPPY 0x1 70 1.1 tsubai #define DBDMA_ETHERNET_TX 0x2 71 1.1 tsubai #define DBDMA_ETHERNET_RV 0x3 72 1.1 tsubai #define DBDMA_SCC_XMIT_A 0x4 73 1.1 tsubai #define DBDMA_SCC_RECV_A 0x5 74 1.1 tsubai #define DBDMA_SCC_XMIT_B 0x6 75 1.1 tsubai #define DBDMA_SCC_RECV_B 0x7 76 1.1 tsubai #define DBDMA_AUDIO_OUT 0x8 77 1.1 tsubai #define DBDMA_AUDIO_IN 0x9 78 1.1 tsubai #define DBDMA_SCSI1 0xA 79 1.1 tsubai 80 1.1 tsubai /* Control register values (in little endian) */ 81 1.1 tsubai 82 1.1 tsubai #define DBDMA_STATUS_MASK 0x000000ff /* Status Mask */ 83 1.1 tsubai #define DBDMA_CNTRL_BRANCH 0x00000100 84 1.1 tsubai /* 0x200 reserved */ 85 1.1 tsubai #define DBDMA_CNTRL_ACTIVE 0x00000400 86 1.1 tsubai #define DBDMA_CNTRL_DEAD 0x00000800 87 1.1 tsubai #define DBDMA_CNTRL_WAKE 0x00001000 88 1.1 tsubai #define DBDMA_CNTRL_FLUSH 0x00002000 89 1.1 tsubai #define DBDMA_CNTRL_PAUSE 0x00004000 90 1.1 tsubai #define DBDMA_CNTRL_RUN 0x00008000 91 1.1 tsubai 92 1.1 tsubai #define DBDMA_SET_CNTRL(x) ( ((x) | (x) << 16) ) 93 1.1 tsubai #define DBDMA_CLEAR_CNTRL(x) ( (x) << 16) 94 1.1 tsubai 95 1.1 tsubai 96 1.1 tsubai #define DBDMA_REGMAP(channel) \ 97 1.1 tsubai (dbdma_regmap_t *)((v_u_char *) POWERMAC_IO(PCI_DMA_BASE_PHYS) \ 98 1.1 tsubai + (channel << 8)) 99 1.1 tsubai 100 1.1 tsubai /* This struct is layout in little endian format */ 101 1.1 tsubai 102 1.1 tsubai struct dbdma_command { 103 1.5 garbled uint16_t d_count; 104 1.5 garbled uint16_t d_command; 105 1.5 garbled uint32_t d_address; 106 1.5 garbled uint32_t d_cmddep; 107 1.5 garbled uint16_t d_resid; 108 1.5 garbled uint16_t d_status; 109 1.1 tsubai }; 110 1.1 tsubai 111 1.1 tsubai typedef struct dbdma_command dbdma_command_t; 112 1.1 tsubai 113 1.1 tsubai #define DBDMA_BUILD_CMD(d, cmd, key, interrupt, wait, branch) { \ 114 1.5 garbled out16rb(&(d)->d_command, \ 115 1.1 tsubai ((cmd) << 12) | ((key) << 8) | \ 116 1.1 tsubai ((interrupt) << 4) | \ 117 1.1 tsubai ((branch) << 2) | (wait)); \ 118 1.1 tsubai } 119 1.1 tsubai 120 1.1 tsubai #define DBDMA_BUILD(d, cmd, key, count, address, interrupt, wait, branch) { \ 121 1.5 garbled out16rb(&(d)->d_count, count); \ 122 1.5 garbled out32rb(&(d)->d_address, address); \ 123 1.2 tsubai (d)->d_resid = 0; \ 124 1.2 tsubai (d)->d_status = 0; \ 125 1.2 tsubai (d)->d_cmddep = 0; \ 126 1.5 garbled out16rb(&(d)->d_command, \ 127 1.1 tsubai ((cmd) << 12) | ((key) << 8) | \ 128 1.1 tsubai ((interrupt) << 4) | \ 129 1.1 tsubai ((branch) << 2) | (wait)); \ 130 1.1 tsubai } 131 1.1 tsubai 132 1.5 garbled #define DBDMA_LD4_ENDIAN(a) in32rb(a) 133 1.5 garbled #define DBDMA_ST4_ENDIAN(a, x) out32rb(a, x) 134 1.1 tsubai 135 1.1 tsubai /* 136 1.1 tsubai * DBDMA Channel layout 137 1.1 tsubai * 138 1.1 tsubai * NOTE - This structure is in little-endian format. 139 1.1 tsubai */ 140 1.1 tsubai 141 1.1 tsubai struct dbdma_regmap { 142 1.5 garbled uint32_t d_control; /* Control Register */ 143 1.5 garbled uint32_t d_status; /* DBDMA Status Register */ 144 1.5 garbled uint32_t d_cmdptrhi; /* MSB of command pointer (not used yet) */ 145 1.5 garbled uint32_t d_cmdptrlo; /* LSB of command pointer */ 146 1.5 garbled uint32_t d_intselect; /* Interrupt Select */ 147 1.5 garbled uint32_t d_branch; /* Branch selection */ 148 1.5 garbled uint32_t d_wait; /* Wait selection */ 149 1.5 garbled uint32_t d_transmode; /* Transfer modes */ 150 1.5 garbled uint32_t d_dataptrhi; /* MSB of Data Pointer */ 151 1.5 garbled uint32_t d_dataptrlo; /* LSB of Data Pointer */ 152 1.5 garbled uint32_t d_reserved; /* Reserved for the moment */ 153 1.5 garbled uint32_t d_branchptrhi; /* MSB of Branch Pointer */ 154 1.5 garbled uint32_t d_branchptrlo; /* LSB of Branch Pointer */ 155 1.1 tsubai /* The remaining fields are undefinied and unimplemented */ 156 1.1 tsubai }; 157 1.1 tsubai 158 1.1 tsubai typedef volatile struct dbdma_regmap dbdma_regmap_t; 159 1.1 tsubai 160 1.1 tsubai /* DBDMA routines */ 161 1.1 tsubai 162 1.1 tsubai void dbdma_start(dbdma_regmap_t *channel, dbdma_command_t *commands); 163 1.1 tsubai void dbdma_stop(dbdma_regmap_t *channel); 164 1.1 tsubai void dbdma_flush(dbdma_regmap_t *channel); 165 1.1 tsubai void dbdma_reset(dbdma_regmap_t *channel); 166 1.1 tsubai void dbdma_continue(dbdma_regmap_t *channel); 167 1.1 tsubai void dbdma_pause(dbdma_regmap_t *channel); 168 1.1 tsubai 169 1.6 macallan dbdma_command_t *dbdma_alloc(int, void **); /* Allocate command structures */ 170 1.6 macallan void dbdma_free(void *, int); 171 1.1 tsubai 172 1.1 tsubai #endif /* !defined(_POWERMAC_DBDMA_H_) */ 173