Hi Simon, On 2025-02-09 21:14, Simon Glass wrote: > Hi Jonas, > > On Sun, 9 Feb 2025 at 09:30, Jonas Karlman <jo...@kwiboo.se> wrote: >> >> Hi Simon, >> >> On 2025-02-09 16:36, Simon Glass wrote: >>> Hi Jonas, >>> >>> On Sun, 9 Feb 2025 at 08:17, Jonas Karlman <jo...@kwiboo.se> wrote: >>>> >>>> Hi Simon, >>>> >>>> On 2025-02-09 15:26, Simon Glass wrote: >>>>> Hi Jonas, >>>>> >>>>> On Wed, 5 Feb 2025 at 15:18, Jonas Karlman <jo...@kwiboo.se> wrote: >>>>>> >>>>>> Hi Simon, >>>>>> >>>>>> On 2025-02-05 02:54, Simon Glass wrote: >>>>>>> TPL runs before VPL. The earliest updatable phase with VBE is SPL. We >>>>>>> want to be able to update the RAM-init code in the field. >>>>>> >>>>>> If I understand your description here, you mean that both TPL and VPL >>>>>> are meant to be "burned" onto the board and not intended to be updatable? >>>>> >>>>> Yes, that's right. If you look at [1] and click on 'vbe-intro' there >>>>> is a diagram that shows the flow. >>>> >>>> Thanks for the reference, I can see that both are listed as read-only. >>>> Unfortunately that do not explain why we need to have both TPL and VPL >>>> aside from it being two separate conceptual parts. >>>> >>>> We can as easily just have BootROM load VPL and start from there, it >>>> does not look like TPL provides anything of real value for VBE on >>>> Rockchip, only one more part that can potentially fail? >>> >>> It is partly conceptual, partly due to space. >>> >>> TPL is about init setup and it is board-specific. VPL is a generic >>> 'root-of-trust' thing which contains the ABrec logic. It is supposed >>> to be generic and run on any supported board. >>> >>> Some boards have very limited space for TPL, but can load a larger >>> amount of code after that. There are quite a lot of x86 boards like >>> that. Also, for rk3399 I was unable to fit all the TPL init and VPL >>> logic into a single phase and still have room to load SPL. >> >> For Rockchip RK3399 I do not really understand why it would not fit. > > Here are the margins at present. Loads of space going from TPL to VPL. > From VPL to SPL it is a lot tighter. I'm pretty sure more things could > be optimised, but there are also things I'd like to enable, like FIT > signatures. > > => vbe state > Phases: TPL (margin 94ea) VPL (margin 2a9f) SPL > >> >> BootROM already does most init that is typically needed, and TPL >> probably only need to init iomux for debug uart and pinctrl for the >> storage media next phase is loaded from. Will be easier to understand >> once you have a series that can be applied :-) > > Yes indeed. It has been so hard trying to get this all landed and > there are so many things needed. Once it is applied and in the lab it > will be easier to try things. > >> >>> >>> As to combining them, I am sure it could be done, if there is enough >>> SRAM. Perhaps that could be a build option? >>> >>> If the MMC fails, we are not going to boot, so loading an extra phase >>> is not a big problem, IMO. >>> >>>> >>>>> >>>>>> >>>>>> Is this a typo or do I misunderstand something? Else I do not understand >>>>>> why you would need TPL->VPL->SPL, please explain. >>>>>> >>>>>>> >>>>>>> So when VPL is being used, init the RAM later, in SPL. >>>>>>> >>>>>>> Signed-off-by: Simon Glass <s...@chromium.org> >>>>>>> --- >>>>>>> >>>>>>> drivers/ram/rockchip/sdram_rk3399.c | 6 ++++-- >>>>>>> 1 file changed, 4 insertions(+), 2 deletions(-) >>>>>>> >>>>>>> diff --git a/drivers/ram/rockchip/sdram_rk3399.c >>>>>>> b/drivers/ram/rockchip/sdram_rk3399.c >>>>>>> index 6fa8f268770..9ac16dfdc71 100644 >>>>>>> --- a/drivers/ram/rockchip/sdram_rk3399.c >>>>>>> +++ b/drivers/ram/rockchip/sdram_rk3399.c >>>>>>> @@ -194,6 +194,7 @@ struct io_setting { >>>>>>> static bool phase_sdram_init(void) >>>>>>> { >>>>>>> return xpl_phase() == PHASE_TPL || >>>>>>> + (IS_ENABLED(CONFIG_VPL) && xpl_phase() == PHASE_SPL) || >>>>>>> (!IS_ENABLED(CONFIG_TPL) && >>>>>>> !IS_ENABLED(CONFIG_ROCKCHIP_EXTERNAL_TPL) && >>>>>>> !not_xpl()); >>>>>>> @@ -3195,8 +3196,9 @@ U_BOOT_DRIVER(dmc_rk3399) = { >>>>>>> .of_to_plat = rk3399_dmc_of_to_plat, >>>>>>> .probe = rk3399_dmc_probe, >>>>>>> .priv_auto = sizeof(struct dram_info), >>>>>>> -#if defined(CONFIG_TPL_BUILD) || \ >>>>>>> - (!defined(CONFIG_TPL) && defined(CONFIG_XPL_BUILD)) >>>>>>> +#if defined(CONFIG_VPL) && defined(CONFIG_SPL_BUILD) || \ >>>>>>> + !defined(CONFIG_VPL) && defined(CONFIG_TPL_BUILD) || \ >>>>>>> + !defined(CONFIG_TPL) && defined(CONFIG_SPL_BUILD) >>>>>>> .plat_auto = sizeof(struct rockchip_dmc_plat), >>>>>>> #endif >>>>>>> }; >>>>>> >>>>>> These two conditions are starting to get ridiculous. >>>>>> >>>>>> With "[PATCH 24/29] rockchip: Allow SPL to set up SDRAM" you are >>>>>> depending on TPL_RAM to decide if RAM should be initialized. Maybe that >>>>>> is something we can use here to simplify? >>>>> >>>>> The problem is that TPL_RAM means that the ram driver is present, >>>>> which isn't the same thing as actually doing the RAM init in that >>>>> phase. If we had a Kconfig value for 'phase' then we could perhaps >>>>> have CONFIG_PHASE_RAM=tpl or something like that. >>>> >>>> Yes, we may need to add a new Kconfig symbol to more easily control >>>> where DRAM init happens. >>>> >>>> I have been slowly working on unifying all Rockchip SoCs to use TPL for >>>> DRAM init and SPL for loading a FIT. All AArch64 should now follow this, >>>> and currently looking at migrating the older ARMv7 SoCs. >>> >>> OK, that's fine, but note that SPL is where this is supposed to >>> happen. What is the benefit of doing it earlier? From my understanding >>> it was just to accommodate Rockchip's secret blobs? >> >> It has nothing to do with accommodating Rockchip's secret blobs to my >> knowledge. >> >> Most Rockchip SoCs have limited SRAM and initializing full DRAM is >> what needs to happen early, i.e. RK3036 have 8 KiB SRAM. Thanks to >> this SPL has full DRAM access and does not really have a size limit. >> >> Theoretically you can have BootROM load full U-Boot proper as the next >> phase after the initial DRAM init phase. Not something that is really >> used, instead SPL is loaded to have more control over what is loaded >> next, i.e. falcon boot, EDK2, TF-A/OP-TEE and/or U-Boot proper. > > OK. So I wonder whether DRAM should be in SPL, for modern SoCs, then?
To be uniform across the Rockchip platform I would not recommend that. It is also my understanding that LPDDR4/5 DRAM controller and training code is typically under strict NDA, and open-source options may be problematic. For now the modern SoCs must use vendor blobs to initialize and run training algorithms for DRAM. E.g. only option is to have a blob run before any part of open-source U-Boot can run. > > It would be nice if Rockchip could expose the MMC-reading code as a > function table in the ROM, so we don't need to repeat the code in xPL. On modern RK35xx SoCs the BootROM can load and run up to 4 images using the back-to-brom method. See my "rockchip: mkimage: Improve support for v2 image format" series at https://patchwork.ozlabs.org/cover/2040406/ that extend support for the 2 extra images supported by the v2 image format. Regards, Jonas > >> >> Rockchip does provide DRAM init blobs that typically can be used as a >> stand in replacement for U-Boot TPL (DRAM init) in case there is no >> open-source implementation for the DRAM used on a board or SoC. > > OK. > > Regards, > Simon > >> >> Regards, >> Jonas >> >>> >>>> >>>>> I plan to get back >>>>> to my rejected XPL series soon and that is something I could >>>>> incorporate when that goes in. >>>>> >>>>>> >>>>>> Basically we will have 3 possible DRAM init scenarios to support: >>>>>> - ROCKCHIP_EXTERNA_TPL=y -> DRAM init happen in external TPL and SPL >>>>>> should only read DRAM size >>>>>> - VPL=y or TPL=n -> both DRAM init and read DRAM size happen in SPL >>>>>> - TPL=y -> DRAM init in TPL and SPL should only read DRAM size >>>>> >>>>> Yes that's my understanding too. For the last one, for clarity: >>>>> >>>>> - TPL=y -> DRAM init in TPL; SPL should only read DRAM size >>>> >>>> Correct. >>>> >>>> >>> >>> Regards, >>> SImon >>> >>>>> >>>>> [1] >>>>> https://docs.u-boot.org/en/latest/develop/vbe.html#verified-boot-for-embedded-vbe >>>> >>