[U-Boot] [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/b2f74cc7fe5c4881589d5e440a17cb51f...
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 --- 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..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),)

On 20.6.2018 23:00, 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:
- if a board-specific file exists in board/xilinx/zynq[mp]/$(CONFIG_DEFAULT_DEVICE_TREE)/ps?_init_gpl.c then use it
- 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/b2f74cc7fe5c4881589d5e440a17cb51f...
Please move this link out of commit message (also fix link above). It is quite long and almost useless.
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
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..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
Please make this as a first line.
+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),)
I have tested it and it looks good.
Thanks, Michal

Hi Michal,
On 22/06/2018 09:38, Michal Simek wrote:
On 20.6.2018 23:00, 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:
- if a board-specific file exists in board/xilinx/zynq[mp]/$(CONFIG_DEFAULT_DEVICE_TREE)/ps?_init_gpl.c then use it
- 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/b2f74cc7fe5c4881589d5e440a17cb51f...
Please move this link out of commit message (also fix link above). It is quite long and almost useless.
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
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..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
Please make this as a first line.
+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),)
I have tested it and it looks good.
Good, thanks. I just sent v2 with the changes you requested.
Regards,
participants (2)
-
Luca Ceresoli
-
Michal Simek