-
Notifications
You must be signed in to change notification settings - Fork 0
Troubleshooting
Most problems are one of: not running with privileges, no backend available, Secure Boot blocking PCI access, or an argument the CPU doesn't support. Start with:
# Linux
sudo zenmaster --info
# Windows (Administrator)
zenmaster --info
# macOS
sudo python3 -m zenmaster --infoIf --info shows a Backend: other than not initialized, the SMU is reachable and the problem is elsewhere (usually the argument). If it says not initialized, the problem is the backend: see below.
SMU writes, --table, and --dump-table need elevation.
-
Linux: run with
sudo. Ifsudo zenmasterreports command not found, your install is in a user environment thatsudodoesn't see onPATH. Usesudo python3 -m zenmaster ...or install system-wide withsudo pip install zenmaster. - Windows: open the terminal as Administrator (right-click, Run as administrator), not a normal one.
-
macOS: same "command not found" issue as Linux, and the same fix:
sudo python3 -m zenmaster ...instead ofsudo zenmaster ....
With Secure Boot off, ZenMaster always uses PCI direct access. If it can't:
- Confirm you're running as root.
- Check kernel lockdown is off (it can block PCI config writes even without Secure Boot).
- If the PCI config space genuinely isn't there, your chipset path may differ from the expected
0000:00:00.0; open an issue with your--infooutput.
A loaded ryzen_smu module is not used when Secure Boot is off. The selection is by Secure Boot state, not by what's loaded.
When Secure Boot is on, kernel lockdown blocks raw PCI access, and there is no fallback: you must use the ryzen_smu module. ZenMaster detects this and says so.
Options:
-
Use
ryzen_smu. Build and install it, then sign the module with a MOK key and enroll it so it loads under Secure Boot:git clone https://github.com/amkillam/ryzen_smu cd ryzen_smu && make && sudo make install sudo modprobe ryzen_smu
- Disable Secure Boot in UEFI firmware settings.
ZenMaster reads the module's drv_version and needs 0.1.7 or newer (it uses the /smn interface added in that release). Update the module:
cd ryzen_smu && git pull && make && sudo make install
sudo rmmod ryzen_smu && sudo modprobe ryzen_smuInstall PawnIO and reboot:
https://github.com/namazso/PawnIO.Setup/releases/latest/download/PawnIO_setup.exe
- The driver may need a reboot to activate after install.
- Make sure the terminal is elevated (Administrator).
- If you get error 1 (
INVALID_FUNCTION), reinstall PawnIO from the link above.
Neither DirectHW.kext nor the kext-free IOPCIBridge path is usable. The error message tells you exactly what's missing, but the two fixes are:
-
Install and load DirectHW.kext (this gets you
--table/--sensorstoo): https://github.com/joevt/directhw. On a Hackintosh, SIP also needs to allow unsigned kexts,csr-active-configset to03080000in your OpenCore/Clover config. -
Use the kext-free path: run as root and add the
debug=0x144boot-arg, then pass--iopci. This gets you tuning only, not the PM table.
You forced --iopci (or DirectHW isn't loaded, so ZenMaster fell back to it) without that boot-arg set. Add debug=0x144 to your bootloader config and reboot. There's no way around this requirement; it's how Apple's own IOPCIDiagnostics client gates config-space writes.
You're on the kext-free IOPCIBridge path. It only reaches config space, not physical memory, so it can apply tuning arguments but can't read the PM table at all. Install DirectHW.kext if you want sensors too.
If a tuning line ends in something other than OK:
| Status | Meaning | What to do |
|---|---|---|
Rejected (prerequisite) |
The SMU needs another state first (e.g. OC mode enabled) | Enable the prerequisite first, e.g. --enable-oc before OC clocks |
Rejected (busy) |
The mailbox was busy | Retry; avoid hammering the SMU from multiple tools at once |
Unknown command |
That opcode isn't valid on this firmware | The arg may not truly apply to your CPU |
Failed |
Generic failure | Check the value is sane for that field |
Also check the value's unit and range: power is in mW (15000 = 15 W), current in mA, temperature in °C. A value far out of range is commonly rejected. See Tuning Arguments.
The argument isn't in your CPU's command table, or a value argument was passed without =value. Run zenmaster --help to see exactly which arguments your CPU supports. The help list is authoritative: it's generated from your detected family.
Not all families have a PM table (it's mostly APUs/mobile). If your family isn't covered, --table and --dump-table won't work and aren't shown in --help. See the supported list in PM Table and Monitoring.
On Linux PCI direct, the table is read over /dev/mem; if your kernel has CONFIG_STRICT_DEVMEM enabled it may block that region, in which case load the ryzen_smu module instead, which reads the table through sysfs. On macOS, the table needs DirectHW.kext specifically; the kext-free --iopci path can't read it at all.
Some firmware and vendor software periodically reset SMU limits. Use the reapply loop to hold them:
sudo zenmaster --stapm-limit=15000 --reapply=15It re-applies every N seconds until you stop it with Ctrl-C. For persistence across reboots, wrap it in a systemd service (Linux) or a scheduled task at logon (Windows).
You set a value the silicon can't sustain (too aggressive an undervolt, too high a clock, too low a current limit). ZenMaster's writes are not persistent: reboot and the SMU returns to firmware defaults. Reboot, then dial the value back and test incrementally.
Open an issue with your zenmaster --info --json output and the exact command you ran:
https://github.com/HorizonUnix/ZenMaster/issues
PyPI · Report an issue · Releases · By HorizonUnix under GPL-3.0
Getting started
Monitoring
Developers
Help