1*30ed9f04Smacallan /* $NetBSD: dbdma.h,v 1.6 2016/07/15 21:08:27 macallan Exp $ */ 2d4d74161Stsubai 32be6df07Stsubai /* 4d4d74161Stsubai * Copyright 1991-1998 by Open Software Foundation, Inc. 52be6df07Stsubai * All Rights Reserved 62be6df07Stsubai * 72be6df07Stsubai * Permission to use, copy, modify, and distribute this software and 82be6df07Stsubai * its documentation for any purpose and without fee is hereby granted, 92be6df07Stsubai * provided that the above copyright notice appears in all copies and 102be6df07Stsubai * that both the copyright notice and this permission notice appear in 112be6df07Stsubai * supporting documentation. 122be6df07Stsubai * 132be6df07Stsubai * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE 142be6df07Stsubai * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 152be6df07Stsubai * FOR A PARTICULAR PURPOSE. 162be6df07Stsubai * 172be6df07Stsubai * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR 182be6df07Stsubai * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 192be6df07Stsubai * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, 202be6df07Stsubai * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 212be6df07Stsubai * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 222be6df07Stsubai * 232be6df07Stsubai */ 242be6df07Stsubai 252be6df07Stsubai #ifndef _POWERMAC_DBDMA_H_ 262be6df07Stsubai #define _POWERMAC_DBDMA_H_ 272be6df07Stsubai 282be6df07Stsubai #define DBDMA_CMD_OUT_MORE 0 292be6df07Stsubai #define DBDMA_CMD_OUT_LAST 1 302be6df07Stsubai #define DBDMA_CMD_IN_MORE 2 312be6df07Stsubai #define DBDMA_CMD_IN_LAST 3 322be6df07Stsubai #define DBDMA_CMD_STORE_QUAD 4 332be6df07Stsubai #define DBDMA_CMD_LOAD_QUAD 5 342be6df07Stsubai #define DBDMA_CMD_NOP 6 352be6df07Stsubai #define DBDMA_CMD_STOP 7 362be6df07Stsubai 372be6df07Stsubai /* Keys */ 382be6df07Stsubai 392be6df07Stsubai #define DBDMA_KEY_STREAM0 0 402be6df07Stsubai #define DBDMA_KEY_STREAM1 1 412be6df07Stsubai #define DBDMA_KEY_STREAM2 2 422be6df07Stsubai #define DBDMA_KEY_STREAM3 3 432be6df07Stsubai 442be6df07Stsubai /* value 4 is reserved */ 452be6df07Stsubai #define DBDMA_KEY_REGS 5 462be6df07Stsubai #define DBDMA_KEY_SYSTEM 6 472be6df07Stsubai #define DBDMA_KEY_DEVICE 7 482be6df07Stsubai 492be6df07Stsubai #define DBDMA_INT_NEVER 0 502be6df07Stsubai #define DBDMA_INT_IF_TRUE 1 512be6df07Stsubai #define DBDMA_INT_IF_FALSE 2 522be6df07Stsubai #define DBDMA_INT_ALWAYS 3 532be6df07Stsubai 542be6df07Stsubai #define DBDMA_BRANCH_NEVER 0 552be6df07Stsubai #define DBDMA_BRANCH_IF_TRUE 1 562be6df07Stsubai #define DBDMA_BRANCH_IF_FALSE 2 572be6df07Stsubai #define DBDMA_BRANCH_ALWAYS 3 582be6df07Stsubai 592be6df07Stsubai #define DBDMA_WAIT_NEVER 0 602be6df07Stsubai #define DBDMA_WAIT_IF_TRUE 1 612be6df07Stsubai #define DBDMA_WAIT_IF_FALSE 2 622be6df07Stsubai #define DBDMA_WAIT_ALWAYS 3 632be6df07Stsubai 642be6df07Stsubai 652be6df07Stsubai /* Channels */ 662be6df07Stsubai 672be6df07Stsubai #define DBDMA_SCSI0 0x0 682be6df07Stsubai #define DBDMA_CURIO_SCSI DBDMA_SCSI0 692be6df07Stsubai #define DBDMA_FLOPPY 0x1 702be6df07Stsubai #define DBDMA_ETHERNET_TX 0x2 712be6df07Stsubai #define DBDMA_ETHERNET_RV 0x3 722be6df07Stsubai #define DBDMA_SCC_XMIT_A 0x4 732be6df07Stsubai #define DBDMA_SCC_RECV_A 0x5 742be6df07Stsubai #define DBDMA_SCC_XMIT_B 0x6 752be6df07Stsubai #define DBDMA_SCC_RECV_B 0x7 762be6df07Stsubai #define DBDMA_AUDIO_OUT 0x8 772be6df07Stsubai #define DBDMA_AUDIO_IN 0x9 782be6df07Stsubai #define DBDMA_SCSI1 0xA 792be6df07Stsubai 802be6df07Stsubai /* Control register values (in little endian) */ 812be6df07Stsubai 822be6df07Stsubai #define DBDMA_STATUS_MASK 0x000000ff /* Status Mask */ 832be6df07Stsubai #define DBDMA_CNTRL_BRANCH 0x00000100 842be6df07Stsubai /* 0x200 reserved */ 852be6df07Stsubai #define DBDMA_CNTRL_ACTIVE 0x00000400 862be6df07Stsubai #define DBDMA_CNTRL_DEAD 0x00000800 872be6df07Stsubai #define DBDMA_CNTRL_WAKE 0x00001000 882be6df07Stsubai #define DBDMA_CNTRL_FLUSH 0x00002000 892be6df07Stsubai #define DBDMA_CNTRL_PAUSE 0x00004000 902be6df07Stsubai #define DBDMA_CNTRL_RUN 0x00008000 912be6df07Stsubai 922be6df07Stsubai #define DBDMA_SET_CNTRL(x) ( ((x) | (x) << 16) ) 932be6df07Stsubai #define DBDMA_CLEAR_CNTRL(x) ( (x) << 16) 942be6df07Stsubai 952be6df07Stsubai 962be6df07Stsubai #define DBDMA_REGMAP(channel) \ 972be6df07Stsubai (dbdma_regmap_t *)((v_u_char *) POWERMAC_IO(PCI_DMA_BASE_PHYS) \ 982be6df07Stsubai + (channel << 8)) 992be6df07Stsubai 1002be6df07Stsubai /* This struct is layout in little endian format */ 1012be6df07Stsubai 1022be6df07Stsubai struct dbdma_command { 103d974db0aSgarbled uint16_t d_count; 104d974db0aSgarbled uint16_t d_command; 105d974db0aSgarbled uint32_t d_address; 106d974db0aSgarbled uint32_t d_cmddep; 107d974db0aSgarbled uint16_t d_resid; 108d974db0aSgarbled uint16_t d_status; 1092be6df07Stsubai }; 1102be6df07Stsubai 1112be6df07Stsubai typedef struct dbdma_command dbdma_command_t; 1122be6df07Stsubai 1132be6df07Stsubai #define DBDMA_BUILD_CMD(d, cmd, key, interrupt, wait, branch) { \ 114d974db0aSgarbled out16rb(&(d)->d_command, \ 1152be6df07Stsubai ((cmd) << 12) | ((key) << 8) | \ 1162be6df07Stsubai ((interrupt) << 4) | \ 1172be6df07Stsubai ((branch) << 2) | (wait)); \ 1182be6df07Stsubai } 1192be6df07Stsubai 1202be6df07Stsubai #define DBDMA_BUILD(d, cmd, key, count, address, interrupt, wait, branch) { \ 121d974db0aSgarbled out16rb(&(d)->d_count, count); \ 122d974db0aSgarbled out32rb(&(d)->d_address, address); \ 1232be6df07Stsubai (d)->d_resid = 0; \ 1242be6df07Stsubai (d)->d_status = 0; \ 1252be6df07Stsubai (d)->d_cmddep = 0; \ 126d974db0aSgarbled out16rb(&(d)->d_command, \ 127d4d74161Stsubai ((cmd) << 12) | ((key) << 8) | \ 128d4d74161Stsubai ((interrupt) << 4) | \ 129d4d74161Stsubai ((branch) << 2) | (wait)); \ 1302be6df07Stsubai } 1312be6df07Stsubai 132d974db0aSgarbled #define DBDMA_LD4_ENDIAN(a) in32rb(a) 133d974db0aSgarbled #define DBDMA_ST4_ENDIAN(a, x) out32rb(a, x) 1342be6df07Stsubai 1352be6df07Stsubai /* 1362be6df07Stsubai * DBDMA Channel layout 1372be6df07Stsubai * 1382be6df07Stsubai * NOTE - This structure is in little-endian format. 1392be6df07Stsubai */ 1402be6df07Stsubai 1412be6df07Stsubai struct dbdma_regmap { 142d974db0aSgarbled uint32_t d_control; /* Control Register */ 143d974db0aSgarbled uint32_t d_status; /* DBDMA Status Register */ 144d974db0aSgarbled uint32_t d_cmdptrhi; /* MSB of command pointer (not used yet) */ 145d974db0aSgarbled uint32_t d_cmdptrlo; /* LSB of command pointer */ 146d974db0aSgarbled uint32_t d_intselect; /* Interrupt Select */ 147d974db0aSgarbled uint32_t d_branch; /* Branch selection */ 148d974db0aSgarbled uint32_t d_wait; /* Wait selection */ 149d974db0aSgarbled uint32_t d_transmode; /* Transfer modes */ 150d974db0aSgarbled uint32_t d_dataptrhi; /* MSB of Data Pointer */ 151d974db0aSgarbled uint32_t d_dataptrlo; /* LSB of Data Pointer */ 152d974db0aSgarbled uint32_t d_reserved; /* Reserved for the moment */ 153d974db0aSgarbled uint32_t d_branchptrhi; /* MSB of Branch Pointer */ 154d974db0aSgarbled uint32_t d_branchptrlo; /* LSB of Branch Pointer */ 1552be6df07Stsubai /* The remaining fields are undefinied and unimplemented */ 1562be6df07Stsubai }; 1572be6df07Stsubai 1582be6df07Stsubai typedef volatile struct dbdma_regmap dbdma_regmap_t; 1592be6df07Stsubai 1602be6df07Stsubai /* DBDMA routines */ 1612be6df07Stsubai 1622be6df07Stsubai void dbdma_start(dbdma_regmap_t *channel, dbdma_command_t *commands); 1632be6df07Stsubai void dbdma_stop(dbdma_regmap_t *channel); 1642be6df07Stsubai void dbdma_flush(dbdma_regmap_t *channel); 1652be6df07Stsubai void dbdma_reset(dbdma_regmap_t *channel); 1662be6df07Stsubai void dbdma_continue(dbdma_regmap_t *channel); 1672be6df07Stsubai void dbdma_pause(dbdma_regmap_t *channel); 1682be6df07Stsubai 169*30ed9f04Smacallan dbdma_command_t *dbdma_alloc(int, void **); /* Allocate command structures */ 170*30ed9f04Smacallan void dbdma_free(void *, int); 1712be6df07Stsubai 1722be6df07Stsubai #endif /* !defined(_POWERMAC_DBDMA_H_) */ 173