aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPali Rohár <pali@kernel.org>2022-08-29 15:44:48 +0200
committerStefan Roese <sr@denx.de>2022-09-13 06:38:08 +0200
commit64c422b14fbe22d0424c53c043f3e5c6183f05ef (patch)
tree25636638413bf967817fca796152a05e41dccdb0
parent109dde049740fe17a461471d7ff54a64fc58aab9 (diff)
downloadu-boot-64c422b14fbe22d0424c53c043f3e5c6183f05ef.zip
u-boot-64c422b14fbe22d0424c53c043f3e5c6183f05ef.tar.gz
u-boot-64c422b14fbe22d0424c53c043f3e5c6183f05ef.tar.bz2
arm: mvebu: turris_mox: Add support for distroboot $fdt_addr
$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@kernel.org> Reviewed-by: Stefan Roese <sr@denx.de>
-rw-r--r--board/CZ.NIC/turris_mox/turris_mox.c48
-rw-r--r--include/configs/turris_mox.h1
2 files changed, 49 insertions, 0 deletions
diff --git a/board/CZ.NIC/turris_mox/turris_mox.c b/board/CZ.NIC/turris_mox/turris_mox.c
index 5e1cf328..ff1c4cb 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 b8ff705..f549f9f 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" \