| From 4c9d54ab5a41d65000c8d249b6fb1b76056f1812 Mon Sep 17 00:00:00 2001 |
| From: Luca Ceresoli <luca@lucaceresoli.net> |
| Date: Wed, 20 Jun 2018 12:11:50 +0200 |
| Subject: [PATCH] arm/arm64: zynq/zynqmp: pass the PS init file as a kconfig |
| variable |
| |
| 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 [0]). |
| |
| 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 |
| |
| [0] https://github.com/Xilinx/meta-xilinx/blob/b2f74cc7fe5c4881589d5e440a17cb51fc66a7ab/meta-xilinx-bsp/recipes-bsp/u-boot/u-boot-spl-zynq-init.inc#L9 |
| |
| 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> |
| Backported from upstream: https://git.denx.de/?p=u-boot.git;a=commit;h=6da4f67ad09cd8b311d77b2b04e557b7ef65b56c |
| --- |
| 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 |
| @@ -1293,4 +1293,5 @@ 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/zipitz2/Kconfig" |
| |
| source "arch/arm/Kconfig.debug" |
| diff --git a/board/xilinx/Kconfig b/board/xilinx/Kconfig |
| new file mode 100644 |
| index 000000000000..aa3fa061edef |
| --- /dev/null |
| +++ b/board/xilinx/Kconfig |
| @@ -0,0 +1,41 @@ |
| +# Copyright (c) 2018, Luca Ceresoli <luca@lucaceresoli.net> |
| +# |
| +# SPDX-License-Identifier: GPL-2.0 |
| + |
| +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),) |
| -- |
| 2.7.4 |
| |