IOFWUserPhysicalAddressSpace.cpp [plain text]
#import "IOFWUserPhysicalAddressSpace.h"
#import "FWDebugging.h"
OSDefineMetaClassAndStructors(IOFWUserPhysicalAddressSpace, IOFWPhysicalAddressSpace) ;
bool
IOFWUserPhysicalAddressSpace::initWithDesc(
IOFireWireBus* bus,
IOMemoryDescriptor* mem)
{
DebugLog("// *** TEST: IOFWUserPhysicalAddressSpace<%p>::initWithDesc\n", this );
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("IOFWUserPhysicalAddressSpace<%p>::initWithDesc - fSegmentCount = %d, length = %u\n", this, fSegmentCount, (unsigned int)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 )
{
DebugLog("// *** TEST: IOFWUserPhysicalAddressSpace<%p>::getSegmentCount\n", this ) ;
*outSegmentCount = fSegmentCount ;
return kIOReturnSuccess ;
}
IOReturn
IOFWUserPhysicalAddressSpace::getSegments (
UInt32* ioSegmentCount,
IOFireWireLib::FWPhysicalSegment32 outSegments[] )
{
DebugLog("// *** TEST: IOFWUserPhysicalAddressSpace<%p>::getSegments\n", this ) ;
unsigned segmentCount = *ioSegmentCount;
if( fSegmentCount < segmentCount )
{
segmentCount = fSegmentCount;
}
#if 1
IOReturn status = kIOReturnSuccess;
IODMACommand * dma_command = getDMACommand();
IODMACommand::Segment32 segs[ segmentCount ];
UInt32 numSegs = 0;
if( status == kIOReturnSuccess )
{
numSegs = segmentCount;
status = dma_command->gen32IOVMSegments( 0, segs, &numSegs );
if( status != kIOReturnSuccess )
{
DebugLog("IOFWUserPhysicalAddressSpace<%p>::getSegments - ERROR: gen32IOVMSegments failed with 0x%08x\n", this, status );
}
}
if( status == kIOReturnSuccess )
{
if( numSegs > segmentCount || numSegs == 0 )
{
DebugLog("IOFWUserPhysicalAddressSpace<%p>::getSegments - ERROR: numSegs = %u\n", this, numSegs );
status = kIOReturnNoResources;
}
}
if( status == kIOReturnSuccess )
{
*ioSegmentCount = numSegs;
for( unsigned i = 0; i < numSegs; i++ )
{
outSegments[i].location = segs[i].fIOVMAddr;
outSegments[i].length = segs[i].fLength;
DebugLog("IOFWUserPhysicalAddressSpace<%p>::getSegments - outSegments[%d].location = 0x%08x\n", this, i, outSegments[i].location );
DebugLog("IOFWUserPhysicalAddressSpace<%p>::getSegments - outSegments[%d].length = 0x%08x\n", this, i, outSegments[i].length );
}
}
#else
IOByteCount currentOffset = 0 ;
for( unsigned index = 0; index < segmentCount; ++index )
{
IOByteCount length = 0;
outSegments[ index ].location = (IOPhysicalAddress32)fDescriptor->getPhysicalSegment( currentOffset, &length ) ;
outSegments[ index ].length = (IOPhysicalLength32)length;
currentOffset += length ;
}
#endif
return kIOReturnSuccess ;
}