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