]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
arm/arm64: zynq/zynqmp: pass the PS init file as a kconfig variable
authorLuca Ceresoli <luca@lucaceresoli.net>
Fri, 22 Jun 2018 10:40:16 +0000 (12:40 +0200)
committerMichal Simek <michal.simek@xilinx.com>
Fri, 22 Jun 2018 13:54:09 +0000 (15:54 +0200)
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@lucaceresoli.net>
Cc: Albert Aribaud <albert.u.boot@aribaud.net>
Cc: Michal Simek <michal.simek@xilinx.com>
Cc: Nathan Rossi <nathan@nathanrossi.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
arch/arm/Kconfig
board/xilinx/Kconfig [new file with mode: 0644]
board/xilinx/zynq/Makefile
board/xilinx/zynqmp/Makefile

index 231829023ad0501af2fac046b235825811fdc580..5eda484d1fe92a90600b9f2b60bbed45a84db904 100644 (file)
@@ -1294,6 +1294,7 @@ source "board/technologic/ts4600/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 (file)
index 0000000..37bec5f
--- /dev/null
@@ -0,0 +1,41 @@
+# SPDX-License-Identifier: GPL-2.0
+#
+# Copyright (c) 2018, Luca Ceresoli <luca@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
index 7de0212bc9f79a7571f0d11be0e451ab3cb02d88..69e43f93b1f987613321cb997e530d738869fabd 100644 (file)
@@ -7,10 +7,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),)
index 1d43928366b1429832dcaedbf6dbdb0be3775e5f..46d1e54b7e88f4b6c26fc42523ebda26cb7d472a 100644 (file)
@@ -7,10 +7,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),)