]> git.saurik.com Git - apple/xnu.git/blob - iokit/IOKit/ppc/IODBDMA.h
90c91808e99c2ac3d25fec43f38098b327f3d2f6
[apple/xnu.git] / iokit / IOKit / ppc / IODBDMA.h
1 /*
2 * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_OSREFERENCE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the
10 * License may not be used to create, or enable the creation or
11 * redistribution of, unlawful or unlicensed copies of an Apple operating
12 * system, or to circumvent, violate, or enable the circumvention or
13 * violation of, any terms of an Apple operating system software license
14 * agreement.
15 *
16 * Please obtain a copy of the License at
17 * http://www.opensource.apple.com/apsl/ and read it before using this
18 * file.
19 *
20 * The Original Code and all software distributed under the License are
21 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
22 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
23 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
24 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
25 * Please see the License for the specific language governing rights and
26 * limitations under the License.
27 *
28 * @APPLE_LICENSE_OSREFERENCE_HEADER_END@
29 */
30 /*
31 * Copyright (c) 1997 Apple Computer, Inc.
32 *
33 *
34 * HISTORY
35 *
36 * Simon Douglas 10 Nov 97
37 * - first checked in, mostly from MacOS DBDMA.i, machdep/ppc/dbdma.h
38 * but use byte reverse ops.
39 */
40
41 #ifndef _IODBDMA_H_
42 #define _IODBDMA_H_
43
44 #include <IOKit/IOTypes.h>
45 #include <libkern/OSByteOrder.h>
46
47
48 /* DBDMA definitions */
49
50 struct IODBDMAChannelRegisters {
51 volatile unsigned long channelControl;
52 volatile unsigned long channelStatus;
53 volatile unsigned long commandPtrHi; /* implementation optional*/
54 volatile unsigned long commandPtrLo;
55 volatile unsigned long interruptSelect; /* implementation optional*/
56 volatile unsigned long branchSelect; /* implementation optional*/
57 volatile unsigned long waitSelect; /* implementation optional*/
58 volatile unsigned long transferModes; /* implementation optional*/
59 volatile unsigned long data2PtrHi; /* implementation optional*/
60 volatile unsigned long data2PtrLo; /* implementation optional*/
61
62 volatile unsigned long reserved1;
63 volatile unsigned long addressHi; /* implementation optional*/
64 volatile unsigned long reserved2[4];
65 volatile unsigned long unimplemented[16];
66
67 /* This structure must remain fully padded to 256 bytes.*/
68 volatile unsigned long undefined[32];
69 };
70 typedef struct IODBDMAChannelRegisters IODBDMAChannelRegisters;
71
72 /* These constants define the DB-DMA channel control words and status flags.*/
73
74 enum {
75 kdbdmaRun = 0x00008000,
76 kdbdmaPause = 0x00004000,
77 kdbdmaFlush = 0x00002000,
78 kdbdmaWake = 0x00001000,
79 kdbdmaDead = 0x00000800,
80 kdbdmaActive = 0x00000400,
81 kdbdmaBt = 0x00000100,
82 kdbdmaS7 = 0x00000080,
83 kdbdmaS6 = 0x00000040,
84 kdbdmaS5 = 0x00000020,
85 kdbdmaS4 = 0x00000010,
86 kdbdmaS3 = 0x00000008,
87 kdbdmaS2 = 0x00000004,
88 kdbdmaS1 = 0x00000002,
89 kdbdmaS0 = 0x00000001
90 };
91
92
93 #define IOSetDBDMAChannelControlBits(mask) ( ((mask) | (mask) << 16) )
94 #define IOClearDBDMAChannelControlBits(mask) ( (mask) << 16)
95
96
97 /* This structure defines the DB-DMA channel command descriptor.*/
98
99 /*
100 *** WARNING: Endian-ness issues must be considered when performing load/store! ***
101 */
102
103 struct IODBDMADescriptor {
104 unsigned long operation; /* cmd || key || i || b || w || reqCount*/
105 unsigned long address;
106 volatile unsigned long cmdDep;
107 volatile unsigned long result; /* xferStatus || resCount*/
108 };
109 typedef struct IODBDMADescriptor IODBDMADescriptor;
110
111 /* These constants define the DB-DMA channel command operations and modifiers.*/
112
113
114 enum {
115 /* Command.cmd operations*/
116 kdbdmaOutputMore = 0,
117 kdbdmaOutputLast = 1,
118 kdbdmaInputMore = 2,
119 kdbdmaInputLast = 3,
120 kdbdmaStoreQuad = 4,
121 kdbdmaLoadQuad = 5,
122 kdbdmaNop = 6,
123 kdbdmaStop = 7
124 };
125
126
127 enum {
128 /* Command.key modifiers (choose one for INPUT, OUTPUT, LOAD, and STORE)*/
129 kdbdmaKeyStream0 = 0, /* default modifier*/
130 kdbdmaKeyStream1 = 1,
131 kdbdmaKeyStream2 = 2,
132 kdbdmaKeyStream3 = 3,
133 kdbdmaKeyRegs = 5,
134 kdbdmaKeySystem = 6,
135 kdbdmaKeyDevice = 7,
136
137 kdbdmaIntNever = 0, /* default modifier*/
138 kdbdmaIntIfTrue = 1,
139 kdbdmaIntIfFalse = 2,
140 kdbdmaIntAlways = 3,
141
142 kdbdmaBranchNever = 0, /* default modifier*/
143 kdbdmaBranchIfTrue = 1,
144 kdbdmaBranchIfFalse = 2,
145 kdbdmaBranchAlways = 3,
146
147 kdbdmaWaitNever = 0, /* default modifier*/
148 kdbdmaWaitIfTrue = 1,
149 kdbdmaWaitIfFalse = 2,
150 kdbdmaWaitAlways = 3,
151
152 kdbdmaCommandMask = (long)0xFFFF0000,
153 kdbdmaReqCountMask = 0x0000FFFF
154 };
155
156
157 /* These constants define the DB-DMA channel command results.*/
158
159 enum {
160 /* result masks*/
161 kdbdmaStatusRun = kdbdmaRun << 16,
162 kdbdmaStatusPause = kdbdmaPause << 16,
163 kdbdmaStatusFlush = kdbdmaFlush << 16,
164 kdbdmaStatusWake = kdbdmaWake << 16,
165 kdbdmaStatusDead = kdbdmaDead << 16,
166 kdbdmaStatusActive = kdbdmaActive << 16,
167 kdbdmaStatusBt = kdbdmaBt << 16,
168 kdbdmaStatusS7 = kdbdmaS7 << 16,
169 kdbdmaStatusS6 = kdbdmaS6 << 16,
170 kdbdmaStatusS5 = kdbdmaS5 << 16,
171 kdbdmaStatusS4 = kdbdmaS4 << 16,
172 kdbdmaStatusS3 = kdbdmaS3 << 16,
173 kdbdmaStatusS2 = kdbdmaS2 << 16,
174 kdbdmaStatusS1 = kdbdmaS1 << 16,
175 kdbdmaStatusS0 = kdbdmaS0 << 16,
176 kdbdmaResCountMask = 0x0000FFFF,
177 kdbdmaXferStatusMask = 0xFFFF0000
178 };
179
180
181 /* These macros are are IODBDMAChannelRegisters accessor functions. */
182
183 #define IOSetDBDMAChannelRegister(registerSetPtr,field,value) \
184 OSWriteSwapInt32(registerSetPtr,offsetof(IODBDMAChannelRegisters,field),value)
185
186 #define IOGetDBDMAChannelRegister(registerSetPtr, field) \
187 OSReadSwapInt32(registerSetPtr,offsetof(IODBDMAChannelRegisters, field))
188
189
190 /* void IOSetDBDMAChannelControl (IODBDMAChannelRegisters *registerSetPtr, unsigned long ctlValue); */
191
192 #define IOSetDBDMAChannelControl(registerSetPtr,ctlValue) \
193 do { \
194 eieio(); \
195 IOSetDBDMAChannelRegister(registerSetPtr,channelControl,ctlValue); \
196 eieio(); \
197 } while(0)
198
199 /* unsigned long IOGetDBDMAChannelStatus (IODBDMAChannelRegisters *registerSetPtr); */
200
201 #define IOGetDBDMAChannelStatus(registerSetPtr) \
202 IOGetDBDMAChannelRegister(registerSetPtr,channelStatus)
203
204 /* unsigned long IOGetDBDMACommandPtr (IODBDMAChannelRegisters *registerSetPtr); */
205
206 #define IOGetDBDMACommandPtr(registerSetPtr) \
207 IOGetDBDMAChannelRegister(registerSetPtr,commandPtrLo)
208
209 /* void IOSetDBDMACommandPtr (IODBDMAChannelRegisters *registerSetPtr, unsigned long cclPtr); */
210
211 #define IOSetDBDMACommandPtr(registerSetPtr,cclPtr) \
212 do { \
213 IOSetDBDMAChannelRegister(registerSetPtr,commandPtrHi,0); \
214 eieio(); \
215 IOSetDBDMAChannelRegister(registerSetPtr,commandPtrLo,cclPtr); \
216 eieio(); \
217 } while(0)
218
219
220 /* unsigned long IOGetDBDMAInterruptSelect (IODBDMAChannelRegisters *registerSetPtr); */
221
222 #define IOGetDBDMAInterruptSelect(registerSetPtr) \
223 IOGetDBDMAChannelRegister(registerSetPtr,interruptSelect)
224
225 /* void IOSetDBDMAInterruptSelect (IODBDMAChannelRegisters *registerSetPtr, unsigned long intSelValue); */
226
227 #define IOSetDBDMAInterruptSelect(registerSetPtr,intSelValue) \
228 do { \
229 IOSetDBDMAChannelRegister(registerSetPtr,interruptSelect,intSelValue); \
230 eieio(); \
231 } while(0)
232
233 /* unsigned long IOGetDBDMABranchSelect (IODBDMAChannelRegisters *registerSetPtr); */
234
235 #define IOGetDBDMABranchSelect(registerSetPtr) \
236 IOGetDBDMAChannelRegister(registerSetPtr,branchSelect)
237
238 /* void IOSetDBDMABranchSelect (IODBDMAChannelRegisters *registerSetPtr, unsigned long braSelValue); */
239
240 #define IOSetDBDMABranchSelect(registerSetPtr,braSelValue) \
241 do { \
242 IOSetDBDMAChannelRegister(registerSetPtr,branchSelect,braSelValue); \
243 eieio(); \
244 } while(0)
245
246 /* unsigned long IOGetDBDMAWaitSelect (IODBDMAChannelRegisters *registerSetPtr); */
247
248 #define IOGetDBDMAWaitSelect(registerSetPtr) \
249 IOGetDBDMAChannelRegister(registerSetPtr,waitSelect)
250
251 /* void IOSetDBDMAWaitSelect (IODBDMAChannelRegisters *registerSetPtr, unsigned long waitSelValue); */
252
253 #define IOSetDBDMAWaitSelect(registerSetPtr,waitSelValue) \
254 do { \
255 IOSetDBDMAChannelRegister(registerSetPtr,waitSelect,waitSelValue); \
256 eieio(); \
257 } while(0)
258
259
260 /* These macros are IODBDMADescriptor accessor functions. */
261
262 #define IOSetDBDMADescriptor(descPtr,field,value) \
263 OSWriteSwapInt32( descPtr, offsetof( IODBDMADescriptor, field), value)
264
265 #define IOGetDBDMADescriptor(descPtr,field) \
266 OSReadSwapInt32( descPtr, offsetof( IODBDMADescriptor, field))
267
268 #define IOMakeDBDMAOperation(cmd,key,interrupt,branch,wait,count) \
269 ( ((cmd) << 28) | ((key) << 24) | ((interrupt) << 20) \
270 | ((branch) << 18) | ( (wait) << 16) | (count) )
271
272 /* void IOMakeDBDMADescriptor (IODBDMADescriptor *descPtr,
273 unsigned long cmd,
274 unsigned long key,
275 unsigned long interrupt,
276 unsigned long branch,
277 unsigned long wait,
278 unsigned long count,
279 unsigned long addr); */
280
281 #define IOMakeDBDMADescriptor(descPtr,cmd,key,interrupt,branch,wait,count,addr)\
282 do { \
283 IOSetDBDMADescriptor(descPtr, address, addr); \
284 IOSetDBDMADescriptor(descPtr, cmdDep, 0); \
285 IOSetDBDMADescriptor(descPtr, result, 0); \
286 eieio(); \
287 IOSetDBDMADescriptor(descPtr, operation, \
288 IOMakeDBDMAOperation(cmd,key,interrupt,branch,wait,count)); \
289 eieio(); \
290 } while(0)
291
292 /* void IOMakeDBDMADescriptorDep (IODBDMADescriptor *descPtr,
293 unsigned long cmd,
294 unsigned long key,
295 unsigned long interrupt,
296 unsigned long branch,
297 unsigned long wait,
298 unsigned long count,
299 unsigned long addr,
300 unsigned long dep); */
301
302 #define IOMakeDBDMADescriptorDep(descPtr,cmd,key,interrupt,branch,wait,count,addr,dep) \
303 do { \
304 IOSetDBDMADescriptor(descPtr, address, addr); \
305 IOSetDBDMADescriptor(descPtr, cmdDep, dep); \
306 IOSetDBDMADescriptor(descPtr, result, 0); \
307 eieio(); \
308 IOSetDBDMADescriptor(descPtr, operation, \
309 IOMakeDBDMAOperation(cmd, key, interrupt, branch, wait, count)); \
310 eieio(); \
311 } while(0)
312
313 /* Field accessors - NOTE: unsynchronized */
314
315 /* unsigned long IOGetDBDMAOperation (IODBDMADescriptor *descPtr) */
316
317 #define IOGetCCOperation(descPtr) \
318 IOGetDBDMADescriptor(descPtr,operation)
319
320 /* void IOSetCCOperation (IODBDMADescriptor *descPtr, unsigned long operationValue) */
321
322 #define IOSetCCOperation(descPtr,operationValue) \
323 IOSetDBDMADescriptor(descPtr,operation,operationValue)
324
325 /* unsigned long IOGetCCAddress (IODBDMADescriptor *descPtr) */
326
327 #define IOGetCCAddress(descPtr) \
328 IOGetDBDMADescriptor(descPtr,address)
329
330 /* void IOSetCCAddress (IODBDMADescriptor *descPtr, unsigned long addressValue) */
331
332 #define IOSetCCAddress(descPtr,addressValue) \
333 IOSetDBDMADescriptor(descPtr,address, addressValue)
334
335 /* unsigned long IOGetCCCmdDep (IODBDMADescriptor *descPtr) */
336
337 #define IOGetCCCmdDep(descPtr) \
338 IOGetDBDMADescriptor(descPtr,cmdDep)
339
340 /* void IOSetCCCmdDep (IODBDMADescriptor *descPtr, unsigned long cmdDepValue) */
341
342 #define IOSetCCCmdDep(descPtr,cmdDepValue) \
343 IOSetDBDMADescriptor(descPtr,cmdDep,cmdDepValue)
344
345 /* unsigned long IOGetCCResult (IODBDMADescriptor *descPtr) */
346
347 #define IOGetCCResult(descPtr) \
348 IOGetDBDMADescriptor(descPtr,result)
349
350 /* void IOSetCCResult (IODBDMADescriptor *descPtr, unsigned long resultValue) */
351
352 #define IOSetCCResult(descPtr,resultValue) \
353 IOSetDBDMADescriptor(descPtr,result,resultValue)
354
355
356 /* DBDMA routines */
357
358 extern void IODBDMAStart( volatile IODBDMAChannelRegisters *registerSetPtr, volatile IODBDMADescriptor *physicalDescPtr);
359 extern void IODBDMAStop( volatile IODBDMAChannelRegisters *registerSetPtr);
360 extern void IODBDMAFlush( volatile IODBDMAChannelRegisters *registerSetPtr);
361 extern void IODBDMAReset( volatile IODBDMAChannelRegisters *registerSetPtr);
362 extern void IODBDMAContinue( volatile IODBDMAChannelRegisters *registerSetPtr);
363 extern void IODBDMAPause( volatile IODBDMAChannelRegisters *registerSetPtr);
364
365 extern IOReturn IOAllocatePhysicallyContiguousMemory( unsigned int size, unsigned int options,
366 IOVirtualAddress * logical, IOPhysicalAddress * physical );
367 extern IOReturn IOFreePhysicallyContiguousMemory( IOVirtualAddress * logical, unsigned int size);
368
369 #endif /* !defined(_IODBDMA_H_) */