I can confirm that booting Odroid M1 from SD card does not work with U-Boot versions newer than 2024.04. Many thanks to IAV for providing a workaround. Perhaps most people are booting from NVMe now, so this issue has flown under the radar?
# Install U-Boot 24.5.1 (maps to upstream v2024.04)
apt-get install -y linux-u-boot-odroidm1-edge=24.5.1
# Freeze the package at that version
"printf 'linux-u-boot-odroidm1-edge hold\n' | sudo dpkg --set-selections"
# Flash SPI directly from the package artifacts (or via armbian-install)
flashcp -v /usr/lib/linux-u-boot-edge-odroidm1/idbloader.img /dev/mtd0
flashcp -v /usr/lib/linux-u-boot-edge-odroidm1/u-boot.itb /dev/mtd2
# Confirm
strings /dev/mtd0 | grep -m1 "U-Boot" # U-Boot SPL 2024.04 (Jan 10 2026 - 10:54:44 +0100)
strings /dev/mtd2 | grep -m1 "U-Boot" # FIT image for U-Boot with bl31 (TF-A)
Now I can boot from sdcard again w/o RCY button.
To use only ZFS on my system I compiled zfs into U-Boot. That worked but the problem was still with U-Boot's handling of the mmc1 somehow. Even though zfsls/zfsload were present in the SPI-flashed U-Boot, that build immediately reinitialized mmc1 in HS200 (1.8 V) mode and hit the “Card did not respond to voltage select! : -110” failure before the boot script could run. So the inability to boot the ZFS v28 pool was due to the SPI U-Boot’s bad MMC tuning, not the ZFS commands themselves.
For future reference I’ll leave here on how to built U-Boot with ZFS support from the upstream sources:
# Workspace & Dependencies
apt install git gcc-aarch64-linux-gnu bison flex device-tree-compiler libssl-dev make python3 ninja-build build-essential
mkdir -p ~/work/u-boot && cd ~/work/u-boot
# Upstream U-Boot
git clone --depth=1 --branch v2024.04 https://source.denx.de/u-boot/u-boot.git
# Firmare blobs
git clone --depth=1 https://github.com/rockchip-linux/rkbin.git
# Prepare .config
cd u-boot
cp configs/odroid-m1-rk3568_defconfig .config
scripts/config --file .config --enable CONFIG_CMD_ZFS
yes "" | olddefconfig
# Compile
make -j$(nproc) \
BL31=../rkbin/bin/rk35/rk3568_bl31_v1.45.elf \
ROCKCHIP_TPL=../rkbin/bin/rk35/rk3568_ddr_1560MHz_v1.23.bin
# Flash SPI directly from the package artifacts (or via armbian-install)
cp spl/u-boot-spl.bin /usr/lib/linux-u-boot-edge-odroidm1/idbloader.img
cp u-boot.itb /usr/lib/linux-u-boot-edge-odroidm1/u-boot.itb
flashcp -v /usr/lib/linux-u-boot-edge-odroidm1/idbloader.img /dev/mtd0
flashcp -v /usr/lib/linux-u-boot-edge-odroidm1/u-boot.itb /dev/mtd2