##
## This file is part of the coreboot project.
##
## Copyright (C) 2012 The Chromium OS 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
##

config ELOG
	depends on SPI_FLASH
	bool "Support for flash based event log"
	default n
	help
	  Enable support for flash based event logging.

if ELOG

config ELOG_DEBUG
	bool "Enable debug output for event logging"
	default n

config ELOG_FLASH_BASE
	hex "Event log offset into flash"
	default 0
	help
	  Offset into the flash chip for the ELOG block.
	  This should be allocated in the FMAP.

config ELOG_AREA_SIZE
	hex "Size of Event Log area in flash"
	default 0x1000
	help
	  This should be a multiple of flash block size.

	  Default is 4K.

config ELOG_FULL_THRESHOLD
	hex "Threshold at which flash is considered full"
	default 0xC00
	help
	  When the Event Log size is larger than this it will be shrunk
	  to ELOG_SHRINK_SIZE.  Must be greater than ELOG_AREA_SIZE, and
	  ELOG_AREA_SIZE - ELOG_FULL_THRESHOLD must be greater than the
	  maximum event size of 128.

	  Default is 75% of the log, or 3K.

config ELOG_SHRINK_SIZE
	hex "Resulting size when the event log is shrunk"
	default 0x400
	help
	  When the Event Log is shrunk it will go to this size.
	  ELOG_AREA_SIZE - ELOG_SHRINK_SIZE must be less than
	  CONFIG_ELOG_FULL_THRESHOLD.

	  Default is 1K.

config ELOG_CBMEM
	bool "Store a copy of ELOG in CBMEM"
	default n
	help
	 This option will have ELOG store a copy of the flash event log
	 in a CBMEM region and export that address in SMBIOS to the OS.
	 This is useful if the ELOG location is not in memory mapped flash,
	 but it means that events added at runtime via the SMI handler
	 will not be reflected in the CBMEM copy of the log.

endif

config ELOG_GSMI
	depends on ELOG && SPI_FLASH_SMM && SMM_TSEG
	bool "SMI interface to write and clear event log"
	default n
	help
	  This interface is compatible with the linux kernel driver
	  available with CONFIG_GOOGLE_GSMI and can be used to write
	  kernel reset/shutdown messages to the event log.

config ELOG_BOOT_COUNT
	depends on ELOG
	bool "Maintain a monotonic boot number in CMOS"
	default n
	help
	  Store a monotonic boot number in CMOS and provide an interface
	  to read the current value and increment the counter.  This boot
	  counter will be logged as part of the System Boot event.

config ELOG_BOOT_COUNT_CMOS_OFFSET
	depends on ELOG && ELOG_BOOT_COUNT && !USE_OPTION_TABLE
	int "Offset in CMOS to store the boot count"
	default 0
	help
	  This value must be greater than 16 bytes so as not to interfere
	  with the standard RTC region.  Requires 8 bytes.
