IOFWUserPhysicalAddressSpace.cpp [plain text]
#import "IOFWUserPhysicalAddressSpace.h"
#import "FWDebugging.h"
OSDefineMetaClassAndStructors(IOFWUserPhysicalAddressSpace, IOFWPhysicalAddressSpace) ;
bool
IOFWUserPhysicalAddressSpace::initWithDesc(
IOFireWireBus* bus,
IOMemoryDescriptor* mem)
{
DebugLog("+IOFWUserPhysicalAddressSpace::initWithDesc\n" ) ;
if (!IOFWPhysicalAddressSpace::initWithDesc(bus, mem))
return false ;
fDescriptor = mem;
fDescriptor->retain();
fSegmentCount = 0 ;
{ UInt32 currentOffset = 0 ;
IOByteCount length ;
while (0 != fDescriptor->getPhysicalSegment(currentOffset, & length))
{
currentOffset += length ;
++fSegmentCount ;
}
}
DebugLog("new phys addr space - segmentCount=%d length=0x%x\n", (uint32_t)fSegmentCount, (uint32_t)fDescriptor->getLength() ) ;
return true ;
}
void
IOFWUserPhysicalAddressSpace::free()
{
if( fDescriptor )
{
fDescriptor->release();
fDescriptor = NULL;
}
IOFWPhysicalAddressSpace::free();
}
void
IOFWUserPhysicalAddressSpace::exporterCleanup( const OSObject * self )
{
IOFWUserPhysicalAddressSpace * me = (IOFWUserPhysicalAddressSpace*)self;
DebugLog("IOFWUserPseudoAddressSpace::exporterCleanup\n");
me->deactivate();
}
IOReturn
IOFWUserPhysicalAddressSpace::getSegmentCount( UInt32 * outSegmentCount )
{
*outSegmentCount = fSegmentCount ;
return kIOReturnSuccess ;
}
IOReturn
IOFWUserPhysicalAddressSpace::getSegments (
UInt32* ioSegmentCount,
IOFireWireLib::FWPhysicalSegment32 outSegments[] )
{
unsigned segmentCount = *ioSegmentCount;
if( fSegmentCount < segmentCount )
{
segmentCount = fSegmentCount;
}
IOByteCount currentOffset = 0 ;
for( unsigned index = 0; index < segmentCount; ++index )
{
IOByteCount length = 0;
outSegments[ index ].location = fDescriptor->getPhysicalSegment( currentOffset, &length ) ;
outSegments[ index ].length = length;
currentOffset += length ;
}
return kIOReturnSuccess ;
}