[PATCH] ARM: ZynqMP: Add ZCU102 support

Sascha Hauer sha at pengutronix.de
Thu Sep 21 01:14:06 PDT 2023


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 at pengutronix.de>
> ---
>  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 |



More information about the barebox mailing list