From d6ffdd7be69889e7375ebb1a91b5991c9f382603 Mon Sep 17 00:00:00 2001 From: Raito Bezarius Date: Mon, 19 Feb 2024 02:48:15 +0100 Subject: [PATCH] devices/zyxel-nwa50ax: expose primary and secondary images To support A/B a bit better. Signed-off-by: Raito Bezarius --- default.nix | 4 + .../mt7621_zyxel_nwa-ax-for-ab.dtsi | 20 +-- .../b_image/mt7621_zyxel_nwa-ax-for-ab.dtsi | 155 ++++++++++++++++++ devices/zyxel-nwa50ax/default.nix | 11 +- modules/base.nix | 4 + modules/outputs/zyxel-nwa-fit.nix | 2 +- 6 files changed, 176 insertions(+), 20 deletions(-) rename devices/zyxel-nwa50ax/{ => a_image}/mt7621_zyxel_nwa-ax-for-ab.dtsi (86%) create mode 100644 devices/zyxel-nwa50ax/b_image/mt7621_zyxel_nwa-ax-for-ab.dtsi diff --git a/default.nix b/default.nix index 2bd91c5..acfce7c 100644 --- a/default.nix +++ b/default.nix @@ -3,6 +3,7 @@ , liminix-config ? , 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/mt7621_zyxel_nwa-ax-for-ab.dtsi b/devices/zyxel-nwa50ax/a_image/mt7621_zyxel_nwa-ax-for-ab.dtsi similarity index 86% rename from devices/zyxel-nwa50ax/mt7621_zyxel_nwa-ax-for-ab.dtsi rename to devices/zyxel-nwa50ax/a_image/mt7621_zyxel_nwa-ax-for-ab.dtsi index 250bc04..6c75b0b 100644 --- a/devices/zyxel-nwa50ax/mt7621_zyxel_nwa-ax-for-ab.dtsi +++ b/devices/zyxel-nwa50ax/a_image/mt7621_zyxel_nwa-ax-for-ab.dtsi @@ -40,20 +40,6 @@ 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 { @@ -70,7 +56,7 @@ }; partition@400000 { - label = "ubi_a"; + label = "ubi"; reg = <0x800000 0x2000000>; }; }; @@ -142,9 +128,7 @@ reg = <0x0 0 0 0 0>; compatible = "mediatek,mt76"; - nvmem-cells = <&eeprom_factory_0>, <&precal_factory_e10>; - nvmem-cell-names = "eeprom", "precal"; - + mediatek,mtd-eeprom = <&factory 0x0>; /* MAC-Address set in userspace */ }; }; 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 new file mode 100644 index 0000000..c35d362 --- /dev/null +++ b/devices/zyxel-nwa50ax/b_image/mt7621_zyxel_nwa-ax-for-ab.dtsi @@ -0,0 +1,155 @@ +#include "mt7621.dtsi" + +#include +#include + +/ { + 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 index 468487b..2e8fd2a 100644 --- 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/modules/base.nix b/modules/base.nix index f64c817..8f53df2 100644 --- 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 index d6f894e..a68dd39 100644 --- 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