Bartosz Witkowski - Blog.
Home About me

I was recently forced to migrate to a new laptop. After hunting down possible models that would suit me (large amounts of RAM, largish screen, x86_64, non-problematic hardware) I narrowed down the alternatives to Dell Precision 7770, Lenovo ThinkPad P17 Gen 2 (second gen of a laptop I ran previously) and Framework 16.

Since ThinkPad’s hardware hasn’t been updated for some time, and a fully upgraded Dell would set me back almost twice as much money as the Framework the choice was pretty obvious.

Framework 16 was going to be my new system.

And to make a long story short: even though debian isn’t officially supported - trixie does run on the Framework 16, but requires a newer kernel and firmware.

First Contact

The specs:

The laptop came in an unassuming brown box, and being the DIY edition it had to be assembled before usage.

The installation was really easy.

To be honest, I don’t think the DIY edition is a cutting-cost measure - it’s part product demo (i.e showcasing the concept of repairable/open hardware) and part acknowledging the reality that people buying the Framework laptop want to open it up and look inside.

After 20-30 minutes of unscrewing, connecting clips, screwing back again, inserting the screen frame, keyboard modules and expansion cards I had a fully assembled laptop.

The only problematic part was reattaching a fallen thermal pad - the damn thing wouldn’t stay put!

Making It Work

The laptop greeted me with a pretty nifty BIOS screen. I downloaded debian (trixie) and installed the basics. Then started making it usable.

Debian isn’t a system that’s officially supported by Framework.

Debian, in general, doesn’t do “new” quite well and Framework is fresh off the press. I run debian for my main system mostly out of habit, but also because of its boring predictability.

The following will be a series of notes (mostly left to myself) of what was done to get it working.

Firmware

$ sudo apt install fwupd sensors
$ fwupdmgr refresh
$ fwupdmgr update

Seemed to address most of my problems and present reasonable temperatures (sans gpu).

Amd Graphics

At this stage I tried installing nvidia graphics but failed miserably. Running X without nvidia, also didn’t work.

$ sudo apt install firmware-amd-graphics firmware-linux firmware-linux-nonfree

made sure that AMD modules were available.

Unfortunately, X still didn’t work - X logs said startx tried and failed to use the framebuffer.

Only after setting up a /etc/X11/xorg.conf.d/10-amdgpu.conf file and explicitly passing the BusId

Section "Device"
	Identifier "AMD"
	Driver "amdgpu"
	BusId "Pci:194:0:0"
EndSection

did X start.

Graphic Glitches

At this point I had working wifi, sound (see below), sensors, some minor font problems and a seemingly working X windows which loaded up awesomewm from my old configuration.

Unfortunately, I had intermittent display glitches - most often in xterm/urxvt but sometimes even in awesomewm panels or browsers. I initially attributed it to fonts but even after fixing those it didn’t go away.

What I tried:

Frustratingly, some combination of those parameters did seem to help to alleviate the frequency of the glitches but it didn’t eliminate them. After disabling dri 3 I had a few days of glitch free experience - and then it came back.

What finally worked was new kernel and new firmware see suspending. In the so-called mean time I tried tackling other issues.

Sound

Seems to work out of the box, the only thing I needed to do was change the output profile in pavucontrol.

Nvidia Graphics

At the moment of writing neither debian stable, testing nor unstable have drivers that support the Geforce 5070 RTX.

It’s been years since I had to use the binary blob from - nvidia but apart from the occasional re-installation I remember it being mostly unproblematic (that was also a big reason why I went with a nvidia card in the first place).

After fetching and running

$ sudo apt install build-essential linux-headers-$(uname -r) dkms  pkg-config

I ran NVIDIA-Linux-x86_64-580.119.02.run which was the latest driver on nvidia’s website.

I remembered that letting the nvidia installer create X configuration files was a mistake on modern systems. Other gotchas:

The above finally made nvidia-smi report cards and running2 steam via

$ __NV_PRIME_RENDER_OFFLOAD=1 \
__GLX_VENDOR_LIBRARY_NAME=nvidia \
steam

showed that acceleration, indeed, worked.

Suspending

The final concern was the non working suspending (or rather: non working unsuspending)

After adding these options:

options mt7925e disable_aspm=1

to modprobe and

amdgpu.runpm=0 amdgpu.vpe=0

to grub defaults and disabling bluetooth suspend by adding

[Unit]
Description=Disable Bluetooth before suspend
Before=sleep.target

[Service]
Type=oneshot
ExecStart=/usr/bin/bluetoothctl power off

[Install]
WantedBy=sleep.target

to /etc/systemd/system/bt-disable-suspend.service

I still had a non-suspending system - albeit the logs were quiet about those three particular issues.

After scrounging the net - I read through this article and decided to try running a new kernel. After reading what Ubuntu3 was on I decided to go with 6.17 (the kernel version of Ubuntu 25.10) and I sincerely hoped all of the needed patches from Ubuntu existed upstream.

Trixie doesn’t ship 6.17 yet so I needed to build it manually.

It’s been a while since I needed to build a kernel, fortunately, not a lot changed since the last time I built one

$ sudo apt update
$ sudo apt install \
    build-essential bc bison flex libelf-dev \
    dwarves pahole \
    fakeroot rsync git \
    cpio python3 kmod \
    libncurses-dev pkg-config \
    debhelper debhelper-compat libdw-dev 
$ git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
$ cd linux-stable
$ git checkout v6.17.12
$ cp -v /boot/config-$(uname -r) .config
$ scripts/config --set-str LOCALVERSION "-fw16-6.17"
$ make olddefconfig
# I had some misc warnings 
$ scripts/config --enable FB_BACKLIGHT
$ scripts/config --module ANDROID_BINDER_IPC || true
$ make -j20 bindeb-pkg

After some time I had a ready kernel.

sudo dpkg -i linux-headers-6.17*.deb linux-image-6.17*.deb
sudo update-initramfs -c -k '6.17.12-fw16-6.17'

After making sure I could boot to both kernel versions I ran

sudo update-grub
sudo reboot

After the reboot, I tested suspending with:

sudo rtcwake -m mem -s 20

and was happy to see it unsuspend.

My happiness lasted right until the following morning when the laptop was totally unresponsive after waking up and the only message I got was

amdgpu: VPE queue reset failed

Since this looked like a firmware issue I took a look at what version of firmware-amd-graphics sid has and it was 20251111-1 compared to 20250410-2 installed by trixie.

So after pinning4 firmware packages to sid I ran

$ sudo apt update
$ sudo apt install -t sid firmware-amd-graphics firmware-mediatek
$ sudo update-initramfs -u
$ sudo reboot

And this time - it resumed even after a longer suspend!

At this point, I had a working suspend, and as a bonus the earlier display glitches completely disappeared.

Framework Review

Overall, am I happy with the laptop?

It’s not a perfect machine but overall, I’m pretty happy.

Footnotes

  1. sudo tee /etc/modprobe.d/blacklist-nouveau.conf >/dev/null <<'eof'
    blacklist nouveau
    options nouveau modeset=0
    eof 
    

  2. PRIME packages need to be installed for this to work: libglvnd0 libglvnd-dev libegl1 libegl1-mesa-dev libglvnd0:i386 libegl1:i386 

  3. which unlike debian is officially supported 

  4. Put

    deb http://deb.debian.org/debian sid non-free-firmware
    

    inside /etc/apt/sources.list.d/sid-firmware.list then

    Package: *
    Pin: release a=sid
    Pin-Priority: 100
    

    inside /etc/apt/preferences.d/99-firmware-sid