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: