#include <IOKit/IOTimerEventSource.h>
#include <IOKit/IOMemoryCursor.h>
#include <IOKit/pci/IOPCIDevice.h>
#include <libkern/OSByteOrder.h>
#include <IOKit/ata/IOATAStandardInterface.h>
#include "AppleUltra33ATARegs.h"
class AppleUltra33ATA : public IOATAStandardDriver
{
OSDeclareDefaultStructors( AppleUltra33ATA )
public:
virtual bool attach( IOService * provider );
virtual void detach( IOService * provider );
void free();
protected:
bool configure( IOService *provider, ATAControllerInfo *controllerDataSize );
void interruptOccurred();
void enableControllerInterrupts();
void disableControllerInterrupts();
bool calculateTiming( UInt32 deviceNum, ATATiming *timing );
bool selectTiming( UInt32 deviceNum, ATATimingProtocol timingProtocol );
void newDeviceSelected( IOATADevice *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 checkDmaActive();
bool resetDma();
private:
bool calculatePIOTiming( UInt32 deviceNum, ATATiming *timing );
bool calculateDMATiming( UInt32 deviceNum, ATATiming *timing );
bool calculateUltraDMATiming( UInt32 deviceNum, ATATiming *timing );
UInt32 pciReadByte( UInt32 reg );
void pciWriteByte( UInt32 reg, UInt32 value );
UInt32 pciReadLong( UInt32 reg );
void pciWriteLong( UInt32 reg, UInt32 value );
private:
IOPCIDevice *provider;
IOService *pathProvider;
UInt32 busNum;
IOMemoryMap *ioMapATA[2];
volatile UInt32 *ioBaseATA[2];
IOInterruptEventSource *interruptEventSource;
Ultra646Regs ideTimingRegs[2];
IOBigMemoryCursor *dmaMemoryCursor;
Ultra646Descriptor *dmaDescriptors;
UInt32 dmaDescriptorsPhys;
UInt32 numDescriptors;
void *bitBucketAddr;
UInt32 bitBucketAddrPhys;
UInt32 dmaReqLength;
bool dmaIsWrite;
};