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