1*36fd90dcSjsg /* $OpenBSD: dbdma.h,v 1.5 2021/03/11 11:16:58 jsg Exp $ */ 2d9a5f17fSdrahn /* $NetBSD: dbdma.h,v 1.2 1998/08/21 16:13:28 tsubai Exp $ */ 3d9a5f17fSdrahn 4d9a5f17fSdrahn /* 5d9a5f17fSdrahn * Copyright 1991-1998 by Open Software Foundation, Inc. 6d9a5f17fSdrahn * All Rights Reserved 7d9a5f17fSdrahn * 8d9a5f17fSdrahn * Permission to use, copy, modify, and distribute this software and 9d9a5f17fSdrahn * its documentation for any purpose and without fee is hereby granted, 10d9a5f17fSdrahn * provided that the above copyright notice appears in all copies and 11d9a5f17fSdrahn * that both the copyright notice and this permission notice appear in 12d9a5f17fSdrahn * supporting documentation. 13d9a5f17fSdrahn * 14d9a5f17fSdrahn * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE 15d9a5f17fSdrahn * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 16d9a5f17fSdrahn * FOR A PARTICULAR PURPOSE. 17d9a5f17fSdrahn * 18d9a5f17fSdrahn * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR 19d9a5f17fSdrahn * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 20d9a5f17fSdrahn * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, 21d9a5f17fSdrahn * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 22d9a5f17fSdrahn * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 23d9a5f17fSdrahn * 24d9a5f17fSdrahn */ 25d9a5f17fSdrahn 2649f72352Sdrahn #include <machine/bus.h> 2749f72352Sdrahn #include <machine/pio.h> 28d9a5f17fSdrahn 29d9a5f17fSdrahn #ifndef _POWERMAC_DBDMA_H_ 30d9a5f17fSdrahn #define _POWERMAC_DBDMA_H_ 31d9a5f17fSdrahn 32d9a5f17fSdrahn #define DBDMA_CMD_OUT_MORE 0 33d9a5f17fSdrahn #define DBDMA_CMD_OUT_LAST 1 34d9a5f17fSdrahn #define DBDMA_CMD_IN_MORE 2 35d9a5f17fSdrahn #define DBDMA_CMD_IN_LAST 3 36d9a5f17fSdrahn #define DBDMA_CMD_STORE_QUAD 4 37d9a5f17fSdrahn #define DBDMA_CMD_LOAD_QUAD 5 38d9a5f17fSdrahn #define DBDMA_CMD_NOP 6 39d9a5f17fSdrahn #define DBDMA_CMD_STOP 7 40d9a5f17fSdrahn 41d9a5f17fSdrahn /* Keys */ 42d9a5f17fSdrahn 43d9a5f17fSdrahn #define DBDMA_KEY_STREAM0 0 44d9a5f17fSdrahn #define DBDMA_KEY_STREAM1 1 45d9a5f17fSdrahn #define DBDMA_KEY_STREAM2 2 46d9a5f17fSdrahn #define DBDMA_KEY_STREAM3 3 47d9a5f17fSdrahn 48d9a5f17fSdrahn /* value 4 is reserved */ 49d9a5f17fSdrahn #define DBDMA_KEY_REGS 5 50d9a5f17fSdrahn #define DBDMA_KEY_SYSTEM 6 51d9a5f17fSdrahn #define DBDMA_KEY_DEVICE 7 52d9a5f17fSdrahn 53d9a5f17fSdrahn #define DBDMA_INT_NEVER 0 54d9a5f17fSdrahn #define DBDMA_INT_IF_TRUE 1 55d9a5f17fSdrahn #define DBDMA_INT_IF_FALSE 2 56d9a5f17fSdrahn #define DBDMA_INT_ALWAYS 3 57d9a5f17fSdrahn 58d9a5f17fSdrahn #define DBDMA_BRANCH_NEVER 0 59d9a5f17fSdrahn #define DBDMA_BRANCH_IF_TRUE 1 60d9a5f17fSdrahn #define DBDMA_BRANCH_IF_FALSE 2 61d9a5f17fSdrahn #define DBDMA_BRANCH_ALWAYS 3 62d9a5f17fSdrahn 63d9a5f17fSdrahn #define DBDMA_WAIT_NEVER 0 64d9a5f17fSdrahn #define DBDMA_WAIT_IF_TRUE 1 65d9a5f17fSdrahn #define DBDMA_WAIT_IF_FALSE 2 66d9a5f17fSdrahn #define DBDMA_WAIT_ALWAYS 3 67d9a5f17fSdrahn 68d9a5f17fSdrahn 69d9a5f17fSdrahn /* Channels */ 70d9a5f17fSdrahn 71d9a5f17fSdrahn #define DBDMA_SCSI0 0x0 72d9a5f17fSdrahn #define DBDMA_CURIO_SCSI DBDMA_SCSI0 73d9a5f17fSdrahn #define DBDMA_FLOPPY 0x1 74d9a5f17fSdrahn #define DBDMA_ETHERNET_TX 0x2 75d9a5f17fSdrahn #define DBDMA_ETHERNET_RV 0x3 76d9a5f17fSdrahn #define DBDMA_SCC_XMIT_A 0x4 77d9a5f17fSdrahn #define DBDMA_SCC_RECV_A 0x5 78d9a5f17fSdrahn #define DBDMA_SCC_XMIT_B 0x6 79d9a5f17fSdrahn #define DBDMA_SCC_RECV_B 0x7 80d9a5f17fSdrahn #define DBDMA_AUDIO_OUT 0x8 81d9a5f17fSdrahn #define DBDMA_AUDIO_IN 0x9 82d9a5f17fSdrahn #define DBDMA_SCSI1 0xA 83d9a5f17fSdrahn 84d9a5f17fSdrahn /* Control register values (in little endian) */ 85d9a5f17fSdrahn 86d9a5f17fSdrahn #define DBDMA_STATUS_MASK 0x000000ff /* Status Mask */ 87d9a5f17fSdrahn #define DBDMA_CNTRL_BRANCH 0x00000100 88d9a5f17fSdrahn /* 0x200 reserved */ 89d9a5f17fSdrahn #define DBDMA_CNTRL_ACTIVE 0x00000400 90d9a5f17fSdrahn #define DBDMA_CNTRL_DEAD 0x00000800 91d9a5f17fSdrahn #define DBDMA_CNTRL_WAKE 0x00001000 92d9a5f17fSdrahn #define DBDMA_CNTRL_FLUSH 0x00002000 93d9a5f17fSdrahn #define DBDMA_CNTRL_PAUSE 0x00004000 94d9a5f17fSdrahn #define DBDMA_CNTRL_RUN 0x00008000 95d9a5f17fSdrahn 96d9a5f17fSdrahn #define DBDMA_SET_CNTRL(x) ( ((x) | (x) << 16) ) 97d9a5f17fSdrahn #define DBDMA_CLEAR_CNTRL(x) ( (x) << 16) 98d9a5f17fSdrahn 99e6d856e8Smickey #define DBDMA_COUNT_MAX 0x8000 100d9a5f17fSdrahn 101d9a5f17fSdrahn #define DBDMA_REGMAP(channel) \ 102d9a5f17fSdrahn (dbdma_regmap_t *)((v_u_char *) POWERMAC_IO(PCI_DMA_BASE_PHYS) \ 103d9a5f17fSdrahn + (channel << 8)) 104d9a5f17fSdrahn 105d9a5f17fSdrahn /* This struct is layout in little endian format */ 106d9a5f17fSdrahn 107d9a5f17fSdrahn struct dbdma_command { 108d9a5f17fSdrahn u_int16_t d_count; 109d9a5f17fSdrahn u_int16_t d_command; 110d9a5f17fSdrahn u_int32_t d_address; 111d9a5f17fSdrahn u_int32_t d_cmddep; 112d9a5f17fSdrahn u_int16_t d_resid; 113d9a5f17fSdrahn u_int16_t d_status; 114d9a5f17fSdrahn }; 115d9a5f17fSdrahn 116d9a5f17fSdrahn typedef struct dbdma_command dbdma_command_t; 117d9a5f17fSdrahn 118d9a5f17fSdrahn #define DBDMA_BUILD_CMD(d, cmd, key, interrupt, wait, branch) { \ 119d9a5f17fSdrahn dbdma_st16(&(d)->d_command, \ 120d9a5f17fSdrahn ((cmd) << 12) | ((key) << 8) | \ 121d9a5f17fSdrahn ((interrupt) << 4) | \ 122d9a5f17fSdrahn ((branch) << 2) | (wait)); \ 123d9a5f17fSdrahn } 124d9a5f17fSdrahn 125d9a5f17fSdrahn #define DBDMA_BUILD(d, cmd, key, count, address, interrupt, wait, branch) { \ 126d9a5f17fSdrahn dbdma_st16(&(d)->d_count, count); \ 127d9a5f17fSdrahn dbdma_st32(&(d)->d_address, address); \ 128d9a5f17fSdrahn (d)->d_resid = 0; \ 129d9a5f17fSdrahn (d)->d_status = 0; \ 130d9a5f17fSdrahn (d)->d_cmddep = 0; \ 131d9a5f17fSdrahn dbdma_st16(&(d)->d_command, \ 132d9a5f17fSdrahn ((cmd) << 12) | ((key) << 8) | \ 133d9a5f17fSdrahn ((interrupt) << 4) | \ 134d9a5f17fSdrahn ((branch) << 2) | (wait)); \ 135d9a5f17fSdrahn } 136d9a5f17fSdrahn 137d9a5f17fSdrahn #if 0 138d9a5f17fSdrahn static __inline__ void 139d9a5f17fSdrahn dbdma_st32(a, x) 140d9a5f17fSdrahn volatile u_int32_t *a; 141d9a5f17fSdrahn u_int32_t x; 142d9a5f17fSdrahn { 143d9a5f17fSdrahn __asm__ volatile 144d9a5f17fSdrahn ("stwbrx %0,0,%1" : : "r" (x), "r" (a) : "memory"); 145d9a5f17fSdrahn __asm__ volatile ("eieio"); 146d9a5f17fSdrahn } 147d9a5f17fSdrahn 148d9a5f17fSdrahn static __inline__ void 149d9a5f17fSdrahn dbdma_st16(a, x) 150d9a5f17fSdrahn volatile u_int16_t *a; 151d9a5f17fSdrahn u_int16_t x; 152d9a5f17fSdrahn { 153d9a5f17fSdrahn __asm__ volatile 154d9a5f17fSdrahn ("sthbrx %0,0,%1" : : "r" (x), "r" (a) : "memory"); 155d9a5f17fSdrahn __asm__ volatile ("eieio"); 156d9a5f17fSdrahn } 157d9a5f17fSdrahn 158d9a5f17fSdrahn static __inline__ u_int32_t 159d9a5f17fSdrahn dbdma_ld32(a) 160d9a5f17fSdrahn volatile u_int32_t *a; 161d9a5f17fSdrahn { 162d9a5f17fSdrahn u_int32_t swap; 163d9a5f17fSdrahn 164d9a5f17fSdrahn __asm__ volatile ("eieio"); 165d9a5f17fSdrahn __asm__ volatile 166d9a5f17fSdrahn ("lwbrx %0,0,%1" : "=r" (swap) : "r" (a)); 167d9a5f17fSdrahn 168d9a5f17fSdrahn return swap; 169d9a5f17fSdrahn } 170d9a5f17fSdrahn 171d9a5f17fSdrahn static __inline__ u_int16_t 172d9a5f17fSdrahn dbdma_ld16(a) 173d9a5f17fSdrahn volatile u_int16_t *a; 174d9a5f17fSdrahn { 175d9a5f17fSdrahn u_int16_t swap; 176d9a5f17fSdrahn 177d9a5f17fSdrahn __asm__ volatile ("eieio"); 178d9a5f17fSdrahn __asm__ volatile 179d9a5f17fSdrahn ("lhbrx %0,0,%1" : "=r" (swap) : "r" (a)); 180d9a5f17fSdrahn 181d9a5f17fSdrahn return swap; 182d9a5f17fSdrahn } 183d9a5f17fSdrahn 184d9a5f17fSdrahn #define DBDMA_LD4_ENDIAN(a) dbdma_ld32(a) 185d9a5f17fSdrahn #define DBDMA_ST4_ENDIAN(a, x) dbdma_st32(a, x) 186d9a5f17fSdrahn #else 187d9a5f17fSdrahn #define DBDMA_LD4_ENDIAN(a) in32rb(a) 188d9a5f17fSdrahn #define DBDMA_ST4_ENDIAN(a, x) out32rb(a, x) 189d9a5f17fSdrahn #define dbdma_st16(a,x) out16rb((a),(x)) 190d9a5f17fSdrahn #define dbdma_ld16(a) in16rb(a) 191d9a5f17fSdrahn #define dbdma_st32(a,x) out32rb((a),(x)) 192d9a5f17fSdrahn #define dbdma_ld32(a) in32rb(a) 193d9a5f17fSdrahn #endif 194d9a5f17fSdrahn 195d9a5f17fSdrahn 196d9a5f17fSdrahn /* 197d9a5f17fSdrahn * DBDMA Channel layout 198d9a5f17fSdrahn * 199d9a5f17fSdrahn * NOTE - This structure is in little-endian format. 200d9a5f17fSdrahn */ 201d9a5f17fSdrahn 202d9a5f17fSdrahn struct dbdma_regmap { 203d9a5f17fSdrahn u_int32_t d_control; /* Control Register */ 204d9a5f17fSdrahn u_int32_t d_status; /* DBDMA Status Register */ 205d9a5f17fSdrahn u_int32_t d_cmdptrhi; /* MSB of command pointer (not used yet) */ 206d9a5f17fSdrahn u_int32_t d_cmdptrlo; /* LSB of command pointer */ 207d9a5f17fSdrahn u_int32_t d_intselect; /* Interrupt Select */ 208d9a5f17fSdrahn u_int32_t d_branch; /* Branch selection */ 209d9a5f17fSdrahn u_int32_t d_wait; /* Wait selection */ 210d9a5f17fSdrahn u_int32_t d_transmode; /* Transfer modes */ 211d9a5f17fSdrahn u_int32_t d_dataptrhi; /* MSB of Data Pointer */ 212d9a5f17fSdrahn u_int32_t d_dataptrlo; /* LSB of Data Pointer */ 213d9a5f17fSdrahn u_int32_t d_reserved; /* Reserved for the moment */ 214d9a5f17fSdrahn u_int32_t d_branchptrhi; /* MSB of Branch Pointer */ 215d9a5f17fSdrahn u_int32_t d_branchptrlo; /* LSB of Branch Pointer */ 216*36fd90dcSjsg /* The remaining fields are undefined and unimplemented */ 217d9a5f17fSdrahn }; 218d9a5f17fSdrahn 219d9a5f17fSdrahn typedef volatile struct dbdma_regmap dbdma_regmap_t; 220d9a5f17fSdrahn 221d9a5f17fSdrahn /* DBDMA routines */ 222e6d856e8Smickey typedef 223e6d856e8Smickey struct dbdma_desc { 224fe1b9aebSmiod bus_dma_tag_t d_dmat; 225e6d856e8Smickey bus_dmamap_t d_map; 226e6d856e8Smickey dbdma_command_t *d_addr; 227e6d856e8Smickey #define d_paddr d_segs->ds_addr 228e6d856e8Smickey bus_dma_segment_t d_segs[1]; 229fe1b9aebSmiod int d_nsegs; 230e6d856e8Smickey size_t d_size; 231e6d856e8Smickey } *dbdma_t; 232d9a5f17fSdrahn 233e6d856e8Smickey dbdma_t dbdma_alloc(bus_dma_tag_t, int); /* Allocate command structures */ 234e6d856e8Smickey void dbdma_free(dbdma_t); /* Dispose command structures */ 235e6d856e8Smickey void dbdma_start(dbdma_regmap_t *channel, dbdma_t dt); 236d9a5f17fSdrahn void dbdma_stop(dbdma_regmap_t *channel); 237d9a5f17fSdrahn void dbdma_flush(dbdma_regmap_t *channel); 238d9a5f17fSdrahn void dbdma_reset(dbdma_regmap_t *channel); 239d9a5f17fSdrahn void dbdma_continue(dbdma_regmap_t *channel); 240d9a5f17fSdrahn void dbdma_pause(dbdma_regmap_t *channel); 241d9a5f17fSdrahn 242d9a5f17fSdrahn 243d9a5f17fSdrahn #endif /* !defined(_POWERMAC_DBDMA_H_) */ 244