[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