> From: Eugen Hristev <eugen.hris...@collabora.com> > Date: Thu, 16 Feb 2023 15:29:05 +0200 > > 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.
I can confirm that using the full 16GB of memory on the rock5b causes prolems for OpenBSD as well. Was wondering whether excluding these regions was better done by adding reserved-memory nodes in the device tree though like what is done in the meson-g12-common.dtsi file for example. > Signed-off-by: Eugen Hristev <eugen.hris...@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 > >