diff --git a/hardkernel/odroid-m1/default.nix b/hardkernel/odroid-m1/default.nix index 067c50a..bde34d4 100644 --- a/hardkernel/odroid-m1/default.nix +++ b/hardkernel/odroid-m1/default.nix @@ -1,31 +1,36 @@ -# Based on kboot-conf by original authors povik and sstent. -# I'm just porting things over. the original work can be viewed at: -# https://github.com/sstent/nixos-on-odroid-m1 -# https://github.com/povik/nixos-on-odroid-n2 { config, pkgs, lib, ... }: { imports = [ - ./kboot-conf + ./petitboot ]; - #boot.loader.grub.enable = false; - boot.loader.kboot-conf.enable = true; + boot.loader.petitboot.enable = lib.mkForce true; + + # Fails to rebuild unless grub is explicitly disabled + boot.loader.grub.enable = lib.mkForce false; + + # TODO: Can this be removed? Presumably anything built with 25.11 / unstable + # or later will be on a kernel >6.6 # Use kernel >6.6 The devicetree is missing from kernel versions older than this. boot.kernelPackages = lib.mkIf (lib.versionOlder pkgs.linux.version "6.6") (lib.mkDefault pkgs.linuxPackages_latest); + + # TODO: Debug why removing this breaks booting from petitboot boot.supportedFilesystems = lib.mkForce ["btrfs" "cifs" "f2fs" "jfs" "ntfs" "reiserfs" "vfat" "xfs"]; - # I'm not completely sure if some of these could be omitted, - # but want to make sure disk access works + + # TODO: Some of these could potentially be omitted, check which ones are + # actually necessary for disk access to function boot.initrd.availableKernelModules = [ + # Only nvme emitted when using nixos-generate-config on my odroid-m1 "nvme" - "nvme-core" - "phy-rockchip-naneng-combphy" - "phy-rockchip-snps-pcie3" + # "nvme-core" + # "phy-rockchip-naneng-combphy" + # "phy-rockchip-snps-pcie3" ]; - # Petitboot uses this port and baud rate on the boards serial port, - # it's probably good to keep the options same for the running - # kernel for serial console access to work well + # Petitboot uses this port and baud rate on the board's serial port. It's + # probably good to keep the options same for the running kernel for serial + # console access to work well. boot.kernelParams = ["console=ttyS2,1500000"]; hardware.deviceTree.name = "rockchip/rk3568-odroid-m1.dtb"; } diff --git a/hardkernel/odroid-m1/kboot-conf/default.nix b/hardkernel/odroid-m1/kboot-conf/default.nix deleted file mode 100644 index 9d714a0..0000000 --- a/hardkernel/odroid-m1/kboot-conf/default.nix +++ /dev/null @@ -1,73 +0,0 @@ -{ config, lib, pkgs, ... }: - -let - cfg = config.boot.loader.kboot-conf; - - # The builder used to write during system activation - builder = pkgs.replaceVarsWith { - src = ./generate-kboot-conf.sh; - replacements = { - bash = pkgs.bash; - path = lib.makeBinPath [ - pkgs.coreutils - pkgs.gnused - pkgs.gnugrep - ]; - }; - name = "system-activation-generate-kboot-conf"; - isExecutable = true; - }; - # The builder exposed in populateCmd, which runs when building the sdImage - populateBuilder = pkgs.buildPackages.replaceVarsWith { - src = ./generate-kboot-conf.sh; - replacements = { - bash = pkgs.buildPackages.bash; - path = lib.makeBinPath [ - pkgs.buildPackages.coreutils - pkgs.buildPackages.gnused - pkgs.buildPackages.gnugrep - ]; - }; - name = "build-image-generate-kboot-conf"; - isExecutable = true; - }; -in -{ - options = { - boot.loader.kboot-conf = { - enable = lib.mkOption { - default = false; - type = lib.types.bool; - description = '' - Whether to create petitboot-compatible /kboot.conf - ''; - }; - configurationLimit = lib.mkOption { - default = 10; - example = 5; - type = lib.types.int; - description = '' - Maximum number of configurations in the generated kboot.conf. - ''; - }; - populateCmd = lib.mkOption { - type = lib.types.str; - readOnly = true; - description = '' - Contains the builder command used to populate an image, - honoring all options except the -c <path-to-default-configuration> - argument. - Useful to have for sdImage.populateRootCommands - ''; - }; - }; - }; - config = let - args = "-g ${toString cfg.configurationLimit} -n ${config.hardware.deviceTree.name}"; - in - lib.mkIf cfg.enable { - system.build.installBootLoader = lib.mkForce "${builder} ${args} -c"; - system.boot.loader.id = "kboot-conf"; - boot.loader.kboot-conf.populateCmd = "${populateBuilder} ${args}"; - }; -} diff --git a/hardkernel/odroid-m1/petitboot/default.nix b/hardkernel/odroid-m1/petitboot/default.nix new file mode 100644 index 0000000..48c395a --- /dev/null +++ b/hardkernel/odroid-m1/petitboot/default.nix @@ -0,0 +1,75 @@ +{ + config, + lib, + pkgs, + ... +}: + +let + cfg = config.boot.loader.petitboot; + args = "-g ${toString cfg.configurationLimit} -n ${config.hardware.deviceTree.name}"; + + # The installer used when running nixos-rebuild switch or similar + installer = pkgs.replaceVarsWith { + src = ./install-petitboot.sh; + replacements = { + bash = pkgs.bash; + path = lib.makeBinPath [ + pkgs.coreutils + pkgs.gnused + pkgs.gnugrep + ]; + }; + name = "install-petitboot"; + isExecutable = true; + }; + # The installer used to write to SD card images + sdImageInstaller = pkgs.buildPackages.replaceVarsWith { + src = ./install-petitboot.sh; + replacements = { + bash = pkgs.buildPackages.bash; + path = lib.makeBinPath [ + pkgs.buildPackages.coreutils + pkgs.buildPackages.gnused + pkgs.buildPackages.gnugrep + ]; + }; + name = "install-petitboot-sd-image"; + isExecutable = true; + }; +in +{ + options = { + boot.loader.petitboot = { + enable = lib.mkOption { + default = false; + type = lib.types.bool; + description = '' + Whether to enable the Petitboot bootloader. + ''; + }; + + configurationLimit = lib.mkOption { + default = 10; + example = 5; + type = lib.types.int; + description = '' + Maximum number of configurations to display when booting. + ''; + }; + }; + }; + + config = lib.mkMerge[ + (lib.mkIf config.boot.loader.petitboot.enable { + system.build.installBootLoader = lib.mkForce "${installer} ${args} -c"; + system.boot.loader.id = "petitboot"; + }) + + (lib.mkIf config.boot.loader.petitboot.enable && options ? sdImage { + sdImage.populateRootCommands = lib.mkForce '' + ${sdImageInstaller} ${args} -c ${config.system.build.toplevel} -d ./files/kboot.conf + '' + }) + ]; +} diff --git a/hardkernel/odroid-m1/kboot-conf/generate-kboot-conf.sh b/hardkernel/odroid-m1/petitboot/install-petitboot.sh similarity index 96% rename from hardkernel/odroid-m1/kboot-conf/generate-kboot-conf.sh rename to hardkernel/odroid-m1/petitboot/install-petitboot.sh index b1f9ad7..86a0011 100644 --- a/hardkernel/odroid-m1/kboot-conf/generate-kboot-conf.sh +++ b/hardkernel/odroid-m1/petitboot/install-petitboot.sh @@ -57,7 +57,7 @@ addEntry() { echo "'" } -echo "# Auto-generated by generate-kboot-conf.sh, do not edit" > $tmp +echo "# Auto-generated by install-petitboot.sh, do not edit or remove" > $tmp addEntry $default default >> $tmp if [ "$numGenerations" -gt 0 ]; then