[U-Boot] [RFC/RESEND 03/22] thunderx: add FDT support
Tim Harvey
tharvey at gateworks.com
Mon Mar 4 17:34:18 UTC 2019
The thunderx boards use the Cavium Bringup and Diagnostics Kit (BDK) as a
secondary program loader (SPL). This initial boot firmware loads the
device-tree and passes it to the next layer of software in X1.
Signed-off-by: Tim Harvey <tharvey at gateworks.com>
---
arch/arm/mach-thunderx/Makefile | 2 +-
arch/arm/mach-thunderx/fdt.c | 50 ++++++++++++++++++++++++++
arch/arm/mach-thunderx/lowlevel_init.S | 31 ++++++++++++++++
board/cavium/thunderx/thunderx.c | 12 +++++--
4 files changed, 92 insertions(+), 3 deletions(-)
create mode 100644 arch/arm/mach-thunderx/fdt.c
create mode 100644 arch/arm/mach-thunderx/lowlevel_init.S
diff --git a/arch/arm/mach-thunderx/Makefile b/arch/arm/mach-thunderx/Makefile
index 34b6ecc2f9..fb457cb3e0 100644
--- a/arch/arm/mach-thunderx/Makefile
+++ b/arch/arm/mach-thunderx/Makefile
@@ -1,2 +1,2 @@
# SPDX-License-Identifier: GPL-2.0+
-obj-y := atf.o
+obj-y := atf.o lowlevel_init.o fdt.o
diff --git a/arch/arm/mach-thunderx/fdt.c b/arch/arm/mach-thunderx/fdt.c
new file mode 100644
index 0000000000..31f1128e9f
--- /dev/null
+++ b/arch/arm/mach-thunderx/fdt.c
@@ -0,0 +1,50 @@
+// SPDX-License-Identifier: GPL-2.0+
+/**
+ * Copyright (C) 2014, Cavium Inc.
+ */
+
+#include <common.h>
+#include <malloc.h>
+#include <errno.h>
+#include <environment.h>
+#include <fdtdec.h>
+
+/* From lowlevel_init.S */
+extern unsigned long fdt_base_addr;
+
+/**
+ * If the firmware passed a device tree use it for U-Boot
+ *
+ * @return FDT base address received from ATF in x1 register
+ */
+void *board_fdt_blob_setup(void)
+{
+ if (fdt_magic(fdt_base_addr) != FDT_MAGIC)
+ return NULL;
+ return (void *)fdt_base_addr;
+}
+
+int ft_board_setup(void *blob, bd_t *bd)
+{
+ int offset;
+ int ret = 0;
+
+ debug("%s\n", __func__);
+ ret = fdt_check_header(blob);
+ if (ret < 0) {
+ printf("ERROR: %s\n", fdt_strerror(ret));
+ return ret;
+ }
+
+ /* remove "cavium, bdk" node from DT */
+ if (blob) {
+ offset = fdt_path_offset(blob, "/cavium,bdk");
+ if(offset >= 0) {
+ ret = fdt_del_node(blob, offset);
+ debug("%s deleted 'cavium,bdk' node\n", __func__);
+ }
+ }
+
+ return ret;
+}
+
diff --git a/arch/arm/mach-thunderx/lowlevel_init.S b/arch/arm/mach-thunderx/lowlevel_init.S
new file mode 100644
index 0000000000..fb81ac4fd0
--- /dev/null
+++ b/arch/arm/mach-thunderx/lowlevel_init.S
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2018, Cavium Inc.
+ */
+
+#include <linux/linkage.h>
+#include <asm/macro.h>
+
+.align 8
+.global fdt_base_addr
+fdt_base_addr:
+ .dword 0x0
+
+.global save_boot_params
+save_boot_params:
+ /* Read FDT base from x1 register passed by ATF */
+ adr x21, fdt_base_addr
+ str x1, [x21]
+
+ /* Returns */
+ b save_boot_params_ret
+
+ENTRY(lowlevel_init)
+ mov x29, lr /* Save LR */
+
+ /* any lowlevel init should go here */
+
+ mov lr, x29 /* Restore LR */
+ ret
+ENDPROC(lowlevel_init)
+
diff --git a/board/cavium/thunderx/thunderx.c b/board/cavium/thunderx/thunderx.c
index 2b80dc56f1..57dce5aee0 100644
--- a/board/cavium/thunderx/thunderx.c
+++ b/board/cavium/thunderx/thunderx.c
@@ -5,8 +5,9 @@
#include <common.h>
#include <dm.h>
-#include <malloc.h>
#include <errno.h>
+#include <fdt_support.h>
+#include <malloc.h>
#include <linux/compiler.h>
#include <asm/arch-thunderx/atf.h>
@@ -38,7 +39,10 @@ U_BOOT_DEVICE(thunderx_serial1) = {
.name = "serial_pl01x",
.platdata = &serial1,
};
-#endif
+#else
+/* From lowlevel_init.S */
+extern unsigned long fdt_base_addr;
+#endif // !CONFIG_IS_ENABLED(OF_CONTROL)
DECLARE_GLOBAL_DATA_PTR;
@@ -70,6 +74,10 @@ struct mm_region *mem_map = thunderx_mem_map;
int board_init(void)
{
+#if CONFIG_IS_ENABLED(OF_CONTROL)
+ ulong fdt_addr = (ulong)fdt_base_addr;
+ set_working_fdt_addr(fdt_addr);
+#endif
return 0;
}
--
2.17.1
More information about the U-Boot
mailing list