Hi Jonas,

On Thu, 27 Jun 2024 at 10:00, Jonas Karlman <jo...@kwiboo.se> wrote:
>
> Hi Simon,
>
> On 2024-06-27 10:02, Simon Glass wrote:
> > Hi Jonas,
> >
> > On Wed, 26 Jun 2024 at 17:16, Jonas Karlman <jo...@kwiboo.se> wrote:
> >>
> >> Hi Simon,
> >>
> >> On 2024-06-26 17:59, Simon Glass wrote:
> >>> The code here is confusing due to large blocks which are #ifdefed out.
> >>> Add a function phase_sdram_init() which returns whether SDRAM init
> >>> should happen in the current phase, using that as needed to control the
> >>> code flow.
> >>>
> >>> This increases code size by about 500 bytes in SPL when the cache is on,
> >>> since it must call the rather large rockchip_sdram_size() function.
> >>>
> >>> - Drop the non-dcache optimisation, since the cache should normally be on
> >>>
> >>> Signed-off-by: Simon Glass <s...@chromium.org>
> >>> ---
> >>>
> >>> Changes in v5:
> >>> - Move setting of pmugrf into the probe() function
> >>>
> >>> Changes in v3:
> >>> - Split out the refactoring into a separate patch
> >>>
> >>>  drivers/ram/rockchip/sdram_rk3399.c | 33 ++++++++++++++---------------
> >>>  1 file changed, 16 insertions(+), 17 deletions(-)
> >>>
> >>> diff --git a/drivers/ram/rockchip/sdram_rk3399.c 
> >>> b/drivers/ram/rockchip/sdram_rk3399.c
> >>> index 3c4e20f4e80..b259e8e3dd6 100644
> >>> --- a/drivers/ram/rockchip/sdram_rk3399.c
> >>> +++ b/drivers/ram/rockchip/sdram_rk3399.c
> >>
> >> [snip]
> >>
> >>> +/**
> >>> + * phase_sdram_init() - Check if this is the phase where SDRAM init 
> >>> happens
> >>> + *
> >>> + * Returns: true to do SDRAM init in this phase, false to not
> >>> + */
> >>> +static bool phase_sdram_init(void)
> >>> +{
> >>> +     return spl_phase() == PHASE_TPL ||
> >>> +         (!IS_ENABLED(CONFIG_TPL) && !spl_in_proper());
> >>
> >> This still need to check for !IS_ENABLED(CONFIG_ROCKCHIP_EXTERNAL_TPL)
> >> to be correct, else you must build with both CONFIG_TPL and
> >> CONFIG_ROCKCHIP_EXTERNAL_TPL or the generated SPL will incorrectly try
> >> to initialize DRAM.
> >>
> >> DRAM should only be initialized in TPL or ROCKCHIP_EXTERNAL_TPL,
> >> or if none of them are defined in SPL. All other phases should
> >> just read and report dram size.
> >
> > Thanks for the info.
> >
> > The reason I am finding this hard to understand is that
> > ROCKCHIP_EXTERNAL_TPL does not appear in the code as it is. So I
> > cannot figure out why it needs to be added. Is there a bug in the
> > current code, or does my patch introduce a bug, or...?
>
> The current code does not handle ROCKCHIP_EXTERNAL_TPL and TPL must be
> built to later be replaced with the external TPL blob.
>
> This adds a new helper that states "Check if this is the phase where
> SDRAM init happens", and for this statement to be true it should also
> consider ROCKCHIP_EXTERNAL_TPL or a bugfix patch is later needed for
> this newly added helper.
>
> Adding !IS_ENABLED(CONFIG_ROCKCHIP_EXTERNAL_TPL) should make this
> statement be valid for the foreseeable combinations.
>
>         return spl_phase() == PHASE_TPL ||
>                (!IS_ENABLED(CONFIG_TPL) &&
>                 !IS_ENABLED(CONFIG_ROCKCHIP_EXTERNAL_TPL) &&
>                 !spl_in_proper());
>
> With that it should be possible to have TPL=n and ROCKCHIP_EXTERNAL_TPL=y
> and produce a working SPL.

Thanks very much, I understand it now.

Regards,
Simon

Reply via email to