{ config, pkgs, lib, inputs, modulesPath, ... }: # prior art: # https://github.com/dramforever/nixos-riscv-efi/ # https://github.com/NixOS/nixos-hardware/blob/master/starfive/visionfive/v2/sd-image.nix # https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/installer/sd-card/sd-image.nix # info: # https://u-boot.readthedocs.io/en/latest/develop/spl.html # https://github.com/starfive-tech/VisionFive2 # https://github.com/u-boot/u-boot/blob/master/doc/board/starfive/visionfive2.rst # https://github.com/starfive-tech/u-boot/commit/2a040b7720825629103c5b1efc5ace023072db8d # https://www.man7.org/linux/man-pages/man8/sfdisk.8.html # guidance # https://reddit.com/r/RISCV/comments/zy30vl/comment/j3zhzkx/ # https://forum.rvspace.org/t/nvme-boot-using-visionfive2-software-v2-11-5/2464/1 # https://forum.rvspace.org/t/i-tried-the-v3-0-4-sdcard-img-from-sdcard-and-from-nvme/2965 let firmware = pkgs.callPackage "${inputs.nixos-hardware}/starfive/visionfive/v2/firmware.nix" { }; in { options.efiImage = with lib; { imageBaseName = mkOption { default = "nixos-efi-image"; description = mdDoc "Prefix of the name of the generated image file."; }; compressImage = mkOption { type = types.bool; default = false; description = mdDoc "Whether the image should be compressed using {command}`zstd`."; }; }; config = { #assertions = [ # { # assertion = config.boot.loader.systemd-boot.enable; # message = "Building EFI Image requires systemd-boot"; # } #]; #fileSystems.${config.boot.loader.efi.efiSysMountPoint}.neededForBoot = true; #fileSystems."/".autoResize = true; #boot.growPartition = true; system.build.efiImage = pkgs.runCommand "efi-image" { nativeBuildInputs = with pkgs; [ util-linux # (partx) ] ++ lib.optional config.efiImage.compressImage zstd; rootImage = pkgs.callPackage "${modulesPath}/../lib/make-ext4-fs.nix" { storePaths = [ config.system.build.toplevel ]; volumeLabel = "NIXOS_ROOT"; populateImageCommands = '' mkdir -p ./files/boot ${config.boot.loader.generic-extlinux-compatible.populateCmd} -c ${config.system.build.toplevel} -d ./files/boot ''; }; skipSize = 1; # initial offset espSize = 512; # reserved boot partition size imageName = "${config.efiImage.imageBaseName}-${config.system.nixos.label}-${pkgs.stdenv.hostPlatform.system}-starfive-visionfive2.img"; } '' mkdir -p "$out" img="$out/$imageName" rootSizeBlocks="$(du -B 512 --apparent-size "$rootImage" | awk '{ print $1 }')" espSizeBlocks="$(( espSize * 1024 * 1024 / 512 ))" imageSize=$(( rootSizeBlocks * 512 + espSizeBlocks * 512 + skipSize * 1024 * 1024 + 1024 * 1024 )) truncate -s "$imageSize" "$img" sfdisk $img <