##
##
## Copyright (C) 2008 Advanced Micro Devices, Inc.
## Copyright (C) 2008 coresystems GmbH
##
## Redistribution and use in source and binary forms, with or without
## modification, are permitted provided that the following conditions
## are met:
## 1. Redistributions of source code must retain the above copyright
##    notice, this list of conditions and the following disclaimer.
## 2. Redistributions in binary form must reproduce the above copyright
##    notice, this list of conditions and the following disclaimer in the
##    documentation and/or other materials provided with the distribution.
## 3. The name of the author may not be used to endorse or promote products
##    derived from this software without specific prior written permission.
##
## THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
## IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
## ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
## FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
## DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
## OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
## HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
## LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
## OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
## SUCH DAMAGE.
##

mainmenu "Libpayload Configuration"

menu "Generic Options"

config GPL
	bool "GPLv2-licensed Options"
	default y if CHROMEOS
	default n
	help
	  Prompt for options that will build code licensed under the GNU General
	  Public License (version 2). This will subject the whole payload to the
	  terms of this license (including its provision to release all sources,
	  please see the LICENSE_GPL file for details).

config EXPERIMENTAL
	bool "Experimental Options"
	default n
	help
	  Prompt for experimental functionality. Attention: This is not likely
	  to work without problems

config DEVELOPER
	bool "Developer Options"
	default n
	help
	  Prompt for developer options. These options are only interesting for
	  libpayload developers.

config CHROMEOS
	bool "ChromeOS Options"
	default n
	help
	  Select configuration defaults appropriate for ChromeOS boards.

choice
	prompt "Compiler to use"
	default COMPILER_GCC
	help
	  This option allows you to select the compiler.

config COMPILER_GCC
	bool "GCC"
	help
	  Use the GNU Compiler Collection (GCC).

config COMPILER_LLVM_CLANG
	bool "LLVM/clang"
	help
	  Use LLVM/clang.

endchoice

config LTO
	bool "Use link time optimization (LTO)"
	default n
	depends on COMPILER_GCC
	help
	  Compile with link time optimization. This can often decrease the
	  final binary size, but may increase compilation time.

config REMOTEGDB
	bool "Remote GDB stub"
	default n
	depends on GPL
	help
	  Enable Remote GDB debugging support.

config MEMMAP_RAM_ONLY
	bool "Only consider RAM entries in memory map for further processing"
	default n

endmenu

menu "Architecture Options"

choice
        prompt "Target Architecture"
        default ARCH_X86

config ARCH_ARM
        bool "ARM"
        help
          Support the ARM architecture

config ARCH_X86
        bool "x86"
        help
          Support the x86 architecture

config ARCH_ARM64
        bool "ARM64"
        help
          Support the ARM64 architecture

config ARCH_MOCK
        bool "Mock architecture (for unit tests)"
        help
          This enables the mock architecture (for unit tests) that is intended
          to be used for testing purposes, to either test payloads or libpayload itself.
          It provides necessary headers, but requires mocking (providing implementation
          for) arch-specific functions.

endchoice

config MULTIBOOT
	bool "Multiboot header support"
	depends on ARCH_X86
	default y if !CHROMEOS

config HEAP_SIZE
	int "Heap size"
	default 131072
	help
	  This is the heap size (malloc'able size) available
	  to the payload.

	  If unsure, set to 131072 (128K)

config STACK_SIZE
	int "Stack size"
	default 16384
	help
	  This is the stack size available to the payload.

	  If unsure, set to 16384 (16K)

config BASE_ADDRESS
	hex "Base address"
	default 0x04000000 if ARCH_ARM
	default 0x80100000 if ARCH_ARM64
	default 0x00100000 if ARCH_X86
	default 0x00000000 if ARCH_MOCK
	help
	  This is the base address for the payload.

	  If unsure, set to 0x00100000 on x86,
	  0x04000000 on ARM or 0x80100000 on ARM64.

endmenu

config USE_MARCH_586
	bool "Use march=586 qualifier to build"
	default n
	depends on ARCH_X86
	help
	  Allow a platform or processor to select to be compiled using
	  the '-march=i586' option instead of the typical '-march=i686'

menu "Standard Libraries"

config LIBC
	bool "Enable C library support"
	default y

config CURSES
	bool "Build a curses library"
	default y if !CHROMEOS

choice
	prompt "Curses implementation"
	default PDCURSES
	depends on CURSES

config TINYCURSES
	bool "TinyCurses"
	help
	  TinyCurses was the first curses implementation for libpayload.
	  It features low memory consumption, static allocation of larger
	  data structures (so few or no memory allocation calls) and a
	  reduced feature set.

config PDCURSES
	bool "PDCurses"
	help
	  libpayload's PDCurses port provides a full features curses
	  implementation, including libpanel, libmenu and libform (which
	  are taken from ncurses).
	  It requires more system resources, in particularily heap memory.

endchoice

source "libcbfs/Kconfig"

config LZMA
	bool "LZMA decoder"
	default y
	help
	  LZMA decoder implementation, usable eg. by CBFS,
	  but also externally.

config LZ4
	bool "LZ4 decoder"
	default y
	help
	  Decoder implementation for the LZ4 compression algorithm.
	  Adds standalone functions (CBFS support coming soon).

source "vboot/Kconfig"

endmenu

menu "Console Options"

config SKIP_CONSOLE_INIT
	bool "Skip initializing the consoles at startup"
	default y if CHROMEOS
	default n
	help
	  Normally, libpayload will initialize console input/output on startup
	  before the payload itself gets control. This option disables that
	  behavior and leaves console initialization up to the payload.

config CBMEM_CONSOLE
	bool "Send output to the in memory CBMEM console"
	default y

config SERIAL_CONSOLE
	bool "See output on the serial port console"
	default y

config 8250_SERIAL_CONSOLE
	bool "8250-compatible serial port driver (including IO and MMIO)"
	depends on SERIAL_CONSOLE
	default y if ARCH_X86

config S5P_SERIAL_CONSOLE
	bool "Exynos SOC, S5P compatible serial port driver"
	depends on SERIAL_CONSOLE
	default n

config IPQ806X_SERIAL_CONSOLE
	bool "IPQ806x SOC compatible serial port driver"
	depends on SERIAL_CONSOLE
	default n

config IPQ40XX_SERIAL_CONSOLE
	bool "IPQ40xx SOC compatible serial port driver"
	depends on SERIAL_CONSOLE
	default n

config QCS405_SERIAL_CONSOLE
	bool "QCS405 SOC compatible serial port driver"
	depends on SERIAL_CONSOLE
	default n

config QUALCOMM_QUPV3_SERIAL_CONSOLE
	bool "Qualcomm QUPV3 serial port driver"
	depends on SERIAL_CONSOLE
	default n

config PL011_SERIAL_CONSOLE
	bool "PL011 compatible serial port driver"
	depends on 8250_SERIAL_CONSOLE
	default n

config SERIAL_IOBASE
	## This default is currently not used on non-x86 systems.
	hex "Default I/O base for the serial port (default 0x3f8)"
	depends on SERIAL_CONSOLE && ARCH_X86
	default 0x3f8

config SERIAL_SET_SPEED
	bool "Override the serial console baud rate"
	default n
	depends on SERIAL_CONSOLE

config SERIAL_BAUD_RATE
	int "Serial console baud rate (default 115200)"
	depends on SERIAL_SET_SPEED
	default 115200

config SERIAL_ACS_FALLBACK
	bool "Use plain ASCII characters for ACS"
	default n
	depends on SERIAL_CONSOLE
	help
	  The alternate character set (ACS) is used for drawing lines and
	  displaying a couple of other special graphics characters.  The
	  ACS characters generally look good on screen, but can be difficult
	  to cut and paste from a terminal window to a text editor.

	  Say 'y' here if you want to always use plain ASCII characters to
	  approximate the appearance of ACS characters on the serial port
	  console.

config VIDEO_CONSOLE
	bool "See output on a video console"
	default y

config VGA_VIDEO_CONSOLE
	bool "VGA video console driver"
	depends on ARCH_X86 && VIDEO_CONSOLE
	default y if !CHROMEOS

config GEODELX_VIDEO_CONSOLE
	bool "Geode LX video console driver"
	depends on ARCH_X86 && VIDEO_CONSOLE
	default n

config COREBOOT_VIDEO_CONSOLE
	bool "coreboot video console driver"
	depends on VIDEO_CONSOLE && !GEODELX_VIDEO_CONSOLE
	default y if CHROMEOS
	default n
	help
	  Say Y here if coreboot switched to a graphics mode and
	  your payload wants to use it.

config COREBOOT_VIDEO_CENTERED
	bool "Center a classic 80x25 console on bigger screens"
	depends on COREBOOT_VIDEO_CONSOLE
	help
	  Say 'y' here if your payload is hardcoded to a 80x25 console. Otherwise
	  its output would look squeezed into the upper-left corner of the screen.

config FONT_SCALE_FACTOR
	int "Scale factor for the included font"
	depends on GEODELX_VIDEO_CONSOLE || COREBOOT_VIDEO_CONSOLE
	default 0
	help
	  By default (value of 0), the scale factor is automatically
	  calculated to ensure at least 130 columns (when possible).

config CBGFX_FAST_RESAMPLE
	bool "CBGFX: use faster (less pretty) image scaling"
	default n
	help
	  When payloads use the CBGFX library to draw .BMPs on the screen,
	  they will be resampled with an anti-aliasing filter to scale to the
	  requested output size. The default implementation should normally be
	  fast enough, but if desired this option can make it about 50-100%
	  faster at the cost of quality. (It changes the 'a' parameter in the
	  Lanczos resampling algorithm from 3 to 2.)

	  Only affects .BMPs that aren't already provided at the right size.

config PC_I8042
	bool "A common PC i8042 driver"
	default y if PC_KEYBOARD || PC_MOUSE
	default n
	help
	  To be used by PC_KEYBOARD and PC_MOUSE.

config PC_MOUSE
	bool "Allow input from a PC mouse"
	default n if CHROMEOS
	default y if ARCH_X86 # uses IO
	default n
	help
	  PS/2 mouse driver on top of PC_I8042.

config PC_KEYBOARD
	bool "Allow input from a PC keyboard"
	default y if ARCH_X86 # uses IO
	default n

config PC_KEYBOARD_LAYOUT_US
	bool "English (US) keyboard layout"
	depends on PC_KEYBOARD
	default y

config PC_KEYBOARD_LAYOUT_DE
	bool "German keyboard layout"
	depends on PC_KEYBOARD
	default n

config PC_KEYBOARD_TRANSLATION
	bool "Enable or Disable translation in PC keyboard set 2 on exit"
	depends on PC_KEYBOARD
	default y

endmenu

menu "Drivers"

config PCI
	bool "Support for PCI devices"
	default y if ARCH_X86
	default n

config PCI_IO_OPS
	bool "Support for PCI devices with port IO"
	depends on PCI && IO_ADDRESS_SPACE
	default y if ARCH_X86
	default n

config PCIE_MEDIATEK
	bool "Support for PCIe devices on MediaTek platforms"
	depends on PCI && !PCI_IO_OPS
	default n

config PCIE_QCOM
	bool "Support for PCIe devices on Qualcomm platforms"
	depends on PCI && !PCI_IO_OPS
	default n

config NVRAM
	bool "Support for reading/writing NVRAM bytes"
	depends on ARCH_X86 # for now
	default y

config MOUSE_CURSOR
	bool "Support for mouse cursor handling"
	default y if PC_MOUSE
	default n
	help
	  Provides a common interface for various mouse cursor drivers.
	  * Supports up to 32 buttons.
	  * Supports 3 axis mice.
	  * Applies simple cursor acceleration.
	  * Allows to set cursor acceleration and cursor speed.

config RTC_PORT_EXTENDED_VIA
	bool "Extended RTC ports are 0x74/0x75"
	default n
	help
	  For recent chipsets with 256 NVRAM bytes, you have to access the
	  upper 128 bytes (128-255) using two different I/O ports,
	  usually 0x72/0x73.

	  On some chipsets this can be a different set of ports, though.
	  The VIA VT8237R for example only recognizes the ports 0x74/0x75
	  for accessing the high 128 NVRAM bytes (as seems to be the case for
	  multiple VIA chipsets).

	  If you want to read or write CMOS bytes on computers with one of
	  these chipsets, say 'y' here.

config SPEAKER
	bool "Support for PC speaker"
	depends on ARCH_X86
	default y if !CHROMEOS

source "drivers/timer/Kconfig"
source "drivers/storage/Kconfig"
source "drivers/usb/Kconfig"

endmenu

menu "Debugging"
	depends on DEVELOPER

config DEBUG_MALLOC
	bool "Debug memory allocator"
	default n
	help
	  Select this option if you want to debug the memory allocator. This
	  option logs all uses of the following functions:

	    void free(void *ptr);
	    void *malloc(size_t size);
	    void *calloc(size_t nmemb, size_t size);
	    void *realloc(void *ptr, size_t size);
	    void *memalign(size_t align, size_t size);

	  Say N here unless you are debugging memory allocator problems.

endmenu

config BIG_ENDIAN
	default n
	bool

config LITTLE_ENDIAN
	default n
	bool

config IO_ADDRESS_SPACE
	default n
	bool
	help
	  This option is turned on if the target system has a separate
	  IO address space. This is typically only the case on x86.

source "arch/arm/Kconfig"
source "arch/arm64/Kconfig"
source "arch/x86/Kconfig"
source "arch/mock/Kconfig"
