## This file is part of the coreboot project.
##
## Copyright (C) 2011 The ChromiumOS Authors.  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.
##

config MAINBOARD_HAS_CHROMEOS
	def_bool n

menu "ChromeOS"
	depends on MAINBOARD_HAS_CHROMEOS

config CHROMEOS
	bool "Build for ChromeOS"
	default n
	select TPM
	select TPM_INIT_FAILURE_IS_FATAL
	select SKIP_TPM_STARTUP_ON_NORMAL_BOOT
	select BOOTMODE_STRAPS
	select ELOG
	help
	  Enable ChromeOS specific features like the GPIO sub table in
	  the coreboot table. NOTE: Enabling this option on an unsupported
	  board will most likely break your build.

if CHROMEOS

config VBNV_OFFSET
	hex
	default 0x26
	depends on PC80_SYSTEM
	help
	  CMOS offset for VbNv data. This value must match cmos.layout
	  in the mainboard directory, minus 14 bytes for the RTC.

config VBNV_SIZE
	hex
	default 0x10
	depends on PC80_SYSTEM
	help
	  CMOS storage size for VbNv data. This value must match cmos.layout
	  in the mainboard directory.

config CHROMEOS_VBNV_CMOS
	bool "Vboot non-volatile storage in CMOS."
	default n
	help
	  VBNV is stored in CMOS

config CHROMEOS_VBNV_EC
	bool "Vboot non-volatile storage in EC."
	default n
	help
	  VBNV is stored in EC

config CHROMEOS_VBNV_FLASH
	def_bool n
	help
	  VBNV is stored in flash storage

config CHROMEOS_RAMOOPS
	bool "Reserve space for Chrome OS ramoops"
	default y

config CHROMEOS_RAMOOPS_DYNAMIC
	bool "Allocate RAM oops buffer in cbmem"
	default n
	depends on CHROMEOS_RAMOOPS && HAVE_ACPI_TABLES

config CHROMEOS_RAMOOPS_NON_ACPI
	bool "Allocate RAM oops buffer in cbmem passed through cb tables to payload"
	default n
	depends on CHROMEOS_RAMOOPS && !HAVE_ACPI_TABLES

config CHROMEOS_RAMOOPS_RAM_START
	hex "Physical address of preserved RAM"
	default 0x00f00000
	depends on CHROMEOS_RAMOOPS && !CHROMEOS_RAMOOPS_DYNAMIC

config CHROMEOS_RAMOOPS_RAM_SIZE
	hex "Size of preserved RAM"
	default 0x00100000
	depends on CHROMEOS_RAMOOPS

config EC_SOFTWARE_SYNC
	bool "Enable EC software sync"
	default n
	depends on VBOOT_VERIFY_FIRMWARE
	help
	  EC software sync is a mechanism where the AP helps the EC verify its
	  firmware similar to how vboot verifies the main system firmware. This
	  option selects whether depthcharge should support EC software sync.

config VBOOT_EC_SLOW_UPDATE
	bool "EC is slow to update"
	default n
	depends on EC_SOFTWARE_SYNC
	help
	  Whether the EC (or PD) is slow to update and needs to display a
	  screen that informs the user the update is happening.

config VBOOT_OPROM_MATTERS
	bool "Video option ROM matters"
	default n
	depends on VBOOT_VERIFY_FIRMWARE
	help
	  Whether the video option ROM has run matters on this platform.

config VIRTUAL_DEV_SWITCH
	bool "Virtual developer switch support"
	default n
	depends on VBOOT_VERIFY_FIRMWARE
	help
	  Whether this platform has a virtual developer switch.

config VBOOT_VERIFY_FIRMWARE
	bool "Verify firmware with vboot."
	default n
	depends on CHROMEOS && HAVE_HARD_RESET
	help
	  Enabling VBOOT_VERIFY_FIRMWARE will use vboot to verify the components
	  of the firmware (stages, payload, etc).

config NO_TPM_RESUME
	bool
	default n
	help
	  On some boards the TPM stays powered up in S3. On those
	  boards, booting Windows will break if the TPM resume command
	  is sent during an S3 resume.

config PHYSICAL_REC_SWITCH
	bool "Physical recovery switch is present"
	default n
	help
	  Whether this platform has a physical recovery switch

config WIPEOUT_SUPPORTED
	bool "User is able to request factory reset"
	default n
	help
	  When this option is enabled, the firmware provides the ability to
	  signal the application the need for factory reset (a.k.a. wipe
	  out) of the device

source src/vendorcode/google/chromeos/vboot2/Kconfig

endif # CHROMEOS
if !CHROMEOS
config VIRTUAL_DEV_SWITCH
	bool
	default n
	depends on MAINBOARD_HAS_CHROMEOS
	help
	  Whether this platform has a virtual developer switch.
endif
endmenu
