First, it’s the default thing on arm64. Second, we already have a working uefi code. Third, it provides an actual environment with support for our bootloader, so we can show things on screen, load the kernel from disk, and all things our bootloader does, without having to add hardware specific drivers to our bootloader.
Linux works around this by loading the kernel directly with a ramdisk including drivers, they don’t have their own specific stage 2 bootloader.
We don’t really want to go that way because the bootloader has some important features in our case (passing arguments to the kernel which are a binary data structure, setting up the mmu, the bootmenu allowing to enable failsafe mode and boot older versions, etc).
U-boot is too minimal for our firmware needs.
Also, uboot does provide an efi implementation, whichis opensource and not blob at all. It’s just an api that allows our bootloader to talk with the firmware and that’s the minimum we can expect from any other platform as well.