Omarchy on the 2015 MacBook Pro
As of 2026-10-14. Omarchy-specific setup only; the hardware findings, kernel parameter reasons and sleep results are in hardware.md.
Install: Omarchy 4.0.4, linux-omarchy 7.2.5, Limine 12.8 booting a UKI, LUKS + btrfs (subvol=@), Hyprland on Wayland, Mesa 26.2.
Current setup
| Setting | Value | Where |
|---|---|---|
| GPU driver | radeon.si_support=0 amdgpu.si_support=1 |
/etc/default/limine |
| amdgpu video blocks off | amdgpu.ip_block_mask=0x7f |
/etc/default/limine |
| amdgpu deep-sleep fix | patched amdgpu.ko (reset at load) |
/usr/lib/modules/7.2.5-3-omarchy/updates/; built for that kernel only, see Patched amdgpu module |
| Kernel-update guard | pacman hook + boot check + notification | kernel/amdgpu-module/guard/ |
| IOMMU off, NVMe APST off | intel_iommu=off nvme_core.default_ps_max_latency_us=0 |
/etc/limine-entry-tool.d/hardware-quirks.conf |
| Sleep mode | mem_sleep_default=deep |
/etc/limine-entry-tool.d/hardware-quirks.conf |
| Lid close | suspend-then-hibernate, hibernate after 2 h | /etc/systemd/logind.conf.d/30-lid-suspend-then-hibernate.conf, /etc/systemd/sleep.conf.d/suspend-then-hibernate.conf |
| Bluetooth fix | btusb option + udev rule + bt-check.service |
bluetooth/bt-fix.sh |
| Wi-Fi sleep hook | unloads brcmfmac before deep sleep and hibernate | /usr/lib/systemd/system-sleep/brcmfmac, from wifi/brcmfmac-sleep |
| Fans | no daemon (SMC automatic) | — |
Decision (2026-10-14): stay on amdgpu for Vulkan and a working Chromium. With the patched module, deep sleep works at about 0.46 W (about 9 days on a full battery) instead of s2idle at about 22 W. A kernel update brings back the stock module, which hangs on resume from deep sleep. The guard (see Patched amdgpu module) then falls back to s2idle for that boot and shows a notification; rebuild the module and reboot.
Boot options
Kernel parameters go in /etc/default/limine or a drop-in under /etc/limine-entry-tool.d/. Run sudo limine-update and reboot. Don’t edit the files owned by the omarchy-settings package, because updates overwrite them.
| File | Owner | Contents |
|---|---|---|
/etc/default/limine |
you | ESP_PATH, base cmdline (LUKS, btrfs, zswap.enabled=0), GPU driver + ip_block_mask |
limine-entry-tool.d/hardware-quirks.conf |
you | Mac workarounds + mem_sleep_default |
limine-entry-tool.d/resume.conf |
Omarchy install | resume=/dev/mapper/root resume_offset=1941580 |
limine-entry-tool.d/omarchy-defaults.conf |
omarchy-settings | quiet splash …, initramfs_async=0 (works around a kernel 7.1 race that breaks the themed LUKS prompt), boot order, snapshot entries |
limine-entry-tool.d/omarchy-uki.conf |
omarchy-settings | ENABLE_UKI=yes (overrides ENABLE_UKI=no in /etc/limine-entry-tool.conf) |
sudo limine-update # rebuilds /boot/EFI/Linux/omarchy_linux-omarchy.efi + /boot/limine.conf
sudo grep -c 'mem_sleep_default' /boot/limine.conf # /boot is root-only
cat /proc/cmdline # after reboot
limine-updateprintsPossibly missing firmware for module: 'xhci_pci_renesas'and'qat_6xxx'. Both are harmless; that hardware isn’t in this Mac.- Only the main entry gets new parameters. Snapshot boot entries keep the command line they were created with.
- The early-GPU-driver requirement (see hardware.md) is already covered by Omarchy’s mkinitcpio
kmshook; noMODULES=change is needed.
Sleep, lid and power
- Lid:
30-lid-suspend-then-hibernate.conf(HandleLidSwitch=suspend-then-hibernate), withHibernateDelaySec=2hin/etc/systemd/sleep.conf.d/suspend-then-hibernate.conf. Closing the lid goes into deep sleep (S3) and hibernates after 2 h. Idle: Omarchy defaults (no automatic suspend). - logind drop-ins:
10-ignore-power-button.conf(HandlePowerKey=ignore)30-lid-suspend-then-hibernate.conf(see Lid above)20-inhibit-delay.conf(InhibitDelayMaxSec=15, which givesomarchy-sleep-lock.servicetime to lock before sleep)
- Hibernate works (
systemctl hibernate) with the patched module and the Wi-Fi sleep hook. Omarchy’s installer set it up:/swap/swapfile(15.5 GB, plus zram at higher priority)resume.conf- the mkinitcpio drop-in
omarchy_resume.conf, which adds theresumehook afterencrypt
- Module options from Omarchy’s installer:
/etc/modprobe.d/brcmfmac.conf(feature_disable=0x82000, frominstall/hardware/apple/fix-brcmfmac-supplicant.sh) andhid_apple.conf(fnmode=2, frominstall/hardware/fix-fkeys.sh). /etc/modprobe.d/omarchy-usb-autosuspend.conf(owned by omarchy-settings) (usbcore autosuspend=-1) is ignored, because usbcore is built in. The live value is2.- thermald is enabled.
omarchy-system-sleep-monitorlogs a harmlessdbus-monitor ... AccessDenied ... Falling back to eavesdroppingon every boot.
GPU / apps
- Chromium: on amdgpu it needs no flags.
~/.config/chromium-flags.confholds only Omarchy’s defaults (Wayland, gnome-libsecret, touchpad overscroll). When testing flags, use a throwaway--user-data-dir, or the test instance can take over your real profile. - Hyprland: no
AQ_DRM_DEVICESis set. If you ever pin a GPU, use/dev/dri/by-path/. - One-off amdgpu crash: an early boot crashed with no suspend involved (
ring gfx timeoutfrom Hyprland,GPU Recovery Failed: -110). It hasn’t happened since.
Patched amdgpu module
The patch and the reason for it are in hardware.md. Build only amdgpu.ko for the installed linux-omarchy and install it as an override. The build needs the same source as the installed kernel: the kernel.org release plus linux-omarchy’s own patches.
- Install the headers:
sudo pacman -S linux-omarchy-headers. - Download the kernel.org tarball for the version in
pacman -Q linux-omarchy(for examplelinux-7.2.5.tar.xz), and unpack it. - Download the linux-omarchy patches from omacom-io/omarchy-pkgs (
pkgbuilds/linux-omarchy/), from the commit that matches the installed package release. - Apply them in their numbered order:
for p in /path/to/patches/*.patch; do patch -Np1 < "$p"; done. - Apply the fix:
patch -p1 < kernel/amdgpu-si-reset-on-init.patch. - Build the module:
bash kernel/amdgpu-module/build.sh /path/to/linux-7.2.5. This takes about 7 minutes. - Install it:
sudo bash kernel/amdgpu-module/install.sh. This also rebuilds the initramfs and UKI. - Reboot, then check the log:
journalctl -k -b | grep -E 'PCI CONFIG reset|GPU posting|VRAM:'must show VRAM at0x000000F400000000.
The module is unsigned, so loading it taints the kernel. That’s harmless here, because the kernel doesn’t enforce module signatures.
Kernel updates: the module only matches the kernel it was built for.
The guard in kernel/amdgpu-module/guard/ handles the switch (sudo bash kernel/amdgpu-module/guard/install.sh):
- pacman hook: after linux-omarchy is installed or updated, it prints a warning for any kernel without the patched module.
- Boot check (
amdgpu-override-check.service): if the loaded amdgpu isn’t the patched one, it switches that boot to s2idle and plain suspend on lid close, and masks the hibernate targets, because the stock module hangs on resume from deep sleep and hibernate is only tested with the patch. Everything goes under/run, so it undoes itself on the next boot. A user unit then shows a critical desktop notification. Check withjournalctl -b -u amdgpu-override-check.
So a kernel update is:
- Update and reboot. You get the notification, and the system runs on s2idle.
- Rebuild and install the module for the new version (steps 2–8 above), then reboot. Deep sleep and suspend-then-hibernate are back.
To test the fallback without an update: sudo amdgpu-override-check --force, then systemctl --user start amdgpu-override-notify.service. A reboot undoes it.
Without the guard, switch to s2idle by hand before updating (sudo sed -i 's/mem_sleep_default=deep/mem_sleep_default=s2idle/' /etc/limine-entry-tool.d/hardware-quirks.conf && sudo limine-update), keep the lid closed for less than HibernateDelaySec, and switch back after rebuilding.
Once the fix is in linux-omarchy (accepted upstream on 2026-10-15; see hardware.md), no new kernel series is needed. A normal update brings it in:
- Update and reboot. The guard falls back to s2idle and shows its notification, as for any kernel update.
- Check that the stock module has the fix:
journalctl -k -b | grep -E 'PCI CONFIG reset|GPU posting now|VRAM: 'must show the reset, the post andVRAM: 2048M 0x000000F400000000. If VRAM is at0x0000000000000000, the fix isn’t in this kernel yet: rebuild the patched module instead. - Remove the patched module:
sudo bash kernel/amdgpu-module/install.sh remove. - Remove the guard:
sudo bash kernel/amdgpu-module/guard/install.sh remove. - Reboot.
mem_sleep_default=deepis still in the boot options, and the guard’s fallback was only under/run. - Test with
sudo rtcwake -m mem -s 20a few times, then lid close and suspend-then-hibernate.
Keep amdgpu.ip_block_mask=0x7f and the Wi-Fi sleep hook: they fix other problems.
Fallback: radeon + deep sleep
sudo sed -i 's/radeon.si_support=0 amdgpu.si_support=1 amdgpu.ip_block_mask=0x7f/radeon.si_support=1 amdgpu.si_support=0/' /etc/default/limine
sudo sed -i '/mem_sleep_default=s2idle/d' /etc/limine-entry-tool.d/hardware-quirks.conf
sudo limine-update # then reboot and test: sudo rtcwake -m mem -s 20
You lose Vulkan, and the Chromium artifacts seen on radeon here are unexplained. Waking takes about 20 s unless you build linux-omarchy with the MTRR patch (not done; kernel/build-kernel-ubuntu.sh is Ubuntu-only, but kernel/mtrr-resume.patch can go into a linux-omarchy PKGBUILD).
Open items
- Measure s2idle drain: ~22 W (2026-10-14)
- Run
bluetooth/bt-fix.sh, then watchjournalctl -u bt-check -bover the next few boots - Wi-Fi sleep hook installed (2026-10-14); if Wi-Fi still dies after deep sleep, run
sudo bash wifi/wifi-reload.sh - FaceTime HD camera: AUR
facetimehd-dkms+facetimehd-firmware, blacklistbdc_pci - amdgpu patch upstream: applied by the maintainer on 2026-10-15, not in a public branch as of 2026-10-18. Watch the amd-gfx thread and agd5f’s
amd-staging-drm-next. Once it’s in linux-omarchy, follow the removal steps in Patched amdgpu module - Test hibernate with the amdgpu patch: works once brcmfmac is unloaded first (2026-10-14)
- Deep-sleep cycle through systemd with the Wi-Fi hook: resumes, Wi-Fi back in ~4.5 s (2026-10-14)
- suspend-then-hibernate on lid close: works with the fixed Wi-Fi hook (2026-10-15)
- Optional: radeon + deep + MTRR-patched kernel
- Optional: test hibernate on radeon
- Optional, risky: boot-time Intel-only GPU mode (gpu-switch)