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