# 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
	default 0xFC0000 if ARCH_ZYNQ || MICROBLAZE
	default 0x3E80000 if ARCH_ZYNQMP
	default 0x7F80000 if ARCH_VERSAL || ARCH_VERSAL_NET
	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.
