[RESEND PATCH] rpi: Copy properties from firmware dtb to the loaded dtb

Matthias Brugger mbrugger at suse.com
Fri Nov 26 12:31:14 CET 2021



On 25/11/2021 20:42, Sjoerd Simons wrote:
> The RPI firmware adjusts several property values in the dtb it passes
> to u-boot depending on the board/SoC revision. Inherit some of these
> when u-boot loads a dtb itself. Specificaly copy:
> 
> * /model: The firmware provides a more specific string
> * /memreserve: The firmware defines a reserved range, better keep it
> * emmc2bus and pcie0 dma-ranges: The C0T revision of the bcm2711 Soc (as
>    present on rpi 400 and some rpi 4B boards) has different values for
>    these then the B0T revision. So these need to be adjusted to boot on
>    these boards
> * blconfig: The firmware defines the memory area where the blconfig
>    stored. Copy those over so it can be enabled.
> * /chosen/kaslr-seed: The firmware generates a kaslr seed, take advantage
>    of that.

So my question is, why don't you want to use the devicetree provided by the 
firmware in the first place?
Wouldn't that fix all the problems you have?

Regards,
Matthias

> 
> Signed-off-by: Sjoerd Simons <sjoerd at collabora.com>
> ---
> 
>   board/raspberrypi/rpi/rpi.c | 48 +++++++++++++++++++++++++++++++++++++
>   1 file changed, 48 insertions(+)
> 
> diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c
> index 55afaa54d9f..cdde32c8143 100644
> --- a/board/raspberrypi/rpi/rpi.c
> +++ b/board/raspberrypi/rpi/rpi.c
> @@ -499,10 +499,58 @@ void *board_fdt_blob_setup(int *err)
>   	return (void *)fw_dtb_pointer;
>   }
>   
> +int copy_property(void *dst, void *src, char *path, char *property)
> +{
> +	int dst_offset, src_offset;
> +	const fdt32_t *prop;
> +	int len;
> +
> +	src_offset = fdt_path_offset(src, path);
> +	dst_offset = fdt_path_offset(dst, path);
> +
> +	if (src_offset < 0 || dst_offset < 0)
> +		return -1;
> +
> +	prop = fdt_getprop(src, src_offset, property, &len);
> +	if (!prop)
> +		return -1;
> +
> +	return fdt_setprop(dst, dst_offset, property, prop, len);
> +}
> +
> +/* Copy tweaks from the firmware dtb to the loaded dtb */
> +void  update_fdt_from_fw(void *fdt, void *fw_fdt)
> +{
> +	/* Using dtb from firmware directly; leave it alone */
> +	if (fdt == fw_fdt)
> +		return;
> +
> +	/* The firmware provides a more precie model; so copy that */
> +	copy_property(fdt, fw_fdt, "/", "model");
> +
> +	/* memory reserve as suggested by the firmware */
> +	copy_property(fdt, fw_fdt, "/", "memreserve");
> +
> +	/* Adjust dma-ranges for the SD card and PCI bus as they can depend on
> +	 * the SoC revision
> +	 */
> +	copy_property(fdt, fw_fdt, "emmc2bus", "dma-ranges");
> +	copy_property(fdt, fw_fdt, "pcie0", "dma-ranges");
> +
> +	/* Bootloader configuration template exposes as nvmem */
> +	if (copy_property(fdt, fw_fdt, "blconfig", "reg") == 0)
> +		copy_property(fdt, fw_fdt, "blconfig", "status");
> +
> +	/* kernel address randomisation seed as provided by the firmware */
> +	copy_property(fdt, fw_fdt, "/chosen", "kaslr-seed");
> +}
> +
>   int ft_board_setup(void *blob, struct bd_info *bd)
>   {
>   	int node;
>   
> +	update_fdt_from_fw(blob, (void *)fw_dtb_pointer);
> +
>   	node = fdt_node_offset_by_compatible(blob, -1, "simple-framebuffer");
>   	if (node < 0)
>   		lcd_dt_simplefb_add_node(blob);
> 



More information about the U-Boot mailing list