Chameleon

Chameleon Svn Source Tree

Root/branches/mozodojo/i386/include/IOKit/ppc/IODBDMA.h

1/*
2 * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_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 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.
14 *
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
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
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.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
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>
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 {
73kdbdmaRun= 0x00008000,
74kdbdmaPause= 0x00004000,
75kdbdmaFlush= 0x00002000,
76kdbdmaWake= 0x00001000,
77kdbdmaDead= 0x00000800,
78kdbdmaActive= 0x00000400,
79kdbdmaBt= 0x00000100,
80kdbdmaS7= 0x00000080,
81kdbdmaS6= 0x00000040,
82kdbdmaS5= 0x00000020,
83kdbdmaS4= 0x00000010,
84kdbdmaS3= 0x00000008,
85kdbdmaS2= 0x00000004,
86kdbdmaS1= 0x00000002,
87kdbdmaS0= 0x00000001
88};
89
90
91#defineIOSetDBDMAChannelControlBits(mask)( ((mask) | (mask) << 16) )
92#defineIOClearDBDMAChannelControlBits(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 {
102unsigned long operation; /* cmd || key || i || b || w || reqCount*/
103unsigned long address;
104volatile unsigned long cmdDep;
105volatile 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*/
114kdbdmaOutputMore= 0,
115kdbdmaOutputLast= 1,
116kdbdmaInputMore= 2,
117kdbdmaInputLast= 3,
118kdbdmaStoreQuad= 4,
119kdbdmaLoadQuad= 5,
120kdbdmaNop= 6,
121kdbdmaStop= 7
122};
123
124
125enum {
126/* Command.key modifiers (choose one for INPUT, OUTPUT, LOAD, and STORE)*/
127kdbdmaKeyStream0= 0,/* default modifier*/
128kdbdmaKeyStream1= 1,
129kdbdmaKeyStream2= 2,
130kdbdmaKeyStream3= 3,
131kdbdmaKeyRegs= 5,
132kdbdmaKeySystem= 6,
133kdbdmaKeyDevice= 7,
134
135kdbdmaIntNever= 0,/* default modifier*/
136kdbdmaIntIfTrue= 1,
137kdbdmaIntIfFalse= 2,
138kdbdmaIntAlways= 3,
139
140kdbdmaBranchNever= 0,/* default modifier*/
141kdbdmaBranchIfTrue= 1,
142kdbdmaBranchIfFalse= 2,
143kdbdmaBranchAlways= 3,
144
145kdbdmaWaitNever= 0,/* default modifier*/
146kdbdmaWaitIfTrue= 1,
147kdbdmaWaitIfFalse= 2,
148kdbdmaWaitAlways= 3,
149
150kdbdmaCommandMask= (long)0xFFFF0000,
151kdbdmaReqCountMask= 0x0000FFFF
152};
153
154
155/* These constants define the DB-DMA channel command results.*/
156
157enum {
158/* result masks*/
159kdbdmaStatusRun= kdbdmaRun << 16,
160kdbdmaStatusPause= kdbdmaPause << 16,
161kdbdmaStatusFlush= kdbdmaFlush << 16,
162kdbdmaStatusWake= kdbdmaWake << 16,
163kdbdmaStatusDead= kdbdmaDead << 16,
164kdbdmaStatusActive= kdbdmaActive << 16,
165kdbdmaStatusBt= kdbdmaBt << 16,
166kdbdmaStatusS7= kdbdmaS7 << 16,
167kdbdmaStatusS6= kdbdmaS6 << 16,
168kdbdmaStatusS5= kdbdmaS5 << 16,
169kdbdmaStatusS4= kdbdmaS4 << 16,
170kdbdmaStatusS3= kdbdmaS3 << 16,
171kdbdmaStatusS2= kdbdmaS2 << 16,
172kdbdmaStatusS1= kdbdmaS1 << 16,
173kdbdmaStatusS0= kdbdmaS0 << 16,
174kdbdmaResCountMask= 0x0000FFFF,
175kdbdmaXferStatusMask= 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)\
200IOGetDBDMAChannelRegister(registerSetPtr,channelStatus)
201
202/* unsigned long IOGetDBDMACommandPtr (IODBDMAChannelRegisters *registerSetPtr); */
203
204#define IOGetDBDMACommandPtr(registerSetPtr)\
205IOGetDBDMAChannelRegister(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)\
234IOGetDBDMAChannelRegister(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)\
247IOGetDBDMAChannelRegister(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#defineIOMakeDBDMAOperation(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,
271unsigned long cmd,
272unsigned long key,
273unsigned long interrupt,
274unsigned long branch,
275unsigned long wait,
276unsigned long count,
277unsigned 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,
291unsigned long cmd,
292unsigned long key,
293unsigned long interrupt,
294unsigned long branch,
295unsigned long wait,
296unsigned long count,
297unsigned long addr,
298unsigned 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)\
316IOGetDBDMADescriptor(descPtr,operation)
317
318/* void IOSetCCOperation (IODBDMADescriptor *descPtr, unsigned long operationValue) */
319
320#define IOSetCCOperation(descPtr,operationValue)\
321IOSetDBDMADescriptor(descPtr,operation,operationValue)
322
323/* unsigned long IOGetCCAddress (IODBDMADescriptor *descPtr) */
324
325#define IOGetCCAddress(descPtr)\
326IOGetDBDMADescriptor(descPtr,address)
327
328/* void IOSetCCAddress (IODBDMADescriptor *descPtr, unsigned long addressValue) */
329
330#define IOSetCCAddress(descPtr,addressValue)\
331IOSetDBDMADescriptor(descPtr,address, addressValue)
332
333/* unsigned long IOGetCCCmdDep (IODBDMADescriptor *descPtr) */
334
335#define IOGetCCCmdDep(descPtr)\
336IOGetDBDMADescriptor(descPtr,cmdDep)
337
338/* void IOSetCCCmdDep (IODBDMADescriptor *descPtr, unsigned long cmdDepValue) */
339
340#define IOSetCCCmdDep(descPtr,cmdDepValue)\
341IOSetDBDMADescriptor(descPtr,cmdDep,cmdDepValue)
342
343/* unsigned long IOGetCCResult (IODBDMADescriptor *descPtr) */
344
345#define IOGetCCResult(descPtr)\
346IOGetDBDMADescriptor(descPtr,result)
347
348/* void IOSetCCResult (IODBDMADescriptor *descPtr, unsigned long resultValue) */
349
350#define IOSetCCResult(descPtr,resultValue)\
351IOSetDBDMADescriptor(descPtr,result,resultValue)
352
353
354/* DBDMA routines */
355
356extern voidIODBDMAStart( volatile IODBDMAChannelRegisters *registerSetPtr, volatile IODBDMADescriptor *physicalDescPtr);
357extern voidIODBDMAStop( volatile IODBDMAChannelRegisters *registerSetPtr);
358extern voidIODBDMAFlush( volatile IODBDMAChannelRegisters *registerSetPtr);
359extern voidIODBDMAReset( volatile IODBDMAChannelRegisters *registerSetPtr);
360extern voidIODBDMAContinue( volatile IODBDMAChannelRegisters *registerSetPtr);
361extern voidIODBDMAPause( volatile IODBDMAChannelRegisters *registerSetPtr);
362
363extern IOReturnIOAllocatePhysicallyContiguousMemory( 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_) */
368

Archive Download this file

Revision: 1232