#include <IOKit/IOMemoryCursor.h>
#include <IOKit/ppc/IODBDMA.h>
#include <IOKit/ata/IOATAStandardInterface.h>
class AppleUltra66ATA : public IOATAStandardDriver
{
OSDeclareDefaultStructors( AppleUltra66ATA )
public:
void free();
protected:
bool configure( IOService *provider, ATAControllerInfo *controllerDataSize );
void enableControllerInterrupts();
void disableControllerInterrupts();
bool calculateTiming( UInt32 deviceNum, ATATiming *timing );
bool selectTiming( UInt32 deviceNum, ATATimingProtocol timingProtocol );
void newDeviceSelected( IOATAStandardDevice *newDevice );
void writeATAReg( UInt32 regIndex, UInt32 regValue );
UInt32 readATAReg( UInt32 regIndex );
bool programDma( IOATAStandardCommand *cmd );
bool startDma( IOATAStandardCommand *cmd );
bool stopDma( IOATAStandardCommand *cmd, UInt32 *transferCount );
bool resetDma();
bool checkDmaActive();
private:
bool identifyController();
bool calculatePIOTiming( UInt32 deviceNum, ATATiming *timing );
bool calculateDMATiming( UInt32 deviceNum, ATATiming *timing );
bool calculateUltra66PIOTiming( UInt32 deviceNum, ATATiming *timing );
bool calculateUltra66DMATiming( UInt32 deviceNum, ATATiming *timing );
bool calculateUltra66UDMATiming( UInt32 deviceNum, ATATiming *timing );
private:
IOService *provider;
IOMemoryMap *ioMapATA;
volatile UInt32 *ioBaseATA;
IOMemoryMap *ioMapDMA;
volatile IODBDMAChannelRegisters *ioBaseDMA;
UInt32 controllerType;
IOInterruptEventSource *interruptEventSource;
UInt32 ideTimingWord[2];
IOBigMemoryCursor *dmaMemoryCursor;
IODBDMADescriptor *dmaDescriptors;
UInt32 dmaDescriptorsPhys;
UInt32 numDescriptors;
void *bitBucketAddr;
UInt32 bitBucketAddrPhys;
UInt32 dmaReqLength;
};
#define kATACS3RegBase (16)
enum
{
kATASysClkNS = 30,
kATAUltra66ClockPS = (15 * 1000 / 2),
kATAPioAccessBase = 0,
kATAPioAccessMin = 4,
kATAPioRecoveryBase = 4,
kATAPioRecoveryMin = 1,
kATADmaAccessBase = 0,
kATADmaAccessMin = 1,
kATADmaRecoveryBase = 1,
kATADmaRecoveryMin = 1,
};
enum
{
kControllerTypeDBDMAVersion1 = 1,
kControllerTypeDBDMAVersion2 = 2,
kControllerTypeUltra66DBDMA = 3,
};