This kernel extension disables the NVIDIA GPU after waking up from sleep. It is intended to be used on a 2012 MacBook Pro (retina) with a failed NVIDIA GPU.
It is adapted from AMDGPUWakeHandler (for 2011 MacBook Pros with AMD GPUs).
NOTE: To use this extension, you will also want to disable the GPU at boot time using the Grub config:
set timeout=10
menuentry "macOS" {
outb 0x7c2 1
outb 0x7d4 0x28
outb 0x7c2 2
outb 0x7d4 0x10
outb 0x7c2 2
outb 0x7d4 0x40
outb 0x7c2 1
outb 0x7d4 0x50
outb 0x7c2 0
outb 0x7d4 0x50
exit
}
See this gist for more info on how to set up booting from Grub.
To build the kext with Xcode you must disable SIP. Running recovery mode may be difficult with the broken NVIDIA GPU, you could try to create a macOS usb stick and run it to disable SIP.
To build the kext make sure the OSBundle versions in the Info.plist file match the kernel version of your system.
To check your kernel version run from terminal:
system_profiler SPSoftwareDataType
After building using Xcode, copy the kext to /Library/Extensions
and run the following commands from terminal:
sudo chown -R root:wheel /Library/Extensions/NVDAGPUWakeHandler.kext
sudo touch /Library/Extensions
Reboot.
If you prefer to load the kext manually, then after building the kext, copy it to a location of your choice and run the following command to change its permissions:
sudo chown -R root:wheel /path/to/NVDAGPUWakeHandler.kext
Then when you want to load the kext you can simply run the command:
sudo kextload /path/to/NVDAGPUWakeHandler.kext
To unload:
sudo kextunload /path/to/NVDAGPUWakeHandler.kext
To view the logs for the last 24 hours run the following on the terminal:
log show --last 24h --predicate 'senderImagePath contains "NVDAGPUWakeHandler"'
To enable brightness control, after loading this kext, you can run NativeDisplayBrightness