Root/
Source at commit 2920 created 5 years 9 months ago. By ifabio, typo | |
---|---|
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 | ␊ |
48 | struct 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 | };␊ |
68 | typedef struct IODBDMAChannelRegisters IODBDMAChannelRegisters;␊ |
69 | ␊ |
70 | /* These constants define the DB-DMA channel control words and status flags.*/␊ |
71 | ␊ |
72 | enum {␊ |
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 | ␊ |
101 | struct 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 | };␊ |
107 | typedef struct IODBDMADescriptor IODBDMADescriptor;␊ |
108 | ␊ |
109 | /* These constants define the DB-DMA channel command operations and modifiers.*/␊ |
110 | ␊ |
111 | ␊ |
112 | enum {␊ |
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,␊ |
121 | ␉kdbdmaStop␉␉= 7␊ |
122 | };␊ |
123 | ␊ |
124 | ␊ |
125 | enum {␊ |
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 | ␊ |
157 | enum {␊ |
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)␉\␊ |
182 | OSWriteSwapInt32(registerSetPtr,offsetof(IODBDMAChannelRegisters,field),value)␊ |
183 | ␊ |
184 | #define IOGetDBDMAChannelRegister(registerSetPtr, field)␉\␊ |
185 | OSReadSwapInt32(registerSetPtr,offsetof(IODBDMAChannelRegisters, field))␊ |
186 | ␊ |
187 | ␊ |
188 | /* ␉void IOSetDBDMAChannelControl (IODBDMAChannelRegisters *registerSetPtr, unsigned long ctlValue); */␊ |
189 | ␊ |
190 | #define IOSetDBDMAChannelControl(registerSetPtr,ctlValue)␉␉\␊ |
191 | do {␉␉␉␉␉␉␉␉␉\␊ |
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)␉␉␉\␊ |
210 | do {␉␉␉␉␉␉␉␉␉\␊ |
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)␉␉ \␊ |
226 | do {␉␉␉␉␉␉␉␉␉ \␊ |
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)␉␉\␊ |
239 | do {␉␉␉␉␉␉␉␉␉\␊ |
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)␉␉\␊ |
252 | do {␉␉␉␉␉␉␉␉␉\␊ |
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)␉␉\␊ |
261 | OSWriteSwapInt32( descPtr, offsetof( IODBDMADescriptor, field), value)␊ |
262 | ␊ |
263 | #define IOGetDBDMADescriptor(descPtr,field)␉\␊ |
264 | OSReadSwapInt32( 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)\␊ |
280 | do {␉␉␉␉␉␉␉␉␉ \␊ |
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) \␊ |
301 | do {␉␉␉␉␉␉␉␉␉ \␊ |
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 | ␊ |
356 | extern void␉IODBDMAStart( volatile IODBDMAChannelRegisters *registerSetPtr, volatile IODBDMADescriptor *physicalDescPtr);␊ |
357 | extern void␉IODBDMAStop( volatile IODBDMAChannelRegisters *registerSetPtr);␊ |
358 | extern void␉IODBDMAFlush( volatile IODBDMAChannelRegisters *registerSetPtr);␊ |
359 | extern void␉IODBDMAReset( volatile IODBDMAChannelRegisters *registerSetPtr);␊ |
360 | extern void␉IODBDMAContinue( volatile IODBDMAChannelRegisters *registerSetPtr);␊ |
361 | extern void␉IODBDMAPause( volatile IODBDMAChannelRegisters *registerSetPtr);␊ |
362 | ␊ |
363 | extern IOReturn␉IOAllocatePhysicallyContiguousMemory( unsigned int size, unsigned int options,␊ |
364 | ␉␉␉␉ IOVirtualAddress * logical, IOPhysicalAddress * physical );␊ |
365 | extern IOReturn IOFreePhysicallyContiguousMemory( IOVirtualAddress * logical, unsigned int size);␊ |
366 | ␊ |
367 | #endif /* !defined(_IODBDMA_H_) */␊ |
368 |