Message ID | 20231110152944.647535-4-devarsht@ti.com |
---|---|
State | Changes Requested |
Delegated to: | Anatolij Gustschin |
Headers | show |
Series | Move framebuffer reservation for SPL to RAM end | expand |
On Fri, 10 Nov 2023 at 08:29, Devarsh Thakkar <devarsht@ti.com> wrote: > > Start reservations needed for init sequence only after catching > bloblists from previous stage. > > This is to avoid catching bloblists in the middle causing > gaps while u-boot is reserving. > > Adjust the relocaddr as per video hand-off information > received from previous stage so that further reservations > start only after regions reserved for previous stages > > Skip reservation for video memory if it was already > filled by a bloblist. > > Signed-off-by: Devarsh Thakkar <devarsht@ti.com> > --- > V2: Fix typo in commit title and checkpatch warnings/checks > V3: No change > --- > common/board_f.c | 33 ++++++++++++++++++++++++++++++--- > 1 file changed, 30 insertions(+), 3 deletions(-) Reviewed-by: Simon Glass <sjg@chromium.org> > > diff --git a/common/board_f.c b/common/board_f.c > index d4d7d01f8f..acf802c9cb 100644 > --- a/common/board_f.c > +++ b/common/board_f.c > @@ -403,7 +403,7 @@ __weak int arch_reserve_mmu(void) > return 0; > } > > -static int reserve_video(void) > +static int reserve_video_from_videoblob(void) > { > if (IS_ENABLED(CONFIG_SPL_VIDEO_HANDOFF) && spl_phase() > PHASE_SPL) { > struct video_handoff *ho; > @@ -412,8 +412,34 @@ static int reserve_video(void) > if (!ho) > return log_msg_ret("blf", -ENOENT); > video_reserve_from_bloblist(ho); > - gd->relocaddr = ho->fb; > - } else if (CONFIG_IS_ENABLED(VIDEO)) { > + > + /* Sanity check fb from blob is before current relocaddr */ > + if (likely(gd->relocaddr > (unsigned long)ho->fb)) > + gd->relocaddr = ho->fb; > + } > + > + return 0; > +} > + > +/* > + * Check if any bloblist received specifying reserved areas from previous stage and adjust > + * gd->relocaddr accordingly, so that we start reserving after pre-reserved areas > + * from previous stage. > + * > + * NOTE: > + * IT is recommended that all bloblists from previous stage are reserved from ram_top > + * as next stage will simply start reserving further regions after them. > + */ > +static int setup_relocaddr_from_bloblist(void) > +{ > + reserve_video_from_videoblob(); > + > + return 0; > +} > + > +static int reserve_video(void) > +{ > + if (CONFIG_IS_ENABLED(VIDEO)) { > ulong addr; > int ret; > > @@ -923,6 +949,7 @@ static const init_fnc_t init_sequence_f[] = { > reserve_pram, > #endif > reserve_round_4k, > + setup_relocaddr_from_bloblist, > arch_reserve_mmu, > reserve_video, > reserve_trace, > -- > 2.34.1 >
diff --git a/common/board_f.c b/common/board_f.c index d4d7d01f8f..acf802c9cb 100644 --- a/common/board_f.c +++ b/common/board_f.c @@ -403,7 +403,7 @@ __weak int arch_reserve_mmu(void) return 0; } -static int reserve_video(void) +static int reserve_video_from_videoblob(void) { if (IS_ENABLED(CONFIG_SPL_VIDEO_HANDOFF) && spl_phase() > PHASE_SPL) { struct video_handoff *ho; @@ -412,8 +412,34 @@ static int reserve_video(void) if (!ho) return log_msg_ret("blf", -ENOENT); video_reserve_from_bloblist(ho); - gd->relocaddr = ho->fb; - } else if (CONFIG_IS_ENABLED(VIDEO)) { + + /* Sanity check fb from blob is before current relocaddr */ + if (likely(gd->relocaddr > (unsigned long)ho->fb)) + gd->relocaddr = ho->fb; + } + + return 0; +} + +/* + * Check if any bloblist received specifying reserved areas from previous stage and adjust + * gd->relocaddr accordingly, so that we start reserving after pre-reserved areas + * from previous stage. + * + * NOTE: + * IT is recommended that all bloblists from previous stage are reserved from ram_top + * as next stage will simply start reserving further regions after them. + */ +static int setup_relocaddr_from_bloblist(void) +{ + reserve_video_from_videoblob(); + + return 0; +} + +static int reserve_video(void) +{ + if (CONFIG_IS_ENABLED(VIDEO)) { ulong addr; int ret; @@ -923,6 +949,7 @@ static const init_fnc_t init_sequence_f[] = { reserve_pram, #endif reserve_round_4k, + setup_relocaddr_from_bloblist, arch_reserve_mmu, reserve_video, reserve_trace,
Start reservations needed for init sequence only after catching bloblists from previous stage. This is to avoid catching bloblists in the middle causing gaps while u-boot is reserving. Adjust the relocaddr as per video hand-off information received from previous stage so that further reservations start only after regions reserved for previous stages Skip reservation for video memory if it was already filled by a bloblist. Signed-off-by: Devarsh Thakkar <devarsht@ti.com> --- V2: Fix typo in commit title and checkpatch warnings/checks V3: No change --- common/board_f.c | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-)