AGPM Editing for Hackintosh: Tuning Vender, LogControl, and Voltage on Unsupported GPUs

Advanced AGPM kext editing for Hackintosh: fix GPU voltage, thermal throttling, and kernel panics by tuning Vender, LogControl, and control-id keys on legacy AMD and NVIDIA cards.

When you have already patched AppleGraphicsPowerManagement.kext for a basic GPU like a Radeon HD 7xxx or a GeForce GTX 680, the system boots, sleeps, and the fans spin at a reasonable speed. But the real test comes when you push the GPU under load — a render in Final Cut Pro, a game in Windows via Boot Camp, or even a prolonged export in Lightroom. If the clock speed locks to a single value, the voltage stays flat, or the machine kernel panics after ten minutes of 3D work, you have hit the limits of a simple plist edit. This is where AGPM editing enters its third stage — tuning the Vender (sic) and VenderUnderscore keys, controlling the relationship between load states, and handling GPUs that Apple never officially supported on your board.

Why the Third Pass Matters

Apple's power management framework divides GPU operation into several LogControl states. Each state defines a frequency, a voltage, and a set of hardware PLL dividers. The default plist entries for a Radeon HD 7950 on a MacPro5,1 board-id work passably, but on a Z77-based Hackintosh with an Ivy Bridge CPU, the ACPI tables report a different system profile. The kernel's power daemon (kernel_task) then misinterprets the thermal and electrical limits, causing the GPU to either idle at too high a clock or throttle prematurely. The AGPM kext reads its configuration from /System/Library/Extensions/AppleGraphicsPowerManagement.kext/Contents/Info.plist. Editing that file requires SIP disabled and a rebuild of the kernel cache, but the real work is in understanding which keys actually matter for your hardware combination.

The Three Keys You Rarely Touch — Until Now

1. Vender (string) and VenderUnderscore (string)

These two keys appear in every AGPM plist entry for a GPU model. They are misspelled in Apple's original code — Vender instead of Vendor — and you must preserve the exact spelling. Vender holds the device name as reported by IORegistryExplorer (for example, AMD Radeon HD 7950). VenderUnderscore holds the same name but with underscores replacing spaces (AMD_Radeon_HD_7950). The kext uses these strings to match your GPU to a set of power states. If you have a card that Apple never shipped in any Mac (such as a GeForce GTX 780 Ti or a Radeon R9 290X), you must create a new dictionary entry under CFBundleIdentifier matching your GPU's IOReg name. A mismatch here means the kext falls back to a generic profile, often with no dynamic frequency scaling.

2. LogControl (array of dictionaries)

Each dictionary inside LogControl represents a power state. The keys lowThreshold and highThreshold define the GPU temperature range (in degrees Celsius) where that state is active. The control key holds a dictionary with control-id (a numeric identifier for the voltage regulator phase) and control-val (a byte representing the target voltage). On older cards, the voltage is encoded as a raw hex value; on newer cards, it uses a millivolt integer. Editing these values without a hardware monitor (such as HWMonitor or iStat Menus) is risky. A single wrong byte can send 1.3 V into a core rated for 1.0 V, damaging the GPU silently over time.

3. control-id and control-val — The Voltage Landmine

I have seen forum posts where a user blindly copies a control-val from a Mac Edition Radeon HD 4870 into a plist for a GeForce GTX 960. The result is an instant kernel panic on the next boot, and in one case, a popped capacitor on the GPU. The control-id must match the voltage regulator chip that your specific board uses. For reference designs, the ID is usually 0x200 (for NVIDIA) or 0x100 (for AMD). But custom PCBs from ASUS, MSI, or Gigabyte often use different regulators. The only safe way to determine the correct control-id is to boot a known-good configuration (such as a MacPro6,1 SMBIOS with the same GPU) and dump the AGPM state using ioreg -l -w0 | grep AGPM. Then compare the control-id values from a working profile to your target profile.

Step-by-Step: Editing the Third-Level AGPM Profile

This procedure assumes you have already backed up your original kext and disabled SIP. If you have not read the foundational guide to AGPM editing, review the practical steps in AGPM Editing for Legacy Hackintosh: A Practical Guide before proceeding.

  1. Identify your exact GPU model in IORegistry. Run ioreg -l -w0 | grep -i "AGPM" and look for the Vender string. Write it down exactly, including capitalization.
  2. Open /S/L/E/AppleGraphicsPowerManagement.kext/Contents/Info.plist with Xcode or PlistEdit Pro. Do not use a plain text editor — the plist contains binary data in some keys that a text editor will corrupt.
  3. Locate the dictionary for your GPU's IOReg name. If it does not exist, duplicate an entry from a similar card. For a Radeon R9 280X, duplicate the AMD Radeon HD 7950 entry and rename both Vender and VenderUnderscore to match your card.
  4. Adjust the LogControl thresholds. For a card that runs hot (85°C+ under load), increase the highThreshold values by 5°C to prevent aggressive throttling. Never exceed 95°C for the high threshold on any GPU — the silicon will degrade above that.
  5. Set control-id and control-val. If you are unsure, use control-id = 0x200 for NVIDIA and 0x100 for AMD as a starting point. Then test with a GPU stress tool (Unigine Heaven or Valley) while monitoring voltage with GPU-Z in Windows or with RadeonMonitor in macOS. If the voltage does not change between idle and load, the control-id is wrong.
  6. Rebuild kernel cache and reboot. Run sudo kextcache -i / and then sudo reboot. After boot, check the system log for AGPM-related messages: log show --predicate 'eventMessage contains "AGPM"' --last 10m.

Common Pitfalls in AGPM Editing 3

  • Copying profiles between different GPU families. A profile from a Radeon HD 7xxx will not work on a Radeon R9 2xx, even if the device ID is similar. The voltage tables are completely different.
  • Ignoring the LoadIndex key. Some plist entries contain a LoadIndex array that maps each power state to a specific system load level. If you add or remove a state, you must update the indices accordingly.
  • Forgetting to check the SMBIOS dependency. AGPM profiles are often tied to a specific board-id. If you are using a MacPro5,1 SMBIOS but the profile was written for a MacBookPro8,3, the kext may not load at all. Use Clover's config.plist to spoof a board-id that matches your GPU's native Mac profile.
  • Overwriting the kext during a macOS update. Every macOS point release (e.g., 10.12.5 to 10.12.6) replaces the AGPM kext. Keep a backup of your edited plist in a safe location, and re-apply it after each update.

Testing Your Work Without Destroying Your Installation

The safest testing method is to boot from a secondary volume — either a clone of your current macOS installation or a separate SSD with a fresh copy of the OS. Apply the edited AGPM kext to the test volume, then boot from it. Run a GPU stress test for at least 30 minutes while monitoring temperature and system stability. If the machine panics, reboot into the primary volume and revert the kext. Do not rely on a single successful boot as proof of stability; some AGPM errors manifest only after the GPU reaches thermal equilibrium, which can take 15–20 minutes.

For users running dual-CPU configurations on X79 or X99 platforms, AGPM editing becomes even more complex because the ACPI tables report multiple processor packages that can confuse the power management daemon. A dedicated walkthrough for those boards is available in the Dual-CPU Hackintosh Review: IMG 4882 on X79 and X99, which covers the interaction between CPU power states and GPU AGPM profiles on dual-socket systems.

When to Walk Away

Not every GPU can be tamed with AGPM editing. If your card uses a firmware-based voltage control (common on later AMD cards like the Radeon RX 4xx and 5xx series), the AGPM kext has no effect on voltage — the GPU's own VBIOS handles it. In that case, editing the plist only changes the thermal thresholds, which may do nothing or cause the system to ignore the GPU's built-in limits. Similarly, NVIDIA cards from the Maxwell generation onward (GTX 900 series and later) rely on the NVIDIA Web Driver's power management, not Apple's AGPM. Patching AGPM on those cards is pointless and can conflict with the web driver. Know when the hardware is too new for the legacy approach, and accept that some configurations simply cannot achieve dynamic power management under old macOS versions.