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 {
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,
121	kdbdmaStop		= 7
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_) */
368