Black and White Artifact on BMP (24BPP) logo during boot

Hi All,
Artifact occurred only during boot but loading via the bmp command on the u-boot console seems fine.
I have observed the contents of bmp hex codes have changed during the function switch after memory to ddr address. (The same cannot happen on downstream u-boot)
diff --git a/common/splash.c b/common/splash.c index 6820db683b..f97edf8732 100644 --- a/common/splash.c +++ b/common/splash.c @@ -175,6 +175,11 @@ int splash_display(void)
splash_get_pos(&x, &y);
+ if (memcmp((void *)addr, bmp_logo_bitmap, len2) == 0) + printf("%s: SAME\n", __func__); + else + printf("%s: NOTSAME\n", __func__); + if (CONFIG_IS_ENABLED(BMP)) ret = bmp_display(addr, x, y); else diff --git a/drivers/video/bmp.c b/drivers/video/bmp.c index bab6fa7265..dc2928ccdb 100644 --- a/drivers/video/bmp.c +++ b/drivers/video/bmp.c @@ -111,10 +111,15 @@ int bmp_display(ulong addr, int x, int y) { struct udevice *dev; int ret; - struct bmp_image *bmp = map_sysmem(addr, 0); void *bmp_alloc_addr = NULL; unsigned long len;
+ if (memcmp((void *)addr, bmp_logo_bitmap, len2) == 0) + printf("%s: SAME\n", __func__); + else + printf("%s: NOTSAME\n", __func__); + + struct bmp_image *bmp = map_sysmem(addr, 0); if (!((bmp->header.signature[0] == 'B') && (bmp->header.signature[1] == 'M'))) bmp = gunzip_bmp(addr, &len, &bmp_alloc_addr);
So, the contents in splash_display show SAME and the contents in bmp_display show NOTSAME.
This issue is reproducing on specifics like - 24-bit BMP (attached). rockchip.bmp: PC bitmap, Windows 98/2000 and newer format, 480 x 270 x 24 - Rockchip 64-bit SoC (32-bit, RK3288 has no issue). - Allwinner 64-bit SoC seems no issues. - Downstream u-boot rockchip has no issues. (with mainline vide drivers not with drm drivers) - Issue observed in boot but loading via bmp command on u-boot console seems no issue.
I did check the clock, cache, and memory but none of them showed any clue. I did port clock, mach-rockchip code to rockchip u-boot but none of the cases resulted in the same.
Any input on this is appreciated.
Thanks, Jagan.

Hi Jagan,
Have you check the memory area, does it maybe overlap with other area? eg. heap, stack, malloc area and etc.
Thanks,
- Kever
On 2024/1/17 18:36, Jagan Teki wrote:
Hi All,
Artifact occurred only during boot but loading via the bmp command on the u-boot console seems fine.
I have observed the contents of bmp hex codes have changed during the function switch after memory to ddr address. (The same cannot happen on downstream u-boot)
diff --git a/common/splash.c b/common/splash.c index 6820db683b..f97edf8732 100644 --- a/common/splash.c +++ b/common/splash.c @@ -175,6 +175,11 @@ int splash_display(void)
splash_get_pos(&x, &y);
if (memcmp((void *)addr, bmp_logo_bitmap, len2) == 0)
printf("%s: SAME\n", __func__);
else
printf("%s: NOTSAME\n", __func__);
if (CONFIG_IS_ENABLED(BMP)) ret = bmp_display(addr, x, y); else
diff --git a/drivers/video/bmp.c b/drivers/video/bmp.c index bab6fa7265..dc2928ccdb 100644 --- a/drivers/video/bmp.c +++ b/drivers/video/bmp.c @@ -111,10 +111,15 @@ int bmp_display(ulong addr, int x, int y) { struct udevice *dev; int ret;
struct bmp_image *bmp = map_sysmem(addr, 0); void *bmp_alloc_addr = NULL; unsigned long len;
if (memcmp((void *)addr, bmp_logo_bitmap, len2) == 0)
printf("%s: SAME\n", __func__);
else
printf("%s: NOTSAME\n", __func__);
struct bmp_image *bmp = map_sysmem(addr, 0); if (!((bmp->header.signature[0] == 'B') && (bmp->header.signature[1] == 'M'))) bmp = gunzip_bmp(addr, &len, &bmp_alloc_addr);
So, the contents in splash_display show SAME and the contents in bmp_display show NOTSAME.
This issue is reproducing on specifics like
- 24-bit BMP (attached).
rockchip.bmp: PC bitmap, Windows 98/2000 and newer format, 480 x 270 x 24
- Rockchip 64-bit SoC (32-bit, RK3288 has no issue).
- Allwinner 64-bit SoC seems no issues.
- Downstream u-boot rockchip has no issues. (with mainline vide
drivers not with drm drivers)
- Issue observed in boot but loading via bmp command on u-boot console
seems no issue.
I did check the clock, cache, and memory but none of them showed any clue. I did port clock, mach-rockchip code to rockchip u-boot but none of the cases resulted in the same.
Any input on this is appreciated.
Thanks, Jagan.

Hi Kever,
On Thu, Jan 18, 2024 at 9:09 AM Kever Yang kever.yang@rock-chips.com wrote:
Hi Jagan,
Have you check the memory area, does it maybe overlap with other
area? eg. heap, stack, malloc area and etc.
Start with GD all memory map seems proper before and after relocation. I did load U-Boot proper of rockchip with mainline and vice-versa. The issue persists.
Jagan.
participants (2)
-
Jagan Teki
-
Kever Yang