The perfect Linux laptop
Published on: 2023-01-09
Ever since I moved my main computing environment over to a desktop at the start of the pandemic (which by now is already like 70 years ago, time flies man), I have regretted not being mobile anymore - even if that means sitting on the sofa instead of somewhere outside.
So, a few weeks ago, I started looking for a laptop. I wanted something small-ish, max 14 inch. It shall have a 1080p display, since I can't stand the waste of
energy and problems with nonstandard DPI with these high resolution but small displays. I wanted it to have at least DDR4 RAM, since I had some laying around. Also,
I personally find Thunderbolt support really important, for those situations where I do want to connect it to my docking station.
This also implies that I want USB-C power delivery, which makes the docking situation less painful, and also makes it possible to only carry around a small
charger which can at the same time charge my phone. Oh, and I didn't want an Nvidia GPU,
since they don't offer open source drivers and Sway doesn't support anything proprietary, which is a good thing. So, ideally Intel, because I never
had any problems with i915
.
So, with all these criterias set, long story short I settled on a Dell Latitude 7390. The decision was actually easy - I just searched through used laptops on Ebay, while ignoring the Thinkpad series (I cannot stand their swapping of fn and ctrl [I know you can remap it, but still]). Also, HP Elitebooks where way more expensive than Dell Latitudes. I paid 271 EUR for the following configuration:
H/W path Device Class Description
==========================================================
system Latitude 7390 (081B)
/0 bus 09386V
/0/0 memory 64KiB BIOS
/0/4d memory 16GiB System Memory
/0/4d/0 memory 16GiB SODIMM DDR4 Synchronous Unbuffered (Unregistered) 2400 MHz (0,4 ns)
/0/4d/1 memory [empty]
/0/51 memory 256KiB L1 cache
/0/52 memory 1MiB L2 cache
/0/53 memory 6MiB L3 cache
/0/54 processor Intel(R) Core(TM) i5-8350U CPU @ 1.70GHz
/0/100 bridge Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers
/0/100/2 display UHD Graphics 620
/0/100/4 generic Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Thermal Subsystem
/0/100/14 bus Sunrise Point-LP USB 3.0 xHCI Controller
/0/100/14/0 usb1 bus xHCI Host Controller
/0/100/14/0/4 communication N5321 gw
/0/100/14/0/5 multimedia Integrated_Webcam_HD
/0/100/14/0/7 communication Bluetooth wireless interface
/0/100/14/0/8 input SiW HID Touch Controller
/0/100/14/1 usb2 bus xHCI Host Controller
/0/100/14.2 generic Sunrise Point-LP Thermal subsystem
/0/100/15 generic Sunrise Point-LP Serial IO I2C Controller #0
/0/100/15.1 generic Sunrise Point-LP Serial IO I2C Controller #1
/0/100/15.2 generic Sunrise Point-LP Serial IO I2C Controller #2
/0/100/15.3 generic Sunrise Point-LP Serial IO I2C Controller #3
/0/100/16 communication Sunrise Point-LP CSME HECI #1
/0/100/1c bridge Sunrise Point-LP PCI Express Root Port #1
/0/100/1c/0 generic RTS525A PCI Express Card Reader
/0/100/1c.2 bridge Sunrise Point-LP PCI Express Root Port #3
/0/100/1c.2/0 wlp2s0 network Wireless 8265 / 8275
/0/100/1c.4 bridge Sunrise Point-LP PCI Express Root Port #5
/0/100/1d bridge Sunrise Point-LP PCI Express Root Port #9
/0/100/1d/0 storage A2000 NVMe SSD
/0/100/1f bridge Sunrise Point LPC Controller/eSPI Controller
/0/100/1f.2 memory Memory controller
/0/100/1f.3 multimedia Sunrise Point-LP HD Audio
/0/100/1f.4 bus Sunrise Point-LP SMBus
/0/100/1f.6 enp0s31f6 network Ethernet Connection (4) I219-LM
/0/1 system PnP device PNP0c02
/0/2 system PnP device PNP0b00
/0/3 generic PnP device INT3f0d
/0/4 input PnP device PNP0303
/0/5 system PnP device PNP0c02
/0/6 system PnP device PNP0c02
/0/7 system PnP device PNP0c02
/0/8 system PnP device PNP0c02
/1 power DELL DM3WC64
/2 wwx0215e0ec0100 network Ethernet interface
So, I got a 8. Gen i5, 16GB RAM, and Thunderbolt - and even a touchscreen. Pretty good deal! And I can report that eveything (Audio, Webcam, Touchscreen, USB ports, Thunderbolt) works with Debian 11 (Kernel 5.10).
Just one problem...
Keyboard swap
The Keyboard was the German QWERTZ layout. I can touch type ANSI-US QWERTY without really caring all too much about the layout, but it still annoyed the hell out of me. So I looked at other pictures of internals of the laptop, with the plan to do a swap of the keyboard. The good news first: yes, it's possible, but you need to take care which keyboard you buy.
You need two things: an upper palmrest, which is one large plastic frame with the correct keyboard cutout, and the keyboard itself.
The palmrest was the hardest part, and I was lucky - only a single seller was selling one. The keyboard seemed easier, loads of ANSI US keyboards on eBay.
But I had to try two until I found one that actually works completely, as the Windows/Super key wasn't working on the first one. If you're ever in the same situation,
here's the exact model I used:
It's a bit annoying to take it all apart, but be careful with the ribbons (and don't strip any screws!), and you'll be fine.
All in all...
... a very good laptop. Everything works, battery lasts forever and display is great. I can absolutely recommend this setup. It's rugged enough for throwing it into a bag, and beefy enough for compiling code.
Update 2023-10-30
It's been a solid daily driver on the 5.10 kernel. On Debian Bookworm's 6.10 though, suspend started being a problem. The laptop would "freeze" after resume, with the fan spinning, keyboard illumination being on, and the screen being off (no display illumination even). The only thing that "helped" was a hard-reset by power-button. I searched around for a solution for a fairly long time, until I stumbled on this AskUbuntu post.
I can confirm the problem disappears when I boot with snd_hda_intel.dmic_detect=0
. /sys/power/mem_sleep
was always on deep
for me, so I didn't need to override that parameter as suggested additionally in the post. I tried looking in the source what the parameter actually does (link). It seems to disable some DSP firmware probe, which concerned me because I thought it may impact my audio or something, but nope.
Update 2023-10-31 (Happy Helloween!)
Of course, a day after writing an update that the above kernel parameter works, it stopped working. I spent another evening searching for a possible fix.
I tried to reproduce the suspend problem by running systemctl suspend
in a loop, as well as manually setting system state via echo mem > /sys/power/state
to rule out any potential bug in systemd (probably not needed, in hindsight). I managed to reproduce it using this method, in about ~10% of cases. I can confirm that it happens when suspending, and not when waking up.
After some more searching, I found a method which actually, so far, works. I have run 90+ suspend-and-resume iterations now, and it's not a problem anymore.
The fix is yet another kernel parameter: intel_iommu=off
. This disables the Intel Virtualization support within the Kernel. I messed a lot with this parameter in the past when I tried out iGPU passthrough within Proxmox, so it certainly rang a bell. I don't plan on using virtualization on this laptop, so it's fine for me - but be aware of this downside if you happen to stumble on these pages with the same problem.
I found a very interesting thread on the kernel bugzilla about this issue: link
I hope I don't have to write another update here :)