#ifndef _APPLEATAPIIX_H
#define _APPLEATAPIIX_H
#include <IOKit/IOTimerEventSource.h>
#include <IOKit/IOMemoryCursor.h>
#include <IOKit/pci/IOPCIDevice.h>
#include <libkern/OSByteOrder.h>
#include <IOKit/ata/IOATAStandardInterface.h>
#include "AppleATAPIIXRegs.h"
#include "AppleATAPIIXTiming.h"
class AppleATAPIIX : public IOATAStandardDriver
{
OSDeclareDefaultStructors( AppleATAPIIX )
protected:
IOPCIDevice * provider; UInt32 pciCFID; UInt32 channel; UInt16 ioCmdRange; UInt16 ioCtlRange; UInt16 ioBMRange; UInt32 dmaReqLength; bool dmaIsWrite; prdEntry_t * prdTable; IOPhysicalAddress prdTablePhys; PIIXSelectedTimings timings[2]; IOLittleMemoryCursor * prdCursor; IOTimerEventSource * timerEventSource;
IOInterruptEventSource * interruptEventSource;
bool _getIDERanges(IOPCIDevice * provider);
bool _getBMRange(IOPCIDevice * provider);
bool _allocatePRDTable();
void _deallocatePRDTable();
bool _resetTimings();
bool _readPCIConfigSpace(UInt8 * configSpace);
bool _writePCIConfigSpace(UInt8 * configSpace);
bool _selectTiming(UInt32 unit,
PIIXProtocol timingProtocol,
UInt8 * pciConfig);
public:
static void initialize();
static int PIIXGetChannel(IOPCIDevice * provider);
void writeATAReg(UInt32 regIndex, UInt32 regValue);
UInt32 readATAReg(UInt32 regIndex);
void free();
bool configure(IOService * forProvider,
ATAControllerInfo * controllerInfo);
bool createWorkLoop(IOWorkLoop ** workLoop);
bool provideProtocols(enum ATAProtocol * protocolsSupported);
bool provideTimings(UInt32 * numTimings,
ATATiming * timingsSupported);
bool calculateTiming(UInt32 deviceNum, ATATiming * pTiming);
bool selectTiming(UInt32 unitNum,
ATATimingProtocol timingProtocol);
void disableControllerInterrupts();
void enableControllerInterrupts();
void ataTimer(IOTimerEventSource * sender);
bool programDma(IOATAStandardCommand * cmd);
bool startDma(IOATAStandardCommand * cmd);
bool stopDma(IOATAStandardCommand * cmd, UInt32 * transferCount);
void interruptOccurred();
};
#endif