#include <sys/cdefs.h>
__BEGIN_DECLS
#include <ppc/proc_reg.h>
#include <ppc/machine_routines.h>
#include <mach/mach_types.h>
extern vm_offset_t ml_io_map(vm_offset_t phys_addr, vm_size_t size);
__END_DECLS
#include <IOKit/IODeviceTreeSupport.h>
#include <IOKit/IOKitKeys.h>
#include "MacRISC2.h"
#include <IOKit/pci/IOPCIDevice.h>
static unsigned long macRISC2Speed[] = { 0, 1 };
#include <IOKit/pwr_mgt/RootDomain.h>
#include "IOPMSlotsMacRISC2.h"
#include "IOPMUSBMacRISC2.h"
#include <IOKit/pwr_mgt/IOPMPagingPlexus.h>
#include <IOKit/pwr_mgt/IOPMPowerSource.h>
#include <pexpert/pexpert.h>
#include "PB6_1_PlatformMonitor.h"
extern char *gIOMacRISC2PMTree;
#define super ApplePlatformExpert
OSDefineMetaClassAndStructors(MacRISC2PE, ApplePlatformExpert);
bool MacRISC2PE::start(IOService *provider)
{
long machineType;
OSData *tmpData;
IORegistryEntry *uniNRegEntry;
IORegistryEntry *powerMgtEntry;
UInt32 *primInfo;
UInt32 stepType, bitsSet, bitsClear;
bool result;
setChipSetType(kChipSetTypeCore2001);
provider_name = provider->getName();
machineType = kMacRISC2TypeUnknown;
doPlatformPowerMonitor = false;
if (provider_name != NULL) {
if (0 == strncmp(provider_name, "PowerMac", strlen("PowerMac")))
machineType = kMacRISC2TypePowerMac;
else if (0 == strncmp(provider_name, "RackMac", strlen("RackMac")))
machineType = kMacRISC2TypePowerMac;
else if (0 == strncmp(provider_name, "PowerBook", strlen("PowerBook")))
machineType = kMacRISC2TypePowerBook;
else if (0 == strncmp(provider_name, "iBook", strlen("iBook")))
machineType = kMacRISC2TypePowerBook;
else IOLog ("AppleMacRISC2PE - warning: unknown machineType\n");
}
isPortable = (machineType == kMacRISC2TypePowerBook);
setMachineType(machineType);
tmpData = OSDynamicCast(OSData, provider->getProperty("clock-frequency"));
if (tmpData == 0) return false;
macRISC2Speed[0] = *(unsigned long *)tmpData->getBytesNoCopy();
hasPMon = ((!strcmp (provider_name, "PowerBook5,1")) || (!strcmp (provider_name, "PowerBook5,2")) || (!strcmp (provider_name, "PowerBook5,3")));
uniNRegEntry = provider->childFromPath("uni-n", gIODTPlane);
if (uniNRegEntry == 0) return false;
tmpData = OSDynamicCast(OSData, uniNRegEntry->getProperty("device-rev"));
if (tmpData == 0) return false;
uniNVersion = ((unsigned long *)tmpData->getBytesNoCopy())[0];
powerMgtEntry = retrievePowerMgtEntry ();
if (powerMgtEntry == 0)
{
kprintf ("didn't find power mgt node\n");
return false;
}
tmpData = OSDynamicCast(OSData, powerMgtEntry->getProperty ("prim-info"));
if (tmpData != 0)
{
primInfo = (unsigned long *)tmpData->getBytesNoCopy();
if (primInfo != 0)
{
_pePMFeatures = primInfo[3];
_pePrivPMFeatures = primInfo[4];
_peNumBatteriesSupported = ((primInfo[6]>>16) & 0x000000FF);
kprintf ("Public PM Features: %0x.\n",_pePMFeatures);
kprintf ("Privat PM Features: %0x.\n",_pePrivPMFeatures);
kprintf ("Num Internal Batteries Supported: %0x.\n", _peNumBatteriesSupported);
}
}
mutex = IOLockAlloc();
if (mutex == NULL)
return false;
else
IOLockInit( mutex );
processorSpeedChangeFlags = kNoSpeedChange;
stepType = 0;
if (machineType == kMacRISC2TypePowerBook) {
OSIterator *childIterator;
IORegistryEntry *cpuEntry, *powerPCEntry;
OSData *cpuSpeedData, *stepTypeData;
cpuEntry = provider->childFromPath("cpus", gIODTPlane);
if ((childIterator = cpuEntry->getChildIterator (gIODTPlane)) != NULL) {
while ((powerPCEntry = (IORegistryEntry *)(childIterator->getNextObject ())) != NULL) {
if (!strncmp ("PowerPC", powerPCEntry->getName(gIODTPlane), strlen ("PowerPC"))) {
stepTypeData = OSDynamicCast( OSData, powerPCEntry->getProperty( "dynamic-power-step" ));
if (stepTypeData)
processorSpeedChangeFlags = kProcessorBasedSpeedChange | kProcessorFast |
kL3CacheEnabled | kL2CacheEnabled;
else { stepTypeData = OSDynamicCast( OSData, powerPCEntry->getProperty( "force-reduced-speed" ));
cpuSpeedData = OSDynamicCast( OSData, powerPCEntry->getProperty( "max-clock-frequency" ));
if (stepTypeData && cpuSpeedData) {
UInt32 newCPUSpeed, newNum;
doPlatformPowerMonitor = true;
processorSpeedChangeFlags = kDisableL3SpeedChange | kL3CacheEnabled | kL2CacheEnabled;
if (stepTypeData->getLength() > 0)
stepType = *(UInt32 *) stepTypeData->getBytesNoCopy();
newCPUSpeed = *(UInt32 *) cpuSpeedData->getBytesNoCopy();
if (newCPUSpeed != gPEClockFrequencyInfo.cpu_clock_rate_hz) {
if ((_pePrivPMFeatures & (1 << 17)) != 0)
processorSpeedChangeFlags |= kPMUBasedSpeedChange;
processorSpeedChangeFlags |= kEnvironmentalSpeedChange;
newNum = newCPUSpeed / (gPEClockFrequencyInfo.cpu_clock_rate_hz /
gPEClockFrequencyInfo.bus_to_cpu_rate_num);
gPEClockFrequencyInfo.bus_to_cpu_rate_num = newNum; gPEClockFrequencyInfo.cpu_clock_rate_hz = newCPUSpeed; }
} else { if ((_pePrivPMFeatures & (1 << 17)) != 0) {
processorSpeedChangeFlags = kPMUBasedSpeedChange | kProcessorFast |
kL3CacheEnabled | kL2CacheEnabled;
if ((_pePrivPMFeatures & (1<<21)) != 0)
processorSpeedChangeFlags |= kDisableL3SpeedChange;
}
}
}
break;
}
}
childIterator->release();
}
}
OSDictionary *dict = OSDictionary::withCapacity(2);
if (dict) {
const OSSymbol *nameKey, *compatKey, *nameValueSymbol;
const OSData *nameValueData, *compatValueData;
char tmpName[32], tmpCompat[128];
nameKey = OSSymbol::withCStringNoCopy("name");
strcpy(tmpName, "IOPlatformFunction");
nameValueSymbol = OSSymbol::withCString(tmpName);
nameValueData = OSData::withBytes(tmpName, strlen(tmpName)+1);
dict->setObject (nameKey, nameValueData);
compatKey = OSSymbol::withCStringNoCopy("compatible");
strcpy (tmpCompat, "IOPlatformFunctionNub");
compatValueData = OSData::withBytes(tmpCompat, strlen(tmpCompat)+1);
dict->setObject (compatKey, compatValueData);
if (plFuncNub = IOPlatformExpert::createNub (dict)) {
if (!plFuncNub->attach( this ))
IOLog ("NUB ATTACH FAILED for IOPlatformFunctionNub\n");
plFuncNub->setName (nameValueSymbol);
plFuncNub->registerService();
}
dict->release();
nameValueSymbol->release();
nameKey->release();
nameValueData->release();
compatKey->release();
compatValueData->release();
}
result = super::start(provider);
if (hasPMon) {
OSDictionary *dict = OSDictionary::withCapacity(2);
if (dict) {
const OSSymbol *nameKey, *compatKey, *nameValueSymbol;
const OSData *nameValueData, *compatValueData;
char tmpName[32], tmpCompat[128];
nameKey = OSSymbol::withCStringNoCopy("name");
strcpy(tmpName, "IOPlatformMonitor");
nameValueSymbol = OSSymbol::withCString(tmpName);
nameValueData = OSData::withBytes(tmpName, strlen(tmpName)+1);
dict->setObject (nameKey, nameValueData);
compatKey = OSSymbol::withCStringNoCopy("compatible");
if ((!strcmp(provider_name, "PowerBook5,2")) || (!strcmp(provider_name, "PowerBook5,3"))) { strcpy (tmpCompat, "Portable2003");
} else {
strcpy (tmpCompat, provider_name);
}
strcat (tmpCompat, "_PlatformMonitor");
compatValueData = OSData::withBytes(tmpCompat, strlen(tmpCompat)+1);
dict->setObject (compatKey, compatValueData);
if (ioPMonNub = IOPlatformExpert::createNub (dict)) {
if (!ioPMonNub->attach( this ))
IOLog ("NUB ATTACH FAILED\n");
ioPMonNub->setName (nameValueSymbol);
ioPMonNub->registerService();
}
dict->release();
nameValueSymbol->release();
nameKey->release();
nameValueData->release();
compatKey->release();
compatValueData->release();
}
}
if (doPlatformPowerMonitor) {
bitsSet = kIOPMACInstalled | kIOPMACnoChargeCapability;
bitsClear = 0;
powerMonWeakCharger.bitsXor = bitsSet & ~bitsClear;
powerMonWeakCharger.bitsMask = bitsSet | bitsClear;
bitsSet = kIOPMRawLowBattery;
bitsClear = 0;
powerMonBatteryWarning.bitsXor = bitsSet & ~bitsClear;
powerMonBatteryWarning.bitsMask = bitsSet | bitsClear;
bitsSet = kIOPMBatteryDepleted;
bitsClear = 0;
powerMonBatteryDepleted.bitsXor = bitsSet & ~bitsClear;
powerMonBatteryDepleted.bitsMask = bitsSet | bitsClear;
bitsSet = 0;
bitsClear = kIOPMBatteryInstalled;
powerMonBatteryNotInstalled.bitsXor = bitsSet & ~bitsClear;
powerMonBatteryNotInstalled.bitsMask = bitsSet | bitsClear;
if ((stepType & 1) == 0) {
bitsSet = kIOPMClosedClamshell;
bitsClear = 0;
powerMonClamshellClosed.bitsXor = bitsSet & ~bitsClear;
powerMonClamshellClosed.bitsMask = bitsSet | bitsClear;
} else { powerMonClamshellClosed.bitsXor = 0;
powerMonClamshellClosed.bitsMask = ~0L;
}
} else { powerMonWeakCharger.bitsXor = 0;
powerMonWeakCharger.bitsMask = ~0L;
powerMonBatteryWarning.bitsXor = 0;
powerMonBatteryWarning.bitsMask = ~0L;
powerMonBatteryDepleted.bitsXor = 0;
powerMonBatteryDepleted.bitsMask = ~0L;
powerMonBatteryNotInstalled.bitsXor = 0;
powerMonBatteryNotInstalled.bitsMask = ~0L;
powerMonClamshellClosed.bitsXor = 0;
powerMonClamshellClosed.bitsMask = ~0L;
}
return result;
}
IORegistryEntry * MacRISC2PE::retrievePowerMgtEntry (void)
{
IORegistryEntry * theEntry = 0;
IORegistryEntry * anObj = 0;
IORegistryIterator * iter;
OSString * powerMgtNodeName;
iter = IORegistryIterator::iterateOver (IORegistryEntry::getPlane(kIODeviceTreePlane), kIORegistryIterateRecursively);
if (iter)
{
powerMgtNodeName = OSString::withCString("power-mgt");
anObj = iter->getNextObject ();
while (anObj)
{
if (anObj->compareName(powerMgtNodeName))
{
theEntry = anObj;
break;
}
anObj = iter->getNextObject();
}
powerMgtNodeName->release();
iter->release ();
}
return theEntry;
}
bool MacRISC2PE::platformAdjustService(IOService *service)
{
bool result;
if (IODTMatchNubWithKeys(service, "open-pic"))
{
const OSSymbol * keySymbol;
OSSymbol * tmpSymbol;
keySymbol = OSSymbol::withCStringNoCopy("InterruptControllerName");
tmpSymbol = (OSSymbol *)IODTInterruptControllerName(service);
result = service->setProperty(keySymbol, tmpSymbol);
return true;
}
if (!strcmp(service->getName(), "programmer-switch"))
{
service->setProperty("mask_NMI", service);
return true;
}
if (!strcmp(service->getName(), "pmu"))
{
OSArray *tmpArray;
OSCollectionIterator *extIntList;
IORegistryEntry *extInt;
OSObject *extIntControllerName;
OSObject *extIntControllerData;
service->setProperty("no-nvram", service);
extIntList = IODTFindMatchingEntries(getProvider(), kIODTRecursive, "'extint-gpio1'");
extInt = (IORegistryEntry *)extIntList->getNextObject();
tmpArray = (OSArray *)extInt->getProperty(gIOInterruptControllersKey);
extIntControllerName = tmpArray->getObject(0);
tmpArray = (OSArray *)extInt->getProperty(gIOInterruptSpecifiersKey);
extIntControllerData = tmpArray->getObject(0);
tmpArray = (OSArray *)service->getProperty(gIOInterruptControllersKey);
tmpArray->replaceObject(4, extIntControllerName);
tmpArray = (OSArray *)service->getProperty(gIOInterruptSpecifiersKey);
tmpArray->replaceObject(4, extIntControllerData);
extIntList->release();
return true;
}
if (!strcmp(service->getName(), "via-pmu"))
{
service->setProperty("BusSpeedCorrect", this);
return true;
}
if ((uniNVersion == kUniNVersion150) && IODTMatchNubWithKeys(service, "('pci', 'uni-north')") &&
(service->childFromPath("mac-io", gIODTPlane) != NULL)) {
service->setProperty ("DisableRDG", true);
return true;
}
if (((uniNVersion >= kUniNVersion150) && (uniNVersion <= kUniNVersion200) || (uniNVersion == kUniNVersionPangea)) &&
(!strcmp(service->getName(gIODTPlane), "firewire")) &&
IODTMatchNubWithKeys(service->getParentEntry(gIODTPlane), "('pci', 'uni-north')")) {
char data;
data = 0x08; service->setProperty (kIOPCICacheLineSize, &data, 1);
data = 0x40; service->setProperty (kIOPCITimerLatency, &data, 1);
return true;
}
if ((uniNVersion == kUniNVersion200) &&
IODTMatchNubWithKeys(service, "('ethernet', 'gmac')") &&
IODTMatchNubWithKeys(service->getParentEntry(gIODTPlane), "('pci', 'uni-north')")) {
char data;
long cacheSize;
OSData *cacheData;
data = 0x08; cacheData = OSDynamicCast( OSData, service->getProperty( "cache-line-size" ) );
if (cacheData) {
cacheSize = *(long *)cacheData->getBytesNoCopy();
data = (cacheSize >> 2);
}
service->setProperty (kIOPCICacheLineSize, &data, 1);
data = 0x20; service->setProperty (kIOPCITimerLatency, &data, 1);
return true;
}
if (!strcmp(service->getName(), "usb") &&
(0 == strncmp(provider_name, "PowerBook4,", strlen("PowerBook4,"))) &&
IODTMatchNubWithKeys(service->getParentEntry(gIODTPlane), "('pci', 'uni-north')")) {
OSData *regProp;
IOPCIAddressSpace *pciAddress;
UInt32 ports;
if( (regProp = (OSData *) service->getProperty("reg"))) {
pciAddress = (IOPCIAddressSpace *) regProp->getBytesNoCopy();
if (pciAddress->s.deviceNum == 0x18) {
if(!((OSData *) service->getProperty(kAAPLSuspendablePorts))) {
ports = 4;
service->setProperty (kAAPLSuspendablePorts, &ports, sizeof(UInt32));
}
return true;
}
}
}
if ( ( strcmp( "temp-monitor", service->getName() ) == 0 ) &&
( strcmp( "RackMac1,1" , provider_name ) == 0 ) ) {
OSData * deviceType;
UInt32 newRegPropertyValue;
deviceType = OSDynamicCast( OSData, service->getProperty( "device_type" ) );
if ( deviceType && ( strcmp( "ds1775", (char *)deviceType->getBytesNoCopy() ) == 0 ) )
{
newRegPropertyValue = 0x92;
service->setProperty( "reg", &newRegPropertyValue, sizeof( UInt32 ) );
}
}
return true;
}
IOReturn MacRISC2PE::callPlatformFunction(const OSSymbol *functionName,
bool waitForFunction,
void *param1, void *param2,
void *param3, void *param4)
{
if (functionName == gGetDefaultBusSpeedsKey)
{
getDefaultBusSpeeds((long *)param1, (unsigned long **)param2);
return kIOReturnSuccess;
}
if (functionName->isEqualTo("EnableUniNEthernetClock"))
{
enableUniNEthernetClock((bool)param1, (IOService *)param2);
return kIOReturnSuccess;
}
if (functionName->isEqualTo("EnableFireWireClock")) {
enableUniNFireWireClock((bool)param1, (IOService *)param2);
return kIOReturnSuccess;
}
if (functionName->isEqualTo("EnableFireWireCablePower")) {
enableUniNFireWireCablePower((bool)param1);
return kIOReturnSuccess;
}
if (functionName->isEqualTo("AccessUniN15PerformanceRegister"))
{
return accessUniN15PerformanceRegister((bool)param1, (long)param2, (unsigned long *)param3);
}
if (functionName->isEqualTo("PlatformIsPortable")) {
*(bool *) param1 = isPortable;
return kIOReturnSuccess;
}
if (functionName->isEqualTo("PlatformPowerMonitor")) {
return platformPowerMonitor ((UInt32 *) param1);
}
if (functionName->isEqualTo("PerformPMUSpeedChange")) {
if (!macRISC2CPU)
macRISC2CPU = OSDynamicCast (MacRISC2CPU, waitForService (serviceMatching("MacRISC2CPU")));
if (macRISC2CPU) {
macRISC2CPU->performPMUSpeedChange ((UInt32) param1);
return kIOReturnSuccess;
}
return kIOReturnUnsupported;
}
return super::callPlatformFunction(functionName, waitForFunction, param1, param2, param3, param4);
}
void MacRISC2PE::getDefaultBusSpeeds(long *numSpeeds, unsigned long **speedList)
{
if ((numSpeeds == 0) || (speedList == 0)) return;
*numSpeeds = 1;
*speedList = macRISC2Speed;
}
void MacRISC2PE::enableUniNEthernetClock(bool enable, IOService *nub)
{
if (!uniN)
uniN = OSDynamicCast (AppleUniN, waitForService(serviceMatching("AppleUniN")));
if (uniN)
uniN->enableUniNEthernetClock (enable, nub);
return;
}
void MacRISC2PE::enableUniNFireWireClock(bool enable, IOService *nub)
{
if (!uniN)
uniN = OSDynamicCast (AppleUniN, waitForService(serviceMatching("AppleUniN")));
if (uniN)
uniN->enableUniNFireWireClock (enable, nub);
return;
}
void MacRISC2PE::enableUniNFireWireCablePower(bool enable)
{
if(getMachineType() == kMacRISC2TypePowerBook)
{
IOService *keyLargo;
keyLargo = waitForService(serviceMatching("KeyLargo"));
if(keyLargo)
{
UInt32 gpioOffset = 0x73;
keyLargo->callPlatformFunction(OSSymbol::withCString("keyLargo_writeRegUInt8"),
true, (void *)&gpioOffset, (void *)(enable ? 0:4), 0, 0);
}
}
}
IOReturn MacRISC2PE::accessUniN15PerformanceRegister(bool write, long regNumber, unsigned long *data)
{
if (!uniN)
uniN = OSDynamicCast (AppleUniN, waitForService(serviceMatching("AppleUniN")));
if (uniN)
return uniN->accessUniN15PerformanceRegister (write, regNumber, data);
return kIOReturnUnsupported;
}
IOReturn MacRISC2PE::platformPowerMonitor(UInt32 *powerFlags)
{
IOReturn result;
if (ioPMonNub) {
static UInt32 i = 0;
static bool pmonInited = false;
static OSDictionary *dict;
static OSNumber *powerBits;
if (i < 10) {
i++;
return kIOReturnSuccess;
}
if ((i == 10) && !ioPMon) {
IOService *serv;
i = 11;
serv = waitForService(resourceMatching("IOPlatformMonitor"));
ioPMon = OSDynamicCast (IOPlatformMonitor, serv->getProperty("IOPlatformMonitor"));
}
if (ioPMon) { if (!pmonInited) {
dict = OSDictionary::withCapacity(2);
if (!dict) {
ioPMon = NULL;
} else {
powerBits = OSNumber::withNumber ((long long)*powerFlags, 32);
dict->setObject (kIOPMonTypeKey, OSSymbol::withCString (kIOPMonTypeClamshellSens));
dict->setObject (kIOPMonCurrentValueKey, powerBits);
if (messageClient (kIOPMonMessageRegister, ioPMon, (void *)dict) != kIOReturnSuccess) {
IOLog ("MacRISC2PE::platformPowerMonitor - failed to register clamshell with IOPlatformMonitor\n");
dict->release();
ioPMon = NULL;
return kIOReturnUnsupported;
}
pmonInited = true;
return kIOReturnSuccess;
}
}
powerBits->setValue((long long)*powerFlags);
messageClient (kIOPMonMessagePowerMonitor, ioPMon, (void *)dict);
*powerFlags = powerBits->unsigned32BitValue();
}
i++;
return kIOReturnSuccess;
}
if (doPlatformPowerMonitor) {
if ((((*powerFlags ^ powerMonWeakCharger.bitsXor) & powerMonWeakCharger.bitsMask) == 0) ||
(((*powerFlags ^ powerMonBatteryWarning.bitsXor) & powerMonBatteryWarning.bitsMask) == 0) ||
(((*powerFlags ^ powerMonBatteryDepleted.bitsXor) & powerMonBatteryDepleted.bitsMask) == 0) ||
(((*powerFlags ^ powerMonBatteryNotInstalled.bitsXor) & powerMonBatteryNotInstalled.bitsMask) == 0)) {
*powerFlags |= kIOPMForceLowSpeed;
if (processorSpeedChangeFlags & kL3CacheEnabled) {
if (!macRISC2CPU)
macRISC2CPU = OSDynamicCast (MacRISC2CPU, waitForService (serviceMatching("MacRISC2CPU")));
if (macRISC2CPU) {
processorSpeedChangeFlags &= ~kClamshellClosedSpeedChange;
macRISC2CPU->setAggressiveness (kPMSetProcessorSpeed, 1); }
}
} else if (((*powerFlags ^ powerMonClamshellClosed.bitsXor) & powerMonClamshellClosed.bitsMask) == 0) {
*powerFlags |= kIOPMForceLowSpeed;
if (!(processorSpeedChangeFlags & kL3CacheEnabled)) {
if (!macRISC2CPU)
macRISC2CPU = OSDynamicCast (MacRISC2CPU, waitForService (serviceMatching("MacRISC2CPU")));
if (macRISC2CPU) {
if (processorSpeedChangeFlags & kPMUBasedSpeedChange) {
processorSpeedChangeFlags &= ~kPMUBasedSpeedChange;
macRISC2CPU->setAggressiveness (kPMSetProcessorSpeed, 0); processorSpeedChangeFlags |= kPMUBasedSpeedChange;
}
}
}
processorSpeedChangeFlags |= kClamshellClosedSpeedChange; } else {
*powerFlags &= ~kIOPMForceLowSpeed;
processorSpeedChangeFlags &= ~kClamshellClosedSpeedChange;
}
result = kIOReturnSuccess;
} else
result = kIOReturnUnsupported;
return result;
}
void MacRISC2PE::PMInstantiatePowerDomains ( void )
{
const OSSymbol *desc = OSSymbol::withCString("powertreedesc");
IOPMUSBMacRISC2 * usbMacRISC2;
kprintf ("MacRISC2PE::PMInstantiatePowerDomains - getting pmtree property\n");
thePowerTree = OSDynamicCast(OSArray, getProperty(desc));
if( 0 == thePowerTree)
{
kprintf ("error retrieving power tree\n");
return;
}
kprintf ("MacRISC2PE::PMInstantiatePowerDomains - got pmtree property\n");
getProvider()->setProperty (desc, thePowerTree);
removeProperty(desc);
root = IOPMrootDomain::construct();
root->attach(this);
root->start(this);
if ( plexus ) {
root->addPowerChild(plexus);
}
root->setSleepSupported(kRootDomainSleepSupported);
if (NULL == root)
{
kprintf ("PMInstantiatePowerDomains - null ROOT\n");
return;
}
PMRegisterDevice (NULL, root);
usbMacRISC2 = new IOPMUSBMacRISC2;
if (usbMacRISC2)
{
usbMacRISC2->init ();
usbMacRISC2->attach (this);
usbMacRISC2->start (this);
PMRegisterDevice (root, usbMacRISC2);
if ( plexus ) {
plexus->addPowerChild (usbMacRISC2);
}
}
slotsMacRISC2 = new IOPMSlotsMacRISC2;
if (slotsMacRISC2)
{
slotsMacRISC2->init ();
slotsMacRISC2->attach (this);
slotsMacRISC2->start (this);
PMRegisterDevice (root, slotsMacRISC2);
if ( plexus ) {
plexus->addPowerChild (slotsMacRISC2);
}
}
if (processorSpeedChangeFlags != kNoSpeedChange) {
root->publishFeature("Reduce Processor Speed");
if (processorSpeedChangeFlags & kProcessorBasedSpeedChange) {
root->publishFeature("Dynamic Power Step");
}
}
return;
}
extern const IORegistryPlane * gIOPowerPlane;
void MacRISC2PE::PMRegisterDevice(IOService * theNub, IOService * theDevice)
{
bool nodeFound = false;
IOReturn err = -1;
OSData * propertyPtr = 0;
const char * theProperty;
if (mutex != NULL)
IOLockLock(mutex);
multipleParentKeyValue = NULL;
numInstancesRegistered = 0;
nodeFound = CheckSubTree (thePowerTree, theNub, theDevice, NULL);
if (0 == numInstancesRegistered)
{
while( theNub && (!theNub->inPlane(gIOPowerPlane)))
theNub = theNub->getProvider();
}
if (mutex != NULL)
IOLockUnlock(mutex);
if ( NULL != theNub )
err = theNub->addPowerChild (theDevice);
if ((err != IOPMNoErr) && (0 == numInstancesRegistered) && (theDevice != root)) {
root->addPowerChild (theDevice);
if ( plexus ) {
plexus->addPowerChild (theDevice);
}
}
propertyPtr = OSDynamicCast(OSData,theDevice->getProperty("AAPL,slot-name"));
if ( propertyPtr ) {
theProperty = (const char *) propertyPtr->getBytesNoCopy();
if ( strncmp("SLOT-",theProperty,5) == 0 ) {
slotsMacRISC2->addPowerChild (theDevice);
}
}
}