On Wed, Sep 13, 2023 at 03:01:50PM +0200, Ahmad Fatoum wrote: > The ZCU102 is a potentially interesting platform, because there's Qemu > support for it. It's not very straight forward to use, because the > ZynqMP support in barebox and Linux relies heavily on firmware services, > which are lacking when naively using Qemu. > > Still, let's add support now and worry about running it as part of the > test suite later. > > Board support was not tested on actual hardware, but on Qemu with > changes on top of barebox to skip the firmware communication. > > Signed-off-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx> > --- > Documentation/boards/zynqmp.rst | 4 ++-- > arch/arm/boards/Makefile | 1 + > arch/arm/boards/xilinx-zcu102/Makefile | 3 +++ > arch/arm/boards/xilinx-zcu102/board.c | 27 ++++++++++++++++++++++++ > arch/arm/boards/xilinx-zcu102/lowlevel.c | 15 +++++++++++++ > arch/arm/configs/multi_v8_defconfig | 1 + > arch/arm/configs/zynqmp_defconfig | 1 + > arch/arm/dts/Makefile | 1 + > arch/arm/dts/zynqmp-zcu102-revA.dts | 13 ++++++++++++ > arch/arm/dts/zynqmp-zcu102-revB.dts | 13 ++++++++++++ > arch/arm/mach-zynqmp/Kconfig | 7 ++++++ > images/Makefile.zynqmp | 4 ++++ > 12 files changed, 88 insertions(+), 2 deletions(-) > create mode 100644 arch/arm/boards/xilinx-zcu102/Makefile > create mode 100644 arch/arm/boards/xilinx-zcu102/board.c > create mode 100644 arch/arm/boards/xilinx-zcu102/lowlevel.c > create mode 100644 arch/arm/dts/zynqmp-zcu102-revA.dts > create mode 100644 arch/arm/dts/zynqmp-zcu102-revB.dts Applied, thanks Sascha > > diff --git a/Documentation/boards/zynqmp.rst b/Documentation/boards/zynqmp.rst > index 98fcac017b17..86078d496eec 100644 > --- a/Documentation/boards/zynqmp.rst > +++ b/Documentation/boards/zynqmp.rst > @@ -11,13 +11,13 @@ Currently, Barebox only supports booting as a second stage boot loader from an > SD-card. It relies on the FSBL_ to initialize the base system including sdram > setup and pin muxing. > > -The ZynqMP defconfig supports the ZCU104 reference board. Use it to build the > +The ZynqMP defconfig supports the ZCU102/104/106 reference board. Use it to build the > Barebox image:: > > make ARCH=arm64 zynqmp_defconfig > make ARCH=arm64 > > -.. note:: The resulting image ``images/barebox-zynqmp-zcu104.img`` is **not** an image > +.. note:: The resulting image ``images/barebox-zynqmp-zcuX.img`` is **not** an image > that can directly be booted on the ZynqMP. > > For a bootable BOOT.BIN image, you also need to build the FSBL_ and a ZynqMP > diff --git a/arch/arm/boards/Makefile b/arch/arm/boards/Makefile > index 56bd7baf37eb..66dc44cd8867 100644 > --- a/arch/arm/boards/Makefile > +++ b/arch/arm/boards/Makefile > @@ -177,6 +177,7 @@ obj-$(CONFIG_MACH_VSCOM_BALTOS) += vscom-baltos/ > obj-$(CONFIG_MACH_WARP7) += element14-warp7/ > obj-$(CONFIG_MACH_WEBASTO_CCBV2) += webasto-ccbv2/ > obj-$(CONFIG_MACH_VF610_TWR) += freescale-vf610-twr/ > +obj-$(CONFIG_MACH_XILINX_ZCU102) += xilinx-zcu102/ > obj-$(CONFIG_MACH_XILINX_ZCU104) += xilinx-zcu104/ > obj-$(CONFIG_MACH_XILINX_ZCU106) += xilinx-zcu106/ > obj-$(CONFIG_MACH_ZII_COMMON) += zii-common/ > diff --git a/arch/arm/boards/xilinx-zcu102/Makefile b/arch/arm/boards/xilinx-zcu102/Makefile > new file mode 100644 > index 000000000000..d83a4793aa0f > --- /dev/null > +++ b/arch/arm/boards/xilinx-zcu102/Makefile > @@ -0,0 +1,3 @@ > +# SPDX-License-Identifier: GPL-2.0-or-later > +obj-y += board.o > +lwl-y += lowlevel.o > diff --git a/arch/arm/boards/xilinx-zcu102/board.c b/arch/arm/boards/xilinx-zcu102/board.c > new file mode 100644 > index 000000000000..3ef668fdff7a > --- /dev/null > +++ b/arch/arm/boards/xilinx-zcu102/board.c > @@ -0,0 +1,27 @@ > +// SPDX-License-Identifier: GPL-2.0-only > + > +#include <common.h> > +#include <driver.h> > +#include <init.h> > +#include <mach/zynqmp/zynqmp-bbu.h> > +#include <deep-probe.h> > + > +static int zcu102_probe(struct device *dev) > +{ > + return zynqmp_bbu_register_handler("SD", "/boot/BOOT.BIN", > + BBU_HANDLER_FLAG_DEFAULT); > +} > + > +static const struct of_device_id zcu102_of_match[] = { > + { .compatible = "xlnx,zynqmp-zcu102-revA" }, > + { .compatible = "xlnx,zynqmp-zcu102-revB" }, > + { /* sentinel */ }, > +}; > +BAREBOX_DEEP_PROBE_ENABLE(zcu102_of_match); > + > +static struct driver zcu102_board_driver = { > + .name = "board-zynqmp-zcu102", > + .probe = zcu102_probe, > + .of_compatible = zcu102_of_match, > +}; > +coredevice_platform_driver(zcu102_board_driver); > diff --git a/arch/arm/boards/xilinx-zcu102/lowlevel.c b/arch/arm/boards/xilinx-zcu102/lowlevel.c > new file mode 100644 > index 000000000000..4b72c0ec43e1 > --- /dev/null > +++ b/arch/arm/boards/xilinx-zcu102/lowlevel.c > @@ -0,0 +1,15 @@ > +// SPDX-License-Identifier: GPL-2.0+ > + > +#include <common.h> > +#include <debug_ll.h> > +#include <asm/barebox-arm.h> > + > +ENTRY_FUNCTION_WITHSTACK(start_zynqmp_zcu102, 0x80000000, x0, x1, x2) > +{ > + extern char __dtb_z_zynqmp_zcu102_revB_start[]; > + > + /* Assume that the first stage boot loader configured the UART */ > + putc_ll('>'); > + > + barebox_arm_entry(0, SZ_2G, runtime_address(__dtb_z_zynqmp_zcu102_revB_start)); > +} > diff --git a/arch/arm/configs/multi_v8_defconfig b/arch/arm/configs/multi_v8_defconfig > index 20f630281db5..b18498c0a13f 100644 > --- a/arch/arm/configs/multi_v8_defconfig > +++ b/arch/arm/configs/multi_v8_defconfig > @@ -22,6 +22,7 @@ CONFIG_MACH_PINE64_QUARTZ64=y > CONFIG_MACH_RADXA_ROCK3=y > CONFIG_MACH_RADXA_ROCK5=y > CONFIG_MACH_RADXA_CM3=y > +CONFIG_MACH_XILINX_ZCU102=y > CONFIG_MACH_XILINX_ZCU104=y > CONFIG_MACH_XILINX_ZCU106=y > CONFIG_64BIT=y > diff --git a/arch/arm/configs/zynqmp_defconfig b/arch/arm/configs/zynqmp_defconfig > index c9b6fa69ef2a..00327adc399c 100644 > --- a/arch/arm/configs/zynqmp_defconfig > +++ b/arch/arm/configs/zynqmp_defconfig > @@ -1,4 +1,5 @@ > CONFIG_ARCH_ZYNQMP=y > +CONFIG_MACH_XILINX_ZCU102=y > CONFIG_MACH_XILINX_ZCU104=y > CONFIG_64BIT=y > CONFIG_ARM_PSCI_CLIENT=y > diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile > index f30516320738..dad01925e6d2 100644 > --- a/arch/arm/dts/Makefile > +++ b/arch/arm/dts/Makefile > @@ -203,6 +203,7 @@ lwl-$(CONFIG_MACH_SAMA5D27_GIANTBOARD) += at91-sama5d27_giantboard.dtb.o > lwl-$(CONFIG_MACH_SAMA5D4_WIFX) += at91-sama5d4_wifx_l1.dtb.o > lwl-$(CONFIG_MACH_AT91SAM9X5EK) += at91sam9x5ek.dtb.o > lwl-$(CONFIG_MACH_BOSCH_PPM4) += zynqmp-ppm4.dtb.o > +lwl-$(CONFIG_MACH_XILINX_ZCU102) += zynqmp-zcu102-revA.dtb.o zynqmp-zcu102-revB.dtb.o > lwl-$(CONFIG_MACH_XILINX_ZCU104) += zynqmp-zcu104-revA.dtb.o > lwl-$(CONFIG_MACH_XILINX_ZCU106) += zynqmp-zcu106-revA.dtb.o > > diff --git a/arch/arm/dts/zynqmp-zcu102-revA.dts b/arch/arm/dts/zynqmp-zcu102-revA.dts > new file mode 100644 > index 000000000000..8f5410d5e6eb > --- /dev/null > +++ b/arch/arm/dts/zynqmp-zcu102-revA.dts > @@ -0,0 +1,13 @@ > +// SPDX-License-Identifier: GPL-2.0+ > + > +#include <arm64/xilinx/zynqmp-zcu102-revA.dts> > + > +/ { > + chosen { > + environment { > + compatible = "barebox,environment"; > + device-path = &sdhci1, "partname:0"; > + file-path = "barebox.env"; > + }; > + }; > +}; > diff --git a/arch/arm/dts/zynqmp-zcu102-revB.dts b/arch/arm/dts/zynqmp-zcu102-revB.dts > new file mode 100644 > index 000000000000..3f772f465a45 > --- /dev/null > +++ b/arch/arm/dts/zynqmp-zcu102-revB.dts > @@ -0,0 +1,13 @@ > +// SPDX-License-Identifier: GPL-2.0+ > + > +#include <arm64/xilinx/zynqmp-zcu102-revB.dts> > + > +/ { > + chosen { > + environment { > + compatible = "barebox,environment"; > + device-path = &sdhci1, "partname:0"; > + file-path = "barebox.env"; > + }; > + }; > +}; > diff --git a/arch/arm/mach-zynqmp/Kconfig b/arch/arm/mach-zynqmp/Kconfig > index d6543e779ebc..d11e873ed628 100644 > --- a/arch/arm/mach-zynqmp/Kconfig > +++ b/arch/arm/mach-zynqmp/Kconfig > @@ -8,6 +8,13 @@ config MACH_BOSCH_PPM4 > help > Say Y here if you are using the Bosch Zynq UltraScale+ MPSoC PPM4. > > +config MACH_XILINX_ZCU102 > + bool "Xilinx Zynq UltraScale+ MPSoC ZCU102" > + select ARM_USE_COMPRESSED_DTB > + help > + Say Y here if you are using the Xilinx Zynq UltraScale+ MPSoC ZCU102 > + evaluation board. > + > config MACH_XILINX_ZCU104 > bool "Xilinx Zynq UltraScale+ MPSoC ZCU104" > help > diff --git a/images/Makefile.zynqmp b/images/Makefile.zynqmp > index 6c3f384084d4..96740ae75024 100644 > --- a/images/Makefile.zynqmp > +++ b/images/Makefile.zynqmp > @@ -7,6 +7,10 @@ pblb-$(CONFIG_MACH_BOSCH_PPM4) += start_zynqmp_ppm4 > FILE_barebox-zynqmp-ppm4.img = start_zynqmp_ppm4.pblb > image-$(CONFIG_MACH_BOSCH_PPM4) += barebox-zynqmp-ppm4.img > > +pblb-$(CONFIG_MACH_XILINX_ZCU102) += start_zynqmp_zcu102 > +FILE_barebox-zynqmp-zcu102.img = start_zynqmp_zcu102.pblb > +image-$(CONFIG_MACH_XILINX_ZCU102) += barebox-zynqmp-zcu102.img > + > pblb-$(CONFIG_MACH_XILINX_ZCU104) += start_zynqmp_zcu104 > FILE_barebox-zynqmp-zcu104.img = start_zynqmp_zcu104.pblb > image-$(CONFIG_MACH_XILINX_ZCU104) += barebox-zynqmp-zcu104.img > -- > 2.39.2 > > > -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |