##
## 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.
