[U-Boot] [PATCH] arm/arm64: zynq/zynqmp: pass the PS init file as a kconfig variable

Luca Ceresoli luca at lucaceresoli.net
Fri Jun 22 10:41:45 UTC 2018


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:
>>
>>  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
> 
> 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 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>
>> ---
>>  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 at 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,
-- 
Luca


More information about the U-Boot mailing list