[PATCH] arm: mvebu: turris_mox: Add support for distroboot $fdt_addr

Stefan Roese sr at denx.de
Tue Aug 30 14:27:55 CEST 2022


On 29.08.22 15:44, Pali Rohár wrote:
> $fdt_addr is mandatory for systems which provides DTB in HW (e.g. ROM) and
> wishes to pass that DTB to Linux.
> 
> Turris Mox contains DTB binary in SPI NOR memory at "dtb" partition which
> starts at offset 0x7f0000 and is 0x10000 bytes long.
> 
> Armada 3700 CPU does not allow mapping SPI NOR memory into physical address
> space like on other architectures and therefore set $fdt_addr variable to
> memory range in RAM and loads this DTB binary from SPI NOR in misc_init_r()
> function.
> 
> Signed-off-by: Pali Rohár <pali at kernel.org>

Reviewed-by: Stefan Roese <sr at denx.de>

Thanks,
Stefan

> ---
>   board/CZ.NIC/turris_mox/turris_mox.c | 48 ++++++++++++++++++++++++++++
>   include/configs/turris_mox.h         |  1 +
>   2 files changed, 49 insertions(+)
> 
> diff --git a/board/CZ.NIC/turris_mox/turris_mox.c b/board/CZ.NIC/turris_mox/turris_mox.c
> index 3dbd68e52366..3402515bbae2 100644
> --- a/board/CZ.NIC/turris_mox/turris_mox.c
> +++ b/board/CZ.NIC/turris_mox/turris_mox.c
> @@ -23,6 +23,7 @@
>   #include <linux/string.h>
>   #include <miiphy.h>
>   #include <spi.h>
> +#include <spi_flash.h>
>   
>   #include "mox_sp.h"
>   
> @@ -339,6 +340,51 @@ static int get_reset_gpio(struct gpio_desc *reset_gpio)
>   	return 0;
>   }
>   
> +/* Load default system DTB binary to $fdr_addr */
> +static void load_spi_dtb(void)
> +{
> +	const char *const env_name[1] = { "fdt_addr" };
> +	unsigned long size, offset;
> +	struct udevice *spi_dev;
> +	struct spi_flash *flash;
> +	const char *addr_str;
> +	unsigned long addr;
> +	void *buf;
> +
> +	addr_str = env_get(env_name[0]);
> +	if (!addr_str) {
> +		env_set_default_vars(1, (char * const *)env_name, 0);
> +		addr_str = env_get(env_name[0]);
> +	}
> +
> +	if (!addr_str)
> +		return;
> +
> +	addr = hextoul(addr_str, NULL);
> +	if (!addr)
> +		return;
> +
> +	spi_flash_probe_bus_cs(CONFIG_SF_DEFAULT_BUS, CONFIG_SF_DEFAULT_CS, &spi_dev);
> +	flash = dev_get_uclass_priv(spi_dev);
> +	if (!flash)
> +		return;
> +
> +	/*
> +	 * SPI NOR "dtb" partition offset & size hardcoded for now because the
> +	 * mtd subsystem does not offer finding the partition yet and we do not
> +	 * want to reimplement OF partition parser here.
> +	 */
> +	offset = 0x7f0000;
> +	size = 0x10000;
> +
> +	buf = map_physmem(addr, size, MAP_WRBACK);
> +	if (!buf)
> +		return;
> +
> +	spi_flash_read(flash, offset, size, buf);
> +	unmap_physmem(buf, size);
> +}
> +
>   int misc_init_r(void)
>   {
>   	u8 mac[2][6];
> @@ -358,6 +404,8 @@ int misc_init_r(void)
>   			eth_env_set_enetaddr_by_index("eth", i, mac[i]);
>   	}
>   
> +	load_spi_dtb();
> +
>   	return 0;
>   }
>   
> diff --git a/include/configs/turris_mox.h b/include/configs/turris_mox.h
> index b8ff705ac923..f549f9f7ad06 100644
> --- a/include/configs/turris_mox.h
> +++ b/include/configs/turris_mox.h
> @@ -36,6 +36,7 @@
>   	"bootm 0x5800000"
>   
>   #define CONFIG_EXTRA_ENV_SETTINGS				\
> +	"fdt_addr=0x4c00000\0"					\
>   	"scriptaddr=0x4d00000\0"				\
>   	"pxefile_addr_r=0x4e00000\0"				\
>   	"fdt_addr_r=0x4f00000\0"				\

Viele Grüße,
Stefan Roese

-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: sr at denx.de


More information about the U-Boot mailing list