[PATCH 2/2] board: rock5b-rk3588: add memory gaps into kernel's DTB

Eugen Hristev eugen.hristev at collabora.com
Thu Feb 16 14:29:05 CET 2023


RK3588 has two memory gaps when using 16 GiB DRAM size:
[0x3fc000000 , 0x3fc500000]
and
[0x3fff00000 , 0x3ffffffff]

If the kernel is agnostic to these gaps, accessing the area causes
a SError panic.

Hence, add reserved memory areas in kernel's DTB before booting.

Signed-off-by: Eugen Hristev <eugen.hristev at collabora.com>
---

Hi,

These memory gaps are required because the kernel crashes with a SError if
accessing that area.
It appears the ATAGs provide DDR banks that do not include those specific
two regions.
To be able to boot the kernel, those areas have to be reserved.
Maybe someone from Rockchip could have an explanation to this behavior?
Otherwise we have to block them at this level.
If those memory ranges are reserved for a dedicated purpose we can come up
with a better solution, w.r.t. the purpose of the regions.

Thanks !
Eugen

 board/radxa/rock5b-rk3588/rock5b-rk3588.c | 35 +++++++++++++++++++++++
 configs/rock5b-rk3588_defconfig           |  1 +
 2 files changed, 36 insertions(+)

diff --git a/board/radxa/rock5b-rk3588/rock5b-rk3588.c b/board/radxa/rock5b-rk3588/rock5b-rk3588.c
index b5d74798f3b9..5c3b52b94898 100644
--- a/board/radxa/rock5b-rk3588/rock5b-rk3588.c
+++ b/board/radxa/rock5b-rk3588/rock5b-rk3588.c
@@ -2,3 +2,38 @@
 /*
  * Copyright (c) 2023 Collabora Ltd.
  */
+
+#include <fdtdec.h>
+#include <fdt_support.h>
+
+#ifdef CONFIG_OF_BOARD_SETUP
+int rock5b_add_reserved_memory_fdt_nodes(void *new_blob)
+{
+	struct fdt_memory gap1 = {
+		.start = 0x3fc000000,
+		.end = 0x3fc4fffff,
+	};
+	struct fdt_memory gap2 = {
+		.start = 0x3fff00000,
+		.end = 0x3ffffffff,
+	};
+	unsigned long flags = FDTDEC_RESERVED_MEMORY_NO_MAP;
+	unsigned int ret;
+
+	/*
+	 * Inject the reserved-memory nodes into the DTS
+	 */
+	ret = fdtdec_add_reserved_memory(new_blob, "gap1", &gap1,  NULL, 0,
+					 NULL, flags);
+	if (ret)
+		return ret;
+
+	return fdtdec_add_reserved_memory(new_blob, "gap2", &gap2,  NULL, 0,
+					  NULL, flags);
+}
+
+int ft_board_setup(void *blob, struct bd_info *bd)
+{
+	return rock5b_add_reserved_memory_fdt_nodes(blob);
+}
+#endif
diff --git a/configs/rock5b-rk3588_defconfig b/configs/rock5b-rk3588_defconfig
index 9b7db7de64be..f3026c7ea166 100644
--- a/configs/rock5b-rk3588_defconfig
+++ b/configs/rock5b-rk3588_defconfig
@@ -26,6 +26,7 @@ CONFIG_FIT=y
 CONFIG_FIT_VERBOSE=y
 CONFIG_SPL_FIT_SIGNATURE=y
 CONFIG_SPL_LOAD_FIT=y
+CONFIG_OF_BOARD_SETUP=y
 CONFIG_DEFAULT_FDT_FILE="rockchip/rk3588-rock-5b.dtb"
 # CONFIG_DISPLAY_CPUINFO is not set
 CONFIG_DISPLAY_BOARDINFO_LATE=y
-- 
2.34.1



More information about the U-Boot mailing list