## SPDX-License-Identifier: GPL-2.0-only

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

config ARCH_ARM
        bool "ARM"
        help
          Support the ARM architecture

config ARCH_X86_32
        bool "x86_32"
        help
          Support the x86_32 architecture

config ARCH_X86_64
        bool "x86_64"
        help
          Support the x86_64 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 ARCH_X86
	bool
	default y if ARCH_X86_32 || ARCH_X86_64
	help
	  Support the x86 architecture

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

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"
