From 331e36f0f71da7cf48d93eec1c64416f21b4c0d0 Mon Sep 17 00:00:00 2001 From: Avery Black Date: Fri, 13 Sep 2024 21:21:50 -0700 Subject: [PATCH 1/8] Set LIBKERN_RETURN_RETAINED --- VoodooPS2Controller/VoodooPS2Controller.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VoodooPS2Controller/VoodooPS2Controller.cpp b/VoodooPS2Controller/VoodooPS2Controller.cpp index 497b47bc..6194e90e 100644 --- a/VoodooPS2Controller/VoodooPS2Controller.cpp +++ b/VoodooPS2Controller/VoodooPS2Controller.cpp @@ -2126,7 +2126,7 @@ static OSString* getPlatformOverride(IORegistryEntry* reg, const char* sz) return NULL; } -static OSString* getPlatformManufacturer(IORegistryEntry* reg) +static LIBKERN_RETURNS_RETAINED OSString* getPlatformManufacturer(IORegistryEntry* reg) { // allow override in PS2K ACPI device OSString* id = getPlatformOverride(reg, "RM,oem-id"); @@ -2148,7 +2148,7 @@ static OSString* getPlatformManufacturer(IORegistryEntry* reg) return OSString::withCStringNoCopy(oemID); } -static OSString* getPlatformProduct(IORegistryEntry* reg) +static LIBKERN_RETURNS_RETAINED OSString* getPlatformProduct(IORegistryEntry* reg) { // allow override in PS2K ACPI device OSString* id = getPlatformOverride(reg, "RM,oem-table-id"); From 96e11cfc26f9f318a6a87375e857088ce8a9779f Mon Sep 17 00:00:00 2001 From: Avery Black Date: Fri, 13 Sep 2024 21:22:35 -0700 Subject: [PATCH 2/8] Add PS/2 stub driver --- VoodooPS2Controller.xcodeproj/project.pbxproj | 8 +++ VoodooPS2Controller/ApplePS2Device.cpp | 7 ++ VoodooPS2Controller/ApplePS2Device.h | 4 +- VoodooPS2Controller/VoodooPS2Controller.cpp | 11 +++ VoodooPS2Controller/VoodooPS2Controller.h | 2 + VoodooPS2Trackpad/VoodooPS2SMBusDevice.cpp | 68 +++++++++++++++++++ VoodooPS2Trackpad/VoodooPS2SMBusDevice.h | 42 ++++++++++++ .../VoodooPS2SynapticsTouchPad.cpp | 63 ++++++++--------- .../VoodooPS2SynapticsTouchPad.h | 4 +- 9 files changed, 169 insertions(+), 40 deletions(-) create mode 100644 VoodooPS2Trackpad/VoodooPS2SMBusDevice.cpp create mode 100644 VoodooPS2Trackpad/VoodooPS2SMBusDevice.h diff --git a/VoodooPS2Controller.xcodeproj/project.pbxproj b/VoodooPS2Controller.xcodeproj/project.pbxproj index 00971319..dcebfd07 100644 --- a/VoodooPS2Controller.xcodeproj/project.pbxproj +++ b/VoodooPS2Controller.xcodeproj/project.pbxproj @@ -39,6 +39,8 @@ CE8DA1C6251839B7008C44E8 /* libkmod.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CE8DA1C4251839B2008C44E8 /* libkmod.a */; }; CE8DA1C7251839B9008C44E8 /* libkmod.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CE8DA1C4251839B2008C44E8 /* libkmod.a */; }; CE8DA1CC251839BC008C44E8 /* libkmod.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CE8DA1C4251839B2008C44E8 /* libkmod.a */; }; + EE914A902C952F0D0023CFE0 /* VoodooPS2SMBusDevice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EE914A8E2C952F0D0023CFE0 /* VoodooPS2SMBusDevice.cpp */; }; + EE914A912C952F0D0023CFE0 /* VoodooPS2SMBusDevice.h in Headers */ = {isa = PBXBuildFile; fileRef = EE914A8F2C952F0D0023CFE0 /* VoodooPS2SMBusDevice.h */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -131,6 +133,8 @@ EDD95559208E2B640031D99E /* SSDT-Thinkpad_Clickpad.dsl */ = {isa = PBXFileReference; lastKnownFileType = text; path = "SSDT-Thinkpad_Clickpad.dsl"; sourceTree = ""; }; EDD9555A208E2E7A0031D99E /* SSDT-Thinkpad_Trackpad.dsl */ = {isa = PBXFileReference; lastKnownFileType = text; path = "SSDT-Thinkpad_Trackpad.dsl"; sourceTree = ""; }; EDD970FD1FD0B826004CCFFD /* SSDT-HP-FixLidSleep.dsl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "SSDT-HP-FixLidSleep.dsl"; sourceTree = ""; }; + EE914A8E2C952F0D0023CFE0 /* VoodooPS2SMBusDevice.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = VoodooPS2SMBusDevice.cpp; sourceTree = ""; }; + EE914A8F2C952F0D0023CFE0 /* VoodooPS2SMBusDevice.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VoodooPS2SMBusDevice.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -287,6 +291,8 @@ 84833FB0161B62A900845294 /* VoodooPS2SynapticsTouchPad.h */, 84833FAF161B62A900845294 /* VoodooPS2SynapticsTouchPad.cpp */, 4CC27EB2251FBC7700824FE1 /* VoodooPS2TrackpadCommon.h */, + EE914A8F2C952F0D0023CFE0 /* VoodooPS2SMBusDevice.h */, + EE914A8E2C952F0D0023CFE0 /* VoodooPS2SMBusDevice.cpp */, 84167857161B56C4002C60E6 /* Supporting Files */, ); path = VoodooPS2Trackpad; @@ -393,6 +399,7 @@ 356B896323007F4F0042F30F /* VoodooInputEvent.h in Headers */, 9828A93024A2B6C200550FAA /* VoodooPS2Elan.h in Headers */, 356B896223007F4F0042F30F /* VoodooInputMessages.h in Headers */, + EE914A912C952F0D0023CFE0 /* VoodooPS2SMBusDevice.h in Headers */, 356B896423007F4F0042F30F /* VoodooInputTransducer.h in Headers */, 84833FB2161B62A900845294 /* VoodooPS2ALPSGlidePoint.h in Headers */, 356B896523007F4F0042F30F /* MultitouchHelpers.h in Headers */, @@ -653,6 +660,7 @@ 84833FB1161B62A900845294 /* VoodooPS2ALPSGlidePoint.cpp in Sources */, 9828A92F24A2B6C200550FAA /* VoodooPS2Elan.cpp in Sources */, 84833FB3161B62A900845294 /* VoodooPS2SentelicFSP.cpp in Sources */, + EE914A902C952F0D0023CFE0 /* VoodooPS2SMBusDevice.cpp in Sources */, 84833FB5161B62A900845294 /* VoodooPS2SynapticsTouchPad.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/VoodooPS2Controller/ApplePS2Device.cpp b/VoodooPS2Controller/ApplePS2Device.cpp index 9f935d63..cb5d009e 100644 --- a/VoodooPS2Controller/ApplePS2Device.cpp +++ b/VoodooPS2Controller/ApplePS2Device.cpp @@ -181,6 +181,13 @@ void ApplePS2Device::dispatchMessage(int message, void *data) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +IOReturn ApplePS2Device::startSMBusCompanion(OSDictionary *companionData, UInt8 smbusAddr) +{ + return _controller->startSMBusCompanion(companionData, smbusAddr); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ApplePS2Controller* ApplePS2Device::getController() { return _controller; diff --git a/VoodooPS2Controller/ApplePS2Device.h b/VoodooPS2Controller/ApplePS2Device.h index 35aefb10..9d883a6f 100644 --- a/VoodooPS2Controller/ApplePS2Device.h +++ b/VoodooPS2Controller/ApplePS2Device.h @@ -532,9 +532,6 @@ enum kPS2M_resetTouchpad = iokit_vendor_specific_msg(151), // Force touchpad reset (data is int*) - // from trackpad on I2C/SMBus - kPS2M_SMBusStart = iokit_vendor_specific_msg(152), // Reset, disable PS2 comms to not interfere with SMBus comms - // from sensor (such as yoga mode indicator) to keyboard kPS2K_setKeyboardStatus = iokit_vendor_specific_msg(200), // set disable/enable keyboard (data is bool*) kPS2K_getKeyboardStatus = iokit_vendor_specific_msg(201), // get disable/enable keyboard (data is bool*) @@ -607,6 +604,7 @@ class EXPORT ApplePS2Device : public IOService // Messaging virtual void dispatchMessage(int message, void *data); + virtual IOReturn startSMBusCompanion(OSDictionary *companionData, UInt8 smbusAddr); // Exclusive access (command byte contention) diff --git a/VoodooPS2Controller/VoodooPS2Controller.cpp b/VoodooPS2Controller/VoodooPS2Controller.cpp index 6194e90e..e2ec25c0 100644 --- a/VoodooPS2Controller/VoodooPS2Controller.cpp +++ b/VoodooPS2Controller/VoodooPS2Controller.cpp @@ -2423,3 +2423,14 @@ OSDictionary* ApplePS2Controller::makeConfigurationNode(OSDictionary* list, cons return result; } + +IOReturn ApplePS2Controller::startSMBusCompanion(OSDictionary *companionData, UInt8 smbusAddr) { + const OSSymbol *symbol = OSSymbol::withCString("VoodooSMBusCompanionDevice"); + return callPlatformFunction(symbol, + true, + static_cast(this), + static_cast(companionData), + reinterpret_cast(smbusAddr), + nullptr + ); +} diff --git a/VoodooPS2Controller/VoodooPS2Controller.h b/VoodooPS2Controller/VoodooPS2Controller.h index eb97fc56..d3c0bf1e 100644 --- a/VoodooPS2Controller/VoodooPS2Controller.h +++ b/VoodooPS2Controller/VoodooPS2Controller.h @@ -371,6 +371,8 @@ class EXPORT ApplePS2Controller : public IOService OSDictionary* getConfigurationOverride(IOACPIPlatformDevice* acpi, const char* method); OSObject* translateArray(OSArray* array); OSObject* translateEntry(OSObject* obj); + + IOReturn startSMBusCompanion(OSDictionary *companionData, UInt8 smbusAddr); }; #endif /* _APPLEPS2CONTROLLER_H */ diff --git a/VoodooPS2Trackpad/VoodooPS2SMBusDevice.cpp b/VoodooPS2Trackpad/VoodooPS2SMBusDevice.cpp new file mode 100644 index 00000000..0b9baf2b --- /dev/null +++ b/VoodooPS2Trackpad/VoodooPS2SMBusDevice.cpp @@ -0,0 +1,68 @@ +// +// VoodooPS2SMBusDevice.cpp +// VoodooPS2Trackpad +// +// Created by Gwydien on 9/13/24. +// Copyright © 2024 Acidanthera. All rights reserved. +// + +#include "VoodooPS2SMBusDevice.h" + +// Steps +// 1. If PS/2 Mode, create SMBus node +// 2. Attempt start. VRMI should have a power dependency on PS/2 controller +// 3. If SMBus start works, return PS2SmbusDevice + +ApplePS2SmbusDevice *ApplePS2SmbusDevice::withReset(bool resetNeeded) { + ApplePS2SmbusDevice *dev = OSTypeAlloc(ApplePS2SmbusDevice); + + if (dev == nullptr) { + IOLog("ApplePS2SmbusDevice - Could not create PS/2 stub device\n"); + return nullptr; + } + + if (!dev->init()) { + IOLog("ApplePS2SmbusDevice - Could not init PS/2 stub device\n"); + } + + dev->_resetNeeded = resetNeeded; + return dev; +} + +bool ApplePS2SmbusDevice::start(IOService *provider) { + IOReturn ret = kIOReturnSuccess; + + _nub = OSDynamicCast(ApplePS2MouseDevice, provider); + if (_nub == nullptr) { + return false; + } + + if (_resetNeeded) { + ret = resetDevice(); + } + + _nub->installPowerControlAction(this, OSMemberFunctionCast(PS2PowerControlAction, this, &ApplePS2SmbusDevice::powerAction)); + return ret == kIOReturnSuccess; +} + +void ApplePS2SmbusDevice::powerAction(uint32_t ordinal) { + if (ordinal == kPS2C_EnableDevice && _resetNeeded) { + (void) resetDevice(); + } +} + +IOReturn ApplePS2SmbusDevice::resetDevice() { + TPS2Request<> request; + request.commands[0].command = kPS2C_SendCommandAndCompareAck; + request.commands[0].inOrOut = kDP_SetDefaultsAndDisable; // F5 + request.commandsCount = 1; + _nub->submitRequestAndBlock(&request); + + if (request.commandsCount == 1) { + DEBUG_LOG("VoodooPS2Trackpad: sending $FF failed: %d\n", request.commandsCount); + return kIOReturnError; + } + + return kIOReturnSuccess; +} + diff --git a/VoodooPS2Trackpad/VoodooPS2SMBusDevice.h b/VoodooPS2Trackpad/VoodooPS2SMBusDevice.h new file mode 100644 index 00000000..73283e71 --- /dev/null +++ b/VoodooPS2Trackpad/VoodooPS2SMBusDevice.h @@ -0,0 +1,42 @@ +// +// VoodooPS2SMBusDevice.hpp +// VoodooPS2Trackpad +// +// Created by Gwydien on 9/13/24. +// Copyright © 2024 Acidanthera. All rights reserved. +// + +#ifndef VoodooPS2SMBusDevice_hpp +#define VoodooPS2SMBusDevice_hpp + + +#include "../VoodooPS2Controller/ApplePS2MouseDevice.h" +#include + +#include "VoodooPS2TrackpadCommon.h" + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +// ApplePS2SmbusDevice Class Declaration +// Synaptics and Elans devices still need resets over PS2. This acts as a +// PS/2 stub driver that attaches in lieu of the full touchpad driver to reset +// on wakeups and sleep. This also prevents other devices attaching and using +// the otherwise unused PS/2 interface +// + +class EXPORT ApplePS2SmbusDevice : public IOService { + typedef IOService super; + OSDeclareDefaultStructors(ApplePS2SmbusDevice); +public: + static ApplePS2SmbusDevice *withReset(bool resetNeeded); + + bool start(IOService *provider) override; + +private: + ApplePS2MouseDevice *_nub {nullptr}; + bool _resetNeeded {false}; + + IOReturn resetDevice(); + void powerAction(uint32_t ordinal); +}; + +#endif /* VoodooPS2SMBusDevice_hpp */ diff --git a/VoodooPS2Trackpad/VoodooPS2SynapticsTouchPad.cpp b/VoodooPS2Trackpad/VoodooPS2SynapticsTouchPad.cpp index d21e5800..e0019357 100644 --- a/VoodooPS2Trackpad/VoodooPS2SynapticsTouchPad.cpp +++ b/VoodooPS2Trackpad/VoodooPS2SynapticsTouchPad.cpp @@ -44,6 +44,7 @@ #include #include #include +#include "VoodooPS2SMBusDevice.h" #include "VoodooPS2Controller.h" #include "VoodooPS2SynapticsTouchPad.h" #include "VoodooInputMultitouch/VoodooInputTransducer.h" @@ -123,7 +124,7 @@ void ApplePS2SynapticsTouchPad::injectVersionDependentProperties(OSDictionary *c } } -ApplePS2SynapticsTouchPad* ApplePS2SynapticsTouchPad::probe(IOService * provider, SInt32 * score) +IOService* ApplePS2SynapticsTouchPad::probe(IOService * provider, SInt32 * score) { DEBUG_LOG("ApplePS2SynapticsTouchPad::probe entered...\n"); @@ -191,6 +192,31 @@ ApplePS2SynapticsTouchPad* ApplePS2SynapticsTouchPad::probe(IOService * provider return 0; } + // + // Query the touchpad for the capabilities we need to know. + // + queryCapabilities(); + + // + // Attempt to start SMBus Companion. If succesful, attach a stub PS/2 driver. + // + if (_cont_caps.intertouch) { + // Helpful information for SMBus drivers + OSDictionary *dictionary = OSDictionary::withCapacity(2); + dictionary->setObject("TrackstickButtons", _securepad.trackstick_btns ? + kOSBooleanTrue : kOSBooleanFalse); + dictionary->setObject("Clickpad", _cont_caps.one_btn_clickpad ? + kOSBooleanTrue : kOSBooleanFalse); + + IOReturn ret = _device->startSMBusCompanion(dictionary, 0x2C); + OSSafeReleaseNULL(dictionary); + + if (ret == kIOReturnSuccess) { + ApplePS2SmbusDevice *smbus = ApplePS2SmbusDevice::withReset(true); + return smbus; + } + } + _device = 0; DEBUG_LOG("ApplePS2SynapticsTouchPad::probe leaving.\n"); @@ -365,16 +391,6 @@ void ApplePS2SynapticsTouchPad::queryCapabilities() setTrackpointProperties(); setProperty("VoodooInputSupported", kOSBooleanTrue); - - // Helpful information for SMBus drivers - OSDictionary *dictionary = OSDictionary::withCapacity(2); - dictionary->setObject("TrackstickButtons", _securepad.trackstick_btns ? - kOSBooleanTrue : kOSBooleanFalse); - dictionary->setObject("Clickpad", _cont_caps.one_btn_clickpad ? - kOSBooleanTrue : kOSBooleanFalse); - setProperty("GPIO Data", dictionary); - - OSSafeReleaseNULL(dictionary); INFO_LOG("VoodooPS2Trackpad: logical %dx%d-%dx%d physical_max %dx%d upmm %dx%d", logical_min_x, logical_min_y, @@ -467,11 +483,6 @@ bool ApplePS2SynapticsTouchPad::start( IOService * provider ) attachedHIDPointerDevices = OSSet::withCapacity(1); registerHIDPointerNotifications(); - // - // Query the touchpad for the capabilities we need to know. - // - queryCapabilities(); - // // Set the touchpad mode byte, which will also... // Enable the mouse clock (should already be so) and the mouse IRQ line. @@ -1924,11 +1935,6 @@ void ApplePS2SynapticsTouchPad::setTrackpointProperties() void ApplePS2SynapticsTouchPad::setDevicePowerState( UInt32 whatToDo ) { - if (otherBusInUse) { - // SMBus/I2C is handling power management - return; - } - switch ( whatToDo ) { case kPS2C_DisableDevice: @@ -1992,7 +1998,7 @@ IOReturn ApplePS2SynapticsTouchPad::message(UInt32 type, IOService* provider, vo { bool enable = *((bool*)argument); // ignoreall is true when trackpad has been disabled - if (enable == ignoreall && !otherBusInUse) + if (enable == ignoreall) { // save state, and update LED ignoreall = !enable; @@ -2005,7 +2011,7 @@ IOReturn ApplePS2SynapticsTouchPad::message(UInt32 type, IOService* provider, vo { int* reqCode = (int*)argument; IOLog("VoodooPS2SynapticsTouchPad::kPS2M_resetTouchpad reqCode: %d\n", *reqCode); - if (*reqCode == 1 && !otherBusInUse) + if (*reqCode == 1) { ignoreall = false; initTouchPad(); @@ -2095,17 +2101,6 @@ IOReturn ApplePS2SynapticsTouchPad::message(UInt32 type, IOService* provider, vo keycode = pInfo->adbKeyCode; break; } - case kPS2M_SMBusStart: { - // Trackpad is being taken over by another driver - - // Queries/standing up before this point needs to be reset - // Fixes issues with CSM/Fast Boot on HP laptops - doHardwareReset(); - - // Prevent any PS2 transactions, otherwise the trackpad can completely lock up from PS2 commands - // This is called after ::start (specifically registerService()), so only prevent power management/reset msgs - otherBusInUse = true; - } } return kIOReturnSuccess; diff --git a/VoodooPS2Trackpad/VoodooPS2SynapticsTouchPad.h b/VoodooPS2Trackpad/VoodooPS2SynapticsTouchPad.h index 85c7a1dc..7a7e50ae 100644 --- a/VoodooPS2Trackpad/VoodooPS2SynapticsTouchPad.h +++ b/VoodooPS2Trackpad/VoodooPS2SynapticsTouchPad.h @@ -315,7 +315,6 @@ class EXPORT ApplePS2SynapticsTouchPad : public IOService uint64_t keytime {0}; UInt16 keycode {0}; bool ignoreall {false}; - bool otherBusInUse {false}; // Trackpad being used over SMBus/I2C #ifdef SIMULATE_PASSTHRU UInt32 trackbuttons {0}; #endif @@ -376,8 +375,7 @@ class EXPORT ApplePS2SynapticsTouchPad : public IOService public: bool init( OSDictionary * properties ) override; - ApplePS2SynapticsTouchPad * probe( IOService * provider, - SInt32 * score ) override; + IOService * probe( IOService * provider, SInt32 * score ) override; bool start( IOService * provider ) override; void stop( IOService * provider ) override; From 35c99da71babc0cc9267cee81e026be3821985cf Mon Sep 17 00:00:00 2001 From: Avery Black Date: Sun, 22 Sep 2024 11:23:57 -0700 Subject: [PATCH 3/8] Create companion device in start instead of probe --- VoodooPS2Controller/VoodooPS2Controller.cpp | 6 ++++-- VoodooPS2Trackpad/VoodooPS2SMBusDevice.cpp | 16 ++++++++++------ VoodooPS2Trackpad/VoodooPS2SMBusDevice.h | 4 +++- VoodooPS2Trackpad/VoodooPS2SynapticsTouchPad.cpp | 14 +++++--------- 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/VoodooPS2Controller/VoodooPS2Controller.cpp b/VoodooPS2Controller/VoodooPS2Controller.cpp index e2ec25c0..3927cec0 100644 --- a/VoodooPS2Controller/VoodooPS2Controller.cpp +++ b/VoodooPS2Controller/VoodooPS2Controller.cpp @@ -2426,11 +2426,13 @@ OSDictionary* ApplePS2Controller::makeConfigurationNode(OSDictionary* list, cons IOReturn ApplePS2Controller::startSMBusCompanion(OSDictionary *companionData, UInt8 smbusAddr) { const OSSymbol *symbol = OSSymbol::withCString("VoodooSMBusCompanionDevice"); - return callPlatformFunction(symbol, - true, + IOReturn ret = callPlatformFunction(symbol, + false, static_cast(this), static_cast(companionData), reinterpret_cast(smbusAddr), nullptr ); + OSSafeReleaseNULL(symbol); + return ret; } diff --git a/VoodooPS2Trackpad/VoodooPS2SMBusDevice.cpp b/VoodooPS2Trackpad/VoodooPS2SMBusDevice.cpp index 0b9baf2b..362e6dbf 100644 --- a/VoodooPS2Trackpad/VoodooPS2SMBusDevice.cpp +++ b/VoodooPS2Trackpad/VoodooPS2SMBusDevice.cpp @@ -8,12 +8,9 @@ #include "VoodooPS2SMBusDevice.h" -// Steps -// 1. If PS/2 Mode, create SMBus node -// 2. Attempt start. VRMI should have a power dependency on PS/2 controller -// 3. If SMBus start works, return PS2SmbusDevice +OSDefineMetaClassAndStructors(ApplePS2SmbusDevice, IOService); -ApplePS2SmbusDevice *ApplePS2SmbusDevice::withReset(bool resetNeeded) { +ApplePS2SmbusDevice *ApplePS2SmbusDevice::withReset(bool resetNeeded, OSDictionary *data, uint8_t addr) { ApplePS2SmbusDevice *dev = OSTypeAlloc(ApplePS2SmbusDevice); if (dev == nullptr) { @@ -23,9 +20,12 @@ ApplePS2SmbusDevice *ApplePS2SmbusDevice::withReset(bool resetNeeded) { if (!dev->init()) { IOLog("ApplePS2SmbusDevice - Could not init PS/2 stub device\n"); + return nullptr; } dev->_resetNeeded = resetNeeded; + dev->_data = data; + dev->_addr = addr; return dev; } @@ -38,10 +38,14 @@ bool ApplePS2SmbusDevice::start(IOService *provider) { } if (_resetNeeded) { - ret = resetDevice(); + resetDevice(); } + ret = _nub->startSMBusCompanion(_data, _addr); + _nub->installPowerControlAction(this, OSMemberFunctionCast(PS2PowerControlAction, this, &ApplePS2SmbusDevice::powerAction)); + + OSSafeReleaseNULL(_data); return ret == kIOReturnSuccess; } diff --git a/VoodooPS2Trackpad/VoodooPS2SMBusDevice.h b/VoodooPS2Trackpad/VoodooPS2SMBusDevice.h index 73283e71..39c09909 100644 --- a/VoodooPS2Trackpad/VoodooPS2SMBusDevice.h +++ b/VoodooPS2Trackpad/VoodooPS2SMBusDevice.h @@ -27,13 +27,15 @@ class EXPORT ApplePS2SmbusDevice : public IOService { typedef IOService super; OSDeclareDefaultStructors(ApplePS2SmbusDevice); public: - static ApplePS2SmbusDevice *withReset(bool resetNeeded); + static ApplePS2SmbusDevice *withReset(bool resetNeeded, OSDictionary *data, uint8_t addr); bool start(IOService *provider) override; private: ApplePS2MouseDevice *_nub {nullptr}; bool _resetNeeded {false}; + OSDictionary *_data {nullptr}; + uint8_t _addr{0}; IOReturn resetDevice(); void powerAction(uint32_t ordinal); diff --git a/VoodooPS2Trackpad/VoodooPS2SynapticsTouchPad.cpp b/VoodooPS2Trackpad/VoodooPS2SynapticsTouchPad.cpp index e0019357..2bddf327 100644 --- a/VoodooPS2Trackpad/VoodooPS2SynapticsTouchPad.cpp +++ b/VoodooPS2Trackpad/VoodooPS2SynapticsTouchPad.cpp @@ -200,21 +200,17 @@ IOService* ApplePS2SynapticsTouchPad::probe(IOService * provider, SInt32 * score // // Attempt to start SMBus Companion. If succesful, attach a stub PS/2 driver. // - if (_cont_caps.intertouch) { + const OSSymbol *symbol = OSSymbol::withCString("VoodooSMBusCompanionDevice"); + IOService *resources = getResourceService(); + if (_cont_caps.intertouch && resources && resources->getProperty(symbol)) { // Helpful information for SMBus drivers OSDictionary *dictionary = OSDictionary::withCapacity(2); dictionary->setObject("TrackstickButtons", _securepad.trackstick_btns ? kOSBooleanTrue : kOSBooleanFalse); dictionary->setObject("Clickpad", _cont_caps.one_btn_clickpad ? kOSBooleanTrue : kOSBooleanFalse); - - IOReturn ret = _device->startSMBusCompanion(dictionary, 0x2C); - OSSafeReleaseNULL(dictionary); - - if (ret == kIOReturnSuccess) { - ApplePS2SmbusDevice *smbus = ApplePS2SmbusDevice::withReset(true); - return smbus; - } + ApplePS2SmbusDevice *smbus = ApplePS2SmbusDevice::withReset(true, dictionary, 0x2C); + return smbus; } _device = 0; From 29ab023a205921da10d2b73f73c8260404551b5f Mon Sep 17 00:00:00 2001 From: Avery Black Date: Sun, 22 Sep 2024 18:14:03 -0700 Subject: [PATCH 4/8] Retain/Release companion info dictionary --- VoodooPS2Trackpad/VoodooPS2SMBusDevice.cpp | 10 ++++++++-- VoodooPS2Trackpad/VoodooPS2SMBusDevice.h | 1 + VoodooPS2Trackpad/VoodooPS2SynapticsTouchPad.cpp | 1 + 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/VoodooPS2Trackpad/VoodooPS2SMBusDevice.cpp b/VoodooPS2Trackpad/VoodooPS2SMBusDevice.cpp index 362e6dbf..16a522e2 100644 --- a/VoodooPS2Trackpad/VoodooPS2SMBusDevice.cpp +++ b/VoodooPS2Trackpad/VoodooPS2SMBusDevice.cpp @@ -14,17 +14,19 @@ ApplePS2SmbusDevice *ApplePS2SmbusDevice::withReset(bool resetNeeded, OSDictiona ApplePS2SmbusDevice *dev = OSTypeAlloc(ApplePS2SmbusDevice); if (dev == nullptr) { - IOLog("ApplePS2SmbusDevice - Could not create PS/2 stub device\n"); + IOLog("ApplePS2SmbusDevice: Could not create PS/2 stub device\n"); return nullptr; } if (!dev->init()) { - IOLog("ApplePS2SmbusDevice - Could not init PS/2 stub device\n"); + IOLog("ApplePS2SmbusDevice: Could not init PS/2 stub device\n"); + OSSafeReleaseNULL(dev); return nullptr; } dev->_resetNeeded = resetNeeded; dev->_data = data; + dev->_data->retain(); dev->_addr = addr; return dev; } @@ -49,6 +51,10 @@ bool ApplePS2SmbusDevice::start(IOService *provider) { return ret == kIOReturnSuccess; } +void ApplePS2SmbusDevice::free() { + OSSafeReleaseNULL(_data); +} + void ApplePS2SmbusDevice::powerAction(uint32_t ordinal) { if (ordinal == kPS2C_EnableDevice && _resetNeeded) { (void) resetDevice(); diff --git a/VoodooPS2Trackpad/VoodooPS2SMBusDevice.h b/VoodooPS2Trackpad/VoodooPS2SMBusDevice.h index 39c09909..9cd5880e 100644 --- a/VoodooPS2Trackpad/VoodooPS2SMBusDevice.h +++ b/VoodooPS2Trackpad/VoodooPS2SMBusDevice.h @@ -30,6 +30,7 @@ class EXPORT ApplePS2SmbusDevice : public IOService { static ApplePS2SmbusDevice *withReset(bool resetNeeded, OSDictionary *data, uint8_t addr); bool start(IOService *provider) override; + void free() override; private: ApplePS2MouseDevice *_nub {nullptr}; diff --git a/VoodooPS2Trackpad/VoodooPS2SynapticsTouchPad.cpp b/VoodooPS2Trackpad/VoodooPS2SynapticsTouchPad.cpp index 2bddf327..737d2d16 100644 --- a/VoodooPS2Trackpad/VoodooPS2SynapticsTouchPad.cpp +++ b/VoodooPS2Trackpad/VoodooPS2SynapticsTouchPad.cpp @@ -210,6 +210,7 @@ IOService* ApplePS2SynapticsTouchPad::probe(IOService * provider, SInt32 * score dictionary->setObject("Clickpad", _cont_caps.one_btn_clickpad ? kOSBooleanTrue : kOSBooleanFalse); ApplePS2SmbusDevice *smbus = ApplePS2SmbusDevice::withReset(true, dictionary, 0x2C); + OSSafeReleaseNULL(dictionary); return smbus; } From 27207c7ec5e9206abbe20a049eae1eda51a26a35 Mon Sep 17 00:00:00 2001 From: Avery Black Date: Sun, 22 Sep 2024 18:22:34 -0700 Subject: [PATCH 5/8] Clean up PS2 stub device --- VoodooPS2Trackpad/VoodooPS2SMBusDevice.cpp | 25 +++++++++++----------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/VoodooPS2Trackpad/VoodooPS2SMBusDevice.cpp b/VoodooPS2Trackpad/VoodooPS2SMBusDevice.cpp index 16a522e2..2b171c08 100644 --- a/VoodooPS2Trackpad/VoodooPS2SMBusDevice.cpp +++ b/VoodooPS2Trackpad/VoodooPS2SMBusDevice.cpp @@ -14,12 +14,10 @@ ApplePS2SmbusDevice *ApplePS2SmbusDevice::withReset(bool resetNeeded, OSDictiona ApplePS2SmbusDevice *dev = OSTypeAlloc(ApplePS2SmbusDevice); if (dev == nullptr) { - IOLog("ApplePS2SmbusDevice: Could not create PS/2 stub device\n"); return nullptr; } if (!dev->init()) { - IOLog("ApplePS2SmbusDevice: Could not init PS/2 stub device\n"); OSSafeReleaseNULL(dev); return nullptr; } @@ -32,27 +30,28 @@ ApplePS2SmbusDevice *ApplePS2SmbusDevice::withReset(bool resetNeeded, OSDictiona } bool ApplePS2SmbusDevice::start(IOService *provider) { - IOReturn ret = kIOReturnSuccess; - + if (!super::start(provider)) + return false; + _nub = OSDynamicCast(ApplePS2MouseDevice, provider); - if (_nub == nullptr) { + if (_nub == nullptr) return false; - } - if (_resetNeeded) { + if (_resetNeeded) resetDevice(); - } - ret = _nub->startSMBusCompanion(_data, _addr); - - _nub->installPowerControlAction(this, OSMemberFunctionCast(PS2PowerControlAction, this, &ApplePS2SmbusDevice::powerAction)); + if (_nub->startSMBusCompanion(_data, _addr) != kIOReturnSuccess) { + return false; + } - OSSafeReleaseNULL(_data); - return ret == kIOReturnSuccess; + _nub->installPowerControlAction(this, + OSMemberFunctionCast(PS2PowerControlAction, this, &ApplePS2SmbusDevice::powerAction)); + return true; } void ApplePS2SmbusDevice::free() { OSSafeReleaseNULL(_data); + super::free(); } void ApplePS2SmbusDevice::powerAction(uint32_t ordinal) { From 67d129b565216b3a06faa2e6f7032e8cb0fa9d26 Mon Sep 17 00:00:00 2001 From: Avery Black Date: Sun, 22 Sep 2024 18:38:24 -0700 Subject: [PATCH 6/8] Save OSSymbol in class --- VoodooPS2Controller/ApplePS2Device.h | 2 ++ VoodooPS2Controller/VoodooPS2Controller.cpp | 20 +++++++++++--------- VoodooPS2Controller/VoodooPS2Controller.h | 1 + 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/VoodooPS2Controller/ApplePS2Device.h b/VoodooPS2Controller/ApplePS2Device.h index 9d883a6f..03100b5f 100644 --- a/VoodooPS2Controller/ApplePS2Device.h +++ b/VoodooPS2Controller/ApplePS2Device.h @@ -516,6 +516,8 @@ typedef void (*PS2PowerControlAction)(void * target, UInt32 whatToDo); // Published property for devices to express interest in receiving messages #define kDeliverNotifications "RM,deliverNotifications" +#define kSmbusCompanion "VoodooSMBusCompanionDevice" + // Published property for device nub port location #define kPortKey "Port Num" diff --git a/VoodooPS2Controller/VoodooPS2Controller.cpp b/VoodooPS2Controller/VoodooPS2Controller.cpp index 3927cec0..0dc60a59 100644 --- a/VoodooPS2Controller/VoodooPS2Controller.cpp +++ b/VoodooPS2Controller/VoodooPS2Controller.cpp @@ -280,6 +280,10 @@ bool ApplePS2Controller::init(OSDictionary* dict) _deliverNotification = OSSymbol::withCString(kDeliverNotifications); if (_deliverNotification == NULL) return false; + + _smbusCompanion = OSSymbol::withCString(kSmbusCompanion); + if (_smbusCompanion == NULL) + return false; queue_init(&_requestQueue); @@ -747,6 +751,7 @@ void ApplePS2Controller::stop(IOService * provider) // Free the RMCF configuration cache OSSafeReleaseNULL(_rmcfCache); OSSafeReleaseNULL(_deliverNotification); + OSSafeReleaseNULL(_smbusCompanion); // Free the request queue lock and empty out the request queue. if (_requestQueueLock) @@ -2425,14 +2430,11 @@ OSDictionary* ApplePS2Controller::makeConfigurationNode(OSDictionary* list, cons } IOReturn ApplePS2Controller::startSMBusCompanion(OSDictionary *companionData, UInt8 smbusAddr) { - const OSSymbol *symbol = OSSymbol::withCString("VoodooSMBusCompanionDevice"); - IOReturn ret = callPlatformFunction(symbol, - false, - static_cast(this), - static_cast(companionData), - reinterpret_cast(smbusAddr), - nullptr - ); - OSSafeReleaseNULL(symbol); + IOReturn ret = callPlatformFunction(_smbusCompanion, + false, + static_cast(this), + static_cast(companionData), + reinterpret_cast(smbusAddr), + nullptr); return ret; } diff --git a/VoodooPS2Controller/VoodooPS2Controller.h b/VoodooPS2Controller/VoodooPS2Controller.h index d3c0bf1e..793e200d 100644 --- a/VoodooPS2Controller/VoodooPS2Controller.h +++ b/VoodooPS2Controller/VoodooPS2Controller.h @@ -282,6 +282,7 @@ class EXPORT ApplePS2Controller : public IOService #endif OSDictionary* _rmcfCache {nullptr}; const OSSymbol* _deliverNotification {nullptr}; + const OSSymbol* _smbusCompanion {nullptr}; int _resetControllerFlag {RESET_CONTROLLER_ON_BOOT | RESET_CONTROLLER_ON_WAKEUP}; bool _kbdOnly {0}; From 15d27d6c9f34c45ccc10c91f50f05f8e8093cd81 Mon Sep 17 00:00:00 2001 From: Avery Black Date: Sun, 22 Sep 2024 22:01:44 -0700 Subject: [PATCH 7/8] Save symbol in class --- VoodooPS2Trackpad/VoodooPS2SynapticsTouchPad.cpp | 13 +++++++++++-- VoodooPS2Trackpad/VoodooPS2SynapticsTouchPad.h | 2 ++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/VoodooPS2Trackpad/VoodooPS2SynapticsTouchPad.cpp b/VoodooPS2Trackpad/VoodooPS2SynapticsTouchPad.cpp index 737d2d16..f8cdf8e7 100644 --- a/VoodooPS2Trackpad/VoodooPS2SynapticsTouchPad.cpp +++ b/VoodooPS2Trackpad/VoodooPS2SynapticsTouchPad.cpp @@ -76,6 +76,10 @@ bool ApplePS2SynapticsTouchPad::init(OSDictionary * dict) memset(freeFingerTypes, true, kMT2FingerTypeCount); freeFingerTypes[kMT2FingerTypeUndefined] = false; + + _smbusCompanion = OSSymbol::withCString(kSmbusCompanion); + if (_smbusCompanion == NULL) + return false; // announce version extern kmod_info_t kmod_info; @@ -200,9 +204,8 @@ IOService* ApplePS2SynapticsTouchPad::probe(IOService * provider, SInt32 * score // // Attempt to start SMBus Companion. If succesful, attach a stub PS/2 driver. // - const OSSymbol *symbol = OSSymbol::withCString("VoodooSMBusCompanionDevice"); IOService *resources = getResourceService(); - if (_cont_caps.intertouch && resources && resources->getProperty(symbol)) { + if (_cont_caps.intertouch && resources && resources->getProperty(_smbusCompanion)) { // Helpful information for SMBus drivers OSDictionary *dictionary = OSDictionary::withCapacity(2); dictionary->setObject("TrackstickButtons", _securepad.trackstick_btns ? @@ -602,6 +605,12 @@ void ApplePS2SynapticsTouchPad::stop( IOService * provider ) // OSSafeReleaseNULL(_provider); + // + // Release OSSymbols + // + + OSSafeReleaseNULL(_smbusCompanion); + super::stop(provider); } diff --git a/VoodooPS2Trackpad/VoodooPS2SynapticsTouchPad.h b/VoodooPS2Trackpad/VoodooPS2SynapticsTouchPad.h index 7a7e50ae..061a9981 100644 --- a/VoodooPS2Trackpad/VoodooPS2SynapticsTouchPad.h +++ b/VoodooPS2Trackpad/VoodooPS2SynapticsTouchPad.h @@ -323,6 +323,8 @@ class EXPORT ApplePS2SynapticsTouchPad : public IOService int _processusbmouse {true}; int _processbluetoothmouse {true}; + const OSSymbol* _smbusCompanion {nullptr}; + OSSet* attachedHIDPointerDevices {nullptr}; IONotifier* usb_hid_publish_notify {nullptr}; // Notification when an USB mouse HID device is connected From ae8028c8ca39ec28eb047d46a240b5e369ee5cfe Mon Sep 17 00:00:00 2001 From: Avery Black Date: Mon, 30 Sep 2024 19:50:27 -0700 Subject: [PATCH 8/8] Update copyright --- VoodooPS2Trackpad/VoodooPS2SMBusDevice.cpp | 6 +++++- VoodooPS2Trackpad/VoodooPS2SMBusDevice.h | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/VoodooPS2Trackpad/VoodooPS2SMBusDevice.cpp b/VoodooPS2Trackpad/VoodooPS2SMBusDevice.cpp index 2b171c08..36803959 100644 --- a/VoodooPS2Trackpad/VoodooPS2SMBusDevice.cpp +++ b/VoodooPS2Trackpad/VoodooPS2SMBusDevice.cpp @@ -2,12 +2,16 @@ // VoodooPS2SMBusDevice.cpp // VoodooPS2Trackpad // -// Created by Gwydien on 9/13/24. +// Created by Avery Black on 9/13/24. // Copyright © 2024 Acidanthera. All rights reserved. // #include "VoodooPS2SMBusDevice.h" +// ============================================================================= +// ApplePS2SmbusDevice Class Implementation +// + OSDefineMetaClassAndStructors(ApplePS2SmbusDevice, IOService); ApplePS2SmbusDevice *ApplePS2SmbusDevice::withReset(bool resetNeeded, OSDictionary *data, uint8_t addr) { diff --git a/VoodooPS2Trackpad/VoodooPS2SMBusDevice.h b/VoodooPS2Trackpad/VoodooPS2SMBusDevice.h index 9cd5880e..26f386cd 100644 --- a/VoodooPS2Trackpad/VoodooPS2SMBusDevice.h +++ b/VoodooPS2Trackpad/VoodooPS2SMBusDevice.h @@ -2,7 +2,7 @@ // VoodooPS2SMBusDevice.hpp // VoodooPS2Trackpad // -// Created by Gwydien on 9/13/24. +// Created by Avery Black on 9/13/24. // Copyright © 2024 Acidanthera. All rights reserved. //