SInt8 FakeSMCPlugin::getVacantGPUIndex() { //Find card number char key[5]; for (UInt8 i = 0; i <= 0xf; i++) { snprintf(key, 5, KEY_FORMAT_GPU_DIODE_TEMPERATURE, i); if (isKeyHandled(key)) continue; snprintf(key, 5, KEY_FORMAT_GPU_HEATSINK_TEMPERATURE, i); if (isKeyHandled(key)) continue; snprintf(key, 5, KEY_FORMAT_GPU_PROXIMITY_TEMPERATURE, i); if (isKeyHandled(key)) continue; snprintf(key, 5, KEY_FORMAT_GPU_VOLTAGE, i); if (isKeyHandled(key)) continue; snprintf(key, 5, KEY_FAKESMC_FORMAT_GPU_FREQUENCY, i); if (isKeyHandled(key)) continue; return i; } return false; }
bool TZSensors::start(IOService * provider) { if (!super::start(provider)) return false; acpiDevice = (IOACPIPlatformDevice *)provider; if (!acpiDevice) { HWSensorsFatalLog("ACPI device not ready"); return false; } OSObject *object = NULL; if(kIOReturnSuccess == acpiDevice->evaluateObject("_TMP", &object) && object) { for (UInt8 i = 0; i < 0xf; i++) { char key[5]; snprintf(key, 5, KEY_FORMAT_THERMALZONE_TEMPERATURE, i); if (!isKeyHandled(key)) { if (addSensor(key, TYPE_SP78, TYPE_SPXX_SIZE, kFakeSMCTemperatureSensor, 0)) { break; } } } } registerService(); HWSensorsInfoLog("started on %s", acpiDevice->getName()); return true; }
bool TZSensors::start(IOService * provider) { if (!super::start(provider)) return false; acpiDevice = (IOACPIPlatformDevice *)provider; if (!acpiDevice) { HWSensorsFatalLog("ACPI device not ready"); return false; } if (OSDictionary *configuration = getConfigurationNode()) { OSBoolean* disable = OSDynamicCast(OSBoolean, configuration->getObject("DisableDevice")); if (disable && disable->isTrue()) return false; } // On some computers (eg. RehabMan's ProBook 4530s), the system will hang on startup // if kernel cache is used, because of the early call to updateTemperatures and/or // updateTachometers. At least that is the case with an SSD and a valid pre-linked // kernel, along with kernel cache enabled. This 1000ms sleep seems to fix the problem, // enabling a clean boot with TZSensors enabled. // // On the ProBook this is the case with both TZSensors and PTIDSensors, although // PTIDSensors can be avoided by using DropSSDT=Yes (because PTID device is in an SSDT) // // And in the case of TZSensors it even happens (intermittently) without kernel cache. IOSleep(1000); OSObject *object = NULL; if(kIOReturnSuccess == acpiDevice->evaluateObject("_TMP", &object) && object) { for (UInt8 i = 0; i < 0xf; i++) { char key[5]; snprintf(key, 5, KEY_FORMAT_THERMALZONE_TEMPERATURE, i); if (!isKeyHandled(key)) { if (addSensor(key, TYPE_SP78, TYPE_SPXX_SIZE, kFakeSMCTemperatureSensor, 0)) { break; } } } } registerService(); HWSensorsInfoLog("started on %s", acpiDevice->getName()); return true; }
FakeSMCSensor *FakeSMCPlugin::addTachometer(UInt32 index, const char* name, UInt8 *fanIndex) { UInt8 length = 0; void * data = 0; if (kIOReturnSuccess == storageProvider->callPlatformFunction(kFakeSMCGetKeyValue, true, (void *)KEY_FAN_NUMBER, (void *)&length, (void *)&data, 0)) { length = 0; bcopy(data, &length, 1); for (int i = 0; i <= 0xf; i++) { char key[5]; snprintf(key, 5, KEY_FORMAT_FAN_SPEED, i); if (!isKeyHandled(key)) { if (FakeSMCSensor *sensor = addSensor(key, TYPE_FPE2, 2, kFakeSMCTachometerSensor, index)) { if (name) { snprintf(key, 5, KEY_FORMAT_FAN_ID, i); if (!setKeyValue(key, TYPE_CH8, strlen(name), name)) HWSensorsWarningLog("failed to add tachometer name for key %s", key); } if (i + 1 > length) { length++; if (kIOReturnSuccess != storageProvider->callPlatformFunction(kFakeSMCSetKeyValue, true, (void *)KEY_FAN_NUMBER, (void *)(UInt8)1, (void *)&length, 0)) HWSensorsWarningLog("failed to update FNum value"); } if (fanIndex) *fanIndex = i; return sensor; } else HWSensorsWarningLog("failed to add tachometer sensor for key %s", key); } } } else HWSensorsWarningLog("failed to read FNum value"); return 0; }