##
## This file is part of the libpayload project.
##
## 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 EXPERIMENTAL
	bool "Experimental Options"
	default n
	help
	  Prompt for experimental functionality. Attention: This is not likely
	  to work without problems

config OBSOLETE
	bool "Obsolete Options"
	default n
	help
	  Prompt for obsolete options. These options are for old, unsupported
	  features and are likely to go away in the future.

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

config CHROMEOS
	bool "ChromeOS specific features"
	default n
	help
	  Enable ChromeOS specific features.

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

endchoice

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

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

endmenu

menu "Standard Libraries"

config LIBC
	bool "Enable C library support"
	default y

config CURSES
	bool "Build a curses library"
	default y

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

config LAR
	bool "LAR support"
	default n
	depends on OBSOLETE
	help
	  LAR is the archive format of (obsolete) coreboot v3

config CBFS
	bool "CBFS support"
	default y
	help
	  CBFS is the archive format of coreboot

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

menu "Console Options"

config SKIP_CONSOLE_INIT
	bool "Skip initializing the consoles at startup"
	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, 16450, 16550, 16550A compatible serial port driver"
	depends on SERIAL_CONSOLE
	default y if ARCH_X86
	default n if !ARCH_X86

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

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 n
	help
	  Say Y here if coreboot switched to a graphics mode and
	  your payload wants to use it.

config PC_KEYBOARD
	bool "Allow input from a PC keyboard"
	default y

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

endmenu

menu "Drivers"

config PCI
	bool "Support for PCI devices"
	depends on ARCH_X86 # for now
	default y

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

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

config STORAGE
	bool "Support for storage devices"
	default y
	help
	  Select this option if you want support for storage devices (like
	  hard drives, memory sticks or optical drives).

config STORAGE_64BIT_LBA
	bool "Use 64-bit integers to address sectors"
	depends on STORAGE
	default n
	help
	  If this is selected, sectors will be addressed by an 64-bit integer.
	  Select this to support LBA-48 for ATA drives.

config STORAGE_ATA
	bool "Support ATA drives (i.e. hard drives)"
	depends on STORAGE
	default y
	help
	  Select this option if you want support for ATA storage devices
	  (i.e. hard drives).

config STORAGE_ATAPI
	bool "Support ATAPI drives (i.e. optical drives)"
	depends on STORAGE
	default y
	select STORAGE_ATA
	help
	  Select this option if you want support for ATAPI storage devices
	  (i.e. optical drives like CD or DVD drives).

config STORAGE_AHCI
	bool "Support for AHCI host controllers"
	depends on STORAGE && (STORAGE_ATA || STORAGE_ATAPI) && PCI
	default y
	help
	  Select this option if you want support for SATA controllers in
	  AHCI mode.

config STORAGE_AHCI_ONLY_TESTED
	bool "Only enable tested controllers"
	depends on STORAGE_AHCI
	default y
	help
	  If this option is selected only AHCI controllers which are known
	  to work will be used.

config USB
	bool "USB Support"
	default n

config USB_UHCI
	bool "Support for USB UHCI controllers"
	depends on USB && ARCH_X86
	help
	  Select this option if you are going to use USB 1.1 on an Intel based
	  system.

config USB_OHCI
	bool "Support for USB OHCI controllers"
	depends on USB
	help
	  Select this option if you are going to use USB 1.1 on a non-Intel based
	  system.

config USB_EHCI
	bool "Support for USB EHCI controllers"
	depends on USB
	help
	  Select this option if you want to use USB 2.0

config USB_XHCI
	bool "Support for USB xHCI controllers"
	depends on USB
	help
	  Select this option if you want to use USB 3.0
	  NOTE: This option is not (fully) implemented yet

config USB_HID
	bool "Support for USB keyboards"
	depends on USB
	default y
	help
	  Select this option if you want to use devices complying to the
	  USB HID (Human Interface Device) standard. Such devices are for
	  example keyboards and mice. Currently only keyboards are supported.
	  Say Y here unless you know exactly what you are doing.

config USB_HUB
	bool "Support for USB hubs"
	depends on USB
	default y
	help
	  Select this option if you want to compile in support for USB hubs.
	  Say Y here unless you know exactly what you are doing.

config USB_MSC
	bool "Support for USB storage"
	depends on USB
	default y
	help
	  Select this option if you want to compile in support for USB mass
	  storage devices (USB memory sticks, hard drives, CDROM/DVD drives)
	  Say Y here unless you know exactly what you are doing.

config USB_PCI
	bool "Auto-scan PCI bus for USB host controllers"
	depends on USB
	default y if ARCH_X86
	default n

config USB_GEN_HUB
	bool
	default n if (!USB_HUB && !USB_XHCI)
	default y if (USB_HUB || USB_XHCI)

endmenu

menu "Debugging"
	depends on DEVELOPER

config DEBUG_MALLOC
	bool "Debug memory allocator"
	depends on USB
	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

# Whether the target system has an IO address space.
config IO_ADDRESS_SPACE
	default n
	bool

source "arch/Config.in"
