#ifndef __IOFWREGS_H__
#define __IOFWREGS_H__
#ifndef __IOKIT_IOTYPES_H
#include <IOKit/IOTypes.h>
#endif
#include <IOKit/firewire/IOFireWireFamilyCommon.h>
enum
{
kFWBit0 = (1 << 31),
kFWBit1 = (1 << 30),
kFWBit2 = (1 << 29),
kFWBit3 = (1 << 28),
kFWBit4 = (1 << 27),
kFWBit5 = (1 << 26),
kFWBit6 = (1 << 25),
kFWBit7 = (1 << 24),
kFWBit8 = (1 << 23),
kFWBit9 = (1 << 22),
kFWBit10 = (1 << 21),
kFWBit11 = (1 << 20),
kFWBit12 = (1 << 19),
kFWBit13 = (1 << 18),
kFWBit14 = (1 << 17),
kFWBit15 = (1 << 16),
kFWBit16 = (1 << 15),
kFWBit17 = (1 << 14),
kFWBit18 = (1 << 13),
kFWBit19 = (1 << 12),
kFWBit20 = (1 << 11),
kFWBit21 = (1 << 10),
kFWBit22 = (1 << 9),
kFWBit23 = (1 << 8),
kFWBit24 = (1 << 7),
kFWBit25 = (1 << 6),
kFWBit26 = (1 << 5),
kFWBit27 = (1 << 4),
kFWBit28 = (1 << 3),
kFWBit29 = (1 << 2),
kFWBit30 = (1 << 1),
kFWBit31 = (1 << 0)
};
enum
{
kCSRBit0 = (1 << 31),
kCSRBit1 = (1 << 30),
kCSRBit2 = (1 << 29),
kCSRBit3 = (1 << 28),
kCSRBit4 = (1 << 27),
kCSRBit5 = (1 << 26),
kCSRBit6 = (1 << 25),
kCSRBit7 = (1 << 24),
kCSRBit8 = (1 << 23),
kCSRBit9 = (1 << 22),
kCSRBit10 = (1 << 21),
kCSRBit11 = (1 << 20),
kCSRBit12 = (1 << 19),
kCSRBit13 = (1 << 18),
kCSRBit14 = (1 << 17),
kCSRBit15 = (1 << 16),
kCSRBit16 = (1 << 15),
kCSRBit17 = (1 << 14),
kCSRBit18 = (1 << 13),
kCSRBit19 = (1 << 12),
kCSRBit20 = (1 << 11),
kCSRBit21 = (1 << 10),
kCSRBit22 = (1 << 9),
kCSRBit23 = (1 << 8),
kCSRBit24 = (1 << 7),
kCSRBit25 = (1 << 6),
kCSRBit26 = (1 << 5),
kCSRBit27 = (1 << 4),
kCSRBit28 = (1 << 3),
kCSRBit29 = (1 << 2),
kCSRBit30 = (1 << 1),
kCSRBit31 = (1 << 0)
};
#define CSRBitRange(start, end) \
( \
((((UInt32) 0xFFFFFFFF) << (start)) >> \
((start) + (31 - (end)))) << \
(31 - (end)) \
)
#define CSRBitRangePhase(start, end) \
(31 - end)
enum
{
kCSRStateUnitDepend = CSRBitRange (0, 15),
kCSRStateUnitDependPhase = CSRBitRangePhase (0, 15),
kCSRStateBusDepend = CSRBitRange (16, 23),
kCSRStateBusDependPhase = CSRBitRangePhase (16, 23),
kCSRStateLost = kCSRBit24,
kCSRStateDReq = kCSRBit25,
kCSRStateELog = kCSRBit27,
kCSRStateAtn = kCSRBit28,
kCSRStateOff = kCSRBit29,
kCSRStateState = CSRBitRange (30, 31),
kCSRStateStatePhase = CSRBitRangePhase (30, 31),
kCSRStateStateRunning = 0,
kCSRStateStateInitializing = 1,
kCSRStateStateTesting = 2,
kCSRStateStateDead = 3
};
enum
{
kConfigBusInfoBlockLength = CSRBitRange (0, 7),
kConfigBusInfoBlockLengthPhase = CSRBitRangePhase (0, 7),
kConfigROMCRCLength = CSRBitRange (8, 15),
kConfigROMCRCLengthPhase = CSRBitRangePhase (8, 15),
kConfigROMCRCValue = CSRBitRange (16, 31),
kConfigROMCRCValuePhase = CSRBitRangePhase (16, 31),
kConfigEntryKeyType = CSRBitRange (0, 1),
kConfigEntryKeyTypePhase = CSRBitRangePhase (0, 1),
kConfigEntryKeyValue = CSRBitRange (2, 7),
kConfigEntryKeyValuePhase = CSRBitRangePhase (2, 7),
kConfigEntryValue = CSRBitRange (8, 31),
kConfigEntryValuePhase = CSRBitRangePhase (8, 31),
kConfigLeafDirLength = CSRBitRange (0, 15),
kConfigLeafDirLengthPhase = CSRBitRangePhase (0, 15),
kConfigLeafDirCRC = CSRBitRange (16, 31),
kConfigLeafDirCRCPhase = CSRBitRangePhase (16, 31)
};
enum
{
kCSRNodeID = CSRBitRange (0, 15),
kCSRNodeIDPhase = CSRBitRangePhase (0, 15),
kCSRInitialMemorySpaceBaseAddressHi = 0x00000000,
kCSRInitialMemorySpaceBaseAddressLo = 0x00000000,
kCSRPrivateSpaceBaseAddressHi = 0x0000FFFF,
kCSRPrivateSpaceBaseAddressLo = 0xE0000000,
kCSRRegisterSpaceBaseAddressHi = 0x0000FFFF,
kCSRRegisterSpaceBaseAddressLo = 0xF0000000,
kCSRCoreRegistersBaseAddress = kCSRRegisterSpaceBaseAddressLo,
kCSRStateClearAddress = kCSRCoreRegistersBaseAddress + 0x0000,
kCSRStateSetAddress = kCSRCoreRegistersBaseAddress + 0x0004,
kCSRNodeIDsAddress = kCSRCoreRegistersBaseAddress + 0x0008,
kCSRResetStartAddress = kCSRCoreRegistersBaseAddress + 0x000C,
kCSRIndirectAddressAddress = kCSRCoreRegistersBaseAddress + 0x0010,
kCSRIndirectDataAddress = kCSRCoreRegistersBaseAddress + 0x0014,
kCSRSplitTimeoutHiAddress = kCSRCoreRegistersBaseAddress + 0x0018,
kCSRSplitTimeoutLoAddress = kCSRCoreRegistersBaseAddress + 0x001C,
kCSRArgumentHiAddress = kCSRCoreRegistersBaseAddress + 0x0020,
kCSRArgumentLoAddress = kCSRCoreRegistersBaseAddress + 0x0024,
kCSRTestStartAddress = kCSRCoreRegistersBaseAddress + 0x0028,
kCSRTestStatusAddress = kCSRCoreRegistersBaseAddress + 0x002C,
kCSRUnitsBaseHiAddress = kCSRCoreRegistersBaseAddress + 0x0030,
kCSRUnitsBaseLoAddress = kCSRCoreRegistersBaseAddress + 0x0034,
kCSRUnitsBoundHiAddress = kCSRCoreRegistersBaseAddress + 0x0038,
kCSRUnitsBoundLoAddress = kCSRCoreRegistersBaseAddress + 0x003C,
kCSRMemoryBaseHiAddress = kCSRCoreRegistersBaseAddress + 0x0040,
kCSRMemoryBaseLoAddress = kCSRCoreRegistersBaseAddress + 0x0044,
kCSRMemoryBoundHiAddress = kCSRCoreRegistersBaseAddress + 0x0048,
kCSRMemoryBoundLoAddress = kCSRCoreRegistersBaseAddress + 0x004C,
kCSRInterruptTargetAddress = kCSRCoreRegistersBaseAddress + 0x0050,
kCSRInterruptMaskAddress = kCSRCoreRegistersBaseAddress + 0x0054,
kCSRClockValueHiAddress = kCSRCoreRegistersBaseAddress + 0x0058,
kCSRClockValueMidAddress = kCSRCoreRegistersBaseAddress + 0x005C,
kCSRClockTickPeriodMidAddress = kCSRCoreRegistersBaseAddress + 0x0060,
kCSRClockTickPeriodLoAddress = kCSRCoreRegistersBaseAddress + 0x0064,
kCSRClockStrobeArrivedHiAddress = kCSRCoreRegistersBaseAddress + 0x0068,
kCSRClockStrobeArrivedMidAddress = kCSRCoreRegistersBaseAddress + 0x006C,
kCSRClockInfo0Address = kCSRCoreRegistersBaseAddress + 0x0070,
kCSRClockInfo1Address = kCSRCoreRegistersBaseAddress + 0x0074,
kCSRClockInfo2Address = kCSRCoreRegistersBaseAddress + 0x0078,
kCSRClockInfo3Address = kCSRCoreRegistersBaseAddress + 0x007C,
kCSRMessageRequestAddress = kCSRCoreRegistersBaseAddress + 0x0080,
kCSRMessageResponseAddress = kCSRCoreRegistersBaseAddress + 0x00C0,
kCSRErrorLogBufferAddress = kCSRCoreRegistersBaseAddress + 0x0180,
kCSRBusDependentRegistersBaseAddress
= kCSRRegisterSpaceBaseAddressLo + 0x0200,
kCSRBusyTimeout = kCSRRegisterSpaceBaseAddressLo + 0x0210,
kCSRBusManagerID = kCSRRegisterSpaceBaseAddressLo + 0x021C,
kCSRBandwidthAvailable = kCSRRegisterSpaceBaseAddressLo + 0x0220,
kCSRChannelsAvailable31_0 = kCSRRegisterSpaceBaseAddressLo + 0x0224,
kCSRChannelsAvailable63_32 = kCSRRegisterSpaceBaseAddressLo + 0x0228,
kConfigROMBaseAddress = kCSRRegisterSpaceBaseAddressLo + 0x0400,
kConfigBIBHeaderAddress = kConfigROMBaseAddress,
kConfigBIBBusNameAddress = kConfigROMBaseAddress + 4,
kPCRBaseAddress = kCSRRegisterSpaceBaseAddressLo + 0x900,
kFCPCommandAddress = kCSRRegisterSpaceBaseAddressLo + 0xb00,
kFCPResponseAddress = kCSRRegisterSpaceBaseAddressLo + 0xd00
};
typedef UInt64 CSRNodeUniqueID;
typedef CSRNodeUniqueID *CSRNodeUniqueIDPtr;
enum
{
kFWCSRStateGone = kFWBit16,
kFWCSRStateLinkOff = kFWBit22,
kFWCSRStateCMstr = kFWBit23
};
enum
{
kFWAddressBusID = FWBitRange (16, 25) << kCSRNodeIDPhase,
kFWAddressBusIDPhase = FWBitRangePhase (16, 25) + kCSRNodeIDPhase,
kFWAddressNodeID = FWBitRange (26, 31) << kCSRNodeIDPhase,
kFWAddressNodeIDPhase = FWBitRangePhase (26, 31) + kCSRNodeIDPhase,
kFWLocalBusID = 1023,
kFWBroadcastNodeID = 63,
kFWBadNodeID = 0xffff,
kFWLocalBusAddress = kFWLocalBusID << kFWAddressBusIDPhase,
kFWBroadcastAddress = kFWBroadcastNodeID << kFWAddressNodeIDPhase
};
#define FWNodeBaseAddress(busID, nodeID) \
( \
(busID << kFWAddressBusIDPhase) | \
(nodeID << kFWAddressNodeIDPhase) \
)
#define FWNodeRegisterSpaceBaseAddressHi(busID, nodeID) \
( \
FWNodeBaseAddress (busID, nodeID) | \
kCSRRegisterSpaceBaseAddressHi \
)
enum
{
kFWBIBHeaderAddress = kConfigBIBHeaderAddress,
kFWBIBBusNameAddress = kConfigBIBBusNameAddress,
kFWBIBNodeCapabilitiesAddress = kConfigROMBaseAddress + 8,
kFWBIBNodeUniqueIDHiAddress = kConfigROMBaseAddress + 12,
kFWBIBNodeUniqueIDLoAddress = kConfigROMBaseAddress + 16,
kFWBIBBusName = 0x31333934,
kFWBIBIrmc = kFWBit0,
kFWBIBCmc = kFWBit1,
kFWBIBIsc = kFWBit2,
kFWBIBBmc = kFWBit3,
kFWBIBCycClkAcc = FWBitRange (8, 15),
kFWBIBCycClkAccPhase = FWBitRangePhase (8, 15),
kFWBIBMaxRec = FWBitRange (16, 19),
kFWBIBMaxRecPhase = FWBitRangePhase (16, 19),
kFWBIBMaxROM = FWBitRange (20, 21),
kFWBIBMaxROMPhase = FWBitRangePhase (20, 21),
kFWBIBGeneration = FWBitRange (24, 27),
kFWBIBGenerationPhase = FWBitRangePhase (24, 27),
kFWBIBLinkSpeed = FWBitRange (29, 31),
kFWBIBLinkSpeedPhase = FWBitRangePhase (29, 31),
};
enum
{
kFWBusManagerArbitrationTimeoutDuration = 625 };
enum
{
kFWMaxBusses = 1023,
kFWMaxNodesPerBus = 63,
kFWMaxNodeHops = 16
};
enum
{
kFWPhyPacketID = FWBitRange (0, 1),
kFWPhyPacketIDPhase = FWBitRangePhase (0, 1),
kFWPhyPacketPhyID = FWBitRange (2, 7),
kFWPhyPacketPhyIDPhase = FWBitRangePhase (2, 7)
};
enum
{
kSelfIDPacketSize = 8,
kMaxSelfIDs = 4 };
enum
{
kFWConfigurationPacketID = 0,
kFWLinkOnPacketID = 1,
kFWSelfIDPacketID = 2
};
enum
{
kFWPhyConfigurationR = kFWBit8,
kFWPhyConfigurationT = kFWBit9,
kFWPhyConfigurationGapCnt = FWBitRange (10, 15),
kFWPhyConfigurationGapCntPhase
= FWBitRangePhase (10, 15)
};
enum
{
kFWSelfIDPortStatusChild = 3,
kFWSelfIDPortStatusParent = 2,
kFWSelfIDPortStatusNotConnected = 1,
kFWSelfIDPortStatusNotPresent = 0,
kFWSelfIDNoPower = 0,
kFWSelfIDSelfPowered15W = 1,
kFWSelfIDSelfPowered30W = 2,
kFWSelfIDSelfPowered45W = 3,
kFWSelfIDBusPowered1W = 4,
kFWSelfIDBusPowered3W = 5,
kFWSelfIDBusPowered6W = 6,
kFWSelfIDBusPowered10W = 7,
kFWSelfIDPhyID = kFWPhyPacketPhyID, kFWSelfIDPhyIDPhase = kFWPhyPacketPhyIDPhase,
kFWSelfIDM = kFWBit31,
kFWSelfID0L = kFWBit9,
kFWSelfID0GapCnt = FWBitRange (10, 15),
kFWSelfID0GapCntPhase = FWBitRangePhase (10, 15),
kFWSelfID0SP = FWBitRange (16, 17),
kFWSelfID0SPPhase = FWBitRangePhase (16, 17),
kFWSelfID0Del = FWBitRange (18, 19),
kFWSelfID0DelPhase = FWBitRangePhase (18, 19),
kFWSelfID0C = kFWBit20,
kFWSelfID0Pwr = FWBitRange (21, 23),
kFWSelfID0PwrPhase = FWBitRangePhase (21, 23),
kFWSelfID0P0 = FWBitRange (24, 25),
kFWSelfID0P0Phase = FWBitRangePhase (24, 25),
kFWSelfID0P1 = FWBitRange (26, 27),
kFWSelfID0P1Phase = FWBitRangePhase (26, 27),
kFWSelfID0P2 = FWBitRange (28, 29),
kFWSelfID0P2Phase = FWBitRangePhase (28, 29),
kFWSelfID0I = kFWBit30,
kFWSelfIDPacketType = kFWBit8,
kFWSelfIDNN = FWBitRange (9, 11),
kFWSelfIDNNPhase = FWBitRangePhase (9, 11),
kFWSelfIDNPa = FWBitRange (14, 15),
kFWSelfIDNPaPhase = FWBitRangePhase (14, 15),
kFWSelfIDNPb = FWBitRange (16, 17),
kFWSelfIDNPbPhase = FWBitRangePhase (16, 17),
kFWSelfIDNPc = FWBitRange (18, 19),
kFWSelfIDNPcPhase = FWBitRangePhase (18, 19),
kFWSelfIDNPd = FWBitRange (20, 21),
kFWSelfIDNPdPhase = FWBitRangePhase (20, 21),
kFWSelfIDNPe = FWBitRange (22, 23),
kFWSelfIDNPePhase = FWBitRangePhase (22, 23),
kFWSelfIDNPf = FWBitRange (24, 25),
kFWSelfIDNPfPhase = FWBitRangePhase (24, 25),
kFWSelfIDNPg = FWBitRange (26, 27),
kFWSelfIDNPgPhase = FWBitRangePhase (26, 27),
kFWSelfIDNPh = FWBitRange (28, 29),
kFWSelfIDNPhPhase = FWBitRangePhase (28, 29),
kFWSelfIDMore = kFWBit31
};
enum
{
kFWPacketTCode = FWBitRange (24, 27),
kFWPacketTCodePhase = FWBitRangePhase (24, 27)
};
enum
{
kFWAsynchSpd = FWBitRange (14, 15),
kFWAsynchSpdPhase = FWBitRangePhase (14, 15),
kFWAsynchTLabel = FWBitRange (16, 21),
kFWAsynchTLabelPhase = FWBitRangePhase (16, 21),
kFWAsynchTTotal = ((0xffffffff & kFWAsynchTLabel) >> kFWAsynchTLabelPhase)+1,
kFWAsynchRt = FWBitRange (22, 23),
kFWAsynchRtPhase = FWBitRangePhase (22, 23),
kFWAsynchNew = 0,
kFWAsynchRetryA = 2,
kTIAsycnhRetryB = 3,
kFWAsynchPriority = FWBitRange (28, 31),
kFWAsynchPriorityPhase = FWBitRangePhase (28, 31),
kFWAsynchDestinationID = FWBitRange (0, 15),
kFWAsynchDestinationIDPhase = FWBitRangePhase (0, 15),
kFWAsynchSourceID = FWBitRange (0, 15),
kFWAsynchSourceIDPhase = FWBitRangePhase (0, 15),
kFWAsynchDestinationOffsetHigh = FWBitRange (16, 31),
kFWAsynchDestinationOffsetHighPhase = FWBitRangePhase (16, 31),
kFWAsynchDestinationOffsetLow = FWBitRange (0, 31),
kFWAsynchDestinationOffsetLowPhase = FWBitRangePhase (0, 31),
kFWAsynchDataLength = FWBitRange (0, 15),
kFWAsynchDataLengthPhase = FWBitRangePhase (0, 15),
kFWAsynchExtendedTCode = FWBitRange (16, 31),
kFWAsynchExtendedTCodePhase = FWBitRangePhase (16, 31),
kFWAsynchAckSent = FWBitRange (28, 31),
kFWAsynchAckSentPhase = FWBitRangePhase (28, 31),
kFWAsynchRCode = FWBitRange (16, 19),
kFWAsynchRCodePhase = FWBitRangePhase (16, 19)
};
enum
{
kFWTCodeWriteQuadlet = 0,
kFWTCodeWriteBlock = 1,
kFWTCodeWriteResponse = 2,
kFWTCodeReadQuadlet = 4,
kFWTCodeReadBlock = 5,
kFWTCodeReadQuadletResponse = 6,
kFWTCodeReadBlockResponse = 7,
kFWTCodeCycleStart = 8,
kFWTCodeLock = 9,
kFWTCodeIsochronousBlock = 10,
kFWTCodeLockResponse = 11,
kFWTCodePHYPacket = 14
};
enum
{
kFWExtendedTCodeMaskSwap = 1,
kFWExtendedTCodeCompareSwap = 2,
kFWExtendedTCodeFetchAdd = 3,
kFWExtendedTCodeLittleAdd = 4,
kFWExtendedTCodeBoundedAdd = 5,
kFWExtendedTCodeWrapAdd = 6,
kFWExtendedTCodeVendorDependent = 7
};
enum {
inUseErr = -4160, notFoundErr = -4161, timeoutErr = -4162, busReconfiguredErr = -4163, invalidIDTypeErr = -4166, alreadyRegisteredErr = -4168, disconnectedErr = -4169, retryExceededErr = -4170, addressRangeErr = -4171, addressAlignmentErr = -4172,
multipleTalkerErr = -4180, channelActiveErr = -4181, noListenerOrTalkerErr = -4182, noChannelsAvailableErr = -4183, channelNotAvailableErr = -4184, invalidIsochPortIDErr = -4185, invalidFWReferenceTypeErr = -4186, separateBusErr = -4187, badSelfIDsErr = -4188,
cableVoltageTooLowErr = -4190, cablePowerInsufficientErr = -4191 };
#endif