From 0ac0225d16ca2464c762540f7b34bd4a68d79f45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Thalheim?= Date: Sun, 18 Jan 2026 08:49:52 +0100 Subject: [PATCH 1/2] CONTRIBUTING: expand contributor and reviewer guidelines Document the full contribution workflow including feature branches, README/flake.nix entry formats, testing from forks, deprecation process, and update reviewer section to use GitHub merge queues. Also clarify that any nixpkgs committer can review PRs. --- .github/PULL_REQUEST_TEMPLATE.md | 2 + CONTRIBUTING.md | 144 +++++++++++++++++++++++++++++-- 2 files changed, 140 insertions(+), 6 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index bf8c6df..1dd5736 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,3 +1,5 @@ + + ###### Description of changes diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9356414..5991830 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,5 +1,11 @@ # Contributing a Device Profile +Please submit your contributions from a feature branch, not from your master branch: + +```bash +git checkout -b my-new-hardware-profile +``` + ## 1. Writing profiles Create an appropriate directory and start writing your expression. @@ -36,18 +42,144 @@ should either be conservative or be guarded behind additional NixOS module options. If it makes sense to have a performance-focussed config, it can be declared in a separate profile. -## 2. Adding Entry +## 2. Optional: Add a README -Link the profile in the table in README.md and in flake.nix. +Profiles can include a `README.md` with device-specific documentation such as: +- Firmware update instructions +- BIOS settings +- Known issues and workarounds +- Links to external resources -## 3. Testing +See [framework/13-inch/7040-amd/README.md](framework/13-inch/7040-amd/README.md) +for a good example. -Run `nix run .#run-tests` to evaluate all hardware profiles. +## 3. Adding Entry + +Add your profile to both `README.md` and `flake.nix`. + +**README.md**: Add a row to the table in alphabetical order by manufacturer: + +```markdown +| [Manufacturer Model](manufacturer/model) | `` | `manufacturer-model` | +``` + +The columns are: +1. Model name linking to the profile directory +2. Channel path (for `imports = [ ]`) +3. Flake module name (for `nixos-hardware.nixosModules.`) + +**flake.nix**: Add an entry to the `nixosModules` attribute set: + +```nix +manufacturer-model = import ./manufacturer/model; +``` + +The flake module name should use hyphens (e.g., `dell-xps-15-9500`). + +## 4. Multiple Variants + +For devices with multiple configurations (e.g., different GPU options), create +subdirectories with a shared base module. For example: + +``` +dell/xps/15-9560/ +├── default.nix # Base profile (or one default variant) +├── intel/default.nix # Intel-only variant +├── nvidia/default.nix # Nvidia variant +└── xps-common.nix # Shared configuration +``` + +Each variant needs its own entry in README.md and flake.nix: + +```nix +dell-xps-15-9560 = import ./dell/xps/15-9560; +dell-xps-15-9560-intel = import ./dell/xps/15-9560/intel; +dell-xps-15-9560-nvidia = import ./dell/xps/15-9560/nvidia; +``` + +## 5. Testing + +Before opening a pull request, test your profile by pointing to your fork. + +**Using channels:** + +```bash +sudo nix-channel --add https://github.com//nixos-hardware/archive/.tar.gz nixos-hardware +sudo nix-channel --update +sudo nixos-rebuild test +``` + +**Using flakes:** + +Update your `flake.nix` input temporarily: + +```nix +inputs.nixos-hardware.url = "github:/nixos-hardware/"; +``` + +Then run: + +```bash +sudo nixos-rebuild test --flake . +``` + +You can also run `nix run .#run-tests` to evaluate all hardware profiles. Because profiles can only be tested with the appropriate hardware, quality assurance is up to *you*. +## Compatibility + +Profiles should work with both NixOS unstable and the current stable release. + +## Deprecating Modules + +When renaming or removing a module, add deprecation warnings for both flake and +channel users. + +**For flake users**, use the `deprecated` helper in `flake.nix`: + +```nix +old-module-name = deprecated "issue-number" "old-module-name" (import ./new/path); +``` + +**For channel users**, add an assertion in the old module's `default.nix`: + +```nix +{ ... }: + +{ + assertions = [ + { + assertion = false; + message = "Importing path/to/old/module (default.nix) directly is deprecated! See https://github.com/NixOS/nixos-hardware/blob/master/path/to/DEPRECATION.md for more details"; + } + ]; +} +``` + +Include a markdown file explaining the migration path. See +[asus/zephyrus/ga402x/ATTR-SET-DEPRECATION.md](asus/zephyrus/ga402x/ATTR-SET-DEPRECATION.md) +for an example. + +## Getting Help + +For questions and discussions, join us in the +[#nixos-hardware:nixos.org](https://matrix.to/#/#nixos-hardware:nixos.org) +Matrix channel. + # For reviewers: -This repository has [mergify](https://mergify.com/) enabled for easier merging after a successfull build: +Any nixpkgs committer can review and approve pull requests in this repository. -* `@mergify queue` will add the current pull request to the merge queue and merge when all tests succeed +This repository uses GitHub merge queues for merging pull requests. + +## Review checklist + +1. **README.md entry**: Verify the contribution adds the device to the table in README.md +2. **flake.nix entry**: Verify the profile is exposed in flake.nix +3. **Common profiles**: Since testing on real hardware isn't always possible, + check that the profile re-uses appropriate common profiles (e.g., cpu, gpu, + laptop/pc, ssd/hdd modules) +4. **Previous contributors**: For changes to existing profiles, consider + requesting feedback from previous contributors who may have access to the + hardware From c8f766fd11c8b0a9832b6ca1819de74fbfee3d73 Mon Sep 17 00:00:00 2001 From: Cryolitia PukNgae Date: Sun, 18 Jan 2026 14:39:02 +0800 Subject: [PATCH 2/2] raspberry-pi: move kernel and firmware from nixpkgs As part of the gradual phasing out of linux_rpi in nixpkgs Link: https://github.com/NixOS/nixpkgs/pull/477665 Signed-off-by: Cryolitia PukNgae --- raspberry-pi/2/default.nix | 10 +- raspberry-pi/3/default.nix | 8 +- raspberry-pi/4/default.nix | 12 +- raspberry-pi/5/default.nix | 14 +-- raspberry-pi/common/kernel.nix | 113 ++++++++++++++++++ .../common/raspberry-pi-wireless-firmware.nix | 64 ++++++++++ 6 files changed, 209 insertions(+), 12 deletions(-) create mode 100644 raspberry-pi/common/kernel.nix create mode 100644 raspberry-pi/common/raspberry-pi-wireless-firmware.nix diff --git a/raspberry-pi/2/default.nix b/raspberry-pi/2/default.nix index 2e61025..c917887 100644 --- a/raspberry-pi/2/default.nix +++ b/raspberry-pi/2/default.nix @@ -3,7 +3,13 @@ { boot = { consoleLogLevel = lib.mkDefault 7; - kernelPackages = lib.mkDefault pkgs.linuxPackages_rpi2; + kernelPackages = lib.mkDefault ( + pkgs.linuxPackagesFor ( + pkgs.callPackage ../common/kernel.nix { + rpiVersion = 2; + } + ) + ); kernelParams = [ "dwc_otg.lpm_enable=0" "console=ttyAMA0,115200" @@ -17,7 +23,7 @@ }; }; - nixpkgs.config.platform = lib.systems.platforms.raspberrypi2; + nixpkgs.config.platform = lib.systems.platforms.armv7l-hf-multiplatform; # cpufrequtils doesn't build on ARM powerManagement.enable = lib.mkDefault false; diff --git a/raspberry-pi/3/default.nix b/raspberry-pi/3/default.nix index e7d7c4c..6472c6b 100644 --- a/raspberry-pi/3/default.nix +++ b/raspberry-pi/3/default.nix @@ -6,7 +6,13 @@ { boot = { - kernelPackages = lib.mkDefault pkgs.linuxKernel.packages.linux_rpi3; + kernelPackages = lib.mkDefault ( + pkgs.linuxPackagesFor ( + pkgs.callPackage ../common/kernel.nix { + rpiVersion = 3; + } + ) + ); initrd.availableKernelModules = [ "usbhid" "usb-storage" diff --git a/raspberry-pi/4/default.nix b/raspberry-pi/4/default.nix index 29f62db..9efb4fc 100644 --- a/raspberry-pi/4/default.nix +++ b/raspberry-pi/4/default.nix @@ -28,7 +28,13 @@ ]; boot = { - kernelPackages = lib.mkDefault pkgs.linuxKernel.packages.linux_rpi4; + kernelPackages = lib.mkDefault ( + pkgs.linuxPackagesFor ( + pkgs.callPackage ../common/kernel.nix { + rpiVersion = 4; + } + ) + ); initrd.availableKernelModules = [ "usbhid" "usb-storage" @@ -56,5 +62,7 @@ } ]; - hardware.firmware = [ pkgs.raspberrypiWirelessFirmware ]; + hardware.firmware = [ + (pkgs.callPackage ../common/raspberry-pi-wireless-firmware.nix { }) + ]; } diff --git a/raspberry-pi/5/default.nix b/raspberry-pi/5/default.nix index 020dc97..f8d82a9 100644 --- a/raspberry-pi/5/default.nix +++ b/raspberry-pi/5/default.nix @@ -4,15 +4,15 @@ config, ... }: -let - linux_rpi5 = pkgs.linux_rpi4.override { - rpiVersion = 5; - argsOverride.defconfig = "bcm2712_defconfig"; - }; -in { boot = { - kernelPackages = lib.mkDefault (pkgs.linuxPackagesFor linux_rpi5); + kernelPackages = lib.mkDefault ( + pkgs.linuxPackagesFor ( + pkgs.callPackage ../common/kernel.nix { + rpiVersion = 5; + } + ) + ); initrd.availableKernelModules = [ "nvme" "usbhid" diff --git a/raspberry-pi/common/kernel.nix b/raspberry-pi/common/kernel.nix new file mode 100644 index 0000000..41a678d --- /dev/null +++ b/raspberry-pi/common/kernel.nix @@ -0,0 +1,113 @@ +{ + stdenv, + lib, + pkgs, + fetchFromGitHub, + buildLinux, + rpiVersion, + ... +}@args: + +let + # NOTE: raspberryPiWirelessFirmware should be updated with this + modDirVersion = "6.12.47"; + tag = "stable_20250916"; + hash = "sha256-HG8Oc04V2t54l0SOn4gKmNJWQUrZfjWusgKcWvx74H0=="; +in +lib.overrideDerivation + (buildLinux ( + args + // { + version = "${modDirVersion}-${tag}"; + inherit modDirVersion; + pname = "linux-rpi"; + + src = fetchFromGitHub { + owner = "raspberrypi"; + repo = "linux"; + inherit tag hash; + }; + + defconfig = + { + "1" = "bcmrpi_defconfig"; + "2" = "bcm2709_defconfig"; + "3" = if stdenv.hostPlatform.isAarch64 then "bcm2711_defconfig" else "bcm2709_defconfig"; + "4" = "bcm2711_defconfig"; + "5" = "bcm2712_defconfig"; + } + .${toString rpiVersion}; + + features = { + efiBootStub = false; + } + // (args.features or { }); + + isLTS = true; + + kernelPatches = with pkgs.kernelPatches; [ + bridge_stp_helper + request_key_helper + ]; + + extraMeta = + if (rpiVersion < 3) then + { + platforms = with lib.platforms; lib.intersectLists arm linux; + hydraPlatforms = [ ]; + } + else + { + platforms = with lib.platforms; lib.intersectLists (arm ++ aarch64) linux; + hydraPlatforms = [ "aarch64-linux" ]; + }; + ignoreConfigErrors = true; + } + // (args.argsOverride or { }) + )) + (_oldAttrs: { + postConfigure = '' + # The v7 defconfig has this set to '-v7' which screws up our modDirVersion. + sed -i $buildRoot/.config -e 's/^CONFIG_LOCALVERSION=.*/CONFIG_LOCALVERSION=""/' + sed -i $buildRoot/include/config/auto.conf -e 's/^CONFIG_LOCALVERSION=.*/CONFIG_LOCALVERSION=""/' + ''; + + # Make copies of the DTBs named after the upstream names so that U-Boot finds them. + # This is ugly as heck, but I don't know a better solution so far. + postFixup = '' + dtbDir=${if stdenv.hostPlatform.isAarch64 then "$out/dtbs/broadcom" else "$out/dtbs"} + rm $dtbDir/bcm283*.dtb + copyDTB() { + cp -v "$dtbDir/$1" "$dtbDir/$2" + } + '' + + lib.optionalString (lib.elem stdenv.hostPlatform.system [ "armv6l-linux" ]) '' + copyDTB bcm2708-rpi-zero-w.dtb bcm2835-rpi-zero.dtb + copyDTB bcm2708-rpi-zero-w.dtb bcm2835-rpi-zero-w.dtb + copyDTB bcm2708-rpi-b.dtb bcm2835-rpi-a.dtb + copyDTB bcm2708-rpi-b.dtb bcm2835-rpi-b.dtb + copyDTB bcm2708-rpi-b.dtb bcm2835-rpi-b-rev2.dtb + copyDTB bcm2708-rpi-b-plus.dtb bcm2835-rpi-a-plus.dtb + copyDTB bcm2708-rpi-b-plus.dtb bcm2835-rpi-b-plus.dtb + copyDTB bcm2708-rpi-b-plus.dtb bcm2835-rpi-zero.dtb + copyDTB bcm2708-rpi-cm.dtb bcm2835-rpi-cm.dtb + '' + + lib.optionalString (lib.elem stdenv.hostPlatform.system [ "armv7l-linux" ]) '' + copyDTB bcm2709-rpi-2-b.dtb bcm2836-rpi-2-b.dtb + '' + + + lib.optionalString + (lib.elem stdenv.hostPlatform.system [ + "armv7l-linux" + "aarch64-linux" + ]) + '' + copyDTB bcm2710-rpi-zero-2.dtb bcm2837-rpi-zero-2.dtb + copyDTB bcm2710-rpi-zero-2-w.dtb bcm2837-rpi-zero-2-w.dtb + copyDTB bcm2710-rpi-3-b.dtb bcm2837-rpi-3-b.dtb + copyDTB bcm2710-rpi-3-b-plus.dtb bcm2837-rpi-3-a-plus.dtb + copyDTB bcm2710-rpi-3-b-plus.dtb bcm2837-rpi-3-b-plus.dtb + copyDTB bcm2710-rpi-cm3.dtb bcm2837-rpi-cm3.dtb + copyDTB bcm2711-rpi-4-b.dtb bcm2838-rpi-4-b.dtb + ''; + }) diff --git a/raspberry-pi/common/raspberry-pi-wireless-firmware.nix b/raspberry-pi/common/raspberry-pi-wireless-firmware.nix new file mode 100644 index 0000000..466f563 --- /dev/null +++ b/raspberry-pi/common/raspberry-pi-wireless-firmware.nix @@ -0,0 +1,64 @@ +{ + lib, + stdenvNoCC, + fetchFromGitHub, +}: + +stdenvNoCC.mkDerivation { + pname = "raspberrypi-wireless-firmware"; + version = "0-unstable-2025-04-08"; + + srcs = [ + (fetchFromGitHub { + name = "bluez-firmware"; + owner = "RPi-Distro"; + repo = "bluez-firmware"; + rev = "2bbfb8438e824f5f61dae3f6ebb367a6129a4d63"; + hash = "sha256-t+D4VUfEIov83KV4wiKp6TqXTHXGkxg/mANi4GW7QHs="; + }) + (fetchFromGitHub { + name = "firmware-nonfree"; + owner = "RPi-Distro"; + repo = "firmware-nonfree"; + rev = "c9d3ae6584ab79d19a4f94ccf701e888f9f87a53"; + hash = "sha256-5ywIPs3lpmqVOVP3B75H577fYkkucDqB7htY2U1DW8U="; + }) + ]; + + sourceRoot = "."; + + dontBuild = true; + # Firmware blobs do not need fixing and should not be modified + dontFixup = true; + + installPhase = '' + runHook preInstall + mkdir -p "$out/lib/firmware/brcm" + + # Wifi firmware + cp -rv "$NIX_BUILD_TOP/firmware-nonfree/debian/config/brcm80211/." "$out/lib/firmware/" + + # Bluetooth firmware + cp -rv "$NIX_BUILD_TOP/bluez-firmware/debian/firmware/broadcom/." "$out/lib/firmware/brcm" + + # brcmfmac43455-sdio.bin is a symlink to the non-existent path: ../cypress/cyfmac43455-sdio.bin. + # See https://github.com/RPi-Distro/firmware-nonfree/issues/26 + ln -s "./cyfmac43455-sdio-standard.bin" "$out/lib/firmware/cypress/cyfmac43455-sdio.bin" + + pushd $out/lib/firmware/brcm &>/dev/null + # Symlinks for Zero 2W + ln -s "./brcmfmac43436-sdio.clm_blob" "$out/lib/firmware/brcm/brcmfmac43430b0-sdio.clm_blob" + popd &>/dev/null + + runHook postInstall + ''; + + meta = { + description = "Firmware for builtin Wifi/Bluetooth devices in the Raspberry Pi 3+ and Zero W"; + homepage = "https://github.com/RPi-Distro/firmware-nonfree"; + license = lib.licenses.unfreeRedistributableFirmware; + maintainers = with lib.maintainers; [ lopsided98 ]; + platforms = lib.platforms.linux; + sourceProvenance = with lib.sourceTypes; [ binaryFirmware ]; + }; +}