bpi-r3: more work on booting
(still doesnt boot) also some misc changes not related to bpi-r3
This commit is contained in:
parent
ebc7241725
commit
a96bd4bbcd
10
default.nix
Normal file
10
default.nix
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
(import
|
||||||
|
(
|
||||||
|
let lock = builtins.fromJSON (builtins.readFile ./flake.lock); in
|
||||||
|
fetchTarball {
|
||||||
|
url = "https://github.com/edolstra/flake-compat/archive/${lock.nodes.flake-compat.locked.rev}.tar.gz";
|
||||||
|
sha256 = lock.nodes.flake-compat.locked.narHash;
|
||||||
|
}
|
||||||
|
)
|
||||||
|
{ src = ./.; }
|
||||||
|
).defaultNix
|
19
flake.lock
19
flake.lock
|
@ -17,6 +17,22 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"flake-compat": {
|
"flake-compat": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1673956053,
|
||||||
|
"narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=",
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-compat_2": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1668681692,
|
"lastModified": 1668681692,
|
||||||
|
@ -142,7 +158,7 @@
|
||||||
"nixos-mailserver": {
|
"nixos-mailserver": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"blobs": "blobs",
|
"blobs": "blobs",
|
||||||
"flake-compat": "flake-compat",
|
"flake-compat": "flake-compat_2",
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
"nixpkgs"
|
"nixpkgs"
|
||||||
],
|
],
|
||||||
|
@ -237,6 +253,7 @@
|
||||||
},
|
},
|
||||||
"root": {
|
"root": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
|
"flake-compat": "flake-compat",
|
||||||
"home-manager": "home-manager",
|
"home-manager": "home-manager",
|
||||||
"impermanence": "impermanence",
|
"impermanence": "impermanence",
|
||||||
"nix-gaming": "nix-gaming",
|
"nix-gaming": "nix-gaming",
|
||||||
|
|
|
@ -27,6 +27,10 @@
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
inputs.nixpkgs-22_11.follows = "nixpkgs";
|
inputs.nixpkgs-22_11.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
|
flake-compat = {
|
||||||
|
url = "github:edolstra/flake-compat";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs = inputs@{ self, nixpkgs, nixos-hardware, impermanence, home-manager, nur, nix-gaming, notlua, nixos-mailserver, ... }:
|
outputs = inputs@{ self, nixpkgs, nixos-hardware, impermanence, home-manager, nur, nix-gaming, notlua, nixos-mailserver, ... }:
|
||||||
|
|
|
@ -18,7 +18,14 @@
|
||||||
# position = "bottom";
|
# position = "bottom";
|
||||||
ipc = true;
|
ipc = true;
|
||||||
height = 40;
|
height = 40;
|
||||||
modules-left = [ "sway/workspaces" "sway/mode" "mpris" ];
|
modules-left = [ "sway/workspaces" "sway/mode" "idle_inhibitor" "mpris" ];
|
||||||
|
idle_inhibitor = {
|
||||||
|
format = "{icon}";
|
||||||
|
format-icons = {
|
||||||
|
activated = "";
|
||||||
|
deactivated = "";
|
||||||
|
};
|
||||||
|
};
|
||||||
mpris = {
|
mpris = {
|
||||||
tooltip = true;
|
tooltip = true;
|
||||||
format = "{player_icon} {dynamic}";
|
format = "{player_icon} {dynamic}";
|
||||||
|
|
|
@ -106,6 +106,7 @@
|
||||||
glaxnimate
|
glaxnimate
|
||||||
lalrpop
|
lalrpop
|
||||||
looking-glass-client
|
looking-glass-client
|
||||||
|
tio
|
||||||
];
|
];
|
||||||
xdg.configFile."looking-glass/client.ini".text = ''
|
xdg.configFile."looking-glass/client.ini".text = ''
|
||||||
[app]
|
[app]
|
||||||
|
|
|
@ -23,11 +23,11 @@
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"src": {
|
"src": {
|
||||||
"name": null,
|
"name": null,
|
||||||
"sha256": "sha256-JYGwb0LhIs6B2/OHiU+mJ/dAAS+Dg+MrVksAsn6IS9g=",
|
"sha256": "sha256-OPwmVxBGaWo51pDJcqvxvZ8qxMH8X0DwZTpwiKbdx/I=",
|
||||||
"type": "url",
|
"type": "url",
|
||||||
"url": "https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton8-3/GE-Proton8-3.tar.gz"
|
"url": "https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton8-4/GE-Proton8-4.tar.gz"
|
||||||
},
|
},
|
||||||
"version": "GE-Proton8-3"
|
"version": "GE-Proton8-4"
|
||||||
},
|
},
|
||||||
"yomichan": {
|
"yomichan": {
|
||||||
"cargoLocks": null,
|
"cargoLocks": null,
|
||||||
|
|
|
@ -11,10 +11,10 @@
|
||||||
};
|
};
|
||||||
proton-ge = {
|
proton-ge = {
|
||||||
pname = "proton-ge";
|
pname = "proton-ge";
|
||||||
version = "GE-Proton8-3";
|
version = "GE-Proton8-4";
|
||||||
src = fetchurl {
|
src = fetchurl {
|
||||||
url = "https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton8-3/GE-Proton8-3.tar.gz";
|
url = "https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton8-4/GE-Proton8-4.tar.gz";
|
||||||
sha256 = "sha256-JYGwb0LhIs6B2/OHiU+mJ/dAAS+Dg+MrVksAsn6IS9g=";
|
sha256 = "sha256-OPwmVxBGaWo51pDJcqvxvZ8qxMH8X0DwZTpwiKbdx/I=";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
yomichan = {
|
yomichan = {
|
||||||
|
|
31
pkgs/bpi-r3-atf-backport-mkimage-support.patch
Normal file
31
pkgs/bpi-r3-atf-backport-mkimage-support.patch
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
diff --git a/plat/mediatek/mt7986/platform.mk b/plat/mediatek/mt7986/platform.mk
|
||||||
|
index c232d7a..27a165d 100644
|
||||||
|
--- a/plat/mediatek/mt7986/platform.mk
|
||||||
|
+++ b/plat/mediatek/mt7986/platform.mk
|
||||||
|
@@ -456,6 +456,7 @@ else
|
||||||
|
bl2: $(BUILD_PLAT)/bl2.img
|
||||||
|
endif
|
||||||
|
|
||||||
|
+ifneq ($(USE_MKIMAGE),1)
|
||||||
|
ifneq ($(BROM_SIGN_KEY),)
|
||||||
|
$(BUILD_PLAT)/bl2.img: $(BROM_SIGN_KEY)
|
||||||
|
endif
|
||||||
|
@@ -472,6 +473,18 @@ $(BUILD_PLAT)/bl2.img: $(BL2_IMG_PAYLOAD) $(DOIMAGETOOL)
|
||||||
|
$(if $(BL_AR_VER), -r $(BL_AR_VER)) \
|
||||||
|
$(if $(NAND_TYPE), -n $(NAND_TYPE)) \
|
||||||
|
$(BL2_IMG_PAYLOAD) $@
|
||||||
|
+else
|
||||||
|
+MKIMAGE ?= mkimage
|
||||||
|
+
|
||||||
|
+ifneq ($(BROM_SIGN_KEY)$(AUTO_AR_VER),)
|
||||||
|
+$(warning BL2 signing/anti-rollback is not supported using mkimage)
|
||||||
|
+endif
|
||||||
|
+
|
||||||
|
+$(BUILD_PLAT)/bl2.img: $(BL2_IMG_PAYLOAD)
|
||||||
|
+ $(Q)$(MKIMAGE) -T mtk_image -a $(BL2_BASE) -e $(BL2_BASE) \
|
||||||
|
+ -n "arm64=1;media=$(BROM_HEADER_TYPE)$(if $(NAND_TYPE),;nandinfo=$(NAND_TYPE))" \
|
||||||
|
+ -d $(BL2_IMG_PAYLOAD) $@
|
||||||
|
+endif
|
||||||
|
|
||||||
|
$(DOIMAGETOOL):
|
||||||
|
$(Q)$(MAKE) --no-print-directory -C $(DOIMAGEPATH)
|
142
pkgs/default.nix
142
pkgs/default.nix
|
@ -8,12 +8,73 @@ let
|
||||||
sources = import ./_sources/generated.nix {
|
sources = import ./_sources/generated.nix {
|
||||||
inherit (pkgs) fetchgit fetchurl fetchFromGitHub dockerTools;
|
inherit (pkgs) fetchgit fetchurl fetchFromGitHub dockerTools;
|
||||||
};
|
};
|
||||||
|
armTrustedFirmwareBpiR3 = { bootDevice, uboot ? null }: pkgs.buildArmTrustedFirmware rec {
|
||||||
|
# TODO: nvfetcherify this
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
owner = "frank-w";
|
||||||
|
repo = "u-boot";
|
||||||
|
rev = "c30a1caf8274af67bf31f3fb5abc45df5737df36";
|
||||||
|
hash = "sha256-pW2yytXRIFEIbG1gnuXq8TiLe/Eew7zESe6Pijh2qVk=";
|
||||||
|
};
|
||||||
|
patches = [ ./bpi-r3-atf-backport-mkimage-support.patch ];
|
||||||
|
extraMakeFlags = assert builtins.elem bootDevice [
|
||||||
|
"nor" "snand" "spim-nand" "emmc" "sdmmc" "ram"
|
||||||
|
]; [
|
||||||
|
"BOOT_DEVICE=${bootDevice}"
|
||||||
|
"DRAM_USE_DDR4=1"
|
||||||
|
"USE_MKIMAGE=1"
|
||||||
|
"MKIMAGE=${pkgs.ubootTools}/bin/mkimage"
|
||||||
|
"all"
|
||||||
|
"fip"
|
||||||
|
] ++ lib.optionals (uboot != null) [
|
||||||
|
"BL33=${uboot}/u-boot.bin"
|
||||||
|
];
|
||||||
|
extraMeta.platforms = [ "aarch64-linux" ];
|
||||||
|
platform = "mt7986";
|
||||||
|
filesToInstall = [
|
||||||
|
"build/${platform}/release/bl2.img"
|
||||||
|
"build/${platform}/release/fip.bin"
|
||||||
|
];
|
||||||
|
nativeBuildInputs = with pkgs; [ /*pkgsCross.arm-embedded.stdenv.cc*/ dtc ];
|
||||||
|
};
|
||||||
|
# sd/emmc
|
||||||
|
# -- CONFIG_USE_BOOTCOMMAND/CONFIG_BOOTCOMMAND - distroboot stuff (override default boot command)
|
||||||
|
# -- CONFIG_BOOTDELAY - autoboot timeout
|
||||||
|
# CONFIG_BOOTSTD_DEFAULTS - stdboot stuff
|
||||||
|
# CONFIG_BOOTSTD_BOOTCOMMAND - might be? an alternative to CONFIG_BOOTCOMMAND
|
||||||
|
# CONFIG_DEFAULT_FDT_FILE - compatibility with nixos
|
||||||
|
# CONFIG_DISTRO_DEFAULTS - surely this won't hurt, it adds autocomplete and stuff and doesn't weight much in the large scale of things
|
||||||
|
# CONFIG_SYS_BOOTM_LEN - increase max initrd? size
|
||||||
|
# CONFIG_ZSTD - allow zstd initrd
|
||||||
|
ubootConfig = storage: ''
|
||||||
|
CONFIG_AUTOBOOT=y
|
||||||
|
CONFIG_BOOTCOMMAND="${builtins.replaceStrings [ "\n" ] [ "; " ] ''
|
||||||
|
setenv boot_prefixes /@boot/ /@/ /boot/ /
|
||||||
|
run distro_bootcmd
|
||||||
|
''};"
|
||||||
|
CONFIG_BOOTSTD_DEFAULTS=y
|
||||||
|
CONFIG_BOOTSTD_FULL=y
|
||||||
|
CONFIG_CMD_BTRFS=y
|
||||||
|
CONFIG_CMD_CAT=y
|
||||||
|
CONFIG_DEFAULT_FDT_FILE="mediatek/mt7986a-bananapi-bpi-r3.dtb"
|
||||||
|
CONFIG_DISTRO_DEFAULTS=y
|
||||||
|
CONFIG_ENV_IS_NOWHERE=y
|
||||||
|
CONFIG_FS_BTRFS=y
|
||||||
|
CONFIG_SYS_BOOTM_LEN=0x6000000
|
||||||
|
CONFIG_USE_BOOTCOMMAND=y
|
||||||
|
CONFIG_ZSTD=y
|
||||||
|
'';
|
||||||
|
ubootVersion = "2023.07-rc3";
|
||||||
|
ubootSrc = pkgs.fetchurl {
|
||||||
|
url = "ftp://ftp.denx.de/pub/u-boot/u-boot-${ubootVersion}.tar.bz2";
|
||||||
|
hash = "sha256-QuwINnS9MPpMFueMP19FPAjZ9zdZWne13aWVrDoJ2C8=";
|
||||||
|
};
|
||||||
in
|
in
|
||||||
|
|
||||||
{
|
rec {
|
||||||
osu-lazer-bin = nix-gaming.osu-lazer-bin;
|
osu-lazer-bin = nix-gaming.osu-lazer-bin;
|
||||||
clang-tools_latest = pkgs.clang-tools_15;
|
clang-tools_latest = pkgs.clang-tools_16;
|
||||||
clang_latest = pkgs.clang_15;
|
clang_latest = pkgs.clang_16;
|
||||||
home-daemon = callPackage ./home-daemon { };
|
home-daemon = callPackage ./home-daemon { };
|
||||||
/*ghidra = pkgs.ghidra.overrideAttrs (old: {
|
/*ghidra = pkgs.ghidra.overrideAttrs (old: {
|
||||||
patches = old.patches ++ [ ./ghidra-stdcall.patch ];
|
patches = old.patches ++ [ ./ghidra-stdcall.patch ];
|
||||||
|
@ -43,6 +104,81 @@ in
|
||||||
# system76-scheduler = callPackage ./system76-scheduler.nix { };
|
# system76-scheduler = callPackage ./system76-scheduler.nix { };
|
||||||
techmino = callPackage ./techmino { };
|
techmino = callPackage ./techmino { };
|
||||||
|
|
||||||
|
ubootBpiR3Sd = pkgs.buildUBoot {
|
||||||
|
defconfig = "mt7986a_bpir3_sd_defconfig";
|
||||||
|
extraConfig = ubootConfig "sd";
|
||||||
|
src = ubootSrc;
|
||||||
|
version = ubootVersion;
|
||||||
|
extraMeta.platforms = [ "aarch64-linux" ];
|
||||||
|
# https://github.com/nakato/nixos-bpir3-example/blob/main/pkgs/uboot/mt7986-default-bootcmd.patch
|
||||||
|
patches = [ ./mt7986-default-bootcmd.patch ];
|
||||||
|
filesToInstall = [ "u-boot.bin" ];
|
||||||
|
};
|
||||||
|
ubootBpiR3Emmc = pkgs.buildUBoot {
|
||||||
|
defconfig = "mt7986a_bpir3_emmc_defconfig";
|
||||||
|
extraConfig = ubootConfig "emmc";
|
||||||
|
src = ubootSrc;
|
||||||
|
version = ubootVersion;
|
||||||
|
extraMeta.platforms = [ "aarch64-linux" ];
|
||||||
|
patches = [ ./mt7986-default-bootcmd.patch ];
|
||||||
|
filesToInstall = [ "u-boot.bin" ];
|
||||||
|
};
|
||||||
|
armTrustedFirmwareBpiR3Sd = armTrustedFirmwareBpiR3 { uboot = ubootBpiR3Sd; bootDevice = "sdmmc"; };
|
||||||
|
armTrustedFirmwareBpiR3Emmc = armTrustedFirmwareBpiR3 { uboot = ubootBpiR3Emmc; bootDevice = "emmc"; };
|
||||||
|
bpiR3StuffCombined = pkgs.stdenvNoCC.mkDerivation {
|
||||||
|
name = "bpi-r3-stuff";
|
||||||
|
unpackPhase = "true";
|
||||||
|
buildPhase = "true";
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -p $out/sd
|
||||||
|
mkdir -p $out/emmc
|
||||||
|
cp ${bpiR3StuffEmmc}/* $out/emmc
|
||||||
|
cp ${bpiR3StuffSd}/* $out/sd
|
||||||
|
'';
|
||||||
|
fixupPhase = "true";
|
||||||
|
};
|
||||||
|
bpiR3StuffEmmc = pkgs.stdenvNoCC.mkDerivation {
|
||||||
|
name = "bpi-r3-stuff-emmc";
|
||||||
|
unpackPhase = "true";
|
||||||
|
buildPhase = "true";
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -p $out
|
||||||
|
cp ${ubootBpiR3Emmc}/*.* $out
|
||||||
|
cp ${armTrustedFirmwareBpiR3Emmc}/*.* $out
|
||||||
|
'';
|
||||||
|
fixupPhase = "true";
|
||||||
|
};
|
||||||
|
bpiR3StuffSd = pkgs.stdenvNoCC.mkDerivation {
|
||||||
|
name = "bpi-r3-stuff-sd";
|
||||||
|
unpackPhase = "true";
|
||||||
|
buildPhase = "true";
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -p $out
|
||||||
|
cp ${ubootBpiR3Sd}/*.* $out
|
||||||
|
cp ${armTrustedFirmwareBpiR3Sd}/*.* $out
|
||||||
|
'';
|
||||||
|
fixupPhase = "true";
|
||||||
|
};
|
||||||
|
linux_bpiR3 = (pkgs.buildLinux ({
|
||||||
|
version = "6.3";
|
||||||
|
modDirVersion = "6.3.0";
|
||||||
|
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
owner = "frank-w";
|
||||||
|
repo = "BPI-Router-Linux";
|
||||||
|
rev = "6.3-main";
|
||||||
|
hash = lib.fakeHash;
|
||||||
|
};
|
||||||
|
|
||||||
|
defconfig = "mt7986a_bpi-r3";
|
||||||
|
})).overrideAttrs (old: {
|
||||||
|
postConfigure = ''
|
||||||
|
sed -i "$buildRoot/.config" -e 's%^CONFIG_LOCALVERSION=.*%CONFIG_LOCALVERSION=""%'
|
||||||
|
sed -i "$buildRoot/include/config/auto.conf" -e 's%^CONFIG_LOCALVERSION=.*%CONFIG_LOCALVERSION=""%'
|
||||||
|
'';
|
||||||
|
});
|
||||||
|
linuxPackages_bpiR3 = pkgs.linuxPackagesFor linux_bpiR3;
|
||||||
|
|
||||||
firefox-addons = lib.recurseIntoAttrs (callPackage ./firefox-addons { inherit nur sources; });
|
firefox-addons = lib.recurseIntoAttrs (callPackage ./firefox-addons { inherit nur sources; });
|
||||||
mpvScripts = pkgs.mpvScripts // (callPackage ./mpv-scripts { });
|
mpvScripts = pkgs.mpvScripts // (callPackage ./mpv-scripts { });
|
||||||
}
|
}
|
||||||
|
|
75
pkgs/mt7986-default-bootcmd.patch
Normal file
75
pkgs/mt7986-default-bootcmd.patch
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
diff --git a/include/configs/mt7986.h b/include/configs/mt7986.h
|
||||||
|
index 0c41af1fc3..4ddf3cef89 100644
|
||||||
|
--- a/include/configs/mt7986.h
|
||||||
|
+++ b/include/configs/mt7986.h
|
||||||
|
@@ -9,6 +9,8 @@
|
||||||
|
#ifndef __MT7986_H
|
||||||
|
#define __MT7986_H
|
||||||
|
|
||||||
|
+#include <linux/stringify.h>
|
||||||
|
+
|
||||||
|
/* Uboot definition */
|
||||||
|
#define CFG_SYS_UBOOT_BASE CONFIG_TEXT_BASE
|
||||||
|
|
||||||
|
@@ -18,4 +20,61 @@
|
||||||
|
/* DRAM */
|
||||||
|
#define CFG_SYS_SDRAM_BASE 0x40000000
|
||||||
|
|
||||||
|
+#define BOOT_TARGET_DEVICES(func) \
|
||||||
|
+ func(MMC, mmc, 0)
|
||||||
|
+
|
||||||
|
+#include <config_distro_bootcmd.h>
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Linux mt6978a.dtsi defines reserved memory in the first 256MB:
|
||||||
|
+ * 0x4300_0000 - 0x4302_FFFF
|
||||||
|
+ * 0x4FC0_0000 - 0x4FCF_FFFF
|
||||||
|
+ * 0x4FD0_0000 - 0x4FD3_FFFF
|
||||||
|
+ * 0x4FD4_0000 - 0x4FD7_FFFF
|
||||||
|
+ * 0x4FD8_0000 - 0x4FDA_3FFF
|
||||||
|
+ *
|
||||||
|
+ * Getting uboot to obey these by adding them into the DTS here
|
||||||
|
+ * got it respecting them. To not clobber these memory addresses
|
||||||
|
+ * fdt_high and initrd_high are being set.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Do not relocate FDT, because relocate fails to alloc when
|
||||||
|
+ * initrd_high is set to 0x4FC0_0000 to keep initrd out of
|
||||||
|
+ * reserved memory. This is irregardless of the reserved
|
||||||
|
+ * addresses above still being valid as far as configuraiton
|
||||||
|
+ * is concerned at that point, so I'm at a loss.
|
||||||
|
+ */
|
||||||
|
+#define FDT_HIGH __stringify(0xffffffffffffffff)
|
||||||
|
+/* No reloc might work now that FDT is in-place, but this should be more compatible */
|
||||||
|
+#define INITRD_HIGH __stringify(0x4fc00000)
|
||||||
|
+
|
||||||
|
+/* Seems to be the address uboot would relocate to so place there */
|
||||||
|
+#define KERNEL_ADDR_R __stringify(0x43200000)
|
||||||
|
+/* Right before the kernel, after that reserved memory, probably best spots exist */
|
||||||
|
+#define FDT_ADDR_R __stringify(0x43030000)
|
||||||
|
+
|
||||||
|
+#define RAMDISK_ADDR_R __stringify(0x4b100000)
|
||||||
|
+
|
||||||
|
+/* Anything different means no-boot */
|
||||||
|
+#define BOOTM_SIZE __stringify(0x10000000)
|
||||||
|
+
|
||||||
|
+/* These can be outside Linux's 256MB */
|
||||||
|
+#define SCRIPTADDR __stringify(0x90000000)
|
||||||
|
+#define PXEFILE_ADDR_R __stringify(0x90100000)
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+/* No comp_addr supplied */
|
||||||
|
+#define CFG_EXTRA_ENV_SETTINGS \
|
||||||
|
+ "bootm_size=" BOOTM_SIZE "\0" \
|
||||||
|
+ "fdt_addr_r=" FDT_ADDR_R "\0" \
|
||||||
|
+ "fdt_high=" FDT_HIGH "\0" \
|
||||||
|
+ "initrd_high=" INITRD_HIGH "\0" \
|
||||||
|
+ "kernel_addr_r=" KERNEL_ADDR_R "\0" \
|
||||||
|
+ "pxefile_addr_r=" PXEFILE_ADDR_R "\0" \
|
||||||
|
+ "ramdisk_addr_r=" RAMDISK_ADDR_R "\0" \
|
||||||
|
+ "scriptaddr=" SCRIPTADDR "\0" \
|
||||||
|
+ "fdtfile=" CONFIG_DEFAULT_FDT_FILE "\0" \
|
||||||
|
+ BOOTENV
|
||||||
|
+
|
||||||
|
#endif
|
|
@ -10,3 +10,13 @@ fetch.url = "https://github.com/FooSoft/yomichan/releases/download/$ver/yomichan
|
||||||
# allow prereleases
|
# allow prereleases
|
||||||
src.github_tag = "FastForwardTeam/FastForward"
|
src.github_tag = "FastForwardTeam/FastForward"
|
||||||
fetch.url = "https://github.com/FastForwardTeam/FastForward/releases/download/$ver/fastforwardteam-$ver.xpi"
|
fetch.url = "https://github.com/FastForwardTeam/FastForward/releases/download/$ver/fastforwardteam-$ver.xpi"
|
||||||
|
|
||||||
|
# nix-prefetch doesnt work with git right now for some reason, whatever
|
||||||
|
# [atf-bpir3]
|
||||||
|
# src.git = "https://github.com/frank-w/u-boot.git"
|
||||||
|
# src.branch = "r3-atf"
|
||||||
|
# src.use_commit = true
|
||||||
|
# fetch.git = "https://github.com/frank-w/u-boot.git"
|
||||||
|
# fetch.branch = "$ver"
|
||||||
|
#fetch.github = "frank-w/u-boot"
|
||||||
|
# fetch.branch = "r3-atf"
|
||||||
|
|
|
@ -1,35 +1,26 @@
|
||||||
{ pkgs
|
{ pkgs
|
||||||
, lib
|
|
||||||
, ... }:
|
, ... }:
|
||||||
|
|
||||||
# WIP
|
|
||||||
{
|
{
|
||||||
boot.loader = {
|
boot.loader = {
|
||||||
grub.enable = false;
|
grub.enable = false;
|
||||||
generic-extlinux-compatible.enable = true;
|
generic-extlinux-compatible.enable = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
# https://github.com/frank-w/BPI-Router-Linux
|
# i'm not about to build a kernel on every update without an arm device...
|
||||||
boot.kernelPackages = pkgs.linuxPackagesFor ((pkgs.buildLinux ({
|
# i guess i could use my phone for building it, but no, not interested
|
||||||
version = "6.3";
|
boot.kernelPackages = pkgs.linuxPackages_testing;
|
||||||
modDirVersion = "6.3.0";
|
# boot.kernelPackages = pkgs.linuxPackages_bpiR3;
|
||||||
|
|
||||||
src = pkgs.fetchFromGitHub {
|
|
||||||
owner = "frank-w";
|
|
||||||
repo = "BPI-Router-Linux";
|
|
||||||
rev = "6.3-main";
|
|
||||||
hash = lib.fakeHash;
|
|
||||||
};
|
|
||||||
|
|
||||||
defconfig = "mt7986a_bpi-r3";
|
|
||||||
})).overrideAttrs (old: {
|
|
||||||
postConfigure = ''
|
|
||||||
sed -i "$buildRoot/.config" -e 's/^CONFIG_LOCALVERSION=.*/CONFIG_LOCALVERSION=""/'
|
|
||||||
sed -i "$buildRoot/include/config/auto.conf" -e 's/^CONFIG_LOCALVERSION=.*/CONFIG_LOCALVERSION=""/'
|
|
||||||
'';
|
|
||||||
}));
|
|
||||||
|
|
||||||
hardware.deviceTree.enable = true;
|
hardware.deviceTree.enable = true;
|
||||||
hardware.deviceTree.filter = "mt7986a-bananapi-bpi-r3*.dtb";
|
hardware.deviceTree.filter = "*mt7986*";
|
||||||
hardware.enableRedistributableFirmware = true;
|
hardware.enableRedistributableFirmware = true;
|
||||||
|
|
||||||
|
# # disable a bunch of useless drivers
|
||||||
|
# boot.initrd.includeDefaultModules = false;
|
||||||
|
# boot.initrd.availableKernelModules = [ "mmc_block" "dm_mod" "rfkill" "cfg80211" "mt7915e" "ubi" "sdhci" "sd_mod" "sr_mod" "xhci_pci" ];
|
||||||
|
boot.kernelParams = [ "console=ttyS0,115200" ];
|
||||||
|
|
||||||
|
boot.initrd.compressor = "zstd";
|
||||||
|
nixpkgs.buildPlatform = "x86_64-linux";
|
||||||
}
|
}
|
||||||
|
|
|
@ -231,5 +231,7 @@ in {
|
||||||
};
|
};
|
||||||
|
|
||||||
programs.ccache.enable = true;
|
programs.ccache.enable = true;
|
||||||
|
services.sshd.enable = true;
|
||||||
|
boot.binfmt.emulatedSystems = [ "aarch64-linux" ];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,17 @@
|
||||||
{ config
|
{ config
|
||||||
|
, pkgs
|
||||||
, ... }:
|
, ... }:
|
||||||
|
|
||||||
|
# EMMC size: 7818182656
|
||||||
|
|
||||||
let
|
let
|
||||||
rootUuid = "00000000-0000-0000-0000-000000000000";
|
rootUuid = "44444444-4444-4444-8888-888888888888";
|
||||||
rootPart = "/dev/disk/by-uuid/${rootUuid}";
|
rootPart = "/dev/disk/by-uuid/${rootUuid}";
|
||||||
|
rootfsImage = pkgs.callPackage "${pkgs.path}/nixos/lib/make-ext4-fs.nix" {
|
||||||
|
storePaths = config.system.build.toplevel;
|
||||||
|
compressImage = false;
|
||||||
|
volumeLabel = "NIX_ROOTFS";
|
||||||
|
};
|
||||||
in {
|
in {
|
||||||
system.stateVersion = "22.11";
|
system.stateVersion = "22.11";
|
||||||
# TODO
|
# TODO
|
||||||
|
@ -13,16 +21,41 @@ in {
|
||||||
options = [ "defaults" "size=2G" "mode=755" ]; };
|
options = [ "defaults" "size=2G" "mode=755" ]; };
|
||||||
"/persist" =
|
"/persist" =
|
||||||
{ device = rootPart; fsType = "btrfs"; neededForBoot = true;
|
{ device = rootPart; fsType = "btrfs"; neededForBoot = true;
|
||||||
options = [ ]; };
|
options = [ "compress=zstd:15" "subvol=@" ]; };
|
||||||
|
"/boot" =
|
||||||
|
{ device = rootPart; fsType = "btrfs"; neededForBoot = true;
|
||||||
|
options = [ "subvol=@boot" ]; };
|
||||||
|
"/nix" =
|
||||||
|
{ device = rootPart; fsType = "btrfs"; neededForBoot = true;
|
||||||
|
options = [ "compress=zstd:15" "subvol=@nix" ]; };
|
||||||
};
|
};
|
||||||
|
services.openssh.enable = true;
|
||||||
impermanence = {
|
impermanence = {
|
||||||
enable = true;
|
enable = true;
|
||||||
path = /persist;
|
path = /persist;
|
||||||
directories = [
|
directories = [
|
||||||
{ directory = /home/${config.common.mainUsername}; user = config.common.mainUsername; group = config.common.mainUsername; mode = "0700"; }
|
{ directory = /home/${config.common.mainUsername}; user = config.common.mainUsername; group = config.common.mainUsername; mode = "0700"; }
|
||||||
{ directory = /root; mode = "0700"; }
|
{ directory = /root; mode = "0700"; }
|
||||||
/nix
|
|
||||||
/boot
|
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
hardware.wirelessRegulatoryDatabase = true;
|
||||||
|
system.build.emmcImage = pkgs.callPackage ./image.nix {
|
||||||
|
inherit config rootfsImage;
|
||||||
|
bpiR3Stuff = pkgs.bpiR3StuffEmmc;
|
||||||
|
};
|
||||||
|
system.build.sdImage = pkgs.callPackage ./image.nix {
|
||||||
|
inherit config rootfsImage;
|
||||||
|
bpiR3Stuff = pkgs.bpiR3StuffSd;
|
||||||
|
};
|
||||||
|
system.build.rootfs = rootfsImage;
|
||||||
|
boot.postBootCommands = ''
|
||||||
|
if [ -f ${toString config.impermanence.path}/nix-path-registration ]; then
|
||||||
|
${config.nix.package.out}/bin/nix-store --load-db < ${toString config.impermanence.path}/nix-path-registration
|
||||||
|
mkdir -p /etc
|
||||||
|
touch /etc/NIXOS
|
||||||
|
${config.nix.package.out}/bin/nix-env -p /nix/var/nix/profiles/system --set /run/current-system
|
||||||
|
rm -f ${toString config.impermanence.path}/nix-path-registration
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
boot.kernelParams = [ "boot.shell_on_fail" ];
|
||||||
}
|
}
|
||||||
|
|
99
system/hosts/router/image.nix
Normal file
99
system/hosts/router/image.nix
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
{ gptfdisk
|
||||||
|
, e2fsprogs
|
||||||
|
, util-linux
|
||||||
|
, zstd
|
||||||
|
, btrfs-progs
|
||||||
|
, vmTools
|
||||||
|
, runCommand
|
||||||
|
, jq
|
||||||
|
, kmod
|
||||||
|
, udev
|
||||||
|
, nix
|
||||||
|
, lkl
|
||||||
|
|
||||||
|
, bpiR3Stuff
|
||||||
|
, config
|
||||||
|
, rootfsImage
|
||||||
|
, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
imageSize = 7818182656;
|
||||||
|
bl2Start = 34;
|
||||||
|
bl2End = 8191;
|
||||||
|
envStart = 8192;
|
||||||
|
envEnd = 9215;
|
||||||
|
factoryStart = 9216;
|
||||||
|
factoryEnd = 13311;
|
||||||
|
fipStart = 13312;
|
||||||
|
fipEnd = 17407;
|
||||||
|
rootPartStart = fipEnd + 1;
|
||||||
|
rootPartEnd = builtins.floor (imageSize / 512) - 100;
|
||||||
|
in
|
||||||
|
|
||||||
|
# the vm is suuuuuper slow
|
||||||
|
# so, do as much as possible outside of it
|
||||||
|
# but i still need it to create subvolumes
|
||||||
|
|
||||||
|
vmTools.runInLinuxVM (runCommand "bpi-r3-fs" {
|
||||||
|
enableParallelBuildingByDefault = true;
|
||||||
|
nativeBuildInputs = [
|
||||||
|
btrfs-progs
|
||||||
|
# dosfstools
|
||||||
|
e2fsprogs
|
||||||
|
util-linux # sfdisk
|
||||||
|
config.system.build.nixos-install
|
||||||
|
jq
|
||||||
|
kmod
|
||||||
|
udev
|
||||||
|
gptfdisk
|
||||||
|
zstd
|
||||||
|
nix
|
||||||
|
lkl
|
||||||
|
];
|
||||||
|
preVM = ''
|
||||||
|
img=./result.img
|
||||||
|
ls /dev/fuse /etc/mtab || (echo "Must have /dev/fuse and /etc/mtab in nix options (extra-sandbox-paths)" && exit 1)
|
||||||
|
${vmTools.qemu}/bin/qemu-img create -f raw $img 7818182656
|
||||||
|
truncate -s ${toString imageSize} $img
|
||||||
|
|
||||||
|
${gptfdisk}/bin/sgdisk -o \
|
||||||
|
--set-alignment=2 \
|
||||||
|
-n 1:${toString bl2Start}:${toString bl2End} -c 1:bl2 -A 1:set:2 \
|
||||||
|
-n 2:${toString envStart}:${toString envEnd} -c 2:u-boot-env \
|
||||||
|
-n 3:${toString factoryStart}:${toString factoryEnd} -c 3:factory \
|
||||||
|
-n 4:${toString fipStart}:${toString fipEnd} -c 4:fip \
|
||||||
|
-n 5:${toString rootPartStart}:${toString rootPartEnd} -c 5:root -A 5:set:2 \
|
||||||
|
$img
|
||||||
|
dd conv=notrunc if=${bpiR3Stuff}/bl2.img of=$img seek=${toString bl2Start}
|
||||||
|
dd conv=notrunc if=${bpiR3Stuff}/fip.bin of=$img seek=${toString fipStart}
|
||||||
|
truncate -s ${toString ((rootPartEnd - rootPartStart + 1) * 512)} ./tmp.img
|
||||||
|
${btrfs-progs}/bin/mkfs.btrfs \
|
||||||
|
--label NIXOS_SD \
|
||||||
|
--uuid "44444444-4444-4444-8888-888888888889" \
|
||||||
|
./tmp.img
|
||||||
|
'';
|
||||||
|
# i give up on making this work in a nix derivation, just do the rest in a script (./image.sh)
|
||||||
|
# (i could do more in a vm but thats too slow, i could program a custom userspace utility but thats too annoying)
|
||||||
|
postVM = ''
|
||||||
|
# Truncate the file at the end of the last partition
|
||||||
|
img=./result.img
|
||||||
|
mkdir -p $out/boot
|
||||||
|
${config.boot.loader.generic-extlinux-compatible.populateCmd} -c ${config.system.build.toplevel} -d $out/boot -g 0
|
||||||
|
cp ${rootfsImage} $out/rootfs.ext4
|
||||||
|
cp tmp.img $out/template.btrfs
|
||||||
|
cp $img $out/image.img
|
||||||
|
echo ${toString rootPartStart} > $out/metadata
|
||||||
|
echo ${toString rootPartEnd} >> $out/metadata
|
||||||
|
'';
|
||||||
|
memSize = "4G";
|
||||||
|
QEMU_OPTS = "-drive file=./tmp.img,format=raw,if=virtio,cache=unsafe,werror=report -rtc base=2000-01-01,clock=vm";
|
||||||
|
} ''
|
||||||
|
modprobe btrfs
|
||||||
|
mkdir -p /mnt
|
||||||
|
mount -t btrfs -o space_cache=v2 /dev/vda /mnt
|
||||||
|
btrfs filesystem resize max /mnt
|
||||||
|
btrfs subvolume create /mnt/@boot
|
||||||
|
btrfs subvolume create /mnt/@
|
||||||
|
btrfs subvolume create /mnt/@nix
|
||||||
|
chattr +C /mnt/@boot
|
||||||
|
'')
|
91
system/hosts/router/image.sh
Executable file
91
system/hosts/router/image.sh
Executable file
|
@ -0,0 +1,91 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# this step requires either root access or access to fuse
|
||||||
|
# nix builder doesnt have access to either
|
||||||
|
# i could run this in a vm, but that's slow as fuck because i'm building this on x86_64-linux
|
||||||
|
# usage: image.sh [path to image.nix output]
|
||||||
|
|
||||||
|
set -euxo pipefail
|
||||||
|
|
||||||
|
(which zstd && which rsync) || exit 1
|
||||||
|
|
||||||
|
userspace="$(which lklfuse >/dev/null && echo -n 1 || echo -n)"
|
||||||
|
use_rsync="$(which rsync >/dev/null && echo -n 1 || echo -n)"
|
||||||
|
function Mount() {
|
||||||
|
if [[ "$userspace" == "1" ]]; then
|
||||||
|
if [[ "${4-}" == "ro" ]]; then
|
||||||
|
lklfuse -o "type=$1" -o "$4" "$2" "$3"
|
||||||
|
elif [ -n "${4-}" ]; then
|
||||||
|
lklfuse -o "type=$1" -o "opts=$4" "$2" "$3"
|
||||||
|
else
|
||||||
|
lklfuse -o "type=$1" "$2" "$3"
|
||||||
|
fi
|
||||||
|
elif [ -n "${4-}" ]; then
|
||||||
|
sudo -A mount -t "$1" -o "loop,$4" "$2" "$3"
|
||||||
|
else
|
||||||
|
sudo -A mount -t "$1" -o loop "$2" "$3"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function run() {
|
||||||
|
if [[ "$userspace" == "1" ]]; then
|
||||||
|
"$@"
|
||||||
|
else
|
||||||
|
sudo -A "$@"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function cpr() {
|
||||||
|
if [[ "$use_rsync" == "1" ]]; then
|
||||||
|
run rsync -a --info=progress2 "$1/" "$2/"
|
||||||
|
else
|
||||||
|
run cp -rv "$1"/* "$2/"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ -z "$1" ]; then
|
||||||
|
echo "missing argument"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
rootfs="$1/rootfs.ext4"
|
||||||
|
template="$1/template.btrfs"
|
||||||
|
image="$1/image.img"
|
||||||
|
boot="$1/boot"
|
||||||
|
|
||||||
|
metadata0="$(head -n1 "$1/metadata")"
|
||||||
|
metadata1="$(head -n2 "$1/metadata" | tail -n1)"
|
||||||
|
if [ -z "$metadata0" ] || [ -z "$metadata1" ] || [[ "$metadata0" == "$metadata1" ]]; then
|
||||||
|
echo "invalid metadata"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
tmp=$(mktemp -d)
|
||||||
|
cp "$template" "$tmp/template.btrfs"
|
||||||
|
cp "$image" "$tmp/image.img"
|
||||||
|
template="$tmp/template.btrfs"
|
||||||
|
image="$tmp/image.img"
|
||||||
|
chmod +w "$template" "$image"
|
||||||
|
|
||||||
|
function cleanup {
|
||||||
|
run umount "$rootfs" || echo -n
|
||||||
|
run umount "$tmp/out" || echo -n
|
||||||
|
rm -rf "$tmp"
|
||||||
|
}
|
||||||
|
trap cleanup EXIT
|
||||||
|
mkdir -p "$tmp/rootfs" "$tmp/out"
|
||||||
|
Mount ext4 "$rootfs" "$tmp/rootfs" ro
|
||||||
|
rootfs="$tmp/rootfs"
|
||||||
|
Mount btrfs "$template" "$tmp/out"
|
||||||
|
run cp -rv "$boot"/* "$tmp/out/@boot/"
|
||||||
|
run umount "$tmp/out"
|
||||||
|
Mount btrfs "$template" "$tmp/out" "compress=zstd:15"
|
||||||
|
run cp -v "$rootfs/nix-path-registration" "$tmp/out/@/"
|
||||||
|
run ls "$boot"
|
||||||
|
cpr "$boot" "$tmp/out/@boot"
|
||||||
|
cpr "$rootfs/nix" "$tmp/out/@nix"
|
||||||
|
|
||||||
|
run umount "$rootfs"
|
||||||
|
run umount "$tmp/out"
|
||||||
|
|
||||||
|
dd conv=notrunc if="$template" of="$image" seek="$metadata0"
|
||||||
|
|
||||||
|
zstd --compress "$image"
|
||||||
|
cp "$image.zst" ./image.img.zst
|
|
@ -13,6 +13,7 @@ in {
|
||||||
};
|
};
|
||||||
path = mkOption {
|
path = mkOption {
|
||||||
type = types.path;
|
type = types.path;
|
||||||
|
default = if cfg.enable then throw "You must set path to persistent storage" else "";
|
||||||
description = "Default path for persistence";
|
description = "Default path for persistence";
|
||||||
};
|
};
|
||||||
directories = mkOption {
|
directories = mkOption {
|
||||||
|
|
Loading…
Reference in a new issue