2 * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 1.1 (the
8 * "License"). You may not use this file except in compliance with the
9 * License. Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17 * License for the specific language governing rights and limitations
20 * @APPLE_LICENSE_HEADER_END@
23 * Copyright (c) 1997 Apple Computer, Inc.
28 * Simon Douglas 10 Nov 97
29 * - first checked in, mostly from MacOS DBDMA.i, machdep/ppc/dbdma.h
30 * but use byte reverse ops.
36 #include <IOKit/IOTypes.h>
37 #include <libkern/OSByteOrder.h>
40 /* DBDMA definitions */
42 struct IODBDMAChannelRegisters
{
43 volatile unsigned long channelControl
;
44 volatile unsigned long channelStatus
;
45 volatile unsigned long commandPtrHi
; /* implementation optional*/
46 volatile unsigned long commandPtrLo
;
47 volatile unsigned long interruptSelect
; /* implementation optional*/
48 volatile unsigned long branchSelect
; /* implementation optional*/
49 volatile unsigned long waitSelect
; /* implementation optional*/
50 volatile unsigned long transferModes
; /* implementation optional*/
51 volatile unsigned long data2PtrHi
; /* implementation optional*/
52 volatile unsigned long data2PtrLo
; /* implementation optional*/
54 volatile unsigned long reserved1
;
55 volatile unsigned long addressHi
; /* implementation optional*/
56 volatile unsigned long reserved2
[4];
57 volatile unsigned long unimplemented
[16];
59 /* This structure must remain fully padded to 256 bytes.*/
60 volatile unsigned long undefined
[32];
62 typedef struct IODBDMAChannelRegisters IODBDMAChannelRegisters
;
64 /* These constants define the DB-DMA channel control words and status flags.*/
67 kdbdmaRun
= 0x00008000,
68 kdbdmaPause
= 0x00004000,
69 kdbdmaFlush
= 0x00002000,
70 kdbdmaWake
= 0x00001000,
71 kdbdmaDead
= 0x00000800,
72 kdbdmaActive
= 0x00000400,
73 kdbdmaBt
= 0x00000100,
74 kdbdmaS7
= 0x00000080,
75 kdbdmaS6
= 0x00000040,
76 kdbdmaS5
= 0x00000020,
77 kdbdmaS4
= 0x00000010,
78 kdbdmaS3
= 0x00000008,
79 kdbdmaS2
= 0x00000004,
80 kdbdmaS1
= 0x00000002,
85 #define IOSetDBDMAChannelControlBits(mask) ( ((mask) | (mask) << 16) )
86 #define IOClearDBDMAChannelControlBits(mask) ( (mask) << 16)
89 /* This structure defines the DB-DMA channel command descriptor.*/
92 *** WARNING: Endian-ness issues must be considered when performing load/store! ***
95 struct IODBDMADescriptor
{
96 unsigned long operation
; /* cmd || key || i || b || w || reqCount*/
97 unsigned long address
;
98 volatile unsigned long cmdDep
;
99 volatile unsigned long result
; /* xferStatus || resCount*/
101 typedef struct IODBDMADescriptor IODBDMADescriptor
;
103 /* These constants define the DB-DMA channel command operations and modifiers.*/
107 /* Command.cmd operations*/
108 kdbdmaOutputMore
= 0,
109 kdbdmaOutputLast
= 1,
120 /* Command.key modifiers (choose one for INPUT, OUTPUT, LOAD, and STORE)*/
121 kdbdmaKeyStream0
= 0, /* default modifier*/
122 kdbdmaKeyStream1
= 1,
123 kdbdmaKeyStream2
= 2,
124 kdbdmaKeyStream3
= 3,
129 kdbdmaIntNever
= 0, /* default modifier*/
131 kdbdmaIntIfFalse
= 2,
134 kdbdmaBranchNever
= 0, /* default modifier*/
135 kdbdmaBranchIfTrue
= 1,
136 kdbdmaBranchIfFalse
= 2,
137 kdbdmaBranchAlways
= 3,
139 kdbdmaWaitNever
= 0, /* default modifier*/
140 kdbdmaWaitIfTrue
= 1,
141 kdbdmaWaitIfFalse
= 2,
142 kdbdmaWaitAlways
= 3,
144 kdbdmaCommandMask
= (long)0xFFFF0000,
145 kdbdmaReqCountMask
= 0x0000FFFF
149 /* These constants define the DB-DMA channel command results.*/
153 kdbdmaStatusRun
= kdbdmaRun
<< 16,
154 kdbdmaStatusPause
= kdbdmaPause
<< 16,
155 kdbdmaStatusFlush
= kdbdmaFlush
<< 16,
156 kdbdmaStatusWake
= kdbdmaWake
<< 16,
157 kdbdmaStatusDead
= kdbdmaDead
<< 16,
158 kdbdmaStatusActive
= kdbdmaActive
<< 16,
159 kdbdmaStatusBt
= kdbdmaBt
<< 16,
160 kdbdmaStatusS7
= kdbdmaS7
<< 16,
161 kdbdmaStatusS6
= kdbdmaS6
<< 16,
162 kdbdmaStatusS5
= kdbdmaS5
<< 16,
163 kdbdmaStatusS4
= kdbdmaS4
<< 16,
164 kdbdmaStatusS3
= kdbdmaS3
<< 16,
165 kdbdmaStatusS2
= kdbdmaS2
<< 16,
166 kdbdmaStatusS1
= kdbdmaS1
<< 16,
167 kdbdmaStatusS0
= kdbdmaS0
<< 16,
168 kdbdmaResCountMask
= 0x0000FFFF,
169 kdbdmaXferStatusMask
= 0xFFFF0000
173 /* These macros are are IODBDMAChannelRegisters accessor functions. */
175 #define IOSetDBDMAChannelRegister(registerSetPtr,field,value) \
176 OSWriteSwapInt32(registerSetPtr,offsetof(IODBDMAChannelRegisters,field),value)
178 #define IOGetDBDMAChannelRegister(registerSetPtr, field) \
179 OSReadSwapInt32(registerSetPtr,offsetof(IODBDMAChannelRegisters, field))
182 /* void IOSetDBDMAChannelControl (IODBDMAChannelRegisters *registerSetPtr, unsigned long ctlValue); */
184 #define IOSetDBDMAChannelControl(registerSetPtr,ctlValue) \
187 IOSetDBDMAChannelRegister(registerSetPtr,channelControl,ctlValue); \
191 /* unsigned long IOGetDBDMAChannelStatus (IODBDMAChannelRegisters *registerSetPtr); */
193 #define IOGetDBDMAChannelStatus(registerSetPtr) \
194 IOGetDBDMAChannelRegister(registerSetPtr,channelStatus)
196 /* unsigned long IOGetDBDMACommandPtr (IODBDMAChannelRegisters *registerSetPtr); */
198 #define IOGetDBDMACommandPtr(registerSetPtr) \
199 IOGetDBDMAChannelRegister(registerSetPtr,commandPtrLo)
201 /* void IOSetDBDMACommandPtr (IODBDMAChannelRegisters *registerSetPtr, unsigned long cclPtr); */
203 #define IOSetDBDMACommandPtr(registerSetPtr,cclPtr) \
205 IOSetDBDMAChannelRegister(registerSetPtr,commandPtrHi,0); \
207 IOSetDBDMAChannelRegister(registerSetPtr,commandPtrLo,cclPtr); \
212 /* unsigned long IOGetDBDMAInterruptSelect (IODBDMAChannelRegisters *registerSetPtr); */
214 #define IOGetDBDMAInterruptSelect(registerSetPtr) \
215 IOGetDBDMAChannelRegister(registerSetPtr,interruptSelect)
217 /* void IOSetDBDMAInterruptSelect (IODBDMAChannelRegisters *registerSetPtr, unsigned long intSelValue); */
219 #define IOSetDBDMAInterruptSelect(registerSetPtr,intSelValue) \
221 IOSetDBDMAChannelRegister(registerSetPtr,interruptSelect,intSelValue); \
225 /* unsigned long IOGetDBDMABranchSelect (IODBDMAChannelRegisters *registerSetPtr); */
227 #define IOGetDBDMABranchSelect(registerSetPtr) \
228 IOGetDBDMAChannelRegister(registerSetPtr,branchSelect)
230 /* void IOSetDBDMABranchSelect (IODBDMAChannelRegisters *registerSetPtr, unsigned long braSelValue); */
232 #define IOSetDBDMABranchSelect(registerSetPtr,braSelValue) \
234 IOSetDBDMAChannelRegister(registerSetPtr,branchSelect,braSelValue); \
238 /* unsigned long IOGetDBDMAWaitSelect (IODBDMAChannelRegisters *registerSetPtr); */
240 #define IOGetDBDMAWaitSelect(registerSetPtr) \
241 IOGetDBDMAChannelRegister(registerSetPtr,waitSelect)
243 /* void IOSetDBDMAWaitSelect (IODBDMAChannelRegisters *registerSetPtr, unsigned long waitSelValue); */
245 #define IOSetDBDMAWaitSelect(registerSetPtr,waitSelValue) \
247 IOSetDBDMAChannelRegister(registerSetPtr,waitSelect,waitSelValue); \
252 /* These macros are IODBDMADescriptor accessor functions. */
254 #define IOSetDBDMADescriptor(descPtr,field,value) \
255 OSWriteSwapInt32( descPtr, offsetof( IODBDMADescriptor, field), value)
257 #define IOGetDBDMADescriptor(descPtr,field) \
258 OSReadSwapInt32( descPtr, offsetof( IODBDMADescriptor, field))
260 #define IOMakeDBDMAOperation(cmd,key,interrupt,branch,wait,count) \
261 ( ((cmd) << 28) | ((key) << 24) | ((interrupt) << 20) \
262 | ((branch) << 18) | ( (wait) << 16) | (count) )
264 /* void IOMakeDBDMADescriptor (IODBDMADescriptor *descPtr,
267 unsigned long interrupt,
268 unsigned long branch,
271 unsigned long addr); */
273 #define IOMakeDBDMADescriptor(descPtr,cmd,key,interrupt,branch,wait,count,addr)\
275 IOSetDBDMADescriptor(descPtr, address, addr); \
276 IOSetDBDMADescriptor(descPtr, cmdDep, 0); \
277 IOSetDBDMADescriptor(descPtr, result, 0); \
279 IOSetDBDMADescriptor(descPtr, operation, \
280 IOMakeDBDMAOperation(cmd,key,interrupt,branch,wait,count)); \
284 /* void IOMakeDBDMADescriptorDep (IODBDMADescriptor *descPtr,
287 unsigned long interrupt,
288 unsigned long branch,
292 unsigned long dep); */
294 #define IOMakeDBDMADescriptorDep(descPtr,cmd,key,interrupt,branch,wait,count,addr,dep) \
296 IOSetDBDMADescriptor(descPtr, address, addr); \
297 IOSetDBDMADescriptor(descPtr, cmdDep, dep); \
298 IOSetDBDMADescriptor(descPtr, result, 0); \
300 IOSetDBDMADescriptor(descPtr, operation, \
301 IOMakeDBDMAOperation(cmd, key, interrupt, branch, wait, count)); \
305 /* Field accessors - NOTE: unsynchronized */
307 /* unsigned long IOGetDBDMAOperation (IODBDMADescriptor *descPtr) */
309 #define IOGetCCOperation(descPtr) \
310 IOGetDBDMADescriptor(descPtr,operation)
312 /* void IOSetCCOperation (IODBDMADescriptor *descPtr, unsigned long operationValue) */
314 #define IOSetCCOperation(descPtr,operationValue) \
315 IOSetDBDMADescriptor(descPtr,operation,operationValue)
317 /* unsigned long IOGetCCAddress (IODBDMADescriptor *descPtr) */
319 #define IOGetCCAddress(descPtr) \
320 IOGetDBDMADescriptor(descPtr,address)
322 /* void IOSetCCAddress (IODBDMADescriptor *descPtr, unsigned long addressValue) */
324 #define IOSetCCAddress(descPtr,addressValue) \
325 IOSetDBDMADescriptor(descPtr,address, addressValue)
327 /* unsigned long IOGetCCCmdDep (IODBDMADescriptor *descPtr) */
329 #define IOGetCCCmdDep(descPtr) \
330 IOGetDBDMADescriptor(descPtr,cmdDep)
332 /* void IOSetCCCmdDep (IODBDMADescriptor *descPtr, unsigned long cmdDepValue) */
334 #define IOSetCCCmdDep(descPtr,cmdDepValue) \
335 IOSetDBDMADescriptor(descPtr,cmdDep,cmdDepValue)
337 /* unsigned long IOGetCCResult (IODBDMADescriptor *descPtr) */
339 #define IOGetCCResult(descPtr) \
340 IOGetDBDMADescriptor(descPtr,result)
342 /* void IOSetCCResult (IODBDMADescriptor *descPtr, unsigned long resultValue) */
344 #define IOSetCCResult(descPtr,resultValue) \
345 IOSetDBDMADescriptor(descPtr,result,resultValue)
350 extern void IODBDMAStart( volatile IODBDMAChannelRegisters
*registerSetPtr
, volatile IODBDMADescriptor
*physicalDescPtr
);
351 extern void IODBDMAStop( volatile IODBDMAChannelRegisters
*registerSetPtr
);
352 extern void IODBDMAFlush( volatile IODBDMAChannelRegisters
*registerSetPtr
);
353 extern void IODBDMAReset( volatile IODBDMAChannelRegisters
*registerSetPtr
);
354 extern void IODBDMAContinue( volatile IODBDMAChannelRegisters
*registerSetPtr
);
355 extern void IODBDMAPause( volatile IODBDMAChannelRegisters
*registerSetPtr
);
357 extern IOReturn
IOAllocatePhysicallyContiguousMemory( unsigned int size
, unsigned int options
,
358 IOVirtualAddress
* logical
, IOPhysicalAddress
* physical
);
359 extern IOReturn
IOFreePhysicallyContiguousMemory( IOVirtualAddress
* logical
, unsigned int size
);
361 #endif /* !defined(_IODBDMA_H_) */