#ifndef _APPLEK2SATA_
#define _APPLEK2SATA_
#include <IOKit/IOTypes.h>
#include <IOKit/pci/IOPCIDevice.h>
#include <IOKit/ata/IOATATypes.h>
#include <IOKit/ata/IOATABusInfo.h>
#include <IOKit/ata/IOPCIATA.h>
#include <IOKit/ppc/IODBDMA.h>
#include <IOKit/IOMemoryCursor.h>
#include <IOKit/IOFilterInterruptEventSource.h>
class AppleK2SATA : public IOPCIATA
{
OSDeclareDefaultStructors(AppleK2SATA)
public:
virtual bool init(OSDictionary* properties);
virtual IOService* probe( IOService* provider, SInt32* score );
virtual bool start( IOService* provider );
virtual IOWorkLoop* getWorkLoop() const;
virtual IOReturn selectConfig( IOATADevConfig* configRequest, UInt32 unitNumber);
virtual IOReturn getConfig( IOATADevConfig* configRequest, UInt32 unitNumber);
virtual IOReturn provideBusInfo( IOATABusInfo* infoOut);
virtual IOReturn message (UInt32 type, IOService* provider, void* argument = 0);
virtual void getLock(bool lock);
protected:
struct ATABusTimings
{
UInt8 ataPIOSpeedMode; UInt16 ataPIOCycleTime; UInt8 ataMultiDMASpeed; UInt16 ataMultiCycleTime; UInt16 ataUltraDMASpeedMode; };
ATABusTimings busTimings[2];
volatile UInt32* SATAStatus;
volatile UInt32* SATAError;
volatile UInt32* SATAControl;
volatile UInt32* SIMRegister;
volatile UInt32* GInterruptStatus;
volatile UInt32* StatusWide;
volatile UInt32* SICR1;
volatile UInt32* SICR2;
UInt32 interruptBitMask;
IOMemoryMap* ioBaseAddrMap[5];
UInt32 busChildNumber;
bool isBusOnline;
IOFilterInterruptEventSource* _devIntSrc;
virtual IOReturn selectIOTimerValue( IOATADevConfig* configRequest, UInt32 unitNumber);
virtual void selectIOTiming( ataUnitID unit );
virtual bool configureTFPointers(void);
virtual bool createDeviceInterrupt(void);
static void sDeviceInterruptOccurred(OSObject*, IOInterruptEventSource *, int count);
static bool sFilterInterrupt(OSObject *, IOFilterInterruptEventSource *);
virtual IOReturn handleDeviceInterrupt(void);
bool interruptIsValid( IOFilterInterruptEventSource* source);
virtual void handleTimeout( void );
virtual IOReturn startDMA( void );
virtual IOReturn issueCommand( void );
virtual UInt32 scanForDrives( void );
virtual IOReturn selectDevice( ataUnitID unit );
virtual IOReturn registerAccess(bool isWrite);
virtual IOReturn softResetBus( bool doATAPI );
virtual IOReturn synchronousIO(void);
virtual bool allocDMAChannel(void);
virtual void initATADMAChains (PRD* descPtr);
virtual IOReturn createChannelCommands(void);
virtual bool freeDMAChannel(void);
virtual bool ATAPISlaveExists( void );
virtual IOReturn writePacket( void );
virtual IOReturn executeCommand(IOATADevice* nub, IOATABusCommand* command); virtual IOReturn handleCommand( void* param0, void* param1, void* param2,void* param3 );
virtual IOReturn handleQueueFlush( void ); virtual bool checkTimeout( void ); static void cleanUpAction(OSObject * owner, void*, void*, void*, void*); virtual void cleanUpBus(void);
virtual void free();
};
#endif // _APPLEK2SATA_