diff mbox series

[U-Boot,RFC,03/22] thunderx: add FDT support

Message ID 20190222180319.32221-4-tharvey@gateworks.com
State RFC
Delegated to: Tom Rini
Headers show
Series Add support for Cavium Octeon-TX CN80XX/CN81XX | expand

Commit Message

Tim Harvey Feb. 22, 2019, 6:03 p.m. UTC
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@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

Comments

Alexander Graf Feb. 24, 2019, 4:39 p.m. UTC | #1
On 22.02.19 19:03, Tim Harvey wrote:
> 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@gateworks.com>

In the long run we maybe want to standardize on CONFIG_OF_PRIOR_STAGE
for aarch64 as well and then move rpi as well as this target over to it.
But for now, I think this solution is very reasonable.

> ---
>  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__);

Why remove it?


Alex
diff mbox series

Patch

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;
 }