Wiki > Distributions Linux & ROCm > GPU Governor
Source : Admin & CommunautéLecture : 15 min de lecture
Voir sur GitHub ↗

06 — GPU Governor

ℹ️ NOTE
The GPU governor is essential. Without it, the GPU is locked at 1500 MHz and idle power is 85–105W.
With it, the GPU dynamically scales from ~1000 MHz (idle) to 2000–2230 MHz (gaming), and idle power drops to 60–70W.

Which Governor Should You Use?

GovernorTypeKernel Patch?Recommended?Notes
cyan-skillfish-governor-smuSMU-basedNo (works on any distro)YES — Best choiceMost efficient, best scaling, no kernel mods needed
cyan-skillfish-governor-smu-plusSMU-based + extrasNoEmerging alternativeAdds fix-metrics, set-method, frequency-range, pprofile autoswitching, memory controller/IF clock idle lowering -- some CachyOS issues reported
cyan-skillfish-governor-ttMulti-stepYes (pre-included in Bazzite)Good alternativeThermal throttling aware
oberon-governorTwo-stateYesLegacy / No longer recommendedSimple but limited to 1000/2000 MHz

Installation: cyan-skillfish-governor-smu (Recommended)

Fedora

BASH
sudo dnf copr enable filippor/bazzite
sudo dnf install cyan-skillfish-governor-smu
sudo systemctl enable --now cyan-skillfish-governor-smu.service

Bazzite (rpm-ostree)

BASH
sudo dnf copr enable filippor/bazzite
rpm-ostree install cyan-skillfish-governor-smu
systemctl reboot
# After reboot:
sudo systemctl enable --now cyan-skillfish-governor-smu.service

CachyOS (paru pre-installed)

BASH
paru -S cyan-skillfish-governor-smu
sudo systemctl enable --now cyan-skillfish-governor-smu.service

Arch / Manjaro (install an AUR helper first)

BASH
# Install paru (if not present)
sudo pacman -S --needed base-devel git
git clone https://aur.archlinux.org/paru.git
cd paru && makepkg -si && cd ..

# Then:
paru -S cyan-skillfish-governor-smu
# Or with yay: yay -S cyan-skillfish-governor-smu
sudo systemctl enable --now cyan-skillfish-governor-smu.service

Debian / Ubuntu

BASH
wget https://github.com/Magnap/cyan-skillfish-governor/releases/latest/download/cyan-skillfish-governor-smu_amd64.deb
sudo dpkg -i cyan-skillfish-governor-smu_amd64.deb
sudo systemctl enable --now cyan-skillfish-governor-smu.service

Generic Linux (Build from Source)

BASH
git clone https://github.com/filippor/cyan-skillfish-governor.git
cd cyan-skillfish-governor
# See repo README for build instructions (SMU variant is on smu branch)


How the Governor Works (Technical Overview)

Understanding the governor's internal behavior helps tune it for your specific board and cooling setup (explained by filippor, May 2026).

Timing and Sampling

Every adjust microseconds (default: 200,000 µs = 200ms) the governor runs a sampling cycle:

1. Samples the GPU's busy-flag 64 times, once every sample µs (default: 500 µs)

2. Calculates the percentage of time the GPU was busy vs idle

3. Compares to the load_target range (upper/lower thresholds)

4. If GPU utilization is above upper target → increase frequency to next safe-point

5. If GPU utilization is below lower target → decrease frequency to previous safe-point

6. Every flush-every cycles (default: 10) → updates the displayed frequency (visible in MangoHud)

CODE
Timeline:
  |-- adjust (200ms) --|-- adjust (200ms) --|
  | 64x sample (500µs) | 64x sample (500µs) |
  | busy-flag check    | busy-flag check    |
                   ↕ (every 10 cycles = flush-every)
                   MangoHud frequency updates

Safe-Point Interpolation

Between two safe-points, the governor uses the voltage of the next higher safe-point (filippor). Examples:

GPU FrequencyVoltage UsedSource Safe-Point
350 MHz800 mVUses 1000 MHz safe-point (next up)
501 MHz900 mVUses 1500 MHz safe-point
1200 MHz900 mVUses 1500 MHz safe-point
1500 MHz900 mVExact match at safe-point

This means the lowest safe-point [1000, 800] controls voltage for ALL frequencies between 0-1000 MHz. A conservative GPU that never exceeds 1800 MHz during gaming only needs safe-points from 1000-2000 MHz range.

Load Target Tuning

The load_target controls how aggressively the governor scales frequency (filippor, May 2026):

SettingBehaviorBest For
Upper 0.80 / Lower 0.65Less aggressive, stays at lower frequencies longerCooler, quieter, lower power
Upper 0.65 / Lower 0.50More aggressive, faster to ramp upPerformance, higher FPS

Why a lower upper target means MORE aggressive: The governor tries to keep GPU utilization below the upper target. With upper=0.65, it will ramp frequency up sooner (at 65% utilization). With upper=0.80, it waits until 80% before ramping. This is counterintuitive — the lower the upper target, the more the GPU boosts.

Metrics Bug Workaround

On some kernels, GPU metrics reporting is broken. Try setting fix-metrics = false in config.toml if you see incorrect GPU utilization in MangoHud (community report, May 2026).

Decky Loader Plugin: GPU Clock Control

Project: mix3d/bc250-perf-profile-switcher ↗

A Decky Loader ↗ plugin for BC-250 systems. Features:

  • GPU clock cap — notched slider that drives the governor D-Bus service; setting persists across reboots
  • Live telemetry — displays GPU/CPU clock speeds, temperatures, and utilization in the Quick Access Menu
  • Works on Bazzite and CachyOS with Gamescope session (mix3d, Jul 2026)
  • Install via Decky Loader's plugin store or manually from the GitHub repo. Ideal for living-room setups where you want on-the-fly GPU control from a controller-friendly interface.


    Configuration

    Config file: /etc/cyan-skillfish-governor-smu/config.toml

    Recommended Config (Good for Most Users)

    TOML
    safe-points = [
        [1000, 700],   # 1000 MHz @ 700 mV (idle)
        [1500, 900],   # 1500 MHz @ 900 mV
        [2000, 1000],  # 2000 MHz @ 1000 mV (gaming)
        [2100, 1025],  # 2100 MHz @ 1025 mV
        [2175, 1050],  # 2175 MHz @ 1050 mV (overclock)
        [2300, 1075],  # 2300 MHz @ 1075 mV (OC, good air cooling)
    ]
    
    [load_target]
    min = 0.70    # 70% GPU utilization target minimum
    max = 0.95    # 95% GPU utilization target maximum
    
    [timing]
    interval_ms = 50       # How often to check GPU load
    burst_samples = 20     # Samples before jumping to max frequency

    Conservative Config (Lower Temps / Less OC)

    TOML
    safe-points = [
        [1000, 700],
        [1500, 900],
        [2000, 1000],
    ]
    [load_target]
    min = 0.70
    max = 0.95
    [timing]
    interval_ms = 50
    burst_samples = 20
    ℹ️ NOTE
    Minimum voltage is 700 mV. Going below this locks the GPU to 1500 MHz and defeats the purpose. (source: governor.md:36). Some users run 650 mV at very low frequencies (350-500 MHz) for deep idle, but stability varies.

    Idle Power Testing (May 2026)

    Community testing shows CU count has minimal impact on idle power:

    ConfigIdle Power (from wall)User
    4 CU @ 350 MHz / 700 mV68Wbig_trov
    24 CU @ 350 MHz / 700 mV69Wbig_trov
    40 CU @ 350 MHz / 700 mV70Wbig_trov
    24 CU @ 50 MHz / 650 mV64W (FSP500-30AS)pops1cl

    Downclocking the GPU to 10 MHz works, but 1 MHz crashes the kernel driver (pops1cl, May 2026). The default minimum frequency in the governor config has been bumped from 400 MHz to 500 MHz.

    After Changing Config

    BASH
    sudo systemctl restart cyan-skillfish-governor-smu

    SMU-Plus Config Options (Emerging)

    The cyan-skillfish-governor-smu-plus variant adds these config options:

    TOML
    # /etc/cyan-skillfish-governor-smu-plus/config.toml
    fix-metrics = true            # Enables GPU usage metrics fix
    set-method = "smu"            # "smu" or "kernel"
    [frequency-range]
    min = 400                     # Minimum allowed frequency (MHz)
    max = 2200                    # Maximum allowed frequency (MHz)
    [dbus]
    enabled = false               # D-Bus service

    Note: SMU-plus has known issues on CachyOS — the regular SMU governor is more stable.

    8-Core GPU Clock Reporting Fix (Aug 2026)

    Unlocking all 8 CPU cores breaks GPU clock reporting (pp_dpm_sclk shows nonsense like 1: 15Mhz instead of 1500Mhz — the GPU still clocks correctly, it's a reporting bug). Two fixes exist:

    1. fix-freq = true (filippor, commit be9537f, Aug 2026) — fixes reporting in userspace via bind mounts, no kernel patch needed. Add it next to fix-metrics in the governor config:

    TOML
       fix-metrics = true
       fix-freq = true

    ⚠️ Arch repo version may lag behind — if fix-freq isn't available, build from the filippor/cyan-skillfish-governor repo directly (e.g. yay -S --editmenu cyan-skillfish-governor-smu, update version/URL, stub b2sums with SKIP — hexxeh, Aug 2026).

    2. Kernel patch (keroppl_wizard) — see 02-bios-and-firmware.md 8-core metrics fix options.

    Reported working on 8-core boards — GPU frequency reads correctly again (community reports, Aug 2026; hexxeh and lordantares confirmed the config option and the AUR build workaround on kernel 7.1-era CachyOS; dizzey0709 confirmed the updated governor restores GPU freq reporting "without kernel changes", Aug 9 2026).

    ℹ️ NOTE
    Note: some users on the metrics rabbit hole found that reading SMU "table 3" is unstable — the GPU triggers "graphics reset" events constantly (keroppl_wizard, Aug 4 2026). keroppl investigated filling table 3 with full per-core metrics data ("Supposedly theres a table 3 that can be filled out with full unabridged data") but the mailboxes are blocked (Aug 6 2026). The userspace fix-freq/fix-metrics approach (or higorprado's mapping) is the practical fix rather than reading table 3 directly.
    ℹ️ NOTE
    Open question (Aug 13 2026): yrouel86 hypothesizes the "stuck at 1500 MHz" behavior may come from a GFX DPM feature bit missing in the SMU features mask — if so, setting the feature bit (e.g. via the SMU core-mask write primitive, now that arbitrary mask writes are possible) might make the card clock normally without the governor. Untested speculation as of Aug 2026 ("this if Claude isn't hallucinating it") — flagged for future research.
    ℹ️ NOTE
    Power profiles measured (filippor, Aug 10 2026): governor profile setting changes wall power substantially — profile 3→1 drops 82 W → 65 W → 59 W at 500 MHz GPU, and under Furmark (2100 MHz / 1030 mV) 350 W → 280 W → 210 W with frame rate 148 → 85 → 45 FPS. Board-level shutdown limit ~12 W over, PSU-level ~4 W over. Useful reference for choosing a power-vs-performance profile.

    Governor v0.4.0 (May 2026)

    Released to the bc250-collective organization. Key new feature: CPU-based control of memory clocks — lowers memory controller and Infinity Fabric clocks at idle for additional power savings (codyrainy, May 2026). See bc250-collective/cyan-skillfish-governor ↗.


    Manual Testing

    To test a specific frequency/voltage combination before adding it to the config:

    BASH
    # Stop the governor
    sudo systemctl stop cyan-skillfish-governor-smu
    
    # Manually set frequency (in MHz) and voltage (in mV)
    echo "vc 0 2100 1050" | sudo tee /sys/devices/pci0000:00/0000:00:08.1/0000:01:00.0/pp_od_clk_voltage
    
    # Commit changes
    echo "c" | sudo tee /sys/devices/pci0000:00/0000:00:08.1/0000:01:00.0/pp_od_clk_voltage
    
    # Run a game or benchmark (30+ minutes for stability test)
    
    # If stable, add to your config
    # If it crashes, increase voltage or lower frequency
    
    # Restart governor when done
    sudo systemctl start cyan-skillfish-governor-smu

    SMU Performance Profile Tuning (Power Savings)

    Changing the SMU performance profile index can reduce idle power:

    BASH
    # Profile 3 (default): ~75W idle
    # Profile 2: ~65W idle
    # Profile 1: ~60W idle (disputed — most users report 60-70W floor)
    # Profile 0: ~60W idle (gennro reports ~60W from 75W, saving ~15W)

    Note: perfprofileindex works on BIOS v3 but NOT on BIOS v5. This is an advanced tuning step — test stability carefully.

    Known Stable Frequency / Voltage Points

    FrequencyVoltageCooling NeededStability
    2000 MHz980-1000 mVStock air coolingSafe for all boards — recommended daily driver (vinnijs.dev, paul_lionking)
    2100 MHz1025-1050 mVGood air coolingMost boards
    2200 MHz1030-1050 mVGood air cooling requiredUpper limit for most boards at 40 CU before OCP
    2230 MHz1060 mVGood air cooling requiredTested by community
    2300 MHz1075 mVHigh-end air / AIODepends on silicon lottery; risks hard lock at 40 CU
    2400 MHz1125 mVLiquid cooling onlyOCP hard lock at 40 CU — 2400 MHz causes hard lock regardless of cooling at 40 CU; may work at 24 CU with adequate voltage (big_trov, codyrainy, cralant)

    40 CU voltage guidance (May 2026):

  • Start at 2000 MHz @ 980 mV and tune from there (vinnijs.dev).
  • Stay below ~1130 mV and 85°C for longevity (hojnikb).
  • Even 1800 MHz at 40 CU is faster than 24 CU at 2400 MHz, with much better thermals (essdee4336).
  • Silicon lottery varies: one user needed 2000@960, another needed 2000@1060 (paul_lionking).
  • At ~2200 MHz at 40 CU, a secondary power limit is tripped by high voltage — raising voltage above a certain point causes hard lock (big_trov).
  • (source: governor.md:577-583)


    40 CU Unlock Without Kernel Patch

    As of May 2026, 40 CU unlock no longer requires a kernel patch. Use bc250-cu-live-manager ↗ by vinnijs.dev — an interactive TUI that toggles CUs on the fly via UMR. No kernel modifications needed. Works on stock kernel across all distributions including Bazzite (auto-detects dri path).

    BASH
    git clone https://github.com/WinnieLV/bc250-cu-live-manager.git
    cd bc250-cu-live-manager
    # Follow README for your distro

    The tool persists across reboots via systemd (bc250-unlock.service). As of June 2026, the live-manager also supports disabling stock WGPs (Work Group Processors) — useful for isolating defective CUs during artifact troubleshooting. See 10 — Troubleshooting for binary search approach to finding bad CUs.

    For kernel parameter-based masking: amdgpu.disable_cu=X.Y.Z uses WGP-pair indexing. See 02 — BIOS & Firmware for full 40 CU documentation.

    CPU Overclocking (Advanced)

    Uses the bc250_smu_oc ↗ tool to raise CPU boost ceiling:

    BASH
    git clone https://github.com/bc250-collective/bc250_smu_oc.git
    cd bc250_smu_oc
    pip install --user .
    
    # Test frequency (auto-tunes voltage)
    sudo bc250-detect -f 3900 -v 1280 -k
    
    # Make permanent
    sudo bc250-detect -f 3900 -v 1280 -k -c /etc/bc250-overclock.conf
    sudo bc250-apply -a -i /etc/bc250-overclock.conf
    sudo systemctl enable bc250-smu-oc

    Verified Results (Fedora 43, Kernel 6.19.8)

    (source: governor.md:610-619)

    CPU FreqVoltage7zip ScoreTempvs Stock
    3500 MHz (stock)Auto26,06260CBaseline
    3600 MHz1150 mV26,51865C+1.7%
    3700 MHz1199 mV27,21268C+4.4%
    3800 MHz1250 mV27,91972C+7.1%
    3900 MHz1275 mV28,41075C+9.0%
    4000 MHz--Throttles77CNot stable

    Async Compute Queue Fix (GFX1013, Aug 2026)

    By DryhoppedIPA. Linux hard-disables the BC-250 GPU's dedicated compute queues (ACE, the hardware behind async compute) — enabling them on stock software corrupts frames. Root cause is three separate problems: (1) the chip powers on with ACE dispatches in threadgroup-dimension mode mis-executing PARTIAL_TG_EN (RADV's internal copy shaders hit this, corrupting their own copies — the exact defect was known since the GCN3 era and never added to GFX1013's workaround list), (2) stock kernels break the compute-queue lifecycle (repeated teardown wedges the queue), and (3) RADV misdetects the chip as RDNA2 instead of RDNA1-class.

    The fix is a 3-patch kernel side + 3-patch Mesa/RADV side:

  • Results (DryhoppedIPA): Cyberpunk 2077 1440p Medium native, 40-CU unlock, 3 runs each — 6-core 46.4 → 58.0 fps (+25%), 8-core 47.8 → 57.7 fps (+20.8%). Vulkan CTS dEQP-VK.synchronization2.* (81,617 tests): zero regressions; the 7,384 compute-queue cases that stock can't run all pass.
  • Repo: DryhoppedIPA/bc250-gfx1013-fix ↗. Option 1 is an install.sh (Fedora 43, built from source — kernel module + Mesa, first patched boot is one-shot, your stock entry stays default until sudo ./install.sh activate). Option 2 applies patches manually on any distro.
  • ⚠️ The bundled mesh/task shader + Vulkan 1.4 patches (0002/0003) are disabled by default — they can hang the GPU.
  • Ready-made: included in bc250-toolkit v1.1.0 ↗ (rpf16rj, menu 11, Aug 2026) — the simplest path for CachyOS/Arch users.

  • 32-bit games fallback fix (keroppl_wizard, Aug 8 2026): Originally cidhems reported "+10% extra on Expanse Telltale with kernel-mesa patch in Debian; not working on 32bits games" — keroppl_wizard fixed the 32-bit fallback after that: "alright i fixed it. 32bit fallback should just work now. also made it build in release mode" and "robocop rogue city picked up some fps now" (keroppl_wizard, Aug 8 2026).

    PS5GPU-BC250 (GUI Controller)

    A visual Qt-based GPU controller like MSI Afterburner for Windows:

  • Repository: https://github.com/ZEROAESQUERDA/PS5GPU-BC250
  • Features: Automatic + manual modes, temperature limits, 4 boost stages
  • Works on KDE and GNOME
  • Must disable any other governor before using (source: governor.md:117-119)

  • ACPI Fix (CPU Power States)

    The bc250-acpi-fix ↗ enables proper CPU idle and frequency scaling:

  • SSDT-CST: Enables C1/C2/C3 CPU sleep states (lower idle power)
  • SSDT-PST: Enables CPU frequency scaling (800 MHz - 3200 MHz) via standard Linux cpufreq governors (schedutil, powersave, etc.). Note: the repo README says "P-states doesn't work" but this is outdated per community testing (dantistnfs, Jan 2026) -- confirmed working as of kernel 6.19.8.
  • Confirmed working on kernel 6.19.8. Both tables loaded via initrd override. See the bc250-acpi-fix repo for full installation instructions. (source: governor.md:640-706)


    Verification

    Check Governor is Running

    BASH
    systemctl status cyan-skillfish-governor-smu
    # Should show: active (running)

    Check Frequency Scaling

    BASH
    cat /sys/class/drm/card1/device/pp_dpm_sclk
    
    # Example output:
    # 0: 1000Mhz
    # 1: 1500Mhz
    # 2: 2000Mhz *
    #
    # The * indicates active frequency

    Test dynamic scaling: check frequency at idle (~1000 MHz), start a game, check frequency under load (2000+ MHz).

    Monitoring Tools

    CoolerControl (GUI):

    BASH
    # Fedora
    sudo dnf copr enable terra/terra
    sudo dnf install coolercontrol
    
    # Bazzite
    ujust install-coolercontrol

    MangoHud (In-Game Overlay):

    BASH
    sudo dnf install mangohud  # Fedora
    sudo pacman -S mangohud    # Arch
    
    # Steam launch option: mangohud %command%

    (source: governor.md:294-322)


    Performance Comparison

    GovernorIdle FreqMax FreqCPU UsageResponse TimeKernel Patch?
    None1500 MHz (locked)1500 MHz0%N/ANo
    SMUVariable (~1000 MHz)2300+ MHz0.9-1.3%24 msNo
    TTVariable2175+ MHz0.9-1.3%24 msYes
    Oberon (legacy)1000 MHz2000 MHz0.4%100 msYes

    (source: governor.md:504-511)


    Dépannage & Résolution des Problèmes

    Governor Won't Start

    BASH
    # Check service status
    sudo systemctl status cyan-skillfish-governor-smu
    
    # Check logs
    sudo journalctl -u cyan-skillfish-governor-smu
    
    # Enable and restart
    sudo systemctl enable cyan-skillfish-governor-smu
    sudo systemctl restart cyan-skillfish-governor-smu

    GPU Stuck at 1500 MHz

    Check: governor is running, minimum voltage is not below 700 mV, config file exists.

    BASH
    # Check governor status
    systemctl status cyan-skillfish-governor-smu
    
    # Check minimum voltage
    cat /etc/cyan-skillfish-governor-smu/config.toml
    
    # Check kernel frequency range
    cat /sys/devices/pci0000:00/0000:00:08.1/0000:01:00.0/pp_od_clk_voltage

    Black Screen During GPU Reset

    If the governor causes crashes during GPU-intensive games, temporarily disable it:

    BASH
    sudo systemctl stop cyan-skillfish-governor-smu
    # Play the game, then re-enable
    sudo systemctl start cyan-skillfish-governor-smu

    Long-term fix: use stable voltage/frequency settings that don't cause GPU crashes. Increase voltage or reduce max frequency for problematic games.

    Governor High CPU Usage

    Normal CPU usage: 0.9-1.3%. If usage exceeds 2%, increase polling interval:

    TOML
    # /etc/cyan-skillfish-governor-smu/config.toml
    [timing]
    interval_ms = 100  # Increase from 50

    (source: governor.md:482-502)


    Community Resources

  • NexGen3D SteamMachine Scripts ↗ — automated Bazzite setup (governor + swap/zram + CPU mitigations)
  • redbeard1083 BC250 Toolkit ↗ — setup script for CachyOS
  • DeathStalker Grimoire ↗ — community step-by-step guide
  • PS5GPU-BC250 ↗ — GUI GPU controller
  • cyan-skillfish-governor-smu ↗ — SMU governor (moved to bc250-collective org, v0.4.0 adds CPU-based memory clock control)
  • filippor/cyan-skillfish-governor ↗ — Original repo (smu branch still maintained)
  • (source: governor.md:711-716)


    Source of truth: elektricM docs/system/governor.md, docs/system/power.md, docs/bios/overclocking.md

    Last updated: 2026-06-14

    ← Retour à l'index du Wiki Contribuer sur GitHub ↗