AppleMTRRSupport.cpp [plain text]
#include <IOKit/IOLib.h>
#include <IOKit/IOPlatformExpert.h>
#include "AppleMTRRSupport.h"
#include <i386/mtrr.h>
#define super IOService
OSDefineMetaClassAndStructors( AppleMTRRSupport, IOService )
IOService * AppleMTRRSupport::probe( IOService * provider,
SInt32 * score )
{
OSNumber * cpuNumber;
if (!super::probe(provider, score)) return 0;
cpuNumber = OSDynamicCast( OSNumber,
provider->getProperty( "IOCPUNumber" ) );
if ( cpuNumber && cpuNumber->unsigned32BitValue() != 0 )
{
return 0; }
return this;
}
bool AppleMTRRSupport::start( IOService * provider )
{
PE_Video video;
kern_return_t status = KERN_NOT_SUPPORTED;
if ( super::start(provider) == false )
return false;
if ( IOService::getPlatform()->getConsoleInfo( &video ) != kIOReturnSuccess )
return false;
if ( video.v_baseAddr > 0x100000 )
{
UInt32 realSize = video.v_rowBytes * video.v_height;
vramAddr = video.v_baseAddr;
vramSize = 1 * 1024 * 1024;
while ((vramSize < realSize) && (vramSize < 64 * 1024 * 1024))
{
vramSize <<= 1;
}
status = mtrr_range_add( vramAddr, vramSize, MTRR_TYPE_WRITECOMBINE );
if ( status != KERN_SUCCESS )
{
IOLog("%s: set WC memory type error %d\n", getName(), status);
vramSize = 0;
}
else
IOLog("%s: Enabled Write-Combining for memory range %lx:%lx\n",
getName(), vramAddr, vramSize);
}
return (status == KERN_SUCCESS);
}
void AppleMTRRSupport::free()
{
if ( vramAddr && vramSize )
mtrr_range_remove( vramAddr, vramSize, MTRR_TYPE_WRITECOMBINE );
super::free();
}