1/*
2*  IOFWDCL.h
3*  IOFireWireFamily
4*
5*  Created by Niels on Fri Feb 21 2003.
6*  Copyright (c) 2003 Apple Computer, Inc. All rights reserved.
7*
8*	$Log: IOFWDCL.h,v $
9*	Revision 1.20  2008/11/14 00:17:11  arulchan
10*	fix for rdar://5939334
11*
12*	Revision 1.19  2007/03/14 01:01:12  collin
13*	*** empty log message ***
14*
15*	Revision 1.18  2007/01/26 23:42:19  ayanowit
16*	another fix for nuDCL rosetta mode
17*
18*	Revision 1.17  2006/08/16 01:41:41  collin
19*	*** empty log message ***
20*
21*	Revision 1.16  2006/03/09 22:26:46  niels
22*	fix 4466075
23*
24*	Revision 1.15  2006/03/09 22:20:14  niels
25*	fix 4466075
26*
27*	Revision 1.14  2006/03/09 21:40:44  niels
28*	fix 4466075
29*
30*	Revision 1.13  2006/02/09 00:21:50  niels
31*	merge chardonnay branch to tot
32*
33*	Revision 1.12.4.1  2005/08/06 01:31:31  collin
34*	*** empty log message ***
35*
36*	Revision 1.12  2005/02/18 03:19:03  niels
37*	fix isight
38*
39*	Revision 1.11  2004/04/19 21:51:49  niels
40*	*** empty log message ***
41*
42*	Revision 1.10  2004/03/25 00:00:23  niels
43*	fix panic allocating large physical address spaces
44*
45*	Revision 1.9  2003/10/31 02:40:58  niels
46*	*** empty log message ***
47*
48*	Revision 1.8  2003/08/26 05:11:21  niels
49*	*** empty log message ***
50*
51*	Revision 1.7  2003/08/25 08:39:15  niels
52*	*** empty log message ***
53*
54*	Revision 1.6  2003/08/18 23:18:14  niels
55*	*** empty log message ***
56*
57*	Revision 1.5  2003/08/08 22:30:32  niels
58*	*** empty log message ***
59*
60*	Revision 1.4  2003/07/30 05:22:14  niels
61*	*** empty log message ***
62*
63*	Revision 1.3  2003/07/29 22:49:22  niels
64*	*** empty log message ***
65*
66*	Revision 1.2  2003/07/21 06:52:58  niels
67*	merge isoch to TOT
68*
69*	Revision 1.1.2.5  2003/07/18 00:17:41  niels
70*	*** empty log message ***
71*
72*	Revision 1.1.2.4  2003/07/14 22:08:53  niels
73*	*** empty log message ***
74*
75*	Revision 1.1.2.3  2003/07/11 18:15:33  niels
76*	*** empty log message ***
77*
78*	Revision 1.1.2.2  2003/07/03 22:10:24  niels
79*	fix iidc/dv rcv
80*
81*	Revision 1.1.2.1  2003/07/01 20:54:06  niels
82*	isoch merge
83*
84*/
85
86#import <IOKit/firewire/IOFireWireFamilyCommon.h>
87
88#import <libkern/c++/OSObject.h>
89#import <libkern/c++/OSSet.h>
90#import <IOKit/IOTypes.h>
91
92class IODCLProgram ;
93class OSIterator ;
94class IOFireWireLink ;
95class IOMemoryMap ;
96
97/*! @class IOFWDCL
98*/
99
100class IOFWDCL : public OSObject
101{
102	OSDeclareAbstractStructors( IOFWDCL ) ;
103
104	public:
105
106		typedef void (*Callback)( void * refcon ) ;
107
108		enum
109		{
110			kDynamic					= BIT(1)//kNuDCLDynamic,
111			,kUpdateBeforeCallback		= BIT(2)//kNuDCLUpdateBeforeCallback
112			,kUser						= BIT(18) // kNuDCLUser
113			,kBigEndianUpdates			= BIT(19) // NOTE: Don't change this without making similar change to IOFireWireLib's NuDCL::Export(...)!
114		} ;
115
116		class InternalData
117		{
118			public:
119
120				IOFWDCL *			lastBranch ;
121		} ;
122
123	protected:
124
125		IOFWDCL*			fBranch ;
126		Callback			fCallback ;
127		volatile UInt32 *	fTimeStampPtr ;
128		UInt32				fRangeCount ;
129		IOVirtualRange *	fRanges ;
130		OSSet*				fUpdateList ;
131		OSIterator *		fUpdateIterator ;
132		volatile UInt32 *	fUserStatusPtr ;
133		void*				fRefcon ;
134		UInt32				fFlags ;
135
136		InternalData *		fLoLevel ;
137
138	public:
139
140		//
141		// IOFWDCL public API:
142		//
143
144		virtual bool		initWithRanges (
145											OSSet * 				updateSet,
146											unsigned 				rangesCount = 0,
147											IOVirtualRange 			ranges [] = NULL ) ;
148
149		void				setBranch( IOFWDCL* branch ) ;
150		IOFWDCL*			getBranch()	const ;
151		void				setTimeStampPtr ( UInt32* timeStampPtr ) ;
152		UInt32*				getTimeStampPtr () const ;
153		void				setCallback( Callback callback ) ;
154		Callback			getCallback() const ;
155		void				setStatusPtr( UInt32* statusPtr ) ;
156		UInt32*				getStatusPtr() const ;
157		void				setRefcon( void * refcon ) ;
158		void *				getRefcon() const ;
159		const OSSet*		getUpdateList() const ;
160
161		virtual IOReturn	addRange ( IOVirtualRange& range ) ;
162		virtual IOReturn	setRanges ( UInt32 numRanges, IOVirtualRange ranges[] ) ;
163		virtual UInt32		getRanges( UInt32 maxRanges, IOVirtualRange ranges[] ) const ;
164		virtual UInt32		countRanges() ;
165		virtual IOReturn	getSpan( IOVirtualRange& result ) const ;
166		virtual IOByteCount	getSize() const ;
167		IOReturn			appendUpdateList( IOFWDCL* updateDCL ) ;
168		IOReturn			setUpdateList( OSSet* updateList ) ;
169		void				emptyUpdateList() ;
170		void				setFlags( UInt32 flags ) ;
171		UInt32				getFlags() const ;
172
173
174		virtual void		update() = 0 ;
175
176		// OSObject
177
178		virtual void		free () ;
179
180	public:
181
182		//
183		// internal use only; please don't use...
184		//
185
186		virtual IOReturn				compile( IODCLProgram & , bool & ) = 0 ;
187		virtual void					link () = 0 ;
188
189		OSMetaClassDeclareReservedUnused ( IOFWDCL, 4 ) ;		// used to be relink()
190
191	public :
192		virtual bool					interrupt( bool &, IOFWDCL * & ) = 0 ;
193		virtual void					finalize ( IODCLProgram & ) ;
194		virtual IOReturn				importUserDCL (
195														UInt8 *				data,
196														IOByteCount &		dataSize,
197														IOMemoryMap *		bufferMap,
198														const OSArray *		dcl ) ;
199
200	protected :
201
202		friend class IOFWDCLFriend ;
203
204	public :
205
206		// dump DCL info...
207		virtual void					debug() ;
208
209	public:
210
211		//
212		// internal use only; please don't use...
213		//
214
215		virtual bool					checkForInterrupt() = 0 ;
216
217    OSMetaClassDeclareReservedUsed ( IOFWDCL, 0 ) ;
218    OSMetaClassDeclareReservedUnused ( IOFWDCL, 1 ) ;
219    OSMetaClassDeclareReservedUnused ( IOFWDCL, 2 ) ;
220    OSMetaClassDeclareReservedUnused ( IOFWDCL, 3 ) ;
221//	OSMetaClassDeclareReservedUnused ( ***, 4 ) ;			// used above
222
223} ;
224
225#pragma mark -
226
227/*! @class IOFWReceiveDCL
228*/
229
230class IOFWReceiveDCL : public IOFWDCL
231{
232	OSDeclareAbstractStructors( IOFWReceiveDCL )
233
234	protected :
235
236		UInt8		fHeaderBytes ;
237		bool		fWait ;
238
239	public:
240
241		// me
242		virtual bool		initWithParams(
243											OSSet *				updateSet,
244											UInt8				headerBytes,
245											unsigned			rangesCount,
246											IOVirtualRange		ranges [] ) ;
247		IOReturn			setWaitControl( bool wait ) ;
248
249	public :
250
251		// internal use only:
252		virtual IOReturn				importUserDCL (
253														UInt8 *				data,
254														IOByteCount &		dataSize,
255														IOMemoryMap *		bufferMap,
256														const OSArray *		dcl ) ;
257
258	protected :
259
260		virtual void		debug() ;
261
262} ;
263
264#pragma mark -
265
266/*! @class IOFWSendDCL
267*/
268
269class IOFWSendDCL : public IOFWDCL
270{
271	OSDeclareAbstractStructors( IOFWSendDCL )
272
273	protected:
274
275		UInt32 * 	fUserHeaderPtr ;			// pointer to 2 quadlets containing isoch header for this packet
276		UInt32 *	fUserHeaderMaskPtr ;		// pointer to 2 quadlets; used to mask header quadlets
277		IOFWDCL *	fSkipBranchDCL ;
278		Callback	fSkipCallback ;
279		void *		fSkipRefcon ;
280		UInt8		fSync ;
281		UInt8		fTag ;
282
283	public:
284
285		// OSObject
286		virtual void		free() ;
287
288		// IOFWDCL
289		virtual IOReturn	addRange ( IOVirtualRange& range ) ;
290		virtual IOReturn	setRanges ( UInt32 numRanges, IOVirtualRange ranges[] ) ;
291
292		// me
293		virtual bool		initWithParams( OSSet * 				updateSet,
294											unsigned 				rangesCount = 0,
295											IOVirtualRange 			ranges [] = NULL,
296											UInt8					sync = 0,
297											UInt8					tag = 0 ) ;
298
299		void				setUserHeaderPtr( UInt32* userHeaderPtr, UInt32 * maskPtr ) ;
300		UInt32 *			getUserHeaderPtr() ;
301		UInt32 *			getUserHeaderMask() ;
302		void				setSkipBranch( IOFWDCL * skipBranchDCL ) ;
303		IOFWDCL *			getSkipBranch() const ;
304		void				setSkipCallback( Callback callback ) ;
305		Callback			getSkipCallback() const ;
306		void				setSkipRefcon( void * refcon = 0 ) ;
307		void *				getSkipRefcon() const ;
308		void				setSync( UInt8 sync ) ;
309		UInt8				getSync() const ;
310		void				setTag( UInt8 tag ) ;
311		UInt8				getTag() const ;
312
313	public :
314
315		// internal use only:
316		virtual IOReturn				importUserDCL (
317														UInt8 *				data,
318														IOByteCount &		dataSize,
319														IOMemoryMap *		bufferMap,
320														const OSArray *		dcl ) ;
321	protected :
322
323		virtual void		debug() ;
324} ;
325
326#pragma mark -
327
328/*! @class IOFWSkipCycleDCL
329*/
330
331class IOFWSkipCycleDCL : public IOFWDCL
332{
333	OSDeclareAbstractStructors( IOFWSkipCycleDCL )
334
335	public:
336
337		virtual bool		init() ;
338
339		virtual IOReturn	addRange ( IOVirtualRange& range ) ;
340		virtual IOReturn	setRanges ( UInt32 numRanges, IOVirtualRange ranges[] ) ;
341		virtual IOReturn	getSpan( IOVirtualRange& result ) ;
342
343	protected :
344
345		virtual void		debug() ;
346} ;
347