#ifndef _IODBDMA_H_
#define _IODBDMA_H_
#include <IOKit/IOTypes.h>
#include <libkern/OSByteOrder.h>
struct IODBDMAChannelRegisters {
volatile unsigned long channelControl;
volatile unsigned long channelStatus;
volatile unsigned long commandPtrHi;
volatile unsigned long commandPtrLo;
volatile unsigned long interruptSelect;
volatile unsigned long branchSelect;
volatile unsigned long waitSelect;
volatile unsigned long transferModes;
volatile unsigned long data2PtrHi;
volatile unsigned long data2PtrLo;
volatile unsigned long reserved1;
volatile unsigned long addressHi;
volatile unsigned long reserved2[4];
volatile unsigned long unimplemented[16];
volatile unsigned long undefined[32];
};
typedef struct IODBDMAChannelRegisters IODBDMAChannelRegisters;
enum {
kdbdmaRun = 0x00008000,
kdbdmaPause = 0x00004000,
kdbdmaFlush = 0x00002000,
kdbdmaWake = 0x00001000,
kdbdmaDead = 0x00000800,
kdbdmaActive = 0x00000400,
kdbdmaBt = 0x00000100,
kdbdmaS7 = 0x00000080,
kdbdmaS6 = 0x00000040,
kdbdmaS5 = 0x00000020,
kdbdmaS4 = 0x00000010,
kdbdmaS3 = 0x00000008,
kdbdmaS2 = 0x00000004,
kdbdmaS1 = 0x00000002,
kdbdmaS0 = 0x00000001
};
#define IOSetDBDMAChannelControlBits(mask) ( ((mask) | (mask) << 16) )
#define IOClearDBDMAChannelControlBits(mask) ( (mask) << 16)
struct IODBDMADescriptor {
unsigned long operation;
unsigned long address;
volatile unsigned long cmdDep;
volatile unsigned long result;
};
typedef struct IODBDMADescriptor IODBDMADescriptor;
enum {
kdbdmaOutputMore = 0,
kdbdmaOutputLast = 1,
kdbdmaInputMore = 2,
kdbdmaInputLast = 3,
kdbdmaStoreQuad = 4,
kdbdmaLoadQuad = 5,
kdbdmaNop = 6,
kdbdmaStop = 7
};
enum {
kdbdmaKeyStream0 = 0,
kdbdmaKeyStream1 = 1,
kdbdmaKeyStream2 = 2,
kdbdmaKeyStream3 = 3,
kdbdmaKeyRegs = 5,
kdbdmaKeySystem = 6,
kdbdmaKeyDevice = 7,
kdbdmaIntNever = 0,
kdbdmaIntIfTrue = 1,
kdbdmaIntIfFalse = 2,
kdbdmaIntAlways = 3,
kdbdmaBranchNever = 0,
kdbdmaBranchIfTrue = 1,
kdbdmaBranchIfFalse = 2,
kdbdmaBranchAlways = 3,
kdbdmaWaitNever = 0,
kdbdmaWaitIfTrue = 1,
kdbdmaWaitIfFalse = 2,
kdbdmaWaitAlways = 3,
kdbdmaCommandMask = (long)0xFFFF0000,
kdbdmaReqCountMask = 0x0000FFFF
};
enum {
kdbdmaStatusRun = kdbdmaRun << 16,
kdbdmaStatusPause = kdbdmaPause << 16,
kdbdmaStatusFlush = kdbdmaFlush << 16,
kdbdmaStatusWake = kdbdmaWake << 16,
kdbdmaStatusDead = kdbdmaDead << 16,
kdbdmaStatusActive = kdbdmaActive << 16,
kdbdmaStatusBt = kdbdmaBt << 16,
kdbdmaStatusS7 = kdbdmaS7 << 16,
kdbdmaStatusS6 = kdbdmaS6 << 16,
kdbdmaStatusS5 = kdbdmaS5 << 16,
kdbdmaStatusS4 = kdbdmaS4 << 16,
kdbdmaStatusS3 = kdbdmaS3 << 16,
kdbdmaStatusS2 = kdbdmaS2 << 16,
kdbdmaStatusS1 = kdbdmaS1 << 16,
kdbdmaStatusS0 = kdbdmaS0 << 16,
kdbdmaResCountMask = 0x0000FFFF,
kdbdmaXferStatusMask = 0xFFFF0000
};
#define IOSetDBDMAChannelRegister(registerSetPtr,field,value) \
OSWriteSwapInt32(registerSetPtr,offsetof(IODBDMAChannelRegisters,field),value)
#define IOGetDBDMAChannelRegister(registerSetPtr, field) \
OSReadSwapInt32(registerSetPtr,offsetof(IODBDMAChannelRegisters, field))
#define IOSetDBDMAChannelControl(registerSetPtr,ctlValue) \
do { \
eieio(); \
IOSetDBDMAChannelRegister(registerSetPtr,channelControl,ctlValue); \
eieio(); \
} while(0)
#define IOGetDBDMAChannelStatus(registerSetPtr) \
IOGetDBDMAChannelRegister(registerSetPtr,channelStatus)
#define IOGetDBDMACommandPtr(registerSetPtr) \
IOGetDBDMAChannelRegister(registerSetPtr,commandPtrLo)
#define IOSetDBDMACommandPtr(registerSetPtr,cclPtr) \
do { \
IOSetDBDMAChannelRegister(registerSetPtr,commandPtrHi,0); \
eieio(); \
IOSetDBDMAChannelRegister(registerSetPtr,commandPtrLo,cclPtr); \
eieio(); \
} while(0)
#define IOGetDBDMAInterruptSelect(registerSetPtr) \
IOGetDBDMAChannelRegister(registerSetPtr,interruptSelect)
#define IOSetDBDMAInterruptSelect(registerSetPtr,intSelValue) \
do { \
IOSetDBDMAChannelRegister(registerSetPtr,interruptSelect,intSelValue); \
eieio(); \
} while(0)
#define IOGetDBDMABranchSelect(registerSetPtr) \
IOGetDBDMAChannelRegister(registerSetPtr,branchSelect)
#define IOSetDBDMABranchSelect(registerSetPtr,braSelValue) \
do { \
IOSetDBDMAChannelRegister(registerSetPtr,branchSelect,braSelValue); \
eieio(); \
} while(0)
#define IOGetDBDMAWaitSelect(registerSetPtr) \
IOGetDBDMAChannelRegister(registerSetPtr,waitSelect)
#define IOSetDBDMAWaitSelect(registerSetPtr,waitSelValue) \
do { \
IOSetDBDMAChannelRegister(registerSetPtr,waitSelect,waitSelValue); \
eieio(); \
} while(0)
#define IOSetDBDMADescriptor(descPtr,field,value) \
OSWriteSwapInt32( descPtr, offsetof( IODBDMADescriptor, field), value)
#define IOGetDBDMADescriptor(descPtr,field) \
OSReadSwapInt32( descPtr, offsetof( IODBDMADescriptor, field))
#define IOMakeDBDMAOperation(cmd,key,interrupt,branch,wait,count) \
( ((cmd) << 28) | ((key) << 24) | ((interrupt) << 20) \
| ((branch) << 18) | ( (wait) << 16) | (count) )
#define IOMakeDBDMADescriptor(descPtr,cmd,key,interrupt,branch,wait,count,addr)\
do { \
IOSetDBDMADescriptor(descPtr, address, addr); \
IOSetDBDMADescriptor(descPtr, cmdDep, 0); \
IOSetDBDMADescriptor(descPtr, result, 0); \
eieio(); \
IOSetDBDMADescriptor(descPtr, operation, \
IOMakeDBDMAOperation(cmd,key,interrupt,branch,wait,count)); \
eieio(); \
} while(0)
#define IOMakeDBDMADescriptorDep(descPtr,cmd,key,interrupt,branch,wait,count,addr,dep) \
do { \
IOSetDBDMADescriptor(descPtr, address, addr); \
IOSetDBDMADescriptor(descPtr, cmdDep, dep); \
IOSetDBDMADescriptor(descPtr, result, 0); \
eieio(); \
IOSetDBDMADescriptor(descPtr, operation, \
IOMakeDBDMAOperation(cmd, key, interrupt, branch, wait, count)); \
eieio(); \
} while(0)
#define IOGetCCOperation(descPtr) \
IOGetDBDMADescriptor(descPtr,operation)
#define IOSetCCOperation(descPtr,operationValue) \
IOSetDBDMADescriptor(descPtr,operation,operationValue)
#define IOGetCCAddress(descPtr) \
IOGetDBDMADescriptor(descPtr,address)
#define IOSetCCAddress(descPtr,addressValue) \
IOSetDBDMADescriptor(descPtr,address, addressValue)
#define IOGetCCCmdDep(descPtr) \
IOGetDBDMADescriptor(descPtr,cmdDep)
#define IOSetCCCmdDep(descPtr,cmdDepValue) \
IOSetDBDMADescriptor(descPtr,cmdDep,cmdDepValue)
#define IOGetCCResult(descPtr) \
IOGetDBDMADescriptor(descPtr,result)
#define IOSetCCResult(descPtr,resultValue) \
IOSetDBDMADescriptor(descPtr,result,resultValue)
extern void IODBDMAStart( volatile IODBDMAChannelRegisters *registerSetPtr, volatile IODBDMADescriptor *physicalDescPtr);
extern void IODBDMAStop( volatile IODBDMAChannelRegisters *registerSetPtr);
extern void IODBDMAFlush( volatile IODBDMAChannelRegisters *registerSetPtr);
extern void IODBDMAReset( volatile IODBDMAChannelRegisters *registerSetPtr);
extern void IODBDMAContinue( volatile IODBDMAChannelRegisters *registerSetPtr);
extern void IODBDMAPause( volatile IODBDMAChannelRegisters *registerSetPtr);
extern IOReturn IOAllocatePhysicallyContiguousMemory( unsigned int size, unsigned int options,
IOVirtualAddress * logical, IOPhysicalAddress * physical );
extern IOReturn IOFreePhysicallyContiguousMemory( IOVirtualAddress * logical, unsigned int size);
#endif