commit d6ffdd7be69889e7375ebb1a91b5991c9f382603
parent 985f982435ce35a70b07fb1ca101d9ff8f822861
Author: Raito Bezarius <masterancpp@gmail.com>
Date: Mon, 19 Feb 2024 02:48:15 +0100
devices/zyxel-nwa50ax: expose primary and secondary images
To support A/B a bit better.
Signed-off-by: Raito Bezarius <masterancpp@gmail.com>
Diffstat:
7 files changed, 329 insertions(+), 173 deletions(-)
diff --git a/default.nix b/default.nix
@@ -3,6 +3,7 @@
, liminix-config ? <liminix-config>
, nixpkgs ? <nixpkgs>
, borderVmConf ? ./bordervm.conf.nix
+, imageType ? "primary"
}:
let
@@ -30,6 +31,9 @@ let
./modules/s6
./modules/users.nix
./modules/outputs.nix
+ {
+ boot.imageType = imageType;
+ }
];
};
config = eval.config;
diff --git a/devices/zyxel-nwa50ax/a_image/mt7621_zyxel_nwa-ax-for-ab.dtsi b/devices/zyxel-nwa50ax/a_image/mt7621_zyxel_nwa-ax-for-ab.dtsi
@@ -0,0 +1,155 @@
+#include "mt7621.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+ aliases {
+ label-mac-device = &gmac0;
+ };
+};
+
+&nand {
+ status = "okay";
+
+ mediatek,nmbm;
+ mediatek,bmt-max-ratio = <15>;
+ mediatek,bmt-max-reserved-blocks = <64>;
+ mediatek,bmt-remap-range =
+ <0x0 0x980000>,
+ <0x2980000 0x7800000>;
+
+ partitions {
+ compatible = "fixed-partitions";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ partition@0 {
+ label = "u-boot";
+ reg = <0x0 0x80000>;
+ read-only;
+ };
+
+ partition@80000 {
+ label = "u-boot-env";
+ reg = <0x80000 0x80000>;
+ read-only;
+ };
+
+ factory: partition@100000 {
+ label = "factory";
+ reg = <0x100000 0x80000>;
+ read-only;
+ };
+
+ partition@180000 {
+ label = "firmware_a";
+ reg = <0x180000 0x2800000>;
+
+ compatible = "fixed-partitions";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ partition@0 {
+ label = "kernel_a";
+ reg = <0x0 0x800000>;
+ };
+
+ partition@400000 {
+ label = "ubi";
+ reg = <0x800000 0x2000000>;
+ };
+ };
+
+ partition@2980000 {
+ label = "firmware_b";
+ reg = <0x2980000 0x2800000>;
+
+ compatible = "fixed-partitions";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ partition@0 {
+ label = "kernel_b";
+ reg = <0x0 0x800000>;
+ };
+
+ partition@400000 {
+ label = "ubi_b";
+ reg = <0x800000 0x2000000>;
+ };
+ };
+
+ partition@5180000 {
+ label = "rootfs_data";
+ reg = <0x5180000 0x1400000>;
+ };
+
+ partition@6580000 {
+ label = "logs";
+ reg = <0x6580000 0xd00000>;
+ };
+
+ partition@7280000 {
+ label = "vendor-myzyxel";
+ reg = <0x7280000 0x480000>;
+ read-only;
+ };
+
+ partition@7700000 {
+ label = "bootconfig";
+ reg = <0x7700000 0x80000>;
+ };
+
+ mrd: partition@7780000 {
+ label = "mrd";
+ reg = <0x7780000 0x80000>;
+ read-only;
+
+ nvmem-layout {
+ compatible = "fixed-layout";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ macaddr_mrd_1fff8: macaddr@1fff8 {
+ reg = <0x1fff8 0x6>;
+ };
+ };
+ };
+ };
+};
+
+&pcie {
+ status = "okay";
+};
+
+&pcie1 {
+ wlan_5g: wifi@0,0 {
+ reg = <0x0 0 0 0 0>;
+ compatible = "mediatek,mt76";
+
+ mediatek,mtd-eeprom = <&factory 0x0>;
+ /* MAC-Address set in userspace */
+ };
+};
+
+&gmac0 {
+ nvmem-cells = <&macaddr_mrd_1fff8>;
+ nvmem-cell-names = "mac-address";
+};
+
+&switch0 {
+ ports {
+ port@4 {
+ status = "okay";
+ label = "lan";
+ };
+ };
+};
+
+&state_default {
+ gpio {
+ groups = "uart3";
+ function = "gpio";
+ };
+};
diff --git a/devices/zyxel-nwa50ax/b_image/mt7621_zyxel_nwa-ax-for-ab.dtsi b/devices/zyxel-nwa50ax/b_image/mt7621_zyxel_nwa-ax-for-ab.dtsi
@@ -0,0 +1,155 @@
+#include "mt7621.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+ aliases {
+ label-mac-device = &gmac0;
+ };
+};
+
+&nand {
+ status = "okay";
+
+ mediatek,nmbm;
+ mediatek,bmt-max-ratio = <15>;
+ mediatek,bmt-max-reserved-blocks = <64>;
+ mediatek,bmt-remap-range =
+ <0x0 0x980000>,
+ <0x2980000 0x7800000>;
+
+ partitions {
+ compatible = "fixed-partitions";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ partition@0 {
+ label = "u-boot";
+ reg = <0x0 0x80000>;
+ read-only;
+ };
+
+ partition@80000 {
+ label = "u-boot-env";
+ reg = <0x80000 0x80000>;
+ read-only;
+ };
+
+ factory: partition@100000 {
+ label = "factory";
+ reg = <0x100000 0x80000>;
+ read-only;
+ };
+
+ partition@2980000 {
+ label = "firmware_b";
+ reg = <0x2980000 0x2800000>;
+
+ compatible = "fixed-partitions";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ partition@0 {
+ label = "kernel_b";
+ reg = <0x0 0x800000>;
+ };
+
+ partition@400000 {
+ label = "ubi";
+ reg = <0x800000 0x2000000>;
+ };
+ };
+
+ partition@180000 {
+ label = "firmware_a";
+ reg = <0x180000 0x2800000>;
+
+ compatible = "fixed-partitions";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ partition@0 {
+ label = "kernel_a";
+ reg = <0x0 0x800000>;
+ };
+
+ partition@400000 {
+ label = "ubi_a";
+ reg = <0x800000 0x2000000>;
+ };
+ };
+
+ partition@5180000 {
+ label = "rootfs_data";
+ reg = <0x5180000 0x1400000>;
+ };
+
+ partition@6580000 {
+ label = "logs";
+ reg = <0x6580000 0xd00000>;
+ };
+
+ partition@7280000 {
+ label = "vendor-myzyxel";
+ reg = <0x7280000 0x480000>;
+ read-only;
+ };
+
+ partition@7700000 {
+ label = "bootconfig";
+ reg = <0x7700000 0x80000>;
+ };
+
+ mrd: partition@7780000 {
+ label = "mrd";
+ reg = <0x7780000 0x80000>;
+ read-only;
+
+ nvmem-layout {
+ compatible = "fixed-layout";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ macaddr_mrd_1fff8: macaddr@1fff8 {
+ reg = <0x1fff8 0x6>;
+ };
+ };
+ };
+ };
+};
+
+&pcie {
+ status = "okay";
+};
+
+&pcie1 {
+ wlan_5g: wifi@0,0 {
+ reg = <0x0 0 0 0 0>;
+ compatible = "mediatek,mt76";
+
+ mediatek,mtd-eeprom = <&factory 0x0>;
+ /* MAC-Address set in userspace */
+ };
+};
+
+&gmac0 {
+ nvmem-cells = <&macaddr_mrd_1fff8>;
+ nvmem-cell-names = "mac-address";
+};
+
+&switch0 {
+ ports {
+ port@4 {
+ status = "okay";
+ label = "lan";
+ };
+ };
+};
+
+&state_default {
+ gpio {
+ groups = "uart3";
+ function = "gpio";
+ };
+};
diff --git a/devices/zyxel-nwa50ax/default.nix b/devices/zyxel-nwa50ax/default.nix
@@ -151,7 +151,16 @@
# This DTS is insufficient.
src = ./mt7621_zyxel_nwa50ax.dtsi;
includes = [
- "${./.}"
+ # Here's one weird trick to make `ubi` detection
+ # out of the box.
+ # We will write ubi on /dev/firmware_a:rootfs location
+ # and same for /dev/firmware_b:rootfs.
+ # How do we distinguish both?
+ # We can just use the DTS to point ubi at A or B.
+ # This, unfortunately, means that we have "two images".
+ # But they are really just 1 image with 2 different DTS.
+ # TODO: improve this hack in preinit?
+ (if config.boot.imageType == "primary" then "${./a_image}" else "${./b_image}")
"${openwrt.src}/target/linux/ramips/dts"
];
};
diff --git a/devices/zyxel-nwa50ax/mt7621_zyxel_nwa-ax-for-ab.dtsi b/devices/zyxel-nwa50ax/mt7621_zyxel_nwa-ax-for-ab.dtsi
@@ -1,171 +0,0 @@
-#include "mt7621.dtsi"
-
-#include <dt-bindings/gpio/gpio.h>
-#include <dt-bindings/input/input.h>
-
-/ {
- aliases {
- label-mac-device = &gmac0;
- };
-};
-
-&nand {
- status = "okay";
-
- mediatek,nmbm;
- mediatek,bmt-max-ratio = <15>;
- mediatek,bmt-max-reserved-blocks = <64>;
- mediatek,bmt-remap-range =
- <0x0 0x980000>,
- <0x2980000 0x7800000>;
-
- partitions {
- compatible = "fixed-partitions";
- #address-cells = <1>;
- #size-cells = <1>;
-
- partition@0 {
- label = "u-boot";
- reg = <0x0 0x80000>;
- read-only;
- };
-
- partition@80000 {
- label = "u-boot-env";
- reg = <0x80000 0x80000>;
- read-only;
- };
-
- factory: partition@100000 {
- label = "factory";
- reg = <0x100000 0x80000>;
- read-only;
-
- nvmem-layout {
- compatible = "fixed-layout";
- #address-cells = <1>;
- #size-cells = <1>;
-
- eeprom_factory_0: eeprom@0 {
- reg = <0x0 0xe00>;
- };
-
- precal_factory_e10: precal@e10 {
- reg = <0xe10 0x19c10>;
- };
- };
- };
-
- partition@180000 {
- label = "firmware_a";
- reg = <0x180000 0x2800000>;
-
- compatible = "fixed-partitions";
- #address-cells = <1>;
- #size-cells = <1>;
-
- partition@0 {
- label = "kernel_a";
- reg = <0x0 0x800000>;
- };
-
- partition@400000 {
- label = "ubi_a";
- reg = <0x800000 0x2000000>;
- };
- };
-
- partition@2980000 {
- label = "firmware_b";
- reg = <0x2980000 0x2800000>;
-
- compatible = "fixed-partitions";
- #address-cells = <1>;
- #size-cells = <1>;
-
- partition@0 {
- label = "kernel_b";
- reg = <0x0 0x800000>;
- };
-
- partition@400000 {
- label = "ubi_b";
- reg = <0x800000 0x2000000>;
- };
- };
-
- partition@5180000 {
- label = "rootfs_data";
- reg = <0x5180000 0x1400000>;
- };
-
- partition@6580000 {
- label = "logs";
- reg = <0x6580000 0xd00000>;
- };
-
- partition@7280000 {
- label = "vendor-myzyxel";
- reg = <0x7280000 0x480000>;
- read-only;
- };
-
- partition@7700000 {
- label = "bootconfig";
- reg = <0x7700000 0x80000>;
- };
-
- mrd: partition@7780000 {
- label = "mrd";
- reg = <0x7780000 0x80000>;
- read-only;
-
- nvmem-layout {
- compatible = "fixed-layout";
- #address-cells = <1>;
- #size-cells = <1>;
-
- macaddr_mrd_1fff8: macaddr@1fff8 {
- reg = <0x1fff8 0x6>;
- };
- };
- };
- };
-};
-
-&pcie {
- status = "okay";
-};
-
-&pcie1 {
- wlan_5g: wifi@0,0 {
- reg = <0x0 0 0 0 0>;
- compatible = "mediatek,mt76";
-
- nvmem-cells = <&eeprom_factory_0>, <&precal_factory_e10>;
- nvmem-cell-names = "eeprom", "precal";
-
- /* MAC-Address set in userspace */
- };
-};
-
-&gmac0 {
- nvmem-cells = <&macaddr_mrd_1fff8>;
- nvmem-cell-names = "mac-address";
-};
-
-&switch0 {
- ports {
- port@4 {
- status = "okay";
- label = "lan";
- };
- };
-};
-
-&state_default {
- gpio {
- groups = "uart3";
- function = "gpio";
- };
-};
diff --git a/modules/base.nix b/modules/base.nix
@@ -63,6 +63,10 @@ in {
default = "bootargs";
description = "Kernel command line's devicetree node";
};
+ imageType = mkOption {
+ type = types.enum [ "primary" "secondary" ];
+ default = "primary";
+ };
imageFormat = mkOption {
type = types.enum ["fit" "uimage"];
default = "uimage";
diff --git a/modules/outputs/zyxel-nwa-fit.nix b/modules/outputs/zyxel-nwa-fit.nix
@@ -62,7 +62,7 @@ on a system with pre-existing firmware and OS.
};
'';
in
- pkgs.runCommand "zyxel-nwa-fit" {
+ pkgs.runCommand "zyxel-nwa-fit-${config.boot.imageType}" {
nativeBuildInputs = [ pkgs.pkgsBuildBuild.ubootTools pkgs.pkgsBuildBuild.dtc ];
} ''
mkimage -f ${dts} $out