A DeckyLoader plugin for the ASRock BC-250 (AMD Ryzen Embedded V2000 / Cyan Skillfish) running Bazzite, SteamOS Linux, or CachyOS.
Community database of optimized launch options for the BC-250 — apply in one click from the Steam Quick Access Menu.
- Automatically detects the selected game in the Steam library
- Displays recommended settings for the BC-250 (Proton version, launch options, notes, hardware requirements)
- Config variants — when a game ships several tuned profiles (e.g. Stable vs Performance), pick one from a selector; your choice is remembered
- Apply button — in one action writes the launch options, selects the Proton/GE-Proton build, and applies any per-game GPU overrides (
~/.drircRADV options) - Auto-apply (opt-in) — automatically applies the full config when a known game is launched; turning it on also pre-configures every installed game from the database
- Live readout of active CU count via GPU SPI registers
- 4 profiles:
- 24 CU (stock BC-250)
- 32 CU
- 36 CU
- 40 CU (full — all WGPs active)
- Live application without reboot
- Save to boot toggle — installs a systemd service that restores the profile at each startup
- Requires
umr— automatic installation via a button (rpm-ostreeon Bazzite/SteamOS,pacmanon CachyOS/Arch) - Built-in disclaimer and stability recommendations
- VRAM (UMA) management — set the BIOS UMA Frame Buffer Size (Auto / 2G / 4G / 8G) right from the panel by patching the EFI NVRAM variable (
AmdSetup) — no more digging through the BIOS screen. Takes effect at the next reboot; the panel shows both the live VRAM and the value staged in the BIOS- Guard rails: BIOS version whitelist (P3.00), NVRAM layout check, automatic backup before every write (buttons are disabled on unknown BIOSes)
- Writing to the BIOS requires an up-to-date bc250-tweaks (provides the root helper
bc250-uma-helper— no sudo password prompt) - Auto (≈8 GB) is the recommended safe value — if you get graphical artifacts (e.g. green glitches) after a change, switch back to Auto
The BC-250 enumerates only 6 of the 8 Zen 2 cores on its Oberon die. The panel reads the core presence mask and, when the board is eligible, can wake the other two up.
- Status — cores/threads currently online, plus the raw mask
- Eligibility — only a mask of exactly
0x77is acted on. An asymmetric mask looks like genuine factory defect binning, and the SMU primitive writes0xFFregardless, so those boards are deliberately left alone - Unlock button — takes effect at the next reboot
- Restore at boot — an optional toggle that brings the 8 cores back after a power cut, at the cost of one extra reboot (see below)
- The SMU governor is stopped for the write and restarted right after, whatever
happens. Its unit name is auto-detected (
cyan-skillfish-governor-smu,oberon-governor, …) so this works on any distribution — and it is fine if no governor is installed at all
Warning
This is temporary by design. The mask survives warm reboots, but a full
power-off reverts it. Treat the button as a compatibility test: unlock,
reboot, then stress-test for a few hours and check dmesg for machine-check
errors before relying on those cores. They were disabled at the factory and
nobody knows exactly why.
The CU profile can simply be re-poked at boot, because compute units are written live. Cores cannot: the presence mask is only read when the CPU initialises, so the two extra cores appear at the next boot, never the current one.
The toggle deals with that honestly. At startup it checks the mask, and only if the cores are missing does it rewrite it and reboot the machine once. Since the mask survives warm reboots, that extra reboot happens only after a genuine power-off — a warm reboot finds 8 cores already up and does nothing.
Warning
A service that reboots the machine at boot is the most dangerous thing this
plugin can install, so it is capped: two attempts, then it gives up for
good and leaves the board at 6C/12T rather than looping. If you ever need to
disarm it without a working system, add bc250.nocoreunlock to the kernel
command line — the service then exits immediately.
The scripts it runs are copied to /usr/local/lib/bc250-core-unlock/, outside
the plugin directory, because Decky rewrites that directory on every update and
a system service must not depend on a path that can disappear between boots.
The toggle needs the bc250-core-boot sudoers rules from
bc250-tweaks; without them the
plugin cannot install the service and will say so.
Making it permanent without the extra reboot is a BIOS matter, not a software one. The community
firmware AMD-BC-250-UEFI-v2.2-Firmware-Menu-Script
(MIT) ships images suffixed -T that expose Unlock CPU Cores as a BIOS option
with an on/off toggle — permanent and reversible. They are published as the
release-0.1.3.zip asset, not in the repository's Firmware/ folder. Flashing
firmware can brick the board, its menu.nsh backs your current firmware up
first, and we ship no ROM ourselves — verify what you flash by checksum.
Known side effect of the software unlock: pp_dpm_sclk and hwmon freq1_input
start reporting nonsense GPU clocks (tens of MHz instead of hundreds). The GPU
and the SMU are fine — only amdgpu's derived value is wrong, so the panel's GPU
clock readout becomes unreliable until the next cold boot.
Credit: the unlock primitive and the script are the work of
rw-r-r-0644 (MIT, vendored
untouched in core_unlock/upstream/ with its licence).
When BC250 Control Center is
installed (its RPM through rpm-ostree install on Bazzite, then Prepare
dependencies once in the app), this tab is its Game Mode interface:
- GPU — governor profiles and validated safe points
- Compute Units — live 4×5 grid, saved boot table and boot service
- CPU — overclock through the Control Center's detector, manual scale and boot service
- Fans — manual speed per channel, or back to automatic
The Toolkit keeps no settings of its own here: it drives the same protected
helper as the Control Center, so a change made on the desktop shows up in Game
Mode and the other way round. The CU tab goes through it too. Without the
Control Center, the rest of the plugin works as before; on Bazzite the tab
offers an Install BC250 Control Center button (official v1.19.0 RPM,
SHA-256 checked, rpm-ostree install, then reboot), and elsewhere it links to
the project page. The button disappears once the Control Center is detected.
- Real-time CPU/GPU temperatures, fan speed and GPU/CPU clocks
- CPU cores — cores and threads currently online (
6C / 12T, green at8C / 16T) - Resources — enabled system RAM (what the OS keeps after the UMA carve-out), used RAM with usage percentage, and active CU count
- scx_lavd status, tuned profile, gamemode daemon status
- Hardware integrations — read-only: Wi-Fi adapter with its NetworkManager state and driver, whether the
hid_playstationdriver is loaded and how many controllers are connected, active display connectors, the current PipeWire output, and the HDMI-CEC bus when one exists. Nothing is enabled or changed: the panel only reports what the machine actually has, so a TV or controller feature is never offered on hardware that cannot do it. - Manual update button for bc250-tweaks
- Auto-apply toggle
- DB refresh from GitHub
- About — plugin version, author and GitHub link
The plugin automatically detects the Steam interface language:
English · Français · Deutsch · Español · Italiano · Português · Nederlands · Polski · Русский
- Enable Developer Mode in Decky's general settings
- Decky settings → Developer → Install plugin from URL:
https://github.com/Necrosiak/bc250-toolkit-decky/releases/latest/download/BC250-Toolkit.zip
Distributed directly from GitHub: the URL above always points to the latest release, and the plugin then keeps itself current with its built-in auto-update.
A note on automatic updates. Decky owns the plugin's top-level directory, so the built-in updater can rewrite existing files but cannot create new ones. A release that adds a file at the top level therefore has to be installed the normal way — Install plugin from URL, above — rather than through the automatic update. The release notes say so whenever that is the case.
Manual installation:
git clone https://github.com/Necrosiak/bc250-toolkit-decky.git \
~/homebrew/plugins/BC250-Toolkit
sudo systemctl restart plugin_loader- DeckyLoader installed
- Bazzite, SteamOS, or CachyOS on BC-250
The DB is in games_db.json and updates automatically from GitHub.
| Game | Proton | Notes |
|---|---|---|
| Crimson Desert | Proton Experimental (bleeding-edge) | GPU spoof 731F required |
| Cyberpunk 2077 | GE-Proton | RT disabled recommended |
| Elden Ring | GE-Proton | ~60 FPS playable |
| Red Dead Redemption 2 | GE-Proton | Vulkan mode required |
| Control | GE-Proton | RT works (RDNA 1.5) |
| Counter-Strike 2 | Proton Experimental | 100+ FPS |
| Rocket League | Proton Experimental | 120+ FPS |
| Devil May Cry 5 | GE-Proton | ~100 FPS High |
| Company of Heroes 3 | GE-Proton | VRAM split 4 GB min required |
| Detroit: Become Human | Proton Experimental | Stable 60 FPS |
| The Last of Us Part I | GE-Proton | 60 FPS Medium-High |
| Black Myth: Wukong | GE-Proton | Unmodified game files required |
| Code Vein 2 | GE-Proton | UE5 DX12 — needs UMA Frame Buffer = Auto (~8G) + per-game unified-heap fix (auto-applied, see preset below) |
| Stardew Valley | Proton Experimental | Perfect |
- Fortnite / Valorant — kernel-level EAC, Linux incompatible
- FF VII Rebirth — checks GPU ID, Cyan Skillfish not recognized, no fix available
🐛 Bugs & ideas: please open issues! Every report directly shapes the next
release. A few lines are enough — ideally with your OS (Bazzite, CachyOS…),
the plugin version, the QAM tab involved, and if possible the logs
(~/homebrew/logs/BC250-Toolkit/, journalctl -u plugin_loader). Feature
requests and "it works on X" reports are just as welcome.
The strength of this plugin is the BC-250 community.
Use the game submission form — fill in the details, click Submit, and a GitHub issue is created automatically. Once approved, the game is added to the database via PR.
- Fork this repo
- Edit
games_db.jsonfollowing the existing format - Open a Pull Request
Minimal entry:
"STEAM_APP_ID": {
"name": "Game Name",
"proton": "GE-Proton10-34",
"launch_options": "MANGOHUD=1 MANGOHUD_CONFIG=no_display gamemoderun %command%",
"notes": "BC-250 specific notes",
"tested_on": "BC-250"
}Optional advanced fields (the plugin applies them automatically on Apply):
compat_tool— Proton/GE-Proton build to select via Steam's compatibility mappingradv— per-game Mesa RADV overrides written to~/.drirc, matched on the executable name, e.g.{"match": "Game-Win64-Shipping.exe", "options": {"radv_enable_unified_heap_on_apu": false}}requires— hardware prerequisites surfaced to the user (uma_min_mb,gttsize)configs— array of alternative variants, each with its ownlabel,stability,compat_tool,launch_options,radv,requires; the user picks one in the Games tab
The Steam AppID is found in the URL of the game's Steam Store page.
Some Unreal Engine 5 games in DX12 crash at render init (D3D12Util.cpp:926 — Out of video memory) even with plenty of VRAM free, because RADV's unified heap on APU hides the dedicated VRAM from VKD3D (DedicatedVideoMemory ≈ 0). games_db.json ships a reusable ue5_dx12_oom profile under _meta.presets: disable the unified heap for that game's executable + set the BIOS UMA Frame Buffer to Auto (already yields ~8 GB on a 16 GB BC-250 — no need to force 4G) + use GE-Proton for the video codecs. To fix a new affected game, copy the preset into its entry and set radv.match to its executable. First validated on Code Vein 2.
pnpm install
pnpm run build
# Deploy locally
sudo cp dist/index.js ~/homebrew/plugins/BC250-Toolkit/dist/
sudo cp main.py updater.py bios_uma.py games_db.json package.json ~/homebrew/plugins/BC250-Toolkit/
sudo systemctl restart plugin_loader- bc250-tweaks — full system tweaks + auto-update
- AMD BC-250 Docs — community wiki
- bc250.info
- @AyeZeeBB — CachyOS/Arch support for the umr installation + GPU instance fallback (merged from their fork)
- @rw-r-r-0644 — found the 8-core unlock: the core presence mask at SMN
0x0115A870and the ungated SMU queue-3 message that can write it, plus the decision to act only on a0x77mask. Their script is vendored untouched incore_unlock/upstream/(MIT) and does all the writing - @Forbidden-Darkness — the modified P3.00 firmware that exposes the 8-core unlock as a BIOS option with an on/off toggle, and the flashing menu that backs your current firmware up first (AMD-BC-250-UEFI-v2.2-Firmware-Menu-Script, MIT)
- @movacx — BC250 Control Center (MIT): the protected helper the Tuning tab drives for GPU, CU, CPU and fan control; the Toolkit reuses its helper protocol and its GPU profile bounds
- Old Lamer — the videos that documented both unlock routes end to end and brought them to a wider audience, and the one that showed BC250 Control Center
We actively work to make this plugin run on every operating system documented for the BC-250 (community docs) — Bazzite, SteamOS, CachyOS/Arch, Fedora… — with automatic OS detection (package manager, GPU instance) so the right method is used on your distro.
AI (Claude by Anthropic and Codex by OpenAI) was used in the making of this project — for reverse engineering, development and documentation. It was not used for any art or creative writing. Everything released publicly is reviewed by a human, and the results are my responsibility. If that is not something you are comfortable with, now you know.
If this project is useful to you, you can support its ongoing development on Ko-fi.



