##
## Copyright 2016 Google Inc.  All rights reserved.
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; version 2 of the License.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA


config FMAP_OFFSET
	hex "Offset of the FMAP in the firmware image"
	help
	  This is the offset of the FMAP in the ROM. The FMAP is not searched
	  for, so if the address isn't correct the system won't boot.

choice
	prompt "Image size"
        help
          The size of the image to build, if building a complete image.

config IMAGE_SIZE_256KB
	bool "256 KB"

config IMAGE_SIZE_512KB
	bool "512 KB"

config IMAGE_SIZE_1MB
	bool "1 MB"

config IMAGE_SIZE_2MB
	bool "2 MB"

config IMAGE_SIZE_4MB
	bool "4 MB"

config IMAGE_SIZE_8MB
	bool "8 MB"

config IMAGE_SIZE_16MB
	bool "16 MB"

endchoice

config IMAGE_SIZE_KB
	int
        default 256   if IMAGE_SIZE_256KB
        default 512   if IMAGE_SIZE_512KB
	default 1024  if IMAGE_SIZE_1MB
	default 2048  if IMAGE_SIZE_2MB
	default 4096  if IMAGE_SIZE_4MB
	default 8192  if IMAGE_SIZE_8MB
        default 16384 if IMAGE_SIZE_16MB

config IMAGE_HWID
	string "The hardware ID stored in the GBB"
	default ""

config BOOTPLAN_FSP
        bool "Image based on Intel's firmware support package."

choice
	prompt "Boot plan"
	help
	  Different ways of arranging depthcharge into modules. Which one to
          use depends on how depthcharge is started, and what it should do
          while running. Not all options will be supported on all boards.

config BOOTPLAN_CB_SPLIT_PAYLOAD
	bool "Coreboot payload (depthcharge selects firmware)"

config BOOTPLAN_CB_PAYLOAD
	bool "Coreboot payload (coreboot selects firmware)"

config BOOTPLAN_CB_IMAGE
	bool "Coreboot based image (coreboot selects firmware)"

config BOOTPLAN_FSP_V1_1
	bool "Image based on Intel's firmware support package version 1.1."
	select BOOTPLAN_FSP

config BOOTPLAN_QEMU_X86
	bool "Basic x86 image suitable for booting on QEMU."

config BOOTPLAN_RPI3
	bool "Image for booting on the Raspberry Pi 3"

config BOOTPLAN_UEFI
	bool "Chain load from a UEFI based firmware."

endchoice

config BOOTPLAN_CB_IMAGE_MODEL
	string "Model name for this board"
	depends on BOOTPLAN_CB_IMAGE


config BOOTPLAN_FSP_ECS
        string "RW EC images which are managed with EC software sync"
        depends on BOOTPLAN_FSP
        help
          The names are really the names of the directories the EC images are
          in. The actual file used is called ec.RW.bin within those
          directories. The names are separated by : characters.

config BOOTPLAN_FSP_MODEL
	string "Model name for this board"
	depends on BOOTPLAN_FSP

config BOOTPLAN_RPI3_MODEL
	string "Model name for this board"
	depends on BOOTPLAN_RPI3

config BOOTPLAN_UEFI_MODEL
	string "Model name for this board"
	depends on BOOTPLAN_UEFI
