GNOME/Wayland environment for CachyOS on a hybrid-graphics laptop with a 4K OLED panel — plus a full hardware investigation log for a machine whose vendor firmware fights back.
If your NVIDIA laptop GPU is stuck around 16 W instead of its rated
35 W, games run at ~17 FPS with heavy input lag, nvidia-smi reports
SW Power Cap throttling, and your kernel log looks like this:
NVRM: GPU0 ... PlatformRequestHandler failed to get target temp from SBIOS
NVRM: GPU0 ... PlatformRequestHandler failed to get platform power mode from SBIOS
[NV_ERR_INVALID_DATA] (0x00000025)
nvidia-powerd: DC power limits table is not supported
nvidia-powerd: Client (presumably SBIOS) has requested to disable Dynamic Boost DC controller
ucsi_acpi USBC000:00: bogus connector number in CCI: 2
…then you have the same problem this repo documents, and there is a working
workaround: debug/gpu/ — start with
OPERATIONS.md for the runbook, or
SOLUTION.md for the mechanism.
Short version: the platform↔GPU power negotiation channel is broken because
the SBIOS returns garbage, so the driver silently caps itself. The fix
injects a runtime SSDT exposing an \NVST method and drives the NVPCF
handshake manually (NVST 3 → wait → NVST 1) under GPU load, re-armed on
every login by a systemd user unit. Affected hardware here is a Xiaomi
Book Pro 16 2022 with an RTX 2050, BIOS XMAAD6B0P1717 (2022-12-13),
but the mechanism should apply to any laptop whose SBIOS breaks NVPCF.
The same broken ACPI also costs this machine its battery charge-limit
interface — see debug/battery/.
- Device: Xiaomi Book Pro 16 2022
- CPU: Intel Core i7-1260P (12th Gen, Alder Lake-P)
- GPU: NVIDIA RTX 2050 Mobile + Intel Iris Xe (hybrid,
nvidia-prime) - Display: 4K OLED
- Storage: Kingston FURY Renegade 2 TB, btrfs + zstd
- Kernel:
linux-cachyos7.1 (withlinux-cachyos-ltsas fallback)
- DE: GNOME Shell 50.3 on Wayland
- Shell: Fish 🐟 + Starship
- Terminal: Ghostty
- AUR Helper: Paru
- Power Management: Gamemode + custom GPU clock locking
- VPN: Mullvad (with split tunneling for Steam and Spotify)
fish/— shell config,fnm/pnpmpaths,fastfetchgreeting.ghostty/,fontconfig/,gtk-3.0/,btop/— terminal and UI styling.fastfetch/— fetch config and the banner image above.scripts/— utility scripts.gamemode-tweaks.shlocks GPU clocks during games; it ischattr +ilocked because sudoers points at it directly.systemd/user/—nvpcf-unlock.service, the boot-time workaround that keeps the GPU from being throttled. Without it the machine loses ~70% of its GPU performance.autostart/,monitors.xml,user-dirs.dirs,xdg-terminals.list— session bits that are tedious to recreate by hand.gnome-settings.dconf— full dconf dump. This is where the actual GNOME look and behaviour lives; the dotfiles alone won't restore it.pkglist.txt/pkglist-aur.txt— explicitly installed packages.debug/— see below.
Xiaomi shipped broken ACPI tables and never updated the BIOS
(XMAAD6B0P1717, dated 2022-12-13). Several subsystems misbehave as a
result, and each one has its own investigation folder with documentation,
tooling and logs. Start at debug/README.md.
| Branch | Problem | Status |
|---|---|---|
debug/gpu/ |
RTX 2050 throttled to 16 W instead of 35 W | solved via a runtime SSDT workaround |
debug/battery/ |
39% wear after ~2.5 years, no charge limit available | open |
debug/nvme/ |
130k power cycles reported at 6k power-on hours | closed — counter is fine |
Each branch keeps its own CSV log and a *check.sh tool. Negative results
and dead ends are kept on purpose — see the conventions in
debug/README.md.
-
Clone into
~/.config: Back up your existing.configfirst.git clone git@github.com:afterallspace/gnome.git ~/.config -
Restore packages:
sudo pacman -S --needed - < <(cut -d' ' -f1 ~/.config/pkglist.txt)
AUR packages are listed separately in
pkglist-aur.txtand needparu. -
Restore GNOME settings:
dconf load / < ~/.config/gnome-settings.dconf
-
Re-arm the GPU workaround — the service alone is not enough, it needs a root helper and a sudoers rule. Full procedure in
debug/gpu/OPERATIONS.md:systemctl --user enable --now nvpcf-unlock.service
Every one of these cost hours. Full list in
debug/CLAUDE.md.
modprobe.ddoes not work for modules loaded from initramfs (nvidia,nvme_core) — use the kernel command line viaLINUX_OPTIONSin/etc/sdboot-manage.conf, thensudo sdboot-manage gen.dmesgis restricted (dmesg_restrict=1) — usejournalctl -k.nvidia-smi -plis blocked in the vBIOS.- Recursive
grep -rover/syswill peg every core for a very long time.
