Framework Laptop 16

From Gentoo Wiki
Jump to:navigation Jump to:search

The Framework Laptop 16, released in 2024, is a highly modular and repairable 16 inch laptop. This article is incomplete, see Framework Laptop 13 for a guide on comparable hardware.

Hardware

Ryzen mainboard

Other than the CPU, both models (Ryzen 7 and 9) have the same hardware.

Device Make/model Status Vendor ID / Product ID Kernel driver(s) Kernel version Notes
CPU AMD Ryzen 9 7940HS

AMD Ryzen 7 7840HS

Works AMD microcode
Chipset AMD Pink Sardine Works
Video card AMD Phoenix1 Works 1002:15bf amdgpu Use VIDEO_CARDS: amdgpu radeonsi
Sound card AMD Rembrandt Radeon High Definition Audio Controller Works 1002:1640 snd_hda_intel
Sound card AMD Family 17h/19h HD Audio Controller Works 1022:15e3 snd_hda_intel
Audio coprocessor AMD ACP/ACP3X/ACP6x Audio Coprocessor Works 1022:15e2 snd_pci_ps Also requires Realtek HD-audio codec
Wireless network card MediaTek MT7922 Works 14c3:0616 mt7921e
Bluetooth MediaTek MT7922 Works 0e8d:e616 btusb
Fingerprint Reader Goodix USB2.0 MISC Works 27c6:609c Requires a fingerprint reader package
Webcam Realtek Semiconductor Corp. Laptop Camera Works 0bda:5634 uvcvideo The microphone is attached to the sound card (17h/19h), not the webcam
Thunderbolt/USB4 AMD Pink Sardine USB4/Thunderbolt NHI controller Works 1022:1668 1022:1669 thunderbolt Compatibility with complex devices such as docks and eGPUs has not been confirmed.
Ambient light sensor Not tested Found at: /sys/bus/iio/devices/iio:device0/in_illuminance_raw
Encryption AMD Family 19h (Model 74h) CCP/PSP 3.0 Device Not tested 1022:15c7 ccp
AI accelerator AMD IPU Device Not tested 1022:1502 Driver at: https://github.com/amd/xdna-driver

Input modules

The Framework Laptop 16 has a user-configurable input deck. Unless otherwise noted, the modules listed below are OEM modules from Framework.

Device Make/model Status Vendor ID / Product ID Kernel driver(s) Kernel version Notes
Keyboard Framework Laptop 16 Keyboard Module - ANSI Works 32ac:0012 Generic HID?
Touchpad PixArt PIXA3854 Works 093A:0274 hid_multitouch i2c_designware_platform pinctrl_amd
Numpad Framework Laptop 16 Numpad Module Works 32ac:0014 Generic HID?
RGB Macropad Works 32ac:0013 Generic HID?
LED Matrix Works 32ac:0020 cdc_acm

Configuring the QMK devices and LED matrix via web tools requires udev rules (see below).

Expansion cards

See Framework Expansion Cards. The Framework Laptop 16 features six modular expansion card slots allowing for custom port configurations.

Expansion bay

The Framework 16 has an expansion bay with a custom PCIe connector. Unless otherwise noted, the modules listed below are OEM modules from Framework.

Device Make/model Status Vendor ID / Product ID Kernel driver(s) Kernel version Notes
Expansion Bay Shell Works Provides cooling and fills the bay. Fans are managed by the embedded controller.
GPU AMD Radeon RX 7700S Works 1002:7480 1002:ab30 amdgpu snd_hda_intel

Installation

See the Handbook for instructions on the general installation process.

Firmware

Firmware from sys-kernel/linux-firmware is needed for the GPU, wireless, and bluetooth interfaces.

Kernel

The easiest way to configure the kernel is use a distribution kernel. The next easiest way is to use genkernel. See Kernel installation in the handbook for details.

genkernel automatically enables enough to get the system booted, but additional changes are required to get all hardware working. On the upside, genkernel all does everything - it compiles the kernel, builds an initramfs, and installs both in the boot partition, and it can be configured to update the bootloader entries.

Note: compiling certain drivers into the kernel (vs as a module) may cause problems. Some drivers such as the Wi-Fi card driver (MediaTek MT7921E) will not boot up correctly if firmware is not available. This can be resolved by configuring the driver to be a module, or by including the firmware in the initramfs.

KERNEL General
Processor type and features  --->
   [*] AMD ACPI2Platform devices support
   [*] Machine Check / overheating reporting
      [*] AMD MCE features
   Performance monitoring  --->
      <*> Intel/AMD rapl performance events
      <*> AMD Processor Power Reporting Mechanism
      <*> AMD Uncore performance events
Power management and ACPI options --->
   [*] ACPI (Advanced Configuration and Power Interface) Support  --->
      [*]   ACPI Platform Error Interface (APEI)
      [*]     APEI Generic Hardware Error Source
       CPU Frequency scaling  --->
         [*]   AMD Processor P-State driver
Device Drivers  --->
   <*> Hardware Monitoring support  --->
      <*>   AMD Family 10h+ temperature sensor
   [*] Watchdog Timer Support  --->
      <*>   AMD/ATI SP5100 TCO Timer/Watchdog
   [*] HID bus support  --->
      <*>   I2C HID support  --->
            AMD SFH HID Support  --->
               <*> AMD Sensor Fusion Hub
   [*] Reliability, Availability and Serviceability (RAS) features
   <*> EDAC (Error Detection And Correction) reporting  --->
      <*>   Decode MCEs in human-readable form (only on AMD for now)
      <*>   Output ACPI APEI/GHES BIOS detected errors via EDAC
   [*] X86 Platform Specific Device Drivers  --->
      <*>   AMD SoC PMC driver
   [*] IOMMU Hardware Support  --->
      [*]   AMD IOMMU support
   [*] Generic powercap sysfs driver  --->
      <*>   Intel RAPL Support via MSR Interface
KERNEL NVMe/SSD slots
Enable the block layer  --->
   [*]   Logic for interfacing with Opal enabled SEDs
Device Drivers  --->
   NVME Support  --->
      <*> NVM Express block device
KERNEL Wi-Fi and Bluetooth
Device Drivers  --->
   [*] Network device support  --->
      [*]   Wireless LAN  --->
         [*]   MediaTek devices
            <M>     MediaTek MT7921E (PCIe) support
[*] Networking support  --->
   <M>   Bluetooth subsystem support  --->
      [*]     Bluetooth High Speed (HS) features
      [*]   Bluetooth Low Energy (LE) features
            Bluetooth device drivers  --->
               <M> HCI USB driver
               [*]   MediaTek protocol support
KERNEL Graphics
Memory Management options  --->
   [*] Memory hotplug  --->
      [*]   Allow for memory hot remove
   [*] Device memory (pmem, HMM, etc...) hotplug support
   [*] Unaddressable device memory (GPU memory, ...)
Device Drivers  --->
   Graphics support  --->
      <M> AMD GPU
      [*]   Enable amdgpu support for SI parts
            ACP (Audio CoProcessor) Configuration  --->
               [*] Enable AMD Audio CoProcessor IP support
      [*]   HSA kernel driver for AMD GPU devices
      [*]     Enable HMM-based shared virtual memory manager
      Frame buffer Devices  --->
         <*> Support for frame buffer device drivers  --->
            <*>   VGA 16-color graphics support
            [*]   VESA VGA graphics support
            [*]   EFI-based Framebuffer Support
KERNEL Keyboard and touchpad
Cryptographic API  --->
   [*]   Hardware crypto devices  --->
      [*]   Support for AMD Secure Processor
      <*>     Secure Processor device driver
      [*]       Platform Security Processor (PSP) device
Device Drivers  --->
   I2C Support  --->
      <*> I2C support
      <*>   I2C device interface
      I2C Hardware Bus Support  --->
         <*> Intel PIIX4 and compatible (ATI/AMD/Serverworks/Broadcom/SMSC)
         <*> Synopsys DesignWare Platform
         [*]   AMD PSP I2C semaphore support
   [*] Pin controllers  --->
      [*]   AMD GPIO pin control
   [*] HID bus support  --->
      <*>   Generic HID driver
            Special HID drivers  --->
               <*> HID Multitouch panels
            USB HID support  --->
               <*> USB HID transport layer
      <*>   I2C HID support  --->
               <*>   HID over I2C transport layer ACPI driver
KERNEL USB4/Thunderbolt/Type-C
Device Drivers  --->
   [*] USB support  --->
      <*>   USB Type-C Support  --->
         <*>   USB Type-C Connector System Software Interface driver
         <*>     UCSI ACPI Interface Driver
               USB Type-C Alternate Mode drivers  --->
            <*> DisplayPort Alternate Mode driver
   <*> Unified support for USB4 and Thunderbolt  --->
KERNEL Sound card
Device Drivers  --->
   <M> Sound card support  --->
      <M> Advanced Linux Sound Architecture  --->
         HD-Audio  --->
            <M> HD Audio PCI
            <M> Build Realtek HD-audio codec support
            <M> Build HDMI/DisplayPort HD-audio codec support
         <M>   ALSA for SoC audio support  --->
            <M>   AMD Audio Coprocessor-v3.x support
            <M>   AMD Audio Coprocessor - Renoir support
            <M>   AMD Audio Coprocessor-v5.x I2S support
            <M>   AMD Audio Coprocessor-v6.x Yellow Carp support
            <M>   AMD Audio Coprocessor-v6.2 RPL support
            <M>   AMD Audio Coprocessor-v6.3 Pink Sardine support
            [*]   Sound Open Firmware Support  --->
               <M>   SOF PCI enumeration support
               <M>   SOF support for AMD audio DSPs
               <M>     SOF support for RENOIR
               <M>     SOF support for VANGOGH
               <M>     SOF support for REMBRANDT
KERNEL Webcam
Device Drivers  --->
   <M> Multimedia support  --->
      [ ]   Filter media drivers
            Media core support  --->
               <M> Video4Linux core
            Media drivers  --->
               [*] Media USB Adapters  --->
                  <M>   USB Video Class (UVC)
KERNEL Embedded Controller
Device Drivers  --->
   [*] Platform support for Chrome hardware  --->
      <*>   ChromeOS Embedded Controller
      <*>     ChromeOS Embedded Controller (LPC)
KERNEL Ethernet Expansion Card
Device Drivers  --->
   [*] Network device support  --->
      <M>   USB Network Adapters  --->
         <M>   Realtek RTL8152/RTL8153 Based USB Ethernet Adapters
KERNEL Storage Expansion Card
Device Drivers  --->
   [*] USB support  --->
      <*>   USB Mass Storage support
      <M>     USB Attached SCSI
KERNEL LED Matrix
Device Drivers  --->
   [*] USB support  --->
      <M>   USB Modem (CDC ACM) support
KERNEL Needed to get RyzenAdj v0.15.0 working
Kernel hacking  --->
   [ ] Filter access to /dev/mem

Setup

Bluetooth

Enable the bluetooth service. See Bluetooth if the service does not exist.

root #systemctl enable --now bluetooth

Sound

Enable pipewire, pipewire-pulse, and wireplumber. These commands add your user to the pipewire group, enable services for all users (next boot), and start services for your user.

user $sudo usermod -aG pipewire $(whoami)
user $sudo systemctl enable --global pipewire{,-pulse}.{service,socket} wireplumber.service
user $systemctl start --user pipewire{,-pulse}.{service,socket} wireplumber.service

Fingerprint reader

There are a number of fingerprint reader packages but fprintd is recommended.

root #emerge --ask sys-auth/fprintd

Fan control

A modified version of fw-fanctl on GitHub, which also includes a version of ectool that allows to control the fans, tracks the temperature better and will speed up fans faster when temperature rises fast. It also tracks changes in the config file, and reloads the config when it changes and contains a script for init.d as well as systemd.

To clone fw-fanctrl:

user $cd fw-fanctrl

To install (for OpenRC) run inside the cloned directory:

Warning
Please review the script and make sure it won't overwrite any files
root #chmod +x install-initd.sh
root #./install-initd.sh

To list available fan curves (configured in /etc/fw-fanctrl/config.json):

root #fw-fanctrl -l

To change to the fan curve lazy (as an example) run:

root #fw-fanctrl lazy

Embedded Controller

Dustin Howett has written a kernel module that exposes to sysfs the Framework Laptop's battery charge limit, LEDs, fan controls, and privacy switches. Note that, as of this writing (17-Jul-2024), you have to apply this patch series to your kernel sources in order to add a necessary quirk to the kernel's ChromeOS EC driver.

CPU Power Control (RyzenAdj)

The current version of sys-power/RyzenAdj (v0.13.0) does not support the Ryzen 7 7840HS, but the current version from github RyzenAdj on GitHub (v0.15.0) does.

To get it working, it needs access to /dev/mem.

TCG Opal SED

If you have set a password on a TCG Opal self-encrypting drive, then the drive will be locked when Linux resumes from s0ix/s2idle suspend, and your file systems will immediately crash. You can work around this by saving your Opal password into kernel memory using the IOC_OPAL_SAVE ioctl, whereby the kernel will automatically resubmit the key to unlock the drive before resuming tasks. Michal Gawlik's sed-opal-unlocker is a userspace tool that can issue the needed ioctl.

Configuration

Web configuration for input modules

The QMK-based input modules (keyboard, numpad, and macropad) are configurable via https://keyboard.frame.work and the LED matrix is configurable via https://ledmatrix.frame.work once some udev rules are in place; 50-qmk.rules (sourced from GitHub) for QMK devices and 50-framework.rules for the LED matrix.

FILE /etc/udev/rules.d/50-qmk.rules
# Atmel DFU
### ATmega16U2
SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2fef", TAG+="uaccess"
### ATmega32U2
SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ff0", TAG+="uaccess"
### ATmega16U4
SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ff3", TAG+="uaccess"
### ATmega32U4
SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ff4", TAG+="uaccess"
### AT90USB64
SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ff9", TAG+="uaccess"
### AT90USB162
SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ffa", TAG+="uaccess"
### AT90USB128
SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ffb", TAG+="uaccess"

# Input Club
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1c11", ATTRS{idProduct}=="b007", TAG+="uaccess"

# STM32duino
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1eaf", ATTRS{idProduct}=="0003", TAG+="uaccess"
# STM32 DFU
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="df11", TAG+="uaccess"

# BootloadHID
SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05df", TAG+="uaccess"

# USBAspLoader
SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05dc", TAG+="uaccess"

# USBtinyISP
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1782", ATTRS{idProduct}=="0c9f", TAG+="uaccess"

# ModemManager should ignore the following devices
# Atmel SAM-BA (Massdrop)
SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="6124", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1"

# Caterina (Pro Micro)
## pid.codes shared PID
### Keyboardio Atreus 2 Bootloader
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1209", ATTRS{idProduct}=="2302", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1"
## Spark Fun Electronics
### Pro Micro 3V3/8MHz
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1b4f", ATTRS{idProduct}=="9203", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1"
### Pro Micro 5V/16MHz
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1b4f", ATTRS{idProduct}=="9205", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1"
### LilyPad 3V3/8MHz (and some Pro Micro clones)
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1b4f", ATTRS{idProduct}=="9207", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1"
## Pololu Electronics
### A-Star 32U4
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1ffb", ATTRS{idProduct}=="0101", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1"
## Arduino SA
### Leonardo
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="0036", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1"
### Micro
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="0037", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1"
## Adafruit Industries LLC
### Feather 32U4
SUBSYSTEMS=="usb", ATTRS{idVendor}=="239a", ATTRS{idProduct}=="000c", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1"
### ItsyBitsy 32U4 3V3/8MHz
SUBSYSTEMS=="usb", ATTRS{idVendor}=="239a", ATTRS{idProduct}=="000d", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1"
### ItsyBitsy 32U4 5V/16MHz
SUBSYSTEMS=="usb", ATTRS{idVendor}=="239a", ATTRS{idProduct}=="000e", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1"
## dog hunter AG
### Leonardo
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2a03", ATTRS{idProduct}=="0036", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1"
### Micro
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2a03", ATTRS{idProduct}=="0037", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1"

# hid_listen
KERNEL=="hidraw*", MODE="0660", GROUP="plugdev", TAG+="uaccess", TAG+="udev-acl"

# hid bootloaders
## QMK HID
SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2067", TAG+="uaccess"
## PJRC's HalfKay
SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="0478", TAG+="uaccess"

# APM32 DFU
SUBSYSTEMS=="usb", ATTRS{idVendor}=="314b", ATTRS{idProduct}=="0106", TAG+="uaccess"

# GD32V DFU
SUBSYSTEMS=="usb", ATTRS{idVendor}=="28e9", ATTRS{idProduct}=="0189", TAG+="uaccess"

# WB32 DFU
SUBSYSTEMS=="usb", ATTRS{idVendor}=="342d", ATTRS{idProduct}=="dfa0", TAG+="uaccess"
FILE /etc/udev/rules.d/50-framework.rules
# LED Matrix, ModemManager should ignore
SUBSYSTEMS=="usb", ATTRS{idVendor}=="32ac", ATTRS{idProduct}=="0020", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1"

Once one or both of these files have been added, run the following:

root #udevadm control --reload-rules
root #udevadm trigger

See also

External resources