[U-Boot] [PATCH v2] arm/arm64: zynq/zynqmp: pass the PS init file as a kconfig variable
Michal Simek
michal.simek at xilinx.com
Fri Jun 22 13:53:08 UTC 2018
On 22.6.2018 12:40, Luca Ceresoli wrote:
> U-Boot needs to link ps7_init_gpl.c on Zynq or psu_init_gpl.c on
> ZynqMP (PS init for short). The current logic to locate this file for
> both platforms is:
>
> 1. if a board-specific file exists in
> board/xilinx/zynq[mp]/$(CONFIG_DEFAULT_DEVICE_TREE)/ps?_init_gpl.c
> then use it
> 2. otherwise use board/xilinx/zynq/ps?_init_gpl.c
>
> In the latter case the file does not exist in the U-Boot sources and
> must be copied in the source tree from the outside before starting the
> build. This is typical when it is generated from Xilinx tools while
> developing a custom hardware. However making sure that a
> board-specific file is _not_ found (and used) requires some trickery
> such as removing or overwriting all PS init files (e.g.: the current
> meta-xilinx yocto layer).
>
> This generates a few problems:
>
> * if the source tree is shared among different out-of-tree builds,
> they will pollute (and potentially corrupt) each other
> * the source tree cannot be read-only
> * any buildsystem must add a command to copy the PS init file binary
> * overwriting or deleting files in the source tree is ugly as hell
>
> Simplify usage by allowing to pass the path to the desired PS init
> file in kconfig variable XILINX_PS_INIT_FILE. It can be an absolute
> path or relative to $(srctree). If the variable is set, the
> user-specified file will always be used without being copied
> around. If the the variable is left empty, for backward compatibility
> fall back to the old behaviour.
>
> Since the issue is the same for Zynq and ZynqMP, add one kconfig
> variable in a common place and use it for both.
>
> Also use the new kconfig help text to document all the ways to give
> U-Boot the PS init file.
>
> Build-tested with all combinations of:
> - platform: zynq or zynqmp
> - PS init file: from XILINX_PS_INIT_FILE (absolute, relative path,
> non-existing), in-tree board-specific, in board/xilinx/zynq[mp]/
> - building in-tree, in subdir, in other directory
>
> Signed-off-by: Luca Ceresoli <luca at lucaceresoli.net>
> Cc: Albert Aribaud <albert.u.boot at aribaud.net>
> Cc: Michal Simek <michal.simek at xilinx.com>
> Cc: Nathan Rossi <nathan at nathanrossi.com>
>
> ---
> Changes v1 -> v2:
> - removed link to yocto layer code (Michal)
> - fixed location of SPDX line (Michal)
> ---
> arch/arm/Kconfig | 1 +
> board/xilinx/Kconfig | 41 +++++++++++++++++++++++++++++++++++++++++
> board/xilinx/zynq/Makefile | 10 +++++++++-
> board/xilinx/zynqmp/Makefile | 10 +++++++++-
> 4 files changed, 60 insertions(+), 2 deletions(-)
> create mode 100644 board/xilinx/Kconfig
>
> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> index 22234cde2ab6..e04979d0ef7e 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -1441,6 +1441,7 @@ source "board/toradex/colibri_pxa270/Kconfig"
> source "board/vscom/baltos/Kconfig"
> source "board/woodburn/Kconfig"
> source "board/work-microwave/work_92105/Kconfig"
> +source "board/xilinx/Kconfig"
> source "board/xilinx/zynqmp/Kconfig"
> source "board/zipitz2/Kconfig"
>
> diff --git a/board/xilinx/Kconfig b/board/xilinx/Kconfig
> new file mode 100644
> index 000000000000..37bec5fae29d
> --- /dev/null
> +++ b/board/xilinx/Kconfig
> @@ -0,0 +1,41 @@
> +# SPDX-License-Identifier: GPL-2.0
> +#
> +# Copyright (c) 2018, Luca Ceresoli <luca at lucaceresoli.net>
> +
> +if ARCH_ZYNQ || ARCH_ZYNQMP
> +
> +config XILINX_PS_INIT_FILE
> + string "Zynq/ZynqMP PS init file(s) location"
> + help
> + On Zynq and ZynqMP U-Boot SPL (or U-Boot proper if
> + ZYNQMP_PSU_INIT_ENABLED is set) is responsible for some
> + basic initializations, such as enabling peripherals and
> + configuring pinmuxes. The PS init file (called
> + psu_init_gpl.c on ZynqMP, ps7_init_gpl.c for Zynq-7000)
> + contains the code for such initializations.
> +
> + U-Boot contains PS init files for some boards, but each of
> + them describes only one specific configuration. Users of a
> + different board, or needing a different configuration, can
> + generate custom files using the Xilinx development tools.
> +
> + There are three ways to give a PS init file to U-Boot:
> +
> + 1. Set this variable to the path, either relative to the
> + source tree or absolute, where the psu_init_gpl.c or
> + ps7_init_gpl.c file is located. U-Boot will build this
> + file.
> +
> + 2. If you leave an empty string here, U-Boot will use
> + board/xilinx/zynq/$(CONFIG_DEFAULT_DEVICE_TREE)/ps7_init_gpl.c
> + for Zynq-7000, or
> + board/xilinx/zynqmp/$(CONFIG_DEFAULT_DEVICE_TREE)/psu_init_gpl.c
> + for ZynqMP.
> +
> + 3. If the above file does not exist, U-Boot will use
> + board/xilinx/zynq/ps7_init_gpl.c for Zynq-7000, or
> + board/xilinx/zynqmp/psu_init_gpl.c for ZynqMP. This file
> + is not provided by U-Boot, you have to copy it there
> + before the build.
> +
> +endif
> diff --git a/board/xilinx/zynq/Makefile b/board/xilinx/zynq/Makefile
> index 5a76a26720cd..03ad5f0532ee 100644
> --- a/board/xilinx/zynq/Makefile
> +++ b/board/xilinx/zynq/Makefile
> @@ -5,10 +5,18 @@
>
> obj-y := board.o
>
> -hw-platform-y :=$(shell echo $(CONFIG_DEFAULT_DEVICE_TREE))
> +ifneq ($(CONFIG_XILINX_PS_INIT_FILE),"")
> +PS_INIT_FILE := $(shell cd $(srctree); readlink -f $(CONFIG_XILINX_PS_INIT_FILE))
> +init-objs := ps_init_gpl.o
> +spl/board/xilinx/zynq/ps_init_gpl.o board/xilinx/zynq/ps_init_gpl.o: $(PS_INIT_FILE)
> + $(CC) $(c_flags) -I $(srctree)/$(src) -c -o $@ $^
> +endif
>
> +ifeq ($(init-objs),)
> +hw-platform-y :=$(shell echo $(CONFIG_DEFAULT_DEVICE_TREE))
> init-objs := $(if $(wildcard $(srctree)/$(src)/$(hw-platform-y)/ps7_init_gpl.c),\
> $(hw-platform-y)/ps7_init_gpl.o)
> +endif
>
> ifeq ($(init-objs),)
> ifneq ($(wildcard $(srctree)/$(src)/ps7_init_gpl.c),)
> diff --git a/board/xilinx/zynqmp/Makefile b/board/xilinx/zynqmp/Makefile
> index 05ccd25dcef3..960b81fc5853 100644
> --- a/board/xilinx/zynqmp/Makefile
> +++ b/board/xilinx/zynqmp/Makefile
> @@ -5,10 +5,18 @@
>
> obj-y := zynqmp.o
>
> -hw-platform-y :=$(shell echo $(CONFIG_DEFAULT_DEVICE_TREE))
> +ifneq ($(CONFIG_XILINX_PS_INIT_FILE),"")
> +PS_INIT_FILE := $(shell cd $(srctree); readlink -f $(CONFIG_XILINX_PS_INIT_FILE))
> +init-objs := ps_init_gpl.o
> +spl/board/xilinx/zynqmp/ps_init_gpl.o board/xilinx/zynqmp/ps_init_gpl.o: $(PS_INIT_FILE)
> + $(CC) $(c_flags) -I $(srctree)/$(src) -c -o $@ $^
> +endif
>
> +ifeq ($(init-objs),)
> +hw-platform-y :=$(shell echo $(CONFIG_DEFAULT_DEVICE_TREE))
> init-objs := $(if $(wildcard $(srctree)/$(src)/$(hw-platform-y)/psu_init_gpl.c),\
> $(hw-platform-y)/psu_init_gpl.o)
> +endif
>
> ifeq ($(init-objs),)
> ifneq ($(wildcard $(srctree)/$(src)/psu_init_gpl.c),)
>
Applied.
Thanks,
Michal
More information about the U-Boot
mailing list