Portanto, uma das maneiras de corrigir isso é fazer uso de algumas variáveis de ambiente adicionais. Se olharmos em include / configs / ti_armv7_common.h, temos:
/*
* We setup defaults based on constraints from the Linux kernel, which should
* also be safe elsewhere. We have the default load at 32MB into DDR (for
* the kernel), FDT above 128MB (the maximum location for the end of the
* kernel), and the ramdisk 512KB above that (allowing for hopefully never
* seen large trees). We say all of this must be within the first 256MB
* as that will normally be within the kernel lowmem and thus visible via
* bootm_size and we only run on platforms with 256MB or more of memory.
*/
#define DEFAULT_LINUX_BOOT_ENV \
"loadaddr=0x82000000/*
* We setup defaults based on constraints from the Linux kernel, which should
* also be safe elsewhere. We have the default load at 32MB into DDR (for
* the kernel), FDT above 128MB (the maximum location for the end of the
* kernel), and the ramdisk 512KB above that (allowing for hopefully never
* seen large trees). We say all of this must be within the first 256MB
* as that will normally be within the kernel lowmem and thus visible via
* bootm_size and we only run on platforms with 256MB or more of memory.
*/
#define DEFAULT_LINUX_BOOT_ENV \
"loadaddr=0x82000000%pre%" \
"kernel_addr_r=0x82000000%pre%" \
"fdtaddr=0x88000000%pre%" \
"fdt_addr_r=0x88000000%pre%" \
"rdaddr=0x88080000%pre%" \
"ramdisk_addr_r=0x88080000%pre%" \
"scriptaddr=0x80000000%pre%" \
"pxefile_addr_r=0x80100000%pre%" \
"bootm_size=0x10000000%pre%"
" \
"kernel_addr_r=0x82000000%pre%" \
"fdtaddr=0x88000000%pre%" \
"fdt_addr_r=0x88000000%pre%" \
"rdaddr=0x88080000%pre%" \
"ramdisk_addr_r=0x88080000%pre%" \
"scriptaddr=0x80000000%pre%" \
"pxefile_addr_r=0x80100000%pre%" \
"bootm_size=0x10000000%pre%"
Então, para o problema que você está descrevendo, você deve reutilizar bootm_size = 0x10000000 para garantir que mantenhamos a árvore de dispositivos dentro dos primeiros 256MB, que será o kernel visible lowmem (com as configurações padrão do kernel hoje pelo menos, o tamanho do kernel lowmem é configurável).
Outra solução igualmente útil aqui é simplesmente colocar a árvore de dispositivos e o ramdisk na memória onde você sabe que eles estarão seguros e usar fdt_high = 0xffffffff e initrd_high = 0xffffffff para desabilitar a realocação. O principal uso da relocação é certificar-se de que as coisas estarão seguras no caso genérico (onde o U-Boot pode receber um kernel e uma árvore de dispositivos aleatórios e um ramdisk e simplesmente não saber o tamanho de tudo). Em um caso de produção como esse, você pode descobrir alguns valores sempre seguros e corretos, carregá-los e não movê-los em outro momento.