2 * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_OSREFERENCE_HEADER_START@
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
16 * Please obtain a copy of the License at
17 * http://www.opensource.apple.com/apsl/ and read it before using this
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.
28 * @APPLE_LICENSE_OSREFERENCE_HEADER_END@
31 * Copyright (c) 1997 Apple Computer, Inc.
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.
44 #include <IOKit/IOTypes.h>
45 #include <libkern/OSByteOrder.h>
48 /* DBDMA definitions */
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*/
62 volatile unsigned long reserved1
;
63 volatile unsigned long addressHi
; /* implementation optional*/
64 volatile unsigned long reserved2
[4];
65 volatile unsigned long unimplemented
[16];
67 /* This structure must remain fully padded to 256 bytes.*/
68 volatile unsigned long undefined
[32];
70 typedef struct IODBDMAChannelRegisters IODBDMAChannelRegisters
;
72 /* These constants define the DB-DMA channel control words and status flags.*/
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,
93 #define IOSetDBDMAChannelControlBits(mask) ( ((mask) | (mask) << 16) )
94 #define IOClearDBDMAChannelControlBits(mask) ( (mask) << 16)
97 /* This structure defines the DB-DMA channel command descriptor.*/
100 *** WARNING: Endian-ness issues must be considered when performing load/store! ***
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*/
109 typedef struct IODBDMADescriptor IODBDMADescriptor
;
111 /* These constants define the DB-DMA channel command operations and modifiers.*/
115 /* Command.cmd operations*/
116 kdbdmaOutputMore
= 0,
117 kdbdmaOutputLast
= 1,
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,
137 kdbdmaIntNever
= 0, /* default modifier*/
139 kdbdmaIntIfFalse
= 2,
142 kdbdmaBranchNever
= 0, /* default modifier*/
143 kdbdmaBranchIfTrue
= 1,
144 kdbdmaBranchIfFalse
= 2,
145 kdbdmaBranchAlways
= 3,
147 kdbdmaWaitNever
= 0, /* default modifier*/
148 kdbdmaWaitIfTrue
= 1,
149 kdbdmaWaitIfFalse
= 2,
150 kdbdmaWaitAlways
= 3,
152 kdbdmaCommandMask
= (long)0xFFFF0000,
153 kdbdmaReqCountMask
= 0x0000FFFF
157 /* These constants define the DB-DMA channel command results.*/
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
181 /* These macros are are IODBDMAChannelRegisters accessor functions. */
183 #define IOSetDBDMAChannelRegister(registerSetPtr,field,value) \
184 OSWriteSwapInt32(registerSetPtr,offsetof(IODBDMAChannelRegisters,field),value)
186 #define IOGetDBDMAChannelRegister(registerSetPtr, field) \
187 OSReadSwapInt32(registerSetPtr,offsetof(IODBDMAChannelRegisters, field))
190 /* void IOSetDBDMAChannelControl (IODBDMAChannelRegisters *registerSetPtr, unsigned long ctlValue); */
192 #define IOSetDBDMAChannelControl(registerSetPtr,ctlValue) \
195 IOSetDBDMAChannelRegister(registerSetPtr,channelControl,ctlValue); \
199 /* unsigned long IOGetDBDMAChannelStatus (IODBDMAChannelRegisters *registerSetPtr); */
201 #define IOGetDBDMAChannelStatus(registerSetPtr) \
202 IOGetDBDMAChannelRegister(registerSetPtr,channelStatus)
204 /* unsigned long IOGetDBDMACommandPtr (IODBDMAChannelRegisters *registerSetPtr); */
206 #define IOGetDBDMACommandPtr(registerSetPtr) \
207 IOGetDBDMAChannelRegister(registerSetPtr,commandPtrLo)
209 /* void IOSetDBDMACommandPtr (IODBDMAChannelRegisters *registerSetPtr, unsigned long cclPtr); */
211 #define IOSetDBDMACommandPtr(registerSetPtr,cclPtr) \
213 IOSetDBDMAChannelRegister(registerSetPtr,commandPtrHi,0); \
215 IOSetDBDMAChannelRegister(registerSetPtr,commandPtrLo,cclPtr); \
220 /* unsigned long IOGetDBDMAInterruptSelect (IODBDMAChannelRegisters *registerSetPtr); */
222 #define IOGetDBDMAInterruptSelect(registerSetPtr) \
223 IOGetDBDMAChannelRegister(registerSetPtr,interruptSelect)
225 /* void IOSetDBDMAInterruptSelect (IODBDMAChannelRegisters *registerSetPtr, unsigned long intSelValue); */
227 #define IOSetDBDMAInterruptSelect(registerSetPtr,intSelValue) \
229 IOSetDBDMAChannelRegister(registerSetPtr,interruptSelect,intSelValue); \
233 /* unsigned long IOGetDBDMABranchSelect (IODBDMAChannelRegisters *registerSetPtr); */
235 #define IOGetDBDMABranchSelect(registerSetPtr) \
236 IOGetDBDMAChannelRegister(registerSetPtr,branchSelect)
238 /* void IOSetDBDMABranchSelect (IODBDMAChannelRegisters *registerSetPtr, unsigned long braSelValue); */
240 #define IOSetDBDMABranchSelect(registerSetPtr,braSelValue) \
242 IOSetDBDMAChannelRegister(registerSetPtr,branchSelect,braSelValue); \
246 /* unsigned long IOGetDBDMAWaitSelect (IODBDMAChannelRegisters *registerSetPtr); */
248 #define IOGetDBDMAWaitSelect(registerSetPtr) \
249 IOGetDBDMAChannelRegister(registerSetPtr,waitSelect)
251 /* void IOSetDBDMAWaitSelect (IODBDMAChannelRegisters *registerSetPtr, unsigned long waitSelValue); */
253 #define IOSetDBDMAWaitSelect(registerSetPtr,waitSelValue) \
255 IOSetDBDMAChannelRegister(registerSetPtr,waitSelect,waitSelValue); \
260 /* These macros are IODBDMADescriptor accessor functions. */
262 #define IOSetDBDMADescriptor(descPtr,field,value) \
263 OSWriteSwapInt32( descPtr, offsetof( IODBDMADescriptor, field), value)
265 #define IOGetDBDMADescriptor(descPtr,field) \
266 OSReadSwapInt32( descPtr, offsetof( IODBDMADescriptor, field))
268 #define IOMakeDBDMAOperation(cmd,key,interrupt,branch,wait,count) \
269 ( ((cmd) << 28) | ((key) << 24) | ((interrupt) << 20) \
270 | ((branch) << 18) | ( (wait) << 16) | (count) )
272 /* void IOMakeDBDMADescriptor (IODBDMADescriptor *descPtr,
275 unsigned long interrupt,
276 unsigned long branch,
279 unsigned long addr); */
281 #define IOMakeDBDMADescriptor(descPtr,cmd,key,interrupt,branch,wait,count,addr)\
283 IOSetDBDMADescriptor(descPtr, address, addr); \
284 IOSetDBDMADescriptor(descPtr, cmdDep, 0); \
285 IOSetDBDMADescriptor(descPtr, result, 0); \
287 IOSetDBDMADescriptor(descPtr, operation, \
288 IOMakeDBDMAOperation(cmd,key,interrupt,branch,wait,count)); \
292 /* void IOMakeDBDMADescriptorDep (IODBDMADescriptor *descPtr,
295 unsigned long interrupt,
296 unsigned long branch,
300 unsigned long dep); */
302 #define IOMakeDBDMADescriptorDep(descPtr,cmd,key,interrupt,branch,wait,count,addr,dep) \
304 IOSetDBDMADescriptor(descPtr, address, addr); \
305 IOSetDBDMADescriptor(descPtr, cmdDep, dep); \
306 IOSetDBDMADescriptor(descPtr, result, 0); \
308 IOSetDBDMADescriptor(descPtr, operation, \
309 IOMakeDBDMAOperation(cmd, key, interrupt, branch, wait, count)); \
313 /* Field accessors - NOTE: unsynchronized */
315 /* unsigned long IOGetDBDMAOperation (IODBDMADescriptor *descPtr) */
317 #define IOGetCCOperation(descPtr) \
318 IOGetDBDMADescriptor(descPtr,operation)
320 /* void IOSetCCOperation (IODBDMADescriptor *descPtr, unsigned long operationValue) */
322 #define IOSetCCOperation(descPtr,operationValue) \
323 IOSetDBDMADescriptor(descPtr,operation,operationValue)
325 /* unsigned long IOGetCCAddress (IODBDMADescriptor *descPtr) */
327 #define IOGetCCAddress(descPtr) \
328 IOGetDBDMADescriptor(descPtr,address)
330 /* void IOSetCCAddress (IODBDMADescriptor *descPtr, unsigned long addressValue) */
332 #define IOSetCCAddress(descPtr,addressValue) \
333 IOSetDBDMADescriptor(descPtr,address, addressValue)
335 /* unsigned long IOGetCCCmdDep (IODBDMADescriptor *descPtr) */
337 #define IOGetCCCmdDep(descPtr) \
338 IOGetDBDMADescriptor(descPtr,cmdDep)
340 /* void IOSetCCCmdDep (IODBDMADescriptor *descPtr, unsigned long cmdDepValue) */
342 #define IOSetCCCmdDep(descPtr,cmdDepValue) \
343 IOSetDBDMADescriptor(descPtr,cmdDep,cmdDepValue)
345 /* unsigned long IOGetCCResult (IODBDMADescriptor *descPtr) */
347 #define IOGetCCResult(descPtr) \
348 IOGetDBDMADescriptor(descPtr,result)
350 /* void IOSetCCResult (IODBDMADescriptor *descPtr, unsigned long resultValue) */
352 #define IOSetCCResult(descPtr,resultValue) \
353 IOSetDBDMADescriptor(descPtr,result,resultValue)
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
);
365 extern IOReturn
IOAllocatePhysicallyContiguousMemory( unsigned int size
, unsigned int options
,
366 IOVirtualAddress
* logical
, IOPhysicalAddress
* physical
);
367 extern IOReturn
IOFreePhysicallyContiguousMemory( IOVirtualAddress
* logical
, unsigned int size
);
369 #endif /* !defined(_IODBDMA_H_) */