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