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