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 :)

Site generated on 2024-01-29 14:07:12. Changelog on Github.
Subscribe with RSS: https://lpcvoid.com/rss