|
|
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: File: IOFWRegs.h
24:
25: Contains: Definitions of standard FireWire CSR registers.
26:
27: Version: 1.0
28:
29: Copyright: � 1996-1999 by Apple Computer, Inc., all rights reserved.
30:
31: */
32:
33: #ifndef __IOFWREGS_H__
34: #define __IOFWREGS_H__
35:
36: #ifndef __IOKIT_IOTYPES_H
37: #include <IOKit/IOTypes.h>
38: #endif
39:
40: // Something we should add to IOTypes?
41: //typedef SInt8 * Ptr;
42: //typedef UInt8 Boolean;
43:
44: // Generic bit defs.
45:
46: enum
47: {
48: kBit0 = (1 << 0),
49: kBit1 = (1 << 1),
50: kBit2 = (1 << 2),
51: kBit3 = (1 << 3),
52: kBit4 = (1 << 4),
53: kBit5 = (1 << 5),
54: kBit6 = (1 << 6),
55: kBit7 = (1 << 7),
56: kBit8 = (1 << 8),
57: kBit9 = (1 << 9),
58: kBit10 = (1 << 10),
59: kBit11 = (1 << 11),
60: kBit12 = (1 << 12),
61: kBit13 = (1 << 13),
62: kBit14 = (1 << 14),
63: kBit15 = (1 << 15),
64: kBit16 = (1 << 16),
65: kBit17 = (1 << 17),
66: kBit18 = (1 << 18),
67: kBit19 = (1 << 19),
68: kBit20 = (1 << 20),
69: kBit21 = (1 << 21),
70: kBit22 = (1 << 22),
71: kBit23 = (1 << 23),
72: kBit24 = (1 << 24),
73: kBit25 = (1 << 25),
74: kBit26 = (1 << 26),
75: kBit27 = (1 << 27),
76: kBit28 = (1 << 28),
77: kBit29 = (1 << 29),
78: kBit30 = (1 << 30),
79: kBit31 = (1 << 31)
80: };
81:
82: #define BitRange(start, end) \
83: ( \
84: ((((UInt32) 0xFFFFFFFF) << (31 - (end))) >> \
85: ((31 - (end)) + (start))) << \
86: (start) \
87: )
88:
89: #define BitRangePhase(start, end) \
90: (start)
91:
92:
93: ////////////////////////////////////////////////////////////////////////////////
94: //
95: // Standard FireWire defs.
96: //
97:
98: // FireWire bit defs.
99:
100: enum
101: {
102: kFWBit0 = (1 << 31),
103: kFWBit1 = (1 << 30),
104: kFWBit2 = (1 << 29),
105: kFWBit3 = (1 << 28),
106: kFWBit4 = (1 << 27),
107: kFWBit5 = (1 << 26),
108: kFWBit6 = (1 << 25),
109: kFWBit7 = (1 << 24),
110: kFWBit8 = (1 << 23),
111: kFWBit9 = (1 << 22),
112: kFWBit10 = (1 << 21),
113: kFWBit11 = (1 << 20),
114: kFWBit12 = (1 << 19),
115: kFWBit13 = (1 << 18),
116: kFWBit14 = (1 << 17),
117: kFWBit15 = (1 << 16),
118: kFWBit16 = (1 << 15),
119: kFWBit17 = (1 << 14),
120: kFWBit18 = (1 << 13),
121: kFWBit19 = (1 << 12),
122: kFWBit20 = (1 << 11),
123: kFWBit21 = (1 << 10),
124: kFWBit22 = (1 << 9),
125: kFWBit23 = (1 << 8),
126: kFWBit24 = (1 << 7),
127: kFWBit25 = (1 << 6),
128: kFWBit26 = (1 << 5),
129: kFWBit27 = (1 << 4),
130: kFWBit28 = (1 << 3),
131: kFWBit29 = (1 << 2),
132: kFWBit30 = (1 << 1),
133: kFWBit31 = (1 << 0)
134: };
135:
136: #define FWBitRange(start, end) \
137: ( \
138: ((((UInt32) 0xFFFFFFFF) << (start)) >> \
139: ((start) + (31 - (end)))) << \
140: (31 - (end)) \
141: )
142:
143: #define FWBitRangePhase(start, end) \
144: (31 - end)
145:
146:
147: /*zzz Put in IEEE1212.h */
148: ////////////////////////////////////////////////////////////////////////////////
149: //
150: // Define some CSR stuff.
151: //
152:
153: // CSR bit defs.
154:
155: enum
156: {
157: kCSRBit0 = (1 << 31),
158: kCSRBit1 = (1 << 30),
159: kCSRBit2 = (1 << 29),
160: kCSRBit3 = (1 << 28),
161: kCSRBit4 = (1 << 27),
162: kCSRBit5 = (1 << 26),
163: kCSRBit6 = (1 << 25),
164: kCSRBit7 = (1 << 24),
165: kCSRBit8 = (1 << 23),
166: kCSRBit9 = (1 << 22),
167: kCSRBit10 = (1 << 21),
168: kCSRBit11 = (1 << 20),
169: kCSRBit12 = (1 << 19),
170: kCSRBit13 = (1 << 18),
171: kCSRBit14 = (1 << 17),
172: kCSRBit15 = (1 << 16),
173: kCSRBit16 = (1 << 15),
174: kCSRBit17 = (1 << 14),
175: kCSRBit18 = (1 << 13),
176: kCSRBit19 = (1 << 12),
177: kCSRBit20 = (1 << 11),
178: kCSRBit21 = (1 << 10),
179: kCSRBit22 = (1 << 9),
180: kCSRBit23 = (1 << 8),
181: kCSRBit24 = (1 << 7),
182: kCSRBit25 = (1 << 6),
183: kCSRBit26 = (1 << 5),
184: kCSRBit27 = (1 << 4),
185: kCSRBit28 = (1 << 3),
186: kCSRBit29 = (1 << 2),
187: kCSRBit30 = (1 << 1),
188: kCSRBit31 = (1 << 0)
189: };
190:
191: #define CSRBitRange(start, end) \
192: ( \
193: ((((UInt32) 0xFFFFFFFF) << (start)) >> \
194: ((start) + (31 - (end)))) << \
195: (31 - (end)) \
196: )
197:
198: #define CSRBitRangePhase(start, end) \
199: (31 - end)
200:
201: // Core CSR registers.
202:
203: enum
204: {
205: kCSRStateUnitDepend = CSRBitRange (0, 15),
206: kCSRStateUnitDependPhase = CSRBitRangePhase (0, 15),
207:
208: kCSRStateBusDepend = CSRBitRange (16, 23),
209: kCSRStateBusDependPhase = CSRBitRangePhase (16, 23),
210:
211: kCSRStateLost = kCSRBit24,
212: kCSRStateDReq = kCSRBit25,
213: kCSRStateELog = kCSRBit27,
214: kCSRStateAtn = kCSRBit28,
215: kCSRStateOff = kCSRBit29,
216:
217: kCSRStateState = CSRBitRange (30, 31),
218: kCSRStateStatePhase = CSRBitRangePhase (30, 31),
219: kCSRStateStateRunning = 0,
220: kCSRStateStateInitializing = 1,
221: kCSRStateStateTesting = 2,
222: kCSRStateStateDead = 3
223: };
224:
225: // Key values.
226:
227: enum
228: {
229: kCSRTextualDescriptorKey = 0x01,
230: kCSRBusDependentInfoKey = 0x02,
231: kCSRModuleVendorIDKey = 0x03,
232: kCSRModuleHwVersionKey = 0x04,
233: kCSRModuleSpecIdKey = 0x05,
234: kCSRModuleSwVersionKey = 0x06,
235: kCSRModuleDependentInfoKey = 0x07,
236: kCSRNodeVendorIdKey = 0x08,
237: kCSRNodeHwVersionKey = 0x09,
238: kCSRNodeSpecIdKey = 0x0A,
239: kCSRNodeSwVersionKey = 0x0B,
240: kCSRNodeCapabilitiesKey = 0x0C,
241: kCSRNodeUniqueIdKey = 0x0D,
242: kCSRNodeUnitsExtentKey = 0x0E,
243: kCSRNodeMemoryExtentKey = 0x0F,
244: kCSRNodeDependentInfoKey = 0x10,
245: kCSRUnitDirectoryKey = 0x11,
246: kCSRUnitSpecIdKey = 0x12,
247: kCSRUnitSwVersionKey = 0x13,
248: kCSRUnitDependentInfoKey = 0x14,
249: kCSRUnitLocationKey = 0x15,
250: kCSRUnitPollMaskKey = 0x16
251: };
252:
253:
254: // Key value bits for searching.
255:
256: enum
257: {
258: kCSREveryKey = 0xFFFFFFFF,
259:
260: kCSRTextualDescriptorKeyLoBit = (1 << kCSRTextualDescriptorKey),
261: kCSRTextualDescriptorKeyHiBit = 0,
262: kCSRBusDependentInfoKeyLoBit = (1 << kCSRBusDependentInfoKey),
263: kCSRBusDependentInfoKeyHiBit = 0,
264: kCSRModuleVendorIDKeyLoBit = (1 << kCSRModuleVendorIDKey),
265: kCSRModuleVendorIDKeyHiBit = 0,
266: kCSRModuleHwVersionKeyLoBit = (1 << kCSRModuleHwVersionKey),
267: kCSRModuleHwVersionKeyHiBit = 0,
268: kCSRModuleSpecIdKeyLoBit = (1 << kCSRModuleSpecIdKey),
269: kCSRModuleSpecIdKeyHiBit = 0,
270: kCSRModuleSwVersionKeyLoBit = (1 << kCSRModuleSwVersionKey),
271: kCSRModuleSwVersionKeyHiBit = 0,
272: kCSRModuleDependentInfoKeyLoBit = (1 << kCSRModuleDependentInfoKey),
273: kCSRModuleDependentInfoKeyHiBit = 0,
274: kCSRNodeVendorIdKeyLoBit = (1 << kCSRNodeVendorIdKey),
275: kCSRNodeVendorIdKeyHiBit = 0,
276: kCSRNodeHwVersionKeyLoBit = (1 << kCSRNodeHwVersionKey),
277: kCSRNodeHwVersionKeyHiBit = 0,
278: kCSRNodeSpecIdKeyLoBit = (1 << kCSRNodeSpecIdKey),
279: kCSRNodeSpecIdKeyHiBit = 0,
280: kCSRNodeSwVersionKeyLoBit = (1 << kCSRNodeSwVersionKey),
281: kCSRNodeSwVersionKeyHiBit = 0,
282: kCSRNodeCapabilitiesKeyLoBit = (1 << kCSRNodeCapabilitiesKey),
283: kCSRNodeCapabilitiesKeyHiBit = 0,
284: kCSRNodeUniqueIdKeyLoBit = (1 << kCSRNodeUniqueIdKey),
285: kCSRNodeUniqueIdKeyHiBit = 0,
286: kCSRNodeUnitsExtentKeyLoBit = (1 << kCSRNodeUnitsExtentKey),
287: kCSRNodeUnitsExtentKeyHiBit = 0,
288: kCSRNodeMemoryExtentKeyLoBit = (1 << kCSRNodeMemoryExtentKey),
289: kCSRNodeMemoryExtentKeyHiBit = 0,
290: kCSRNodeDependentInfoKeyLoBit = (1 << kCSRNodeDependentInfoKey),
291: kCSRNodeDependentInfoKeyHiBit = 0,
292: kCSRUnitDirectoryKeyLoBit = (1 << kCSRUnitDirectoryKey),
293: kCSRUnitDirectoryKeyHiBit = 0,
294: kCSRUnitSpecIdKeyLoBit = (1 << kCSRUnitSpecIdKey),
295: kCSRUnitSpecIdKeyHiBit = 0,
296: kCSRUnitSwVersionKeyLoBit = (1 << kCSRUnitSwVersionKey),
297: kCSRUnitSwVersionKeyHiBit = 0,
298: kCSRUnitDependentInfoKeyLoBit = (1 << kCSRUnitDependentInfoKey),
299: kCSRUnitDependentInfoKeyHiBit = 0,
300: kCSRUnitLocationKeyLoBit = (1 << kCSRUnitLocationKey),
301: kCSRUnitLocationKeyHiBit = 0,
302: kCSRUnitPollMaskKeyLoBit = (1 << kCSRUnitPollMaskKey),
303: kCSRUnitPollMaskKeyHiBit = 0
304: };
305:
306:
307: // Key types.
308:
309: enum
310: {
311: kCSRImmediateKeyType = 0,
312: kCSROffsetKeyType = 1,
313: kCSRLeafKeyType = 2,
314: kCSRDirectoryKeyType = 3
315: };
316:
317:
318: // Key type bits for searching.
319:
320: enum
321: {
322: kCSREveryKeyType = 0xFFFFFFFF,
323:
324: kCSRImmediateKeyTypeBit = (1 << kCSRImmediateKeyType),
325: kCSROffsetKeyTypeBit = (1 << kCSROffsetKeyType),
326: kCSRLeafKeyTypeBit = (1 << kCSRLeafKeyType),
327: kCSRDirectoryKeyTypeBit = (1 << kCSRDirectoryKeyType)
328: };
329:
330: // CSR ROM entry bit locations.
331:
332: enum
333: {
334: kCSRBusInfoBlockLength = CSRBitRange (0, 7),
335: kCSRBusInfoBlockLengthPhase = CSRBitRangePhase (0, 7),
336:
337: kCSRROMCRCLength = CSRBitRange (8, 15),
338: kCSRROMCRCLengthPhase = CSRBitRangePhase (8, 15),
339:
340: kCSRROMCRCValue = CSRBitRange (16, 31),
341: kCSRROMCRCValuePhase = CSRBitRangePhase (16, 31),
342:
343: kCSREntryKeyType = CSRBitRange (0, 1),
344: kCSREntryKeyTypePhase = CSRBitRangePhase (0, 1),
345:
346: kCSREntryKeyValue = CSRBitRange (2, 7),
347: kCSREntryKeyValuePhase = CSRBitRangePhase (2, 7),
348:
349: kCSREntryValue = CSRBitRange (8, 31),
350: kCSREntryValuePhase = CSRBitRangePhase (8, 31),
351:
352: kCSRLeafDirLength = CSRBitRange (0, 15),
353: kCSRLeafDirLengthPhase = CSRBitRangePhase (0, 15),
354:
355: kCSRLeafDirCRC = CSRBitRange (16, 31),
356: kCSRLeafDirCRCPhase = CSRBitRangePhase (16, 31)
357: };
358:
359: // CSR 64-bit fixed address defs.
360:
361: enum
362: {
363: kCSRNodeID = CSRBitRange (0, 15),
364: kCSRNodeIDPhase = CSRBitRangePhase (0, 15),
365:
366: kCSRInitialMemorySpaceBaseAddressHi = 0x00000000,
367: kCSRInitialMemorySpaceBaseAddressLo = 0x00000000,
368:
369: kCSRPrivateSpaceBaseAddressHi = 0x0000FFFF,
370: kCSRPrivateSpaceBaseAddressLo = 0xE0000000,
371:
372: kCSRRegisterSpaceBaseAddressHi = 0x0000FFFF,
373: kCSRRegisterSpaceBaseAddressLo = 0xF0000000,
374:
375: kCSRCoreRegistersBaseAddress = kCSRRegisterSpaceBaseAddressLo,
376: kCSRStateClearAddress = kCSRCoreRegistersBaseAddress + 0x0000,
377: kCSRStateSetAddress = kCSRCoreRegistersBaseAddress + 0x0004,
378: kCSRNodeIDsAddress = kCSRCoreRegistersBaseAddress + 0x0008,
379: kCSRResetStartAddress = kCSRCoreRegistersBaseAddress + 0x000C,
380: kCSRIndirectAddressAddress = kCSRCoreRegistersBaseAddress + 0x0010,
381: kCSRIndirectDataAddress = kCSRCoreRegistersBaseAddress + 0x0014,
382: kCSRSplitTimeoutHiAddress = kCSRCoreRegistersBaseAddress + 0x0018,
383: kCSRSplitTimeoutLoAddress = kCSRCoreRegistersBaseAddress + 0x001C,
384: kCSRArgumentHiAddress = kCSRCoreRegistersBaseAddress + 0x0020,
385: kCSRArgumentLoAddress = kCSRCoreRegistersBaseAddress + 0x0024,
386: kCSRTestStartAddress = kCSRCoreRegistersBaseAddress + 0x0028,
387: kCSRTestStatusAddress = kCSRCoreRegistersBaseAddress + 0x002C,
388: kCSRUnitsBaseHiAddress = kCSRCoreRegistersBaseAddress + 0x0030,
389: kCSRUnitsBaseLoAddress = kCSRCoreRegistersBaseAddress + 0x0034,
390: kCSRUnitsBoundHiAddress = kCSRCoreRegistersBaseAddress + 0x0038,
391: kCSRUnitsBoundLoAddress = kCSRCoreRegistersBaseAddress + 0x003C,
392: kCSRMemoryBaseHiAddress = kCSRCoreRegistersBaseAddress + 0x0040,
393: kCSRMemoryBaseLoAddress = kCSRCoreRegistersBaseAddress + 0x0044,
394: kCSRMemoryBoundHiAddress = kCSRCoreRegistersBaseAddress + 0x0048,
395: kCSRMemoryBoundLoAddress = kCSRCoreRegistersBaseAddress + 0x004C,
396: kCSRInterruptTargetAddress = kCSRCoreRegistersBaseAddress + 0x0050,
397: kCSRInterruptMaskAddress = kCSRCoreRegistersBaseAddress + 0x0054,
398: kCSRClockValueHiAddress = kCSRCoreRegistersBaseAddress + 0x0058,
399: kCSRClockValueMidAddress = kCSRCoreRegistersBaseAddress + 0x005C,
400: kCSRClockTickPeriodMidAddress = kCSRCoreRegistersBaseAddress + 0x0060,
401: kCSRClockTickPeriodLoAddress = kCSRCoreRegistersBaseAddress + 0x0064,
402: kCSRClockStrobeArrivedHiAddress = kCSRCoreRegistersBaseAddress + 0x0068,
403: kCSRClockStrobeArrivedMidAddress = kCSRCoreRegistersBaseAddress + 0x006C,
404: kCSRClockInfo0Address = kCSRCoreRegistersBaseAddress + 0x0070,
405: kCSRClockInfo1Address = kCSRCoreRegistersBaseAddress + 0x0074,
406: kCSRClockInfo2Address = kCSRCoreRegistersBaseAddress + 0x0078,
407: kCSRClockInfo3Address = kCSRCoreRegistersBaseAddress + 0x007C,
408: kCSRMessageRequestAddress = kCSRCoreRegistersBaseAddress + 0x0080,
409: kCSRMessageResponseAddress = kCSRCoreRegistersBaseAddress + 0x00C0,
410: kCSRErrorLogBufferAddress = kCSRCoreRegistersBaseAddress + 0x0180,
411:
412: kCSRBusDependentRegistersBaseAddress
413: = kCSRRegisterSpaceBaseAddressLo + 0x0200,
414: kCSRBusyTimeout = kCSRRegisterSpaceBaseAddressLo + 0x0210,
415: kCSRBandwidthAvailable = kCSRRegisterSpaceBaseAddressLo + 0x0220,
416: kCSRChannelsAvailable31_0 = kCSRRegisterSpaceBaseAddressLo + 0x0224,
417: kCSRChannelsAvailable63_32 = kCSRRegisterSpaceBaseAddressLo + 0x0228,
418: kCSRROMBaseAddress = kCSRRegisterSpaceBaseAddressLo + 0x0400,
419: kCSRBIBHeaderAddress = kCSRROMBaseAddress,
420: kCSRBIBBusNameAddress = kCSRROMBaseAddress + 4
421: };
422:
423:
424: // CSR ROM search data types and structures.
425:
426: enum {
427: /*
428: ** Absolute locations
429: */
430: kIterateRoot = 0x2L,
431: /*
432: ** "Upward" Relationships
433: */
434: kIterateParents = 0x3L, /* include all parent(s) of entry */
435: /*
436: ** "Downward" Relationships
437: */
438: kIterateChildren = 0x4L, /* include all children */
439: kIterateSubTrees = 0x5L, /* include all sub trees of entry */
440: kIterateDescendants = 0x5L, /* include all descendants of entry */
441: /*
442: ** "Horizontal" Relationships
443: */
444: kIterateSibling = 0x6L, /* include all siblings */
445: /*
446: ** Keep doing the same thing
447: */
448: kIterateContinue = 0x1L
449: };
450:
451: enum
452: {
453: kInvalidCSRROMIterator = 0
454: };
455:
456: enum
457: {
458: kCSRROMSearchForKey = 1
459: };
460:
461: enum
462: {
463: kInvalidCSRROMEntryType = 0xFFFFFFFF,
464: kImmediateCSRROMEntryType = 0,
465: kOffsetCSRROMEntryType = 1,
466: kLeafCSRROMEntryType = 2,
467: kDirectoryCSRROMEntryType = 3
468: };
469:
470: // CSR defined 64 bit unique ID.
471:
472: typedef UInt64 CSRNodeUniqueID;
473: typedef CSRNodeUniqueID *CSRNodeUniqueIDPtr;
474:
475: typedef UInt32 CSRROMEntryIterator;
476: typedef UInt32 CSRROMIterationOp;
477: typedef struct OpaqueCSRROMEntryID* CSRROMEntryID;
478: #define kInvalidCSRROMEntryID ((CSRROMEntryID)0)
479:
480: struct CSRROMSearchCriteriaStruct
481: {
482: UInt32 csrROMSearchType; // Type of search record.
483: UInt32 keyType; // Key types to search for.
484: UInt32 keyHi; // Key values to search for.
485: UInt32 keyLo; //zzz ought to provide nice way to set these.
486: };
487: typedef struct CSRROMSearchCriteriaStruct
488: CSRROMSearchCriteria, *CSRROMSearchCriteriaPtr;
489:
490: void FWCSRROMDisposeIterator (CSRROMEntryIterator csrROMIterator);
491:
492: IOReturn FWCSRROMSetIterator (CSRROMEntryIterator csrROMIterator,
493: CSRROMEntryID csrROMEntryID, CSRROMIterationOp relationship);
494:
495: IOReturn FWCSRROMEntrySearch (CSRROMEntryIterator csrROMIterator, CSRROMIterationOp relationship,
496: CSRROMEntryID *pEntryID, int *pDone, CSRROMSearchCriteriaPtr pSearchCriteria,
497: UInt8 * pEntryValue, UInt32 *pEntrySize);
498:
499: /*zzz End put in IEEE1212.h */
500:
501:
502: ////////////////////////////////////////////////////////////////////////////////
503: //
504: // FireWire CSR defs.
505: //
506:
507: // FireWire core CSR registers.
508:
509: enum
510: {
511: kFWCSRStateGone = kFWBit16,
512: kFWCSRStateLinkOff = kFWBit22,
513: kFWCSRStateCMstr = kFWBit23
514: };
515:
516: // FireWire bus/nodeID address defs.
517:
518: enum
519: {
520: kFWAddressBusID = FWBitRange (16, 25) << kCSRNodeIDPhase,
521: kFWAddressBusIDPhase = FWBitRangePhase (16, 25) + kCSRNodeIDPhase,
522:
523: kFWAddressNodeID = FWBitRange (26, 31) << kCSRNodeIDPhase,
524: kFWAddressNodeIDPhase = FWBitRangePhase (26, 31) + kCSRNodeIDPhase,
525:
526: kFWLocalBusID = 1023,
527: kFWBroadcastNodeID = 63,
528: kFWBadNodeID = 0xffff,
529:
530: kFWLocalBusAddress = kFWLocalBusID << kFWAddressBusIDPhase,
531: kFWBroadcastAddress = kFWBroadcastNodeID << kFWAddressNodeIDPhase
532: };
533:
534: #define FWNodeBaseAddress(busID, nodeID) \
535: ( \
536: (busID << kFWAddressBusIDPhase) | \
537: (nodeID << kFWAddressNodeIDPhase) \
538: )
539:
540: #define FWNodeRegisterSpaceBaseAddressHi(busID, nodeID) \
541: ( \
542: FWNodeBaseAddress (busID, nodeID) | \
543: kCSRRegisterSpaceBaseAddressHi \
544: )
545:
546:
547: // FireWire CSR bus info block defs.
548:
549: enum
550: {
551: kFWBIBHeaderAddress = kCSRBIBHeaderAddress,
552: kFWBIBBusNameAddress = kCSRBIBBusNameAddress,
553: kFWBIBNodeCapabilitiesAddress
554: = kCSRROMBaseAddress + 8,
555: kFWBIBNodeUniqueIDHiAddress = kCSRROMBaseAddress + 12,
556: kFWBIBNodeUniqueIDLoAddress = kCSRROMBaseAddress + 16,
557:
558: kFWBIBBusName = 0x31333934, //'1394'
559:
560: kFWBIBIrmc = kFWBit0,
561: kFWBIBCmc = kFWBit1,
562: kFWBIBIsc = kFWBit2,
563: kFWBIBBmc = kFWBit3,
564: kFWBIBCycClkAcc = FWBitRange (8, 15),
565: kFWBIBCycClkAccPhase = FWBitRangePhase (8, 15),
566: kFWBIBMaxRec = FWBitRange (16, 19),
567: kFWBIBMaxRecPhase = FWBitRangePhase (16, 19)
568: };
569:
570:
571: ////////////////////////////////////////////////////////////////////////////////
572: //
573: // Define some bus management constants.
574: //
575: enum
576: {
577: kFWBusManagerArbitrationTimeoutDuration = 625 // durationMillisecond
578: };
579:
580: ////////////////////////////////////////////////////////////////////////////////
581: //
582: // Define some bus characteristics.
583: //
584:
585: enum
586: {
587: kFWMaxBusses = 1023,
588: kFWMaxNodesPerBus = 63,
589: kFWMaxNodeHops = 16
590: };
591:
592:
593: ////////////////////////////////////////////////////////////////////////////////
594: //
595: // Packet defs.
596: //
597:
598: // Phy packet defs.
599:
600: enum
601: {
602: kFWPhyPacketID = FWBitRange (0, 1),
603: kFWPhyPacketIDPhase = FWBitRangePhase (0, 1),
604:
605: kFWPhyPacketPhyID = FWBitRange (2, 7),
606: kFWPhyPacketPhyIDPhase = FWBitRangePhase (2, 7)
607: };
608:
609: enum
610: {
611: kSelfIDPacketSize = 8,
612: kMaxSelfIDs = 4 // SelfID 0,1,3,8
613: };
614:
615: enum
616: {
617: kFWConfigurationPacketID = 0,
618: kFWLinkOnPacketID = 1,
619: kFWSelfIDPacketID = 2
620: };
621:
622: enum
623: {
624: kFWPhyConfigurationR = kFWBit8,
625: kFWPhyConfigurationT = kFWBit9,
626: kFWPhyConfigurationGapCnt = FWBitRange (10, 15),
627: kFWPhyConfigurationGapCntPhase
628: = FWBitRangePhase (10, 15)
629: };
630:
631: enum
632: {
633: kFWSelfIDPortStatusChild = 3,
634: kFWSelfIDPortStatusParent = 2,
635: kFWSelfIDPortStatusNotConnected = 1,
636: kFWSelfIDPortStatusNotPresent = 0,
637:
638: kFWSelfIDNoPower = 0,
639: kFWSelfIDSelfPowered15W = 1,
640: kFWSelfIDSelfPowered30W = 2,
641: kFWSelfIDSelfPowered45W = 3,
642: kFWSelfIDBusPowered1W = 4,
643: kFWSelfIDBusPowered3W = 5,
644: kFWSelfIDBusPowered6W = 6,
645: kFWSelfIDBusPowered10W = 7,
646:
647: kFWSelfIDPhyID = kFWPhyPacketPhyID,//zzz do we need or want this?
648: kFWSelfIDPhyIDPhase = kFWPhyPacketPhyIDPhase,
649: kFWSelfIDM = kFWBit31,
650:
651: kFWSelfID0L = kFWBit9,
652: kFWSelfID0GapCnt = FWBitRange (10, 15),
653: kFWSelfID0GapCntPhase = FWBitRangePhase (10, 15),
654: kFWSelfID0SP = FWBitRange (16, 17),
655: kFWSelfID0SPPhase = FWBitRangePhase (16, 17),
656: kFWSelfID0Del = FWBitRange (18, 19),
657: kFWSelfID0DelPhase = FWBitRangePhase (18, 19),
658: kFWSelfID0C = kFWBit20,
659: kFWSelfID0Pwr = FWBitRange (21, 23),
660: kFWSelfID0PwrPhase = FWBitRangePhase (21, 23),
661: kFWSelfID0P0 = FWBitRange (24, 25),
662: kFWSelfID0P0Phase = FWBitRangePhase (24, 25),
663: kFWSelfID0P1 = FWBitRange (26, 27),
664: kFWSelfID0P1Phase = FWBitRangePhase (26, 27),
665: kFWSelfID0P2 = FWBitRange (28, 29),
666: kFWSelfID0P2Phase = FWBitRangePhase (28, 29),
667: kFWSelfID0I = kFWBit30,
668:
669: kFWSelfIDPacketType = kFWBit8,
670: kFWSelfIDNN = FWBitRange (9, 11),
671: kFWSelfIDNNPhase = FWBitRangePhase (9, 11),
672: kFWSelfIDNPa = FWBitRange (14, 15),
673: kFWSelfIDNPaPhase = FWBitRangePhase (14, 15),
674: kFWSelfIDNPb = FWBitRange (16, 17),
675: kFWSelfIDNPbPhase = FWBitRangePhase (16, 17),
676: kFWSelfIDNPc = FWBitRange (18, 19),
677: kFWSelfIDNPcPhase = FWBitRangePhase (18, 19),
678: kFWSelfIDNPd = FWBitRange (20, 21),
679: kFWSelfIDNPdPhase = FWBitRangePhase (20, 21),
680: kFWSelfIDNPe = FWBitRange (22, 23),
681: kFWSelfIDNPePhase = FWBitRangePhase (22, 23),
682: kFWSelfIDNPf = FWBitRange (24, 25),
683: kFWSelfIDNPfPhase = FWBitRangePhase (24, 25),
684: kFWSelfIDNPg = FWBitRange (26, 27),
685: kFWSelfIDNPgPhase = FWBitRangePhase (26, 27),
686: kFWSelfIDNPh = FWBitRange (28, 29),
687: kFWSelfIDNPhPhase = FWBitRangePhase (28, 29),
688: kFWSelfIDMore = kFWBit31
689: };
690:
691: // Primary packet defs.
692: enum
693: {
694: kFWPacketTCode = FWBitRange (24, 27),
695: kFWPacketTCodePhase = FWBitRangePhase (24, 27)
696: };
697:
698:
699: enum
700: {
701: kFWAsynchSpd = FWBitRange (14, 15),
702: kFWAsynchSpdPhase = FWBitRangePhase (14, 15),
703:
704: kFWAsynchTLabel = FWBitRange (16, 21),
705: kFWAsynchTLabelPhase = FWBitRangePhase (16, 21),
706: kFWAsynchTTotal = ((0xffffffff & kFWAsynchTLabel) >> kFWAsynchTLabelPhase)+1,
707: kFWAsynchRt = FWBitRange (22, 23),
708: kFWAsynchRtPhase = FWBitRangePhase (22, 23),
709: kFWAsynchNew = 0,
710: kFWAsynchRetryA = 2,
711: kTIAsycnhRetryB = 3,
712:
713: kFWAsynchPriority = FWBitRange (28, 31),
714: kFWAsynchPriorityPhase = FWBitRangePhase (28, 31),
715:
716: kFWAsynchDestinationID = FWBitRange (0, 15),
717: kFWAsynchDestinationIDPhase = FWBitRangePhase (0, 15),
718:
719: kFWAsynchSourceID = FWBitRange (0, 15),
720: kFWAsynchSourceIDPhase = FWBitRangePhase (0, 15),
721:
722: kFWAsynchDestinationOffsetHigh = FWBitRange (16, 31),
723: kFWAsynchDestinationOffsetHighPhase = FWBitRangePhase (16, 31),
724:
725: kFWAsynchDestinationOffsetLow = FWBitRange (0, 31),
726: kFWAsynchDestinationOffsetLowPhase = FWBitRangePhase (0, 31),
727:
728: kFWAsynchDataLength = FWBitRange (0, 15),
729: kFWAsynchDataLengthPhase = FWBitRangePhase (0, 15),
730:
731: kFWAsynchExtendedTCode = FWBitRange (16, 31),
732: kFWAsynchExtendedTCodePhase = FWBitRangePhase (16, 31),
733:
734: kFWAsynchAckSent = FWBitRange (28, 31),
735: kFWAsynchAckSentPhase = FWBitRangePhase (28, 31),
736:
737: kFWAsynchRCode = FWBitRange (16, 19),
738: kFWAsynchRCodePhase = FWBitRangePhase (16, 19)
739: };
740:
741:
742: typedef enum
743: {
744: kFWSpeed100MBit = 0,
745: kFWSpeed200MBit = 1,
746: kFWSpeed400MBit = 2,
747: kFWSpeedMaximum = 0x7FFFFFFF, //zzz what are the best numbers???
748: kFWSpeedInvalid = 0x80000000
749: } IOFWSpeed;
750:
751: enum
752: {
753: kFWTCodeWriteQuadlet = 0,
754: kFWTCodeWriteBlock = 1,
755: kFWTCodeWriteResponse = 2,
756: kFWTCodeReadQuadlet = 4,
757: kFWTCodeReadBlock = 5,
758: kFWTCodeReadQuadletResponse = 6,
759: kFWTCodeReadBlockResponse = 7,
760: kFWTCodeCycleStart = 8,
761: kFWTCodeLock = 9,
762: kFWTCodeIsochronousBlock = 10,
763: kFWTCodeLockResponse = 11,
764: kFWTCodePHYPacket = 14
765: };
766:
767: enum
768: {
769: kFWExtendedTCodeMaskSwap = 1,
770: kFWExtendedTCodeCompareSwap = 2,
771: kFWExtendedTCodeFetchAdd = 3,
772: kFWExtendedTCodeLittleAdd = 4,
773: kFWExtendedTCodeBoundedAdd = 5,
774: kFWExtendedTCodeWrapAdd = 6,
775: kFWExtendedTCodeVendorDependent = 7
776: };
777:
778: enum
779: {
780: kFWResponseComplete = 0, // OK!
781: kFWResponseConflictError = 4, // Resource conflict, may retry
782: kFWResponseDataError = 5, // Data not available
783: kFWResponseTypeError = 6, // Operation not supported
784: kFWResponseAddressError = 7, // Address not valid in target device
785: kFWResponseBusResetError = 16 // Psuedo response generated locally
786: };
787:
788: enum
789: {
790: kFWAckTimeout = -1, // Psuedo ack generated locally
791: kFWAckComplete = 1,
792: kFWAckPending = 2,
793: kFWAckBusyX = 4,
794: kFWAckBusyA = 5,
795: kFWAckBusyB = 6,
796: kFWAckDataError = 13,
797: kFWAckTypeError = 14
798: };
799:
800:
801: enum
802: {
803: kFWIsochDataLength = FWBitRange (0, 15),
804: kFWIsochDataLengthPhase = FWBitRangePhase (0, 15),
805:
806: kFWIsochTag = FWBitRange (16, 17),
807: kFWIsochTagPhase = FWBitRangePhase (16, 17),
808:
809: kFWIsochChanNum = FWBitRange (18, 23),
810: kFWIsochChanNumPhase = FWBitRangePhase (18, 23),
811:
812: kFWIsochTCode = FWBitRange (24, 27),
813: kFWIsochTCodePhase = FWBitRangePhase (24, 27),
814:
815: kFWIsochSy = FWBitRange (28, 31),
816: kFWIsochSyPhase = FWBitRangePhase (28, 31)
817: };
818:
819: struct FWAddressStruct
820: {
821: UInt16 nodeID; // bus/node
822: UInt16 addressHi; // Top 16 bits of node address.
823: UInt32 addressLo; // Bottom 32 bits of node address
824: #ifdef __cplusplus
825: FWAddressStruct(UInt16 h=0xdead, UInt32 l=0xcafebabe) :
826: nodeID(0), addressHi(h), addressLo(l) {};
827: #endif
828: };
829: typedef struct FWAddressStruct FWAddress, *FWAddressPtr;
830:
831:
832: #define iokit_fw_err(return) (sys_iokit|sub_iokit_firewire|return)
833: #define kIOFireWireResponseBase iokit_fw_err(0x10) /* Base of Response error codes */
834: #define kIOFireWireBusReset (kIOFireWireResponseBase+kFWResponseBusResetError)
835: /* Bus reset during command execution */
836:
837: //zzz Put in Errors.h
838:
839: enum {
840: inUseErr = -4160, // Item already in use
841: notFoundErr = -4161, // Item not found
842: timeoutErr = -4162, // Something timed out
843: busReconfiguredErr = -4163, // Bus was reconfigured
844: insufficientBandwidthErr = -4164, // Not enough bandwidth was available
845: invalidIDErr = -4165, // Given ID is not valid.
846: invalidIDTypeErr = -4166, // Given ID is of an invalid type for the requested operation.
847: accessErr = -4167, // Requested access not allowed.
848: alreadyRegisteredErr = -4168, // Item has already been registered.
849: disconnectedErr = -4169, // Target of request has been disconnected.
850: retryExceededErr = -4170, // Retry limit was exceeded.
851: addressRangeErr = -4171, // Address is not in range.
852: addressAlignmentErr = -4172, // Address is not of proper alignment.
853:
854: multipleTalkerErr = -4180, // Tried to install multiple talkers
855: channelActiveErr = -4181, // Operation not permitted when channel is active
856: noListenerOrTalkerErr = -4182, // Every isochronous channel must have one talker and at least
857: // one listener
858: noChannelsAvailableErr = -4183, // No supported isochronous channels are available
859: channelNotAvailableErr = -4184, // Required channel was not available.
860: invalidIsochPortIDErr = -4185, // An isochronous port ID is invalid.
861: invalidFWReferenceTypeErr = -4186, // Operation does not support type of given reference ID
862: separateBusErr = -4187, // Two or more entities are on two or more busses and cannot be associated with eachother.
863: badSelfIDsErr = -4188, // Received self IDs are bad.
864:
865: //zzz Do we own these next ID numbers?
866: cableVoltageTooLowErr = -4190, // Cable power below device's minimum voltage
867: cablePowerInsufficientErr = -4191 // Can't grant power request at this time
868: };
869:
870: // end - Put in Errors.h
871:
872: #endif /* __IOFWREGS_H */
873:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.