---
title: "FreeBSD 15.1 on a ThinkPad T480: 3 W idle, hardware video in both browsers, no drama"
description: "A status report that reads like a checklist: 5 GHz Wi-Fi verified, VA-API verified, Bluetooth audio routed the long way"
author: "Luis Goa"
published: 2026-10-14T22:00:00Z
modified: 2026-10-15T16:23:20Z
url: https://rews.cc/a/freebsd-15-1-on-a-thinkpad-t480-3-w-idle-hardware-video-in-b-66470d
language: en
tags: ["freebsd", "linux", "hardware", "open-source", "security", "tech"]
publisher: "Rews (https://rews.cc)"
---

# FreeBSD 15.1 on a ThinkPad T480: 3 W idle, hardware video in both browsers, no drama

*A status report that reads like a checklist: 5 GHz Wi-Fi verified, VA-API verified, Bluetooth audio routed the long way*

By Luis Goa · October 14, 2026 · https://rews.cc/a/freebsd-15-1-on-a-thinkpad-t480-3-w-idle-hardware-video-in-b-66470d

## In brief

- FreeBSD 15.1-RELEASE-p4 on a ThinkPad T480 with Xfce 4.20 idles at about 3 W in powermon
- Intel UHD 620 drives the desktop via i915kms and drm-latest-kmod; the MX150 sits unused on the PCI bus
- Intel AX210 associates on channel 36 at 5180 MHz, VHT/80, 802.11ac — a working 5 GHz link, nothing more
- libva-intel-media-driver exposes H.264, HEVC and VP9 via VA-API, but not AV1
- Firefox needed VA-API enabled, AV1 disabled and hardware decoding plus WebRender forced

The headline number in [Christian Hofstede-Kuhn’s account](https://blog.hofstede.it/the-t480-is-back-my-freebsd-151-laptop-from-boot-to-browser/) is an idle CPU-package reading of about 3 W in powermon — on an eight-year-old, four-core ThinkPad running FreeBSD 15.1-RELEASE-p4 with Xfce 4.20. His framing is that the machine has become uninteresting: Xfce session, 5 GHz Wi-Fi, video in Firefox or Chromium, a Zoom call, Bluetooth audio, a Git signature from an OpenPGP card, “crazily stable”. Boring is the goal of this kind of setup, and the post’s value is in the specific places where boring had to be earned.

## Graphics and boot policy

The desktop runs on the Intel UHD 620 via i915kms with the drm-latest-kmod package and matching Kaby Lake firmware; the discrete MX150 sits on the PCI bus unused. The rc.conf line loads i915kms, coretemp, cpuctl, cuse and nullfs, and enables dbus, sddm and seatd (a Wayland session is kept available; the Xfce session itself is X11 with the modesetting driver, glamor, DRI 3). His loader.conf retains compat.linuxkpi.i915\_disable\_power\_well=0, which he found necessary for reliable display and suspend on this laptop, plus the fairly aggressive hw.pci.do\_power\_nodriver=3 and hw.pci.do\_power\_suspend=1 for unclaimed devices. The warning he attaches is the right one: these are his machine’s settings, not T480 defaults — change one at a time and keep a boot environment.

![An open laptop with a blank screen has exposed mechanical components in its base, including two large wheels, shafts, wiring, and a motor.](https://rews.cc/img/b38d3ab93ee993f60114abe4fab472e418de5987.webp)

## Wi-Fi: trust the negotiated line, not the box

The card is an Intel AX210, firmware from wifi-firmware-iwlwifi-kmod-ax210, configured for regdomain ETSI, country DE. When he checked, ifconfig showed an association on channel 36 at 5180 MHz, VHT/80, 802.11ac. That is a working 5 GHz connection — and, he stresses, nothing more. A card marketed as Wi-Fi 6E does not imply 6 GHz or even Wi-Fi 6 operation; the negotiated channel and media line is the measurement, the product name is not. He has also declined speculative iwlwifi power-save knobs, preferring to check the link, route, CPU idle state and processes first.

## Video: supported is not used

The libva-intel-media-driver exposes H.264, HEVC and VP9 decoding through VA-API on this GPU — not AV1. vainfo against /dev/dri/renderD128 tells you what the driver can decode; it says nothing about what a browser did decode. Chromium demonstrated the gap: chrome://gpu looked healthy while an H.264 test clip still ran through FFmpegVideoDecoder in software. The fix was launching with --render-node-override=/dev/dri/renderD128 (placed in a per-user desktop-file override), after a full quit and relaunch; chrome://media-internals then reported VaapiVideoDecoder and kIsPlatformVideoDecoder: true for a controlled 720p H.264 clip. Sending a URL to an already-running process would have proven nothing.

![Filmstrips wind through hand-cranked reels and a large computer chip, with miniature figures beside a lever and the chip.](https://rews.cc/img/985f46082c3972df584678f53cf987760ac1316f.webp)

Firefox needed its own preferences: VA-API enabled, AV1 disabled, hardware decoding and WebRender forced. The proof again came from a disposable profile playing the same local clip while the decoder log reported successful VA-API initialization and decoded frames. The practical caveat: a site that serves AV1 forces software decoding on this GPU regardless of browser settings. The codec, not the browser, decides the outcome.

## Bluetooth audio, the long way

Getting a Creative MUVO 2c speaker into Xfce’s volume control takes a chain: Bluetooth controller → paired speaker → FreeBSD Bluetooth audio → virtual\_oss on /dev/dsp9 (48,000 Hz, 16-bit, 2-channel, 16 ms buffer) → a PulseAudio OSS sink → applications. virtual\_oss is in the base system on 15.1; a package adds only the Bluetooth backend, and nothing starts at boot. His connect script loads module-oss for dsp9, stacks a module-remap-sink on top so the speaker gets its own volume (set to 70 percent) that Xfce’s slider actually controls, and makes that the default; the stop path returns the default to dsp0. Streams already playing on the laptop speakers stay put — a running video needs a restart or a manual move in pavucontrol.

The rest of the setup — ZFS, pf, a private VM network, chezmoi-managed dotfiles, the Rust OpenPGP card stack living under ~/.cargo/bin for SSH and Git, coding agents — is listed in his notes for other T480 owners, with one recurring instruction that applies beyond this laptop: verify the decoder’s log, the negotiated channel, the idle watts. The claim “it works” is cheap; his version comes with the command that checks it.
