Framework Laptop with Fedora

Table of Contents

These are my notes on installing a brand new Framework Laptop (Batch 9) for a nephew of mine.

Hardware Info

The Framework Support page should be your entry point. Be sure to check out the Setup, Upgrade, and Repair Guides.

Hardware Summary

  • CPU: Intel® Core™ i7-1165G7
  • Memory: 32GB (2 x 16GB) DDR4-3200
  • Storage: 2TB - WD_BLACK™ SN750 NVMe™
  • Keyboard: English International

Make, Model, Version

[root@framewrk-lptp ~]# dmidecode --type system | head --lines=9
# dmidecode 3.3
Getting SMBIOS data from sysfs.
SMBIOS 3.3.0 present.

Handle 0x0001, DMI type 1, 27 bytes
System Information
	Manufacturer: Framework
	Product Name: Laptop
	Version: AB

BIOS Version

My Batch 9 machine came with today’s latest, 3.07

[root@framewrk-lptp ~]# dmidecode -s bios-version
03.07

CPU

Intel® Core™ i7-1165G7

[root@framewrk-lptp ~]# lscpu
Architecture:            x86_64
  CPU op-mode(s):        32-bit, 64-bit
  Address sizes:         39 bits physical, 48 bits virtual
  Byte Order:            Little Endian
CPU(s):                  8
  On-line CPU(s) list:   0-7
Vendor ID:               GenuineIntel
  BIOS Vendor ID:        Intel(R) Corporation
  Model name:            11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz
    BIOS Model name:     11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz
    CPU family:          6
    Model:               140
    Thread(s) per core:  2
    Core(s) per socket:  4
    Socket(s):           1
    Stepping:            1
    CPU max MHz:         4700,0000
    CPU min MHz:         400,0000
    BogoMIPS:            5606.40
    Flags:               fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq
                          dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l2 invpcid_single cdp_l2 ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow vnm
                         i flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves split_lock_detect dtherm ida arat pln pts hwp
                          hwp_notify hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg avx512_vpopcntdq rdpid movdiri movdir64b fsrm avx512_vp2intersect md_clear flush_l1d arch_capabilities
Virtualization features: 
  Virtualization:        VT-x
Caches (sum of all):     
  L1d:                   192 KiB (4 instances)
  L1i:                   128 KiB (4 instances)
  L2:                    5 MiB (4 instances)
  L3:                    12 MiB (1 instance)
NUMA:                    
  NUMA node(s):          1
  NUMA node0 CPU(s):     0-7
Vulnerabilities:         
  Itlb multihit:         Not affected
  L1tf:                  Not affected
  Mds:                   Not affected
  Meltdown:              Not affected
  Spec store bypass:     Mitigation; Speculative Store Bypass disabled via prctl
  Spectre v1:            Mitigation; usercopy/swapgs barriers and __user pointer sanitization
  Spectre v2:            Mitigation; Enhanced IBRS, IBPB conditional, RSB filling
  Srbds:                 Not affected
  Tsx async abort:       Not affected

Storage

WD_BLACK SN750 2TB

[root@framewrk-lptp ~]# nvme list
Node             SN                   Model                                    Namespace Usage                      Format           FW Rev  
---------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- --------
/dev/nvme0n1     [REDACTED]           WD_BLACK  SN750 2TB                      1           2,00  TB /   2,00  TB    512   B +  0 B   112000WD
[root@framewrk-lptp ~]# df -h -x tmpfs -x devtmpfs
Filesystem      Size  Used Avail Use% Mounted on
/dev/dm-0       1,4T  3,8G  1,4T   1% /
/dev/dm-0       1,4T  3,8G  1,4T   1% /home
/dev/nvme0n1p5  974M  153M  755M  17% /boot
/dev/nvme0n1p1   96M   40M   57M  41% /boot/efi

Note that Fedora uses btrfs by default since F33.

Memory

2x Crucial 16GB DDR4-3200 SODIMM (CT16G4SFD832A)

Click to show technical details.
[root@framewrk-lptp ~]# dmidecode -t memory
# dmidecode 3.3
Getting SMBIOS data from sysfs.
SMBIOS 3.3.0 present.

Handle 0x0014, DMI type 16, 23 bytes
Physical Memory Array
	Location: System Board Or Motherboard
	Use: System Memory
	Error Correction Type: None
	Maximum Capacity: 64 GB
	Error Information Handle: No Error
	Number Of Devices: 2

Handle 0x0015, DMI type 17, 92 bytes
Memory Device
	Array Handle: 0x0014
	Error Information Handle: No Error
	Total Width: 64 bits
	Data Width: 64 bits
	Size: 16 GB
	Form Factor: SODIMM
	Set: None
	Locator: Controller0-ChannelA-DIMM0
	Bank Locator: BANK 0
	Type: DDR4
	Type Detail: Synchronous
	Speed: 3200 MT/s
	Manufacturer: Crucial Technology
	Serial Number: [REDACTED]
	Asset Tag: 9876543210
	Part Number: CT16G4SFRA32A.M16FRS
	Rank: 2
	Configured Memory Speed: 3200 MT/s
	Minimum Voltage: Unknown
	Maximum Voltage: Unknown
	Configured Voltage: 1.2 V
	Memory Technology: DRAM
	Memory Operating Mode Capability: Volatile memory
	Firmware Version: Not Specified
	Module Manufacturer ID: Bank 6, Hex 0x9B
	Module Product ID: Unknown
	Memory Subsystem Controller Manufacturer ID: Unknown
	Memory Subsystem Controller Product ID: Unknown
	Non-Volatile Size: None
	Volatile Size: 16 GB
	Cache Size: None
	Logical Size: None

Handle 0x0016, DMI type 17, 92 bytes
Memory Device
	Array Handle: 0x0014
	Error Information Handle: No Error
	Total Width: 64 bits
	Data Width: 64 bits
	Size: 16 GB
	Form Factor: SODIMM
	Set: None
	Locator: Controller1-ChannelA-DIMM0
	Bank Locator: BANK 0
	Type: DDR4
	Type Detail: Synchronous
	Speed: 3200 MT/s
	Manufacturer: Crucial Technology
	Serial Number: [REDACTED]
	Asset Tag: 9876543210
	Part Number: CT16G4SFRA32A.M16FRS
	Rank: 2
	Configured Memory Speed: 3200 MT/s
	Minimum Voltage: Unknown
	Maximum Voltage: Unknown
	Configured Voltage: 1.2 V
	Memory Technology: DRAM
	Memory Operating Mode Capability: Volatile memory
	Firmware Version: Not Specified
	Module Manufacturer ID: Bank 6, Hex 0x9B
	Module Product ID: Unknown
	Memory Subsystem Controller Manufacturer ID: Unknown
	Memory Subsystem Controller Product ID: Unknown
	Non-Volatile Size: None
	Volatile Size: 16 GB
	Cache Size: None
	Logical Size: None

[root@framewrk-lptp ~]# free -h
               total        used        free      shared  buff/cache   available
Mem:            31Gi       895Mi        28Gi       105Mi       1,5Gi        29Gi
Swap:          8,0Gi          0B       8,0Gi

Expansion Cards

I went for the following

count description
1 DisplayPort Expansion Card
1 HDMI Expansion Card
3 USB-C Expansion Card
2 USB-A Expansion Card

Ethernet Adapter

Since there is no RJ45 Ethernet connection, an Anker PowerExpand USB-C to Gigabit Ethernet Adapter was gifted by Janine. Wi-Fi is nice, but it’s always good to have the option to use cabled network.

Initial Bringup

Insert RAM and NVMe

Is well documented in the Framework Laptop DIY Edition Quick Start Guide.

But not powering up

Problem with this one was that the step pressing the power button (near the end of the article) led to nothing, the machine acted completely dead. :-( Same result with 2 different USB-C power supplies, same result with different USB-C Expansion Cards.

Properly attach power button bracket

On closer inspection the power button felt not correctly attached, one of the three screws holding the retention bracket was not fully screwed in, the power button was wobbly and the case was not flush near the power button. Not a good start for a brand new device.

But, while Framework’s post assembly QA feels below par, the documentation is excellent. I simply followed the Fingerprint Reader Replacement Guide up to step 5 (removing the silver bracket) and then again from step 11 (attach the silver bracket) onward.

While the power button and case now were as they should be, the laptop still would not power on.

Mainboard Reset

At least the problem is shared by others and Framework describes a fix in Fully Resetting the Mainboard State. Since the owner of this laptop will be a teenager, I would be much happier if there was a push button for this reset on the mobo, especially since Framework chose a flimsy battery holder and connector. I would happily have paid up to 25€ more for higher quality CMOS batt holder and laptop batt connector. It is counterproductive to long device life to pick connectors from the very bottom of the price range. I was expecting better and am definitely used to better when working on a ThinkPad.

Shoddy assembly quality aside, the laptop was now finally working.

After reading the thread Completely dead, I get the impression it might have been sufficient to only pull the CMOS battery and not hassle with the fiddly main battery connector. No matter, it works now.

Windows 10 Pro Installation

Since the owner of the laptop will also use it for school, I installed Windows 10 Pro purchased as Download version with the machine. That install was given roughly ¼ of the NVMe, the remaining ¾ were left unused in anticipation of the Fedora Linux install.

The Win10 installation is well documented in Step 13 Install an Operating System and Drivers of the Framework Laptop DIY Edition Quick Start Guide.

Microsoft’s Windows 10 Media Creation Tool twice (once in a VM running on the Framework laptop and once on a native Windows install on another machine) happily created a USB medium, without any errors, but the installer did error out. Seems I am not alone with that issue and the solution was to use a different USB stick. That 3rd write, to a new stick, allowed me to install.

Guess that as a Red Hat Enterprise Linux and Fedora user I am spoiled since those actually verify the boot medium’s integrity by default. No matter. With the second stick it installed fine.

While I would have preferred a driver disk to feed the installer, post install the Framework Laptop Driver Bundle executable did its job just fine.

Dual Boot Notes

I disabled fast boot in Windows, as it is known to interfere with WiFi when dual booting. There was no notable difference in Window’s boot time.

Note that if you intend to use the fingerprint reader in a dual boot setup, then you might have issues, but the threads also show people having success.

Install Fedora 35 Workstation

Is also well documented in Framework’s article Fedora 35 Installation on the Framework Laptop

The two workarounds from Step 4, Completing Setup were applied. That is microphone input on the 3.5mm jack and Gnome […] enable fractional scaling.

Updating the BIOS was not needed since it’s already at version 3.07.

Being a civilised installer, Fedora noticed that Windows was present and automatically created an entry in the bootloader. Not like other OSes (yes, Windows, I am looking at you) that bulldozer over already installed OSes during install.

Fixed Issues under F35 default install plus updates

See the thread Fedora Linux 35 (Fedora 35) on the Framework Laptop.

If you understand German, then you could also read the article in c’t 7/2022, page 160(paywalled) and the link collection of the article.

I expect most if not all of these to be fixed in a future Fedora update, so do not blindly apply if you read this much later then April 2022, rather check the thread linked above.

grub Bootloader Slow to React

Was a known issue, this will hopefully be fixed in Fedora 36. See RHBZ #1986235 for details. It got fixed in rawhide in late March 2022.

For this F35 install I worked around it, as per comment #2 in the bug, after applying updates.

sudo cp /boot/efi/EFI/fedora/grub.cfg /boot/efi/EFI/fedora/grub.cfg.orig
sudo grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg

That was with

[root@framewrk-lptp ~]# rpm -qa grub2*
grub2-common-2.06-10.fc35.noarch
grub2-tools-minimal-2.06-10.fc35.x86_64
grub2-tools-2.06-10.fc35.x86_64
grub2-pc-modules-2.06-10.fc35.noarch
grub2-pc-2.06-10.fc35.x86_64
grub2-efi-ia32-2.06-10.fc35.x86_64
grub2-efi-x64-2.06-10.fc35.x86_64
grub2-tools-extra-2.06-10.fc35.x86_64
grub2-efi-ia32-cdboot-2.06-10.fc35.x86_64
grub2-efi-x64-cdboot-2.06-10.fc35.x86_64
grub2-tools-efi-2.06-10.fc35.x86_64
Technical details, click to expand.

The content of /boot/efi/EFI/fedora/grub.cfg.orig

search --no-floppy --fs-uuid --set=dev [REDACTED]
set prefix=($dev)/grub2

export $prefix
configfile $prefix/grub.cfg

See also Unify the location of GRUB configuration files across all supported CPU architectures in the Fedora 34 release notes.

So the work around is not ideal but works.

FIXME: revisit once F36 is out.

Use Deep Sleep instead of s2idle

For now it looks like sleep type deep is the better choice, try s2idle when on F36 or later.

Deep sleep was configured as per the thread Enabling hibernate on Fedora 35.

sudo grubby --update-kernel=ALL --args=mem_sleep_default=deep

Audio is fine after suspend / resume.

If the power drain during sleep is too much, then revert this by following either Making Persistent Changes to a GRUB 2 Menu Using the grubby Tool or Customizing the GRUB 2 Configuration File in the Working with the GRUB 2 Boot Loader guide.

also see https://community.frame.work/t/fedora-35-kernel-5-16-5-s2idle-and-maybe-wifi-issues/14704/34

Todo: Try without mem_sleep_default=deep once F36 is released and the machine was updated.

Potential Battery Life Tuning

If battery life deemed not good enough, then see the thread Linux battery life tuning.

Install Packages for Virtualization

Since Windows was installed natively, there was no need for a VM under Fedora and I thus left the packages for using virtual machines out.

Do read Getting started with virtualization and Installing virtual operating systems with GNOME Boxes in the Fedora Quick Docs before choosing between the two options.

Virtualisation works fine, as expected. I tested it before doing the dual boot setup. I just did not install the packages in the final installation round.