#include "CMD646Root.h"
#include <IOKit/assert.h>
#include <IOKit/IOTypes.h>
#include <IOKit/IOLib.h>
#include <IOKit/pci/IOPCIDevice.h>
#include <libkern/OSByteOrder.h>
#include <libkern/OSAtomic.h>
#include <IOKit/IODeviceTreeSupport.h>
#ifdef DLOG
#undef DLOG
#endif
#ifdef ATA_DEBUG
#define DLOG(fmt, args...) IOLog(fmt, ## args)
#else
#define DLOG(fmt, args...)
#endif
#define kDeviceTypeString "pci-ide"
#define kDevicetypeKey "device_type"
#define kNameKey "name"
#define kNameString "pci-ata"
#define super IOService
OSDefineMetaClassAndStructors ( CMD646Root, IOService )
IOService*
CMD646Root::probe(IOService* provider, SInt32* score)
{
OSData *compatibleEntry;
DLOG("CMD646Root starting probe\n");
compatibleEntry = OSDynamicCast( OSData, provider->getProperty( "name" ) );
if ( compatibleEntry == 0 )
{
DLOG("CMD646Root failed getting compatible property\n");
return 0;
}
if ( compatibleEntry->isEqualTo( kNameString, sizeof(kNameString)-1 ) == false )
{
DLOG("CMD646Root compatible property doesn't match\n");
return 0;
}
return this;
}
bool
CMD646Root::start( IOService * provider )
{
DLOG("CMD646Root: starting\n");
IOPCIDevice *pciNub = (IOPCIDevice *)provider;
if( !super::start( provider))
return( false);
pciNub->setIOEnable(true);
pciNub->setBusMasterEnable( true );
publishBelow(provider);
DLOG("CMD646Root: started\n");
return( true);
}
IOService *
CMD646Root::createNub( IORegistryEntry * from )
{
IOService * nub;
nub = new CMD646Device;
if( nub && !nub->init( from, gIODTPlane )) {
nub->free();
nub = 0;
}
return( nub);
}
void
CMD646Root::processNub(IOService * )
{
}
void
CMD646Root::publishBelow( IORegistryEntry * root )
{
DLOG("CMD646Root publish below\n");
OSCollectionIterator * kids = 0;
IORegistryEntry * next;
IOService * nub;
kids = IODTFindMatchingEntries( root, kIODTRecursive | kIODTExclusive, "('ata-disk','atapi-disk')");
if( kids) {
DLOG("CMD646Root found kids\n");
while( (next = (IORegistryEntry *)kids->getNextObject())) {
if( 0 == (nub = createNub( next )))
continue;
nub->attach( this );
processNub(nub);
nub->registerService();
}
kids->release();
}
}
bool
CMD646Root::compareNubName( const IOService * nub,
OSString * name, OSString ** matched ) const
{
return( IODTCompareNubName( nub, name, matched )
|| nub->IORegistryEntry::compareName( name, matched ) );
}
IOReturn
CMD646Root::getNubResources( IOService * nub )
{
if( nub->getDeviceMemory())
return( kIOReturnSuccess );
IODTResolveAddressing( nub, "reg", getProvider()->getDeviceMemoryWithIndex(0) );
return( kIOReturnSuccess);
}
#undef super
#define super IOService
OSDefineMetaClassAndStructors(CMD646Device, IOService);
bool CMD646Device::compareName( OSString * name,
OSString ** matched ) const
{
return( ((CMD646Root *)getProvider())->
compareNubName( this, name, matched ));
}
IOService*
CMD646Device::matchLocation( IOService * )
{
return( this );
}
IOReturn
CMD646Device::getResources( void )
{
return( ((CMD646Root *)getProvider())->getNubResources( this ));
}
IOService*
CMD646Device::getRootCMD( void )
{
return getProvider();
}
IOService*
CMD646Device::getPCINub( void )
{
return getProvider()->getProvider();
}