because you overwrite uboot itself. 00 20 00 00 is the "start" of SDRAM on rockchip SoCs, in fact, it's 0, but they "reserve" 2MB for whatever. try something higher. like 02 00 00 00. and use booti. because this should work on 64 bit ARM consistently. what isn't the case for bootm and I am not sure about go. but with go, you aren't able to get DT. how are you gonna discover devices without any configuration? hardcode for every machine? nono. don't forget to insert a header at the beginning of your kernel, loader. whatever, because booti does expect it. it's lame, yes, but it's how linux wants and how uboot obediently follows. you can read about that header format in the linux documentation. boot/arm64 section. and if that is not enough, that header expects your code is position independent! doh. at least its start. OR, BETTER of any of this lamery, USE UBOOT'S UEFI interface! you will be freed of these hassles. but, you'll need to revamp your design and supply a UEFI OS loader. it's a PE executable, easily compiled with MSVC (for x86, x64, arm32, arm64). it's much better, believe me.
ANT - my hobby OS for x86 and ARM.