# 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

config XILINX_OF_BOARD_DTB_ADDR
	hex "Default DTB pickup address"
	default 0x1000 if ARCH_VERSAL || ARCH_VERSAL_NET
	default 0x8000 if MICROBLAZE
	default 0x100000 if ARCH_ZYNQ || ARCH_ZYNQMP
	depends on OF_BOARD || OF_SEPARATE
	help
	  Offset in the memory where the board configuration DTB is placed.

config BOOT_SCRIPT_OFFSET
	hex "Boot script offset"
	depends on ARCH_ZYNQ || ARCH_ZYNQMP || ARCH_VERSAL || ARCH_VERSAL_NET || MICROBLAZE || TARGET_XILINX_MBV
	default 0xFC0000 if ARCH_ZYNQ || MICROBLAZE
	default 0x3E80000 if ARCH_ZYNQMP
	default 0x7F80000 if ARCH_VERSAL || ARCH_VERSAL_NET
	default 0 if TARGET_XILINX_MBV
	help
	   Specifies distro boot script offset in NAND/QSPI/NOR flash.

config CMD_FRU
	bool "FRU information for product"
	help
	  This option enables FRU commands to capture and display FRU
	  information present in the device. The FRU Information is used
	  to primarily to provide "inventory" information about the boards
	  that the FRU Information Device is located on.

config FRU_SC
	bool "FRU system controller decoding"
	help
	  Xilinx System Controller (SC) FRU format is describing boards from two
	  angles. One from DUT and then from SC. DUT is default option for
	  the main CPU. SC behaves more or less as slave and have different ID.
	  If you build U-Boot for SC you should enable this option to get proper
	  MAC address.
