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=%ld length=0x%lx\n", fSegmentCount, (UInt32)fDescriptor->getLength() ) ;
return true ;
}
void
IOFWUserPhysicalAddressSpace::free()
{
if( fDescriptor )
{
fDescriptor->release();
fDescriptor = NULL;
}
IOFWPhysicalAddressSpace::free();
}
void
IOFWUserPhysicalAddressSpace::exporterCleanup ()
{
DebugLog("IOFWUserPseudoAddressSpace::exporterCleanup\n");
deactivate();
}
IOReturn
IOFWUserPhysicalAddressSpace::getSegmentCount( UInt32 * outSegmentCount )
{
*outSegmentCount = fSegmentCount ;
return kIOReturnSuccess ;
}
IOReturn
IOFWUserPhysicalAddressSpace :: getSegments (
UInt32* ioSegmentCount,
IOMemoryCursor::IOPhysicalSegment outSegments[] )
{
unsigned segmentCount = *ioSegmentCount <? fSegmentCount ; IOByteCount currentOffset = 0 ;
for( unsigned index = 0; index < segmentCount; ++index )
{
outSegments[ index ].location = fDescriptor->getPhysicalSegment( currentOffset, & outSegments[ index ].length ) ;
currentOffset += outSegments[ index ].length ;
}
return kIOReturnSuccess ;
}