[PATCH V3 0/8] Update SPL splashscreen framework for AM62x

This patch series aims at updating SPL splashscreen framework for AM62x.
This patch series depends on https://lore.kernel.org/u-boot/20230504225829.2537050-1-sjg@chromium.org/
This series: - Fixes compilation issues in case splash related configs are not defined in SPL. - Does page table setup, dram initialisation and dcache enabling in one function call spl_enable_dcache. - Allows passing of framebuffer from spl to u-boot, eliminating flicker.
V3: - Fix spacing issues. - Add Reviewed-by tag. - Replace #if with if in patch common: spl: spl: Remove video driver - Add link to updated memory map.
V2: - Update cover letter. - Fix commit message.
Nikhil M Jain (8): common: spl: spl: Update stack pointer address arch: arm: mach-k3: common: Return a pointer after setting page table board: ti: am62x: evm: Update function calls for splash screen include: video: Reserve video using blob common: board_f: Pass frame buffer info from SPL to u-boot drivers: video: Kconfig: Add config remove video common: spl: spl: Remove video driver configs: am62x_evm_a53: Add bloblist address
arch/arm/mach-k3/am625_init.c | 1 + arch/arm/mach-k3/common.c | 2 ++ board/ti/am62x/evm.c | 41 ++++++++++++--------------------- common/board_f.c | 11 ++++++++- common/spl/spl.c | 23 +++++++++--------- configs/am62x_evm_a53_defconfig | 1 + drivers/video/Kconfig | 12 ++++++++++ drivers/video/video-uclass.c | 23 ++++++++++++++++++ include/video.h | 9 ++++++++ 9 files changed, 85 insertions(+), 38 deletions(-)

At SPL stage when stack is relocated, the stack pointer needs to be updated, the stack pointer may point to stack in on chip memory even though stack is relocated.
Signed-off-by: Nikhil M Jain n-jain1@ti.com Reviewed-by: Tom Rini trini@konsulko.com --- V3: - Add Reviewed-by tag.
V2: - No change.
common/spl/spl.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/common/spl/spl.c b/common/spl/spl.c index 801c4b507c..13b55e9769 100644 --- a/common/spl/spl.c +++ b/common/spl/spl.c @@ -992,6 +992,7 @@ ulong spl_relocate_stack_gd(void) #endif /* Get stack position: use 8-byte alignment for ABI compliance */ ptr = CONFIG_SPL_STACK_R_ADDR - roundup(sizeof(gd_t),16); + gd->start_addr_sp = ptr; new_gd = (gd_t *)ptr; memcpy(new_gd, (void *)gd, sizeof(gd_t)); #if CONFIG_IS_ENABLED(DM)

In spl_dcache_enable after setting up page table, set gd->relocaddr pointer to tlb_addr, to get next location to reserve memory. Align tlb_addr with 64KB address.
Signed-off-by: Nikhil M Jain n-jain1@ti.com --- V3: - No change.
V2: - Perform 64KB alignment on tlb_addr.
arch/arm/mach-k3/common.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/arch/arm/mach-k3/common.c b/arch/arm/mach-k3/common.c index 0e045919dd..9cd912c523 100644 --- a/arch/arm/mach-k3/common.c +++ b/arch/arm/mach-k3/common.c @@ -624,8 +624,10 @@ void spl_enable_dcache(void) ram_top = (phys_addr_t) 0x100000000;
gd->arch.tlb_addr = ram_top - gd->arch.tlb_size; + gd->arch.tlb_addr &= ~(0x10000 - 1); debug("TLB table from %08lx to %08lx\n", gd->arch.tlb_addr, gd->arch.tlb_addr + gd->arch.tlb_size); + gd->relocaddr = gd->arch.tlb_addr;
dcache_enable(); #endif

On 14/06/23 15:04, Nikhil M Jain wrote:
In spl_dcache_enable after setting up page table, set gd->relocaddr pointer to tlb_addr, to get next location to reserve memory. Align tlb_addr with 64KB address.
Signed-off-by: Nikhil M Jain n-jain1@ti.com
Reviewed-by: Devarsh Thakkar devarsht@ti.com
V3:
- No change.
V2:
- Perform 64KB alignment on tlb_addr.
arch/arm/mach-k3/common.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/arch/arm/mach-k3/common.c b/arch/arm/mach-k3/common.c index 0e045919dd..9cd912c523 100644 --- a/arch/arm/mach-k3/common.c +++ b/arch/arm/mach-k3/common.c @@ -624,8 +624,10 @@ void spl_enable_dcache(void) ram_top = (phys_addr_t) 0x100000000;
gd->arch.tlb_addr = ram_top - gd->arch.tlb_size;
gd->arch.tlb_addr &= ~(0x10000 - 1); debug("TLB table from %08lx to %08lx\n", gd->arch.tlb_addr, gd->arch.tlb_addr + gd->arch.tlb_size);
gd->relocaddr = gd->arch.tlb_addr;
dcache_enable();
#endif

Use spl_dcache_enable, in place of setup_dram, arch_reserve_mmu to set up pagetable, initialise DRAM and enable Dcache.
Signed-off-by: Nikhil M Jain n-jain1@ti.com --- V3: - No change.
V2: - Use CONFIG_SPL_VIDEO in place of CONFIG_SPL_VIDEO_TIDSS to reserve video and call splash at SPL. - Check SPL_SPLASH_SCREEN and SPL_BMP before calling splash display.
arch/arm/mach-k3/am625_init.c | 1 + board/ti/am62x/evm.c | 41 +++++++++++++---------------------- 2 files changed, 16 insertions(+), 26 deletions(-)
diff --git a/arch/arm/mach-k3/am625_init.c b/arch/arm/mach-k3/am625_init.c index 787fe92295..0e5d44269e 100644 --- a/arch/arm/mach-k3/am625_init.c +++ b/arch/arm/mach-k3/am625_init.c @@ -214,6 +214,7 @@ void board_init_f(ulong dummy) if (ret) panic("DRAM init failed: %d\n", ret); #endif + spl_enable_dcache(); }
u32 spl_mmc_boot_mode(struct mmc *mmc, const u32 boot_device) diff --git a/board/ti/am62x/evm.c b/board/ti/am62x/evm.c index 34830f445f..d3c1786cd9 100644 --- a/board/ti/am62x/evm.c +++ b/board/ti/am62x/evm.c @@ -59,42 +59,31 @@ int dram_init_banksize(void) }
#if defined(CONFIG_SPL_BUILD) -#ifdef CONFIG_SPL_VIDEO_TIDSS -static int setup_dram(void) -{ - dram_init(); - dram_init_banksize(); - gd->ram_base = CFG_SYS_SDRAM_BASE; - gd->ram_top = gd->ram_base + gd->ram_size; - gd->relocaddr = gd->ram_top; - return 0; -} - static int video_setup(void) { - ulong addr; - int ret; - addr = gd->relocaddr; + if (CONFIG_IS_ENABLED(VIDEO)) { + ulong addr; + int ret; + + addr = gd->relocaddr; + ret = video_reserve(&addr); + if (ret) + return ret; + debug("Reserving %luk for video at: %08lx\n", + ((unsigned long)gd->relocaddr - addr) >> 10, addr); + gd->relocaddr = addr; + }
- ret = video_reserve(&addr); - if (ret) - return ret; - debug("Reserving %luk for video at: %08lx\n", - ((unsigned long)gd->relocaddr - addr) >> 10, addr); - gd->relocaddr = addr; return 0; }
-#endif void spl_board_init(void) { -#if defined(CONFIG_SPL_VIDEO_TIDSS) - setup_dram(); - arch_reserve_mmu(); video_setup(); enable_caches(); - splash_display(); -#endif + if (IS_ENABLED(CONFIG_SPL_SPLASH_SCREEN) && IS_ENABLED(CONFIG_SPL_BMP)) + splash_display(); + }
#if defined(CONFIG_K3_AM64_DDRSS)

Hi Nikhil,
On 14/06/23 15:04, Nikhil M Jain wrote:
Use spl_dcache_enable, in place of setup_dram, arch_reserve_mmu to set up pagetable, initialise DRAM and enable Dcache.
I think the patch does more than just above, please mention about those changes too in commit message for future reference.
Signed-off-by: Nikhil M Jain n-jain1@ti.com
V3:
- No change.
V2:
- Use CONFIG_SPL_VIDEO in place of CONFIG_SPL_VIDEO_TIDSS to reserve video and call splash at SPL.
- Check SPL_SPLASH_SCREEN and SPL_BMP before calling splash display.
Above should also go to commit message with reasoning along with other changes done in the patch.
Regards Devarsh
arch/arm/mach-k3/am625_init.c | 1 + board/ti/am62x/evm.c | 41 +++++++++++++---------------------- 2 files changed, 16 insertions(+), 26 deletions(-)
diff --git a/arch/arm/mach-k3/am625_init.c b/arch/arm/mach-k3/am625_init.c index 787fe92295..0e5d44269e 100644 --- a/arch/arm/mach-k3/am625_init.c +++ b/arch/arm/mach-k3/am625_init.c @@ -214,6 +214,7 @@ void board_init_f(ulong dummy) if (ret) panic("DRAM init failed: %d\n", ret); #endif
- spl_enable_dcache();
}
u32 spl_mmc_boot_mode(struct mmc *mmc, const u32 boot_device) diff --git a/board/ti/am62x/evm.c b/board/ti/am62x/evm.c index 34830f445f..d3c1786cd9 100644 --- a/board/ti/am62x/evm.c +++ b/board/ti/am62x/evm.c @@ -59,42 +59,31 @@ int dram_init_banksize(void) }
#if defined(CONFIG_SPL_BUILD) -#ifdef CONFIG_SPL_VIDEO_TIDSS -static int setup_dram(void) -{
- dram_init();
- dram_init_banksize();
- gd->ram_base = CFG_SYS_SDRAM_BASE;
- gd->ram_top = gd->ram_base + gd->ram_size;
- gd->relocaddr = gd->ram_top;
- return 0;
-}
static int video_setup(void) {
- ulong addr;
- int ret;
- addr = gd->relocaddr;
- if (CONFIG_IS_ENABLED(VIDEO)) {
ulong addr;
int ret;
addr = gd->relocaddr;
ret = video_reserve(&addr);
if (ret)
return ret;
debug("Reserving %luk for video at: %08lx\n",
((unsigned long)gd->relocaddr - addr) >> 10, addr);
gd->relocaddr = addr;
- }
- ret = video_reserve(&addr);
- if (ret)
return ret;
- debug("Reserving %luk for video at: %08lx\n",
((unsigned long)gd->relocaddr - addr) >> 10, addr);
- gd->relocaddr = addr; return 0;
}
-#endif void spl_board_init(void) { -#if defined(CONFIG_SPL_VIDEO_TIDSS)
- setup_dram();
- arch_reserve_mmu(); video_setup(); enable_caches();
- splash_display();
-#endif
- if (IS_ENABLED(CONFIG_SPL_SPLASH_SCREEN) && IS_ENABLED(CONFIG_SPL_BMP))
splash_display();
}
#if defined(CONFIG_K3_AM64_DDRSS)

Add method to reserve video framebuffer information using blob, received from previous stage.
Signed-off-by: Nikhil M Jain n-jain1@ti.com Reviewed-by: Simon Glass sjg@chromium.org --- V3: - Add Reviewed-by tag.
V2: - Remove #if CONFIG_IS_ENABLED(VIDEO) in video_reserve_from_blob.
drivers/video/video-uclass.c | 11 +++++++++++ include/video.h | 9 +++++++++ 2 files changed, 20 insertions(+)
diff --git a/drivers/video/video-uclass.c b/drivers/video/video-uclass.c index 8396bdfb11..68ce681bb9 100644 --- a/drivers/video/video-uclass.c +++ b/drivers/video/video-uclass.c @@ -142,6 +142,17 @@ int video_reserve(ulong *addrp) return 0; }
+int video_reserve_from_bloblist(struct video_handoff *ho) +{ + gd->video_bottom = ho->fb; + gd->fb_base = ho->fb; + gd->video_top = ho->fb + ho->size; + debug("Reserving %luk for video using blob at: %08x\n", + ((unsigned long)ho->size) >> 10, (u32)ho->fb); + + return 0; +} + int video_fill(struct udevice *dev, u32 colour) { struct video_priv *priv = dev_get_uclass_priv(dev); diff --git a/include/video.h b/include/video.h index 18ed159b8d..5f3010d641 100644 --- a/include/video.h +++ b/include/video.h @@ -389,4 +389,13 @@ int bmp_display(ulong addr, int x, int y); */ int bmp_info(ulong addr);
+/* + * video_reserve_from_bloblist()- Reserve frame-buffer memory for video devices + * using blobs. + * + * @ho: video information passed from SPL + * Returns: 0 (always) + */ +int video_reserve_from_bloblist(struct video_handoff *ho); + #endif

U-boot proper can use frame buffer address passed from SPL to reserve the memory area used by framebuffer set in SPL so that splash image set in SPL continues to get displayed while u-boot proper is running.
Put the framebuffer address and size in a bloblist to make them available at u-boot proper, if in u-boot proper CONFIG_VIDEO is defined.
Signed-off-by: Nikhil M Jain n-jain1@ti.com --- V3: - Clean up errors appeared in checkpatch.
V2: - Fix commit message. - Revert use of #if.
common/board_f.c | 11 ++++++++++- drivers/video/video-uclass.c | 12 ++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/common/board_f.c b/common/board_f.c index 1688e27071..8e5dbaf06c 100644 --- a/common/board_f.c +++ b/common/board_f.c @@ -411,7 +411,16 @@ __weak int arch_reserve_mmu(void)
static int reserve_video(void) { - if (IS_ENABLED(CONFIG_VIDEO)) { + if (IS_ENABLED(CONFIG_SPL_VIDEO) && spl_phase() > PHASE_SPL && + CONFIG_IS_ENABLED(BLOBLIST)) { + struct video_handoff *ho; + + ho = bloblist_find(BLOBLISTT_U_BOOT_VIDEO, sizeof(*ho)); + if (!ho) + return log_msg_ret("blf", -ENOENT); + video_reserve_from_bloblist(ho); + gd->relocaddr = ho->fb; + } else if (CONFIG_IS_ENABLED(VIDEO)) { ulong addr; int ret;
diff --git a/drivers/video/video-uclass.c b/drivers/video/video-uclass.c index 68ce681bb9..f8f0dc0311 100644 --- a/drivers/video/video-uclass.c +++ b/drivers/video/video-uclass.c @@ -6,12 +6,14 @@ #define LOG_CATEGORY UCLASS_VIDEO
#include <common.h> +#include <bloblist.h> #include <console.h> #include <cpu_func.h> #include <dm.h> #include <log.h> #include <malloc.h> #include <mapmem.h> +#include <spl.h> #include <stdio_dev.h> #include <video.h> #include <video_console.h> @@ -139,6 +141,16 @@ int video_reserve(ulong *addrp) debug("Video frame buffers from %lx to %lx\n", gd->video_bottom, gd->video_top);
+ if (spl_phase() == PHASE_SPL && CONFIG_IS_ENABLED(BLOBLIST)) { + struct video_handoff *ho; + + ho = bloblist_add(BLOBLISTT_U_BOOT_VIDEO, sizeof(*ho), 0); + if (!ho) + return log_msg_ret("blf", -ENOENT); + ho->fb = *addrp; + ho->size = size; + } + return 0; }

On 14/06/23 15:04, Nikhil M Jain wrote:
U-boot proper can use frame buffer address passed from SPL to reserve the memory area used by framebuffer set in SPL so that splash image set in SPL continues to get displayed while u-boot proper is running.
Put the framebuffer address and size in a bloblist to make them available at u-boot proper, if in u-boot proper CONFIG_VIDEO is defined.
Signed-off-by: Nikhil M Jain n-jain1@ti.com
Reviewed-by: Devarsh Thakkar devarsht@ti.com
V3:
- Clean up errors appeared in checkpatch.
V2:
- Fix commit message.
- Revert use of #if.
common/board_f.c | 11 ++++++++++- drivers/video/video-uclass.c | 12 ++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/common/board_f.c b/common/board_f.c index 1688e27071..8e5dbaf06c 100644 --- a/common/board_f.c +++ b/common/board_f.c @@ -411,7 +411,16 @@ __weak int arch_reserve_mmu(void)
static int reserve_video(void) {
- if (IS_ENABLED(CONFIG_VIDEO)) {
- if (IS_ENABLED(CONFIG_SPL_VIDEO) && spl_phase() > PHASE_SPL &&
CONFIG_IS_ENABLED(BLOBLIST)) {
struct video_handoff *ho;
ho = bloblist_find(BLOBLISTT_U_BOOT_VIDEO, sizeof(*ho));
if (!ho)
return log_msg_ret("blf", -ENOENT);
video_reserve_from_bloblist(ho);
gd->relocaddr = ho->fb;
- } else if (CONFIG_IS_ENABLED(VIDEO)) { ulong addr; int ret;
diff --git a/drivers/video/video-uclass.c b/drivers/video/video-uclass.c index 68ce681bb9..f8f0dc0311 100644 --- a/drivers/video/video-uclass.c +++ b/drivers/video/video-uclass.c @@ -6,12 +6,14 @@ #define LOG_CATEGORY UCLASS_VIDEO
#include <common.h> +#include <bloblist.h> #include <console.h> #include <cpu_func.h> #include <dm.h> #include <log.h> #include <malloc.h> #include <mapmem.h> +#include <spl.h> #include <stdio_dev.h> #include <video.h> #include <video_console.h> @@ -139,6 +141,16 @@ int video_reserve(ulong *addrp) debug("Video frame buffers from %lx to %lx\n", gd->video_bottom, gd->video_top);
- if (spl_phase() == PHASE_SPL && CONFIG_IS_ENABLED(BLOBLIST)) {
struct video_handoff *ho;
ho = bloblist_add(BLOBLISTT_U_BOOT_VIDEO, sizeof(*ho), 0);
if (!ho)
return log_msg_ret("blf", -ENOENT);
ho->fb = *addrp;
ho->size = size;
- }
- return 0;
}

On Wed, 14 Jun 2023 at 10:35, Nikhil M Jain n-jain1@ti.com wrote:
U-boot proper can use frame buffer address passed from SPL to reserve the memory area used by framebuffer set in SPL so that splash image set in SPL continues to get displayed while u-boot proper is running.
Put the framebuffer address and size in a bloblist to make them available at u-boot proper, if in u-boot proper CONFIG_VIDEO is defined.
Signed-off-by: Nikhil M Jain n-jain1@ti.com
V3:
- Clean up errors appeared in checkpatch.
V2:
- Fix commit message.
- Revert use of #if.
common/board_f.c | 11 ++++++++++- drivers/video/video-uclass.c | 12 ++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-)
Reviewed-by: Simon Glass sjg@chromium.org

This is required since user may want to either call the remove method of video driver and reset the display or not call the remove method to continue displaying until next stage.
Signed-off-by: Nikhil M Jain n-jain1@ti.com Reviewed-by: Devarsh Thakkar devarsht@ti.com --- V3: - No change.
V2: - Add Reviewed-by tag.
drivers/video/Kconfig | 12 ++++++++++++ 1 file changed, 12 insertions(+)
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig index fcc0e85d2e..a89bfaa448 100644 --- a/drivers/video/Kconfig +++ b/drivers/video/Kconfig @@ -840,6 +840,12 @@ config IHS_VIDEO_OUT out On-screen Display (OSD) used on gdsys FPGAs to control dynamic textual overlays of the display outputs.
+config VIDEO_REMOVE + bool "Remove video driver" + help + Use this option to specify if user wants to call remove method of + video driver in u-boot proper stage. + config SPLASH_SCREEN bool "Show a splash-screen image" help @@ -1063,6 +1069,12 @@ config SPL_SYS_WHITE_ON_BLACK This can be better in low-light situations or to reduce eye strain in some cases.
+config SPL_VIDEO_REMOVE + bool "Remove video driver after SPL stage" + help + if this option is enabled video driver will be removed at the end of + SPL stage, beforeloading the next stage. + if SPL_SPLASH_SCREEN
config SPL_SPLASH_SCREEN_ALIGN

On Wed, Jun 14, 2023 at 03:04:38PM +0530, Nikhil M Jain wrote:
This is required since user may want to either call the remove method of video driver and reset the display or not call the remove method to continue displaying until next stage.
Signed-off-by: Nikhil M Jain n-jain1@ti.com Reviewed-by: Devarsh Thakkar devarsht@ti.com
Reviewed-by: Tom Rini trini@konsulko.com

Use config SPL_VIDEO_REMOVE to remove video driver at SPL stage before jumping to next stage, in place of CONFIG_SPL_VIDEO, to allow user to remove video if required.
Signed-off-by: Nikhil M Jain n-jain1@ti.com Reviewed-by: Devarsh Thakkar devarsht@ti.com --- V3: - Replace #if defined(CONFIG_SPL_VIDEO_REMOVE) with if (IS_ENABLED(CONFIG_SPL_VIDEO_REMOVE).
V2: - Add Reviewed-by tag.
common/spl/spl.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/common/spl/spl.c b/common/spl/spl.c index 13b55e9769..79291abeae 100644 --- a/common/spl/spl.c +++ b/common/spl/spl.c @@ -891,18 +891,18 @@ void board_init_r(gd_t *dummy1, ulong dummy2) debug("Failed to stash bootstage: err=%d\n", ret); #endif
-#if defined(CONFIG_SPL_VIDEO) - struct udevice *dev; - int rc; - - rc = uclass_find_device(UCLASS_VIDEO, 0, &dev); - if (!rc && dev) { - rc = device_remove(dev, DM_REMOVE_NORMAL); - if (rc) - printf("Cannot remove video device '%s' (err=%d)\n", - dev->name, rc); + if (IS_ENABLED(CONFIG_SPL_VIDEO_REMOVE)) { + struct udevice *dev; + int rc; + + rc = uclass_find_device(UCLASS_VIDEO, 0, &dev); + if (!rc && dev) { + rc = device_remove(dev, DM_REMOVE_NORMAL); + if (rc) + printf("Cannot remove video device '%s' (err=%d)\n", + dev->name, rc); + } } -#endif
spl_board_prepare_for_boot(); jump_to_image_no_args(&spl_image);

Set bloblist address to 0x80D00000.
Below is the link to updated memory map:
Link: https://gist.github.com/NikMJain/5686f7f976c18a359762b52d474dc07b#file-am62x...
Signed-off-by: Nikhil M Jain n-jain1@ti.com Reviewed-by: Devarsh Thakkar devarsht@ti.com --- V3: - Add link to updated memory map.
V2: - Add Reviewed-by tag.
configs/am62x_evm_a53_defconfig | 1 + 1 file changed, 1 insertion(+)
diff --git a/configs/am62x_evm_a53_defconfig b/configs/am62x_evm_a53_defconfig index 7c3bc184cf..5c572dfb33 100644 --- a/configs/am62x_evm_a53_defconfig +++ b/configs/am62x_evm_a53_defconfig @@ -102,3 +102,4 @@ CONFIG_SYSRESET=y CONFIG_SPL_SYSRESET=y CONFIG_SYSRESET_TI_SCI=y CONFIG_FS_FAT_MAX_CLUSTSIZE=16384 +CONFIG_BLOBLIST_ADDR=0x80D00000

On Wed, Jun 14, 2023 at 03:04:40PM +0530, Nikhil M Jain wrote:
Set bloblist address to 0x80D00000.
Below is the link to updated memory map:
Link: https://gist.github.com/NikMJain/5686f7f976c18a359762b52d474dc07b#file-am62x...
Signed-off-by: Nikhil M Jain n-jain1@ti.com Reviewed-by: Devarsh Thakkar devarsht@ti.com
V3:
- Add link to updated memory map.
V2:
- Add Reviewed-by tag.
configs/am62x_evm_a53_defconfig | 1 + 1 file changed, 1 insertion(+)
Please update the in tree documentation, not point to an external gist.
participants (4)
-
Devarsh Thakkar
-
Nikhil M Jain
-
Simon Glass
-
Tom Rini