On 05/12/25 20:12, Andrew Davis wrote: > > > On 12/5/25 1:32 AM, Beleswar Prasad Padhi wrote: >> >> On 02/12/25 18:47, Andrew Davis wrote: >>> On 12/1/25 11:56 PM, Beleswar Prasad Padhi wrote: >>>> >>>> On 02/12/25 00:58, Andrew Davis wrote: >>>>> On 11/28/25 9:04 AM, Beleswar Padhi wrote: >>>>>> The AM571x SoC has 1 GB DDR space. As part of normal re-location process >>>>>> U-Boot copies itself to the top of DDR bank. However, on HS devices, the >>>>>> top 37 MB is used by PPA and is firewalled. This results in an exception >>>>>> and the boot fails. >>>>>> >>>>>> Introduce a new defconfig for AM571x HS platforms and set >>>>>> CONFIG_SYS_MEM_TOP_HIDE to reserve the top 38 MB memory (aligned to 2MB >>>>>> as per page size for ARM32) for the same. >>>>>> >>>>> >>>>> This "SYS_MEM_TOP_HIDE" looks new, for other OMAP-class HS devices we >>>>> use "CFG_PRAM"[0], seems these two configs do the same thing, could >>>>> probably >>>>> combine them in some way.. >>>>> >>>>> As CFG_PRAM is set based on TI_SECURE_EMIF_TOTAL_REGION_SIZE which is 32MB >>>> >>>> >>>> CFG_PRAM is only set if TI_SECURE_EMIF_REGION_START is not set, but we >>>> have it set it to 0xbdb00000 in the am57xx_hs_evm_defconfig. >>>> >>>> https://github.com/u-boot/u-boot/blob/master/include/configs/ti_omap5_common.h#L75-L81 >>>> >>>>> for all other AM57x, why is this needed only for AM571? >>>> >>>> >>>> Other AM57x boards have >1 GiB DDR. So, the top of DDR space does not >>>> intersect with the firewalled EMIF region (0xbdb00000). Only in case of >>>> AM571x, the top of DDR collides with firewalled region, so boot fails while >>>> doing reloc. >>>> >>> >>> Is there some way to detect this at runtime? Nothing prevents any of the >>> AM57x SoCs being used on boards with 1GB DDR (although they also might use >>> a different defconfig). How do we deal with this for K3 devices? Some use >>> an OP-TEE address aligned at 512MB and I'm sure one of them have that amount >>> of DDR. >> >> >> Well, actually not... >> It's the AM62 SIP platform. From DT, it would look like OPTEE is at the top >> of the >> DDR[1], but we do a FDT fixup here in u-boot to replace the OPTEE to the >> start >> of DDR[2] >> >> [1]: >> https://github.com/torvalds/linux/blob/master/arch/arm64/boot/dts/ti/k3-am62x-sk-common.dtsi#L71 >> [2]: >> https://github.com/u-boot/u-boot/blob/master/arch/arm/mach-k3/am62x/am625_fdt.c#L84 >> >> I am not sure if we can do such a thing here for mem used by PPA/firmware >> as it could assume it has that memory hardcoded. >> >>> >>>>> We build for all >>>>> the AM57x with one defconfig, so this new defconfig will go unused. Just >>>>> set >>>>> the default CFG_PRAM size to 64MB (same as AM43x), >>>> >>>> >>>> I am guessing all AM43x devices have the same amount of memory unlike >>>> AM57x devices? If we set CFG_PRAM to 38MB by default, won't we lose out >>>> that memory on other devices which do not face this limitation? >>>> >>> >>> We only really supported "officially" the AM437x-EVM. But our over-focus >>> on just our EVMs caused us to make assumptions that would later make >>> it difficult to add support for customer boards. Assuming DDR size was >>> one such assumption, and should a customer board have the "wrong" DDR >>> size things like this would break. >>> >>> So instead of making another one-off fix to get one of our EVMs working, >>> I'm trying to think of a way we can make this work automatically for any >>> combination of DDR size and firewalled region. >> >> TL;DR >> I think adding that dynamic support would be tied up only for TI usecase? >> >> Hmm yes, I get your point. But to be able to do this dynamically, we >> would want to see if gd->relocaddr intersects with CFG_PRAM: >> >> Case 1: >> gd->relocaddr > (SECURE_REGION_START + SECURE_REGION_SIZE) >> = Best case. U-Boot relocates to an address higher than firewalled addr >> >> Case 2: >> gd->relocaddr <= (SECURE_REGION_START + SECURE_REGION_SIZE) >> = Fixup needed. U-Boot relocates to an address which could overlap >> with secure region. Update the gd->relocaddr to a lower address range >> which won't overlap with secure region: >> >> reloc_text_size = (RAM_TOP - gd->relocaddr); >> gd->relocaddr = SECURE_REGION_START - reloc_text_size; >> >> >> And ofcourse, we can't put this logic in the existing 'reserve_pram'[3] >> INITCALL because gd->relocaddr gets modified in the subsequent >> initcalls like 'reserve_trace'. We would want to introduce a new >> INITCALL which would be invoked after all reserve_* initcalls and >> before the reloc_* initcalls; where we can put this logic. >> >> Let me know if you think this is worth adding, or is an overkill and >> we can live happily with CFG_PRAM = 38 MB for all AM57x devices :) > > Thanks for doing all this evaluation. I don't think this will be > the last time we run into this issue, but for now let's just make > CFG_PRAM = 64 MB for all AM57x devices and create the perfect solution > later.
Thanks, I tried setting CFG_PRAM but it still ended up in a firewall exception. I guess this is because CFG_PRAM only ensures U-Boot doesn't relocate to that protected address[4], however that memory is still open for access by anything else if needed. Whereas, SYS_MEM_TOP_HIDE reduces the ram size itself[5], which ensures that memory is not visible to U-Boot at all (either for reloc, or general usage). [4]: https://github.com/u-boot/u-boot/blob/master/common/board_f.c#L391 [5]: https://github.com/u-boot/u-boot/blob/master/common/board_f.c#L371 Thanks, Beleswar > > Andrew > >> >> [3]: https://github.com/u-boot/u-boot/blob/master/common/board_f.c#L990 >> >> Thanks, >> Beleswar >> >>> >>> Andrew >>> >>>> Thanks, >>>> Beleswar >>>> >>>>> should be enough for all >>>>> and doesn't hurt to have more than needed reserved to be safe. >>>>> >>>>> Andrew >>>>> >>>>> [0] >>>>> https://github.com/u-boot/u-boot/blob/master/include/configs/am43xx_evm.h#L153 >>>>> >>>>>> Signed-off-by: Beleswar Padhi <[email protected]> >>>>>> --- >>>>>> Fix boot for TI AM571x HS EVM board >>>>>> v2: Changelog: >>>>>> 1. Drop [PATCH v1 2/2] in v2 series. There is no need to add reserved >>>>>> memory node in DT as it is done by U-Boot as part of FDT fixups >>>>>> https://github.com/u-boot/u-boot/blob/master/arch/arm/mach-omap2/fdt-common.c#L72-L107 >>>>>> 2. Add entry in MAINTAINERS for new config. >>>>>> 3. Update commit message to use memory size in MB than raw hex bytes >>>>>> >>>>>> Link to v1: >>>>>> https://lore.kernel.org/all/[email protected]/ >>>>>> >>>>>> Test logs: >>>>>> https://gist.github.com/3V3RYONE/e86b3f4551986b0400d0e0f66d6ecc66 >>>>>> >>>>>> MAINTAINERS | 1 + >>>>>> configs/am571x_hs_evm_defconfig | 3 +++ >>>>>> 2 files changed, 4 insertions(+) >>>>>> create mode 100644 configs/am571x_hs_evm_defconfig >>>>>> >>>>>> diff --git a/MAINTAINERS b/MAINTAINERS >>>>>> index b43dae882b3..e5d564cd760 100644 >>>>>> --- a/MAINTAINERS >>>>>> +++ b/MAINTAINERS >>>>>> @@ -1780,6 +1780,7 @@ F: configs/am335x_hs_evm_spi_defconfig >>>>>> F: configs/am335x_hs_evm_uart_defconfig >>>>>> F: configs/am43xx_hs_evm_defconfig >>>>>> F: configs/am43xx_hs_evm_qspi_defconfig >>>>>> +F: configs/am571x_hs_evm_defconfig >>>>>> F: configs/am57xx_hs_evm_defconfig >>>>>> F: configs/am57xx_hs_evm_usb_defconfig >>>>>> F: configs/dra7xx_hs_evm_defconfig >>>>>> diff --git a/configs/am571x_hs_evm_defconfig >>>>>> b/configs/am571x_hs_evm_defconfig >>>>>> new file mode 100644 >>>>>> index 00000000000..7e44ee5221a >>>>>> --- /dev/null >>>>>> +++ b/configs/am571x_hs_evm_defconfig >>>>>> @@ -0,0 +1,3 @@ >>>>>> +#include <configs/am57xx_hs_evm_defconfig> >>>>>> + >>>>>> +CONFIG_SYS_MEM_TOP_HIDE=0x2600000 >>>>> >>> >

