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