1236 lines
43 KiB
Markdown
1236 lines
43 KiB
Markdown
# Kconfig in coreboot
|
||
|
||
## Overview
|
||
Kconfig is a tool used in coreboot, Linux, and many other projects as the main
|
||
configuration mechanism. In coreboot, it allows a developer both to select
|
||
which platform to build and to modify various features within the platform. The
|
||
Kconfig language was developed as a way to configure the Linux kernel, and is
|
||
still maintained as a part of the Linux kernel tree. Starting in Linux 2.5.45,
|
||
the ncurses based menuconfig was added, which is still used as the main
|
||
configuration front end in coreboot today.
|
||
|
||
The official Kconfig source and documentation is kept at kernel.org:
|
||
|
||
- [Kconfig source](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/scripts/kconfig)
|
||
- [Kconfig Language Documentation](https://www.kernel.org/doc/Documentation/kbuild/kconfig-language.txt)
|
||
|
||
The advantage to using Kconfig is that it allows users to easily select the
|
||
high level features of the project to be enabled or disabled at build time.
|
||
Ultimately the Kconfig tool generates a list of values which are used by the
|
||
source code and Makefiles of the project. This allows the source files to
|
||
select features, and allows the build to determine which files should be
|
||
compiled and linked to the rom.
|
||
|
||
|
||
## Kconfig targets in Make
|
||
The Kconfig program in coreboot is built from source in util/kconfig. There are
|
||
various targets in the makefile to build Kconfig in different ways. These give
|
||
the user control over how to build the platform
|
||
|
||
|
||
### Front end configuration targets
|
||
These are the make targets that would be used to update the configuration of
|
||
the platform.
|
||
- config - Text mode configuration tool, asks each configuration option in turn.
|
||
This does actually run in coreboot, but it is recommended that this not be
|
||
used as there is no way to save a partial config.
|
||
- gconfig - Graphical configuration tool based on GTK+ 2.0.
|
||
- menuconfig - Text mode, menu driven configuration tool.
|
||
- nconfig - Text mode, menu driven configuration tool.
|
||
- xconfig - Graphical front end based on QT.
|
||
|
||
|
||
### Targets that update config files
|
||
These options are used to update the coreboot config files, typically .config.
|
||
The target file can be changed with variables in the environment or on the make
|
||
command line.
|
||
|
||
- defconfig - This generates a config based on another config file. Use the
|
||
environment variable KBUILD_DEFCONFIG to specify the base config file.
|
||
- oldconfig - Displays the answers to all configuration questions as it
|
||
generates the config.h file. If an interactive question is found that does
|
||
not have an answer yet, it stops and queries the user for the desired value.
|
||
- olddefconfig - Generates a config, using the default value for any symbols not
|
||
listed in the .config file.
|
||
- savedefconfig - Creates a ‘mini-config’ file, stripping out all of the symbols
|
||
that were left as default values. This is very useful for debugging, and is
|
||
how config files should be saved.
|
||
- silentoldconfig - This evaluates the .config file the same way that the
|
||
oldconfig target does, but does not print out each question as it is
|
||
evaluated. It still stops to query the user if an option with no answer in
|
||
the .config file is found.
|
||
|
||
|
||
### Targets not typically used in coreboot
|
||
- localmodconfig, localnoconfig, randconfig, allyesconfig, allnoconfig - These
|
||
are all used to generate various Kconfig files for testing.
|
||
|
||
|
||
### Environment Variables that affect Kconfig
|
||
These variables are typically set in the makefiles or on the make command line.
|
||
|
||
#### Variables added to the coreboot Kconfig source
|
||
These variables were added to Kconfig specifically for coreboot and are not
|
||
included in the Linux version.
|
||
|
||
- COREBOOT_BUILD_DIR=path for temporary files. This is used by coreboot’s
|
||
abuild tool.
|
||
|
||
- KCONFIG_STRICT=value. Define to enable warnings as errors. This is enabled
|
||
in coreboot, and should not be changed.
|
||
|
||
- KCONFIG_NEGATIVES=value. Define to show negative values in the autoconf.h file
|
||
(build/config.h). This is enabled in coreboot, and should not be changed.
|
||
|
||
|
||
#### Variables used to control the input and output config files
|
||
- KBUILD_DEFCONFIG=inputname of the defconfig file. This defaults to
|
||
‘configs/defconfig’ and is used by the ‘defconfig’ target.
|
||
|
||
- DEFCONFIG=output name of the defconfig file. This defaults to ‘defconfig’
|
||
and is used by ‘savedefconfig’ target as the output filename.
|
||
|
||
- DOTCONFIG=name of the .config file. This defaults to '.config' and is used
|
||
by most config type targets.
|
||
|
||
|
||
#### Variables used by the makefiles for controlling Kconfig
|
||
- Kconfig=root Kconfig file. This is set to 'src/Kconfig' in the coreboot
|
||
makefile.
|
||
|
||
- KCONFIG_CONFIG=input config file. coreboot sets this to $(DOTCONFIG).
|
||
|
||
- KCONFIG_AUTOHEADER=path and filename of autoconf.h file. coreboot sets this
|
||
to $(obj)/config.h.
|
||
|
||
- KCONFIG_DEPENDENCIES=”kbuild dependency file". This defaults to
|
||
auto.conf.cmd and outputs the name of all of the Kconfig files used.
|
||
|
||
- KCONFIG_SPLITCONFIG=”directory name for individual SYMBOL.h files”.
|
||
coreboot sets this to $(obj)/config.
|
||
|
||
#### Used only for ‘make menuconfig’
|
||
- MENUCONFIG_MODE=single_menu. Set to "single_menu" to enable. All other
|
||
values disable the option. This makes submenus appear below the menu option
|
||
instead of opening a new screen.
|
||
|
||
- MENUCONFIG_COLOR=<theme>. This sets the color theme for the menu from
|
||
these options:
|
||
|
||
- mono => selects colors suitable for monochrome displays.
|
||
- blackbg => selects a color scheme with black background.
|
||
- classic => theme with blue background. The classic look.
|
||
- bluetitle => an LCD friendly version of classic. (default).
|
||
|
||
|
||
#### Used only for ‘make nconfig’
|
||
|
||
- NCONFIG_MODE=single_menu
|
||
|
||
Submenus appear below the menu option instead of opening a new screen.
|
||
|
||
|
||
#### Unused in coreboot
|
||
|
||
Although these variables are not used by coreboot, their values should be left
|
||
at the default values. Other values may have unexpected effects on the
|
||
codebase.
|
||
|
||
- KCONFIG_SEED=randconfig seed value.
|
||
- KCONFIG_PROBABILITY=randconfig percent to set to y.
|
||
- KCONFIG_NOSILENTUPDATE=value. Define to prevent silent updates to .config
|
||
file.
|
||
- KCONFIG_OVERWRITECONFIG=value. Define to prevent breaking a .config symlink.
|
||
- KCONFIG_TRISTATE=filename of tristate.conf file.
|
||
- SRCTREE=path to src directory.
|
||
- KCONFIG_AUTOCONFIG=path and filename of the auto.conf file.
|
||
|
||
coreboot sets this to $(obj)/auto.conf. Although this value is actually
|
||
set by coreboot, the resulting file is not used.
|
||
|
||
- CONFIG_=prefix for Kconfig output symbols.
|
||
|
||
coreboot expects this to *NOT* be set.
|
||
|
||
|
||
|
||
## Kconfig Language
|
||
|
||
The Kconfig language has about 30 keywords, some overloaded, and some with the
|
||
same meaning. Whitespace may have specific meaning, for example in the 'help'
|
||
keyword. There are 8 logical operators for use in expressions, which allow
|
||
values to be set based on other values.
|
||
|
||
|
||
### Terminology
|
||
|
||
- Symbols - There are two types of symbols, "constant" and “non-constant”.
|
||
- Constant symbols are alphanumeric values used in expressions for
|
||
comparison. The Kconfig language specification says that these must be
|
||
surrounded by single or double quotes.
|
||
- Non-constant symbols are the 'config' values that are output into the
|
||
saved .config, auto.conf and config.h files. Non-constant symbols are
|
||
typically defined with the 'config' keyword, although they can also be
|
||
defined with the 'choice' keyword. These symbols may be used in a file's
|
||
expressions before they are defined. Valid characters for non-constant
|
||
symbols are any combination of alphanumeric characters, underscore.
|
||
Although “1234” is accepted as a symbol name, as is “o_o”, convention is
|
||
to use all uppercase words that are descriptive of the symbol's use so
|
||
they make sense when turned into CONFIG_NAME #defines.
|
||
|
||
- Expressions - An expression is a logical evaluation. It can be as simple as
|
||
a static 'y' or 'n', or can be a symbol. Alternatively, expressions can be
|
||
complex evaluations of multiple symbols using the various logical operators.
|
||
The Kconfig language allows these logical evaluations in several places. The
|
||
most common use for complex expressions is following 'if' or ‘depends on’
|
||
keywords, but they can also be used to set the value for a prompt or default
|
||
values.
|
||
|
||
- Types - Each Kconfig symbol is one of the following types: bool, hex, int,
|
||
string, or tristate. The tristate type is not used for coreboot, leaving just
|
||
four types. As noted in the keyword summaries, a symbol must have a consistent
|
||
type anywhere it is defined. Also, Kconfig will simply not display a symbol
|
||
that has no type defined. A warning will be displayed in the terminal where
|
||
menuconfig was run if this happens:
|
||
_src/Kconfig:25:warning: config symbol defined without type_.
|
||
|
||
- Prompts - Input prompts are the text associated with the symbols which shown
|
||
to the user. The Kconfig language definition does not require surrounding the
|
||
prompt’s text with quotes, however it is recommended that quotes be used for
|
||
maximum compatibility.
|
||
|
||
- Menu Entries - These keyword blocks create the symbols and questions that are
|
||
visible in the front end.
|
||
|
||
|
||
## Keywords
|
||
|
||
### bool
|
||
|
||
The 'bool' keyword assigns a boolean type to a symbol. The allowable values for
|
||
a boolean type are 'n' or 'y'. The keyword can be followed by an optional prompt
|
||
string which makes the symbol editable in one of the configuration front ends.
|
||
|
||
|
||
##### Usage:
|
||
bool \[prompt\] \[if <expr>\]
|
||
|
||
|
||
##### Example:
|
||
config ANY_TOOLCHAIN
|
||
bool "Allow building with any toolchain"
|
||
default n
|
||
depends on COMPILER_GCC
|
||
|
||
|
||
##### Notes:
|
||
- Putting the prompt after the 'bool' keyword is the same as using a 'prompt'
|
||
keyword later. See the 'prompt' keyword for more notes.
|
||
- Only the first type definition for each symbol is valid. Further matching
|
||
definitions are fine, although unnecessary. Conflicting type definitions will
|
||
be ignored, and a warning will be presented on the console where the
|
||
configuration front end was run:
|
||
_warning: ignoring type redefinition of 'SYMBOL' from 'hex' to 'integer'_.
|
||
- Boolean symbols do not need a default and will default to ‘n’.
|
||
|
||
|
||
##### Restrictions:
|
||
|
||
- This keyword must be within a symbol definition block, started by the
|
||
'config' keyword.
|
||
|
||
--------------------------------------------------------------------------------
|
||
|
||
### choice
|
||
|
||
This creates a selection list of one or more boolean symbols. For bools, only
|
||
one of the symbols can be selected, and one will be be forced to be selected,
|
||
either by a ‘default’ statement, or by selecting the first config option if
|
||
there is no default value listed.
|
||
|
||
##### Usage:
|
||
choice \[symbol\]
|
||
- \[prompt\]
|
||
- \[default\]
|
||
|
||
|
||
##### Example:
|
||
choice TESTCHOICE
|
||
prompt "Test choice"
|
||
default TESTCHOICE2 if TESTCHOICE_DEFAULT_2
|
||
default TESTCHOICE3
|
||
|
||
config TESTCHOICE1
|
||
bool "Choice 1"
|
||
config TESTCHOICE2
|
||
bool "Choice 2"
|
||
config TESTCHOICE3
|
||
bool "Choice 3"
|
||
config TESTCHOICE4
|
||
bool "Choice 4" if TESTCHOICE_SHOW_4
|
||
endchoice
|
||
|
||
config TESTCHOICE_DEFAULT_2
|
||
def_bool y
|
||
|
||
config TESTCHOICE_SHOW_4
|
||
def_bool n
|
||
|
||
config TESTSTRING
|
||
string
|
||
default “String #1” if TESTCHOICE1
|
||
default “String #2” if TESTCHOICE2
|
||
default “String #4” if TESTCHOICE3
|
||
default “String #4” if TESTCHOICE4
|
||
default “”
|
||
|
||
|
||
##### Notes:
|
||
- If no symbol is associated with a choice, then you can not have multiple
|
||
definitions of that choice. If a symbol is associated to the choice, then
|
||
you may define the same choice (ie. with the same entries) in another place.
|
||
Any selection in either location will update both choice menu selections. In
|
||
coreboot, the value of the symbol is always 1.
|
||
- As shown in the example above, the choice between bools can be used to set
|
||
the default for a non-bool type. This works best when the non-bool type
|
||
does not have an input prompt.
|
||
|
||
|
||
##### Restrictions:
|
||
- Symbols used for 'choice' entries must have input prompts defined using the
|
||
'prompt' keyword.
|
||
- Symbols used in 'choice' entries may not be enabled with a 'select'
|
||
statement, they can be defaulted using a second Kconfig symbol however.
|
||
|
||
--------------------------------------------------------------------------------
|
||
|
||
### comment
|
||
|
||
This keyword defines a line of text that is displayed to the user in the
|
||
configuration frontend and is additionally written to the output files.
|
||
|
||
|
||
##### Usage:
|
||
comment <prompt>
|
||
- \[depends on\]
|
||
|
||
|
||
##### Example:
|
||
|
||
if CONSOLE_SERIAL
|
||
comment "I/O mapped, 8250-compatible"
|
||
depends on DRIVERS_UART_8250IO
|
||
endif
|
||
|
||
|
||
##### Notes:
|
||
- Comments are only valid outside of config blocks, but can be within menu and
|
||
if blocks.
|
||
|
||
--------------------------------------------------------------------------------
|
||
|
||
### config
|
||
|
||
This is the keyword that starts a block defining a Kconfig symbol. The symbol
|
||
modifiers follow the 'config' statement.
|
||
|
||
##### Usage:
|
||
config <symbol>
|
||
|
||
- \[bool | def_bool | int | hex | string\]
|
||
- \[depends on\]
|
||
- \[prompt\]
|
||
- \[help\]
|
||
- \[range\]
|
||
- \[select\]
|
||
|
||
|
||
##### Example:
|
||
config SEABIOS_PS2_TIMEOUT
|
||
prompt "PS/2 keyboard timeout" if PAYLOAD_SEABIOS
|
||
default 0
|
||
depends on PAYLOAD_SEABIOS
|
||
int
|
||
help
|
||
Some PS/2 keyboard controllers don't respond to commands
|
||
immediately after powering on. This specifies how long
|
||
SeaBIOS will wait for the keyboard controller to become
|
||
ready before giving up.
|
||
|
||
|
||
##### Notes:
|
||
- Non-coreboot projects also use the 'tristate' and 'def_tristate' types.
|
||
- Ends at the next Kconfig keyword that is not valid inside the config block:
|
||
|
||
menu | endmenu | if | endif | choice | config | source | comment
|
||
|
||
--------------------------------------------------------------------------------
|
||
|
||
### default
|
||
|
||
The ‘default’ keyword assigns a value to a symbol in the case where no preset
|
||
value exists, i.e. the symbol is not present and assigned in .config. If there
|
||
is no preset value, and no ‘default’ keyword, the user will be asked to enter a
|
||
valid value when building coreboot.
|
||
|
||
|
||
##### Usage:
|
||
default <expr> \[if <expr>\]
|
||
|
||
|
||
##### Example:
|
||
config GENERATE_MP_TABLE
|
||
prompt "Generate an MP table" if HAVE_MP_TABLE || DRIVERS_GENERIC_IOAPIC
|
||
bool
|
||
default HAVE_MP_TABLE || DRIVERS_GENERIC_IOAPIC
|
||
help
|
||
Generate an MP table (conforming to the Intel
|
||
MultiProcessor specification 1.4) for this board.
|
||
|
||
|
||
##### Notes:
|
||
- Kconfig defaults for symbols without a prompt *NEVER* affect existing legal
|
||
symbol definitions in a .config file. The default only affects the symbol if
|
||
there is no valid definition in a config file. This is a frequent source of
|
||
confusion. It’s covered again in the Tips section below.
|
||
- The first valid 'default' entry for a symbol is always used. Any further
|
||
'default' statements for a symbol are ignored. This means that the order of
|
||
Kconfig files is very important as the earlier files get to set the defaults
|
||
first. They should be sourced in the order from most specific (mainboard
|
||
Kconfig files) to the most generic (architecture-specific Kconfig files).
|
||
- If there is no 'default' entry for a symbol, it gets set to 'n', 0, 0x0, or
|
||
“” depending on the type, however the 'bool' type is the only type that
|
||
should be left without a default value.
|
||
|
||
--------------------------------------------------------------------------------
|
||
|
||
### def_bool
|
||
|
||
‘def_bool’ is similar to the 'bool' keyword in that it sets a symbol’s type to
|
||
boolean. It lets you set the type and default value at the same time, instead
|
||
of setting the type and the prompt at the same time. It's typically used for
|
||
symbols that don't have prompts.
|
||
|
||
|
||
##### Usage:
|
||
def_bool <expr> \[if <expr>\]
|
||
|
||
|
||
##### Example:
|
||
config EC_GOOGLE_CHROMEEC_LPC
|
||
depends on EC_GOOGLE_CHROMEEC && ARCH_X86
|
||
def_bool y
|
||
select SERIRQ_CONTINUOUS_MODE
|
||
help
|
||
Google Chrome EC via LPC bus.
|
||
|
||
|
||
##### Notes:
|
||
- Only the first type definition for each symbol is valid. Further matching
|
||
definitions are fine, although unnecessary. Conflicting type definitions will
|
||
be ignored, and a warning will be presented on the console where the
|
||
configuration front end was run:
|
||
_warning: ignoring type redefinition of 'SYMBOL' from 'hex' to 'integer'_.
|
||
|
||
##### Restrictions:
|
||
- This keyword must be within a symbol definition block, started by the
|
||
'config' keyword.
|
||
|
||
--------------------------------------------------------------------------------
|
||
|
||
### depends on
|
||
|
||
This defines a dependency for a menu entry, including symbols and comments. It
|
||
behaves the same as surrounding the menu entry with an if/endif block. If the
|
||
‘depends on’ expression evaluates to false, the 'prompt' value will not be
|
||
printed, and defaults will not be set based on this block.
|
||
|
||
|
||
##### Usage:
|
||
depends on <expr>
|
||
|
||
|
||
##### Example:
|
||
config COMMON_CBFS_SPI_WRAPPER
|
||
bool
|
||
default n
|
||
depends on SPI_FLASH
|
||
depends on !ARCH_X86
|
||
help
|
||
Use common wrapper to interface CBFS to SPI bootrom.
|
||
|
||
|
||
##### Notes:
|
||
- Symbols that have multiple ‘depends on’ sections as above are equivalent to a
|
||
single ‘depends on’ statement with sections joined by &&. So the above is
|
||
the same as “depends on SPI_FLASH && ! ARCH_X86”.
|
||
|
||
--------------------------------------------------------------------------------
|
||
|
||
### endchoice
|
||
|
||
This ends a choice block. See the 'choice' keyword for more information and an
|
||
example.
|
||
|
||
--------------------------------------------------------------------------------
|
||
|
||
### endif
|
||
|
||
This ends a block started by the 'if' keyword. See the 'if' keyword for more
|
||
information and an example.
|
||
|
||
--------------------------------------------------------------------------------
|
||
|
||
### endmenu
|
||
|
||
This ends a menu block. See the 'menu' keyword for more information and an
|
||
example.
|
||
|
||
--------------------------------------------------------------------------------
|
||
|
||
### help
|
||
|
||
The 'help' keyword defines the subsequent block of text as help for a config or
|
||
choice block. The help block is started by the 'help' keyword on a line by
|
||
itself, and the indentation level of the next line controls the end of the help
|
||
block. The help ends on the next non-blank line that has an indentation level
|
||
less than the indentation level of the first line following the 'help' keyword.
|
||
|
||
##### Usage:
|
||
help <help text>
|
||
|
||
|
||
##### Example:
|
||
config COMPILER_GCC
|
||
bool "GCC"
|
||
help
|
||
Use the GNU Compiler Collection (GCC) to build coreboot. For details
|
||
see http://gcc.gnu.org.
|
||
|
||
|
||
##### Notes:
|
||
- Identical to the '---help---' keyword which isn’t used in coreboot.
|
||
- Other keywords are allowed inside the help block, and are not recognized as
|
||
keywords so long as the indentation rules are followed, even if they start a
|
||
line.
|
||
|
||
|
||
##### Restrictions:
|
||
- Only used for 'config' and 'choice' keywords.
|
||
|
||
--------------------------------------------------------------------------------
|
||
|
||
### hex
|
||
|
||
This is another symbol type specifier, specifying an unsigned integer value
|
||
formatted as hexadecimal.
|
||
|
||
##### Usage:
|
||
hex <expr> \[if <expr>\]
|
||
|
||
|
||
##### Example:
|
||
config INTEL_PCH_UART_CONSOLE_NUMBER
|
||
hex "Serial IO UART number to use for console"
|
||
default 0x0
|
||
depends on INTEL_PCH_UART_CONSOLE
|
||
|
||
|
||
##### Notes:
|
||
- Kconfig doesn’t complain if you don’t start the default value for a hex
|
||
symbol with ‘0x’, but not doing so will lead to issues. It will update 10
|
||
to 0x10 without warning the user.
|
||
- Putting the prompt text after the 'hex' keyword is the same as using a
|
||
'prompt' keyword later. See the 'prompt' keyword for more notes.
|
||
- Only the first type definition for each symbol is valid. Further matching
|
||
definitions are fine, although unnecessary. Conflicting type definitions will
|
||
be ignored, and a warning will be presented on the console where the
|
||
configuration front end was run:
|
||
_warning: ignoring type redefinition of 'SYMBOL' from 'hex' to 'integer'_.
|
||
|
||
|
||
##### Restrictions:
|
||
- This keyword must be within a symbol definition block, started by the
|
||
'config' keyword.
|
||
- 'hex' type symbols must have a 'default' entry set.
|
||
|
||
--------------------------------------------------------------------------------
|
||
|
||
### if
|
||
|
||
The 'if' keyword is overloaded, used in two different ways. The first definition
|
||
enables and disables various other keywords, and follows the other keyword
|
||
definition. This usage is shown in each of the other keywords' usage listings.
|
||
|
||
The second usage of the 'if' keyword is part of an if/endif block. Most items
|
||
within an if/endif block are not evaluated, while others, such as the 'source'
|
||
keyword, ignore the existence of the if/endif block completely. Symbols defined
|
||
within an if/endif block are still created, although their default values are
|
||
ignored - all values are set to 'n'.
|
||
|
||
|
||
##### Usage:
|
||
if <expr>
|
||
|
||
- \[config\]
|
||
- \[choice\]
|
||
- \[comment\]
|
||
- \[menu\]
|
||
|
||
endif
|
||
|
||
|
||
##### Example:
|
||
if ARCH_X86
|
||
|
||
config SMP
|
||
bool
|
||
default y if MAX_CPUS != 1
|
||
default n
|
||
help
|
||
This option is used to enable certain functions to make
|
||
coreboot work correctly on symmetric multi processor (SMP) systems.
|
||
endif
|
||
|
||
##### Restrictions:
|
||
- Corresponding ‘if’ and ‘endif’ statements must exist in the same file.
|
||
|
||
--------------------------------------------------------------------------------
|
||
|
||
### int
|
||
|
||
A type setting keyword, defines a symbol as an integer, accepting only signed
|
||
numeric values. The values can be further restricted with the ‘range’ keyword.
|
||
|
||
|
||
##### Usage:
|
||
int <expr> \[if <expr>\]
|
||
|
||
|
||
##### Example:
|
||
config PRE_GRAPHICS_DELAY
|
||
int "Graphics initialization delay in ms"
|
||
default 0
|
||
help
|
||
On some systems, coreboot boots so fast that connected
|
||
monitors (mostly TVs) won't be able to wake up fast enough
|
||
to talk to the VBIOS. On those systems we need to wait for a
|
||
bit before executing the VBIOS.
|
||
|
||
|
||
##### Notes:
|
||
- Only the first type definition for each symbol is valid. Further matching
|
||
definitions are fine, although unnecessary. Conflicting type definitions will
|
||
be ignored, and a warning will be presented on the console where the
|
||
configuration front end was run:
|
||
_warning: ignoring type redefinition of 'SYMBOL' from 'hex' to 'integer'_.
|
||
|
||
|
||
##### Restrictions:
|
||
- This keyword must be within a symbol definition block, started by the 'config'
|
||
keyword.
|
||
- 'int' type symbols must have a default value set.
|
||
|
||
--------------------------------------------------------------------------------
|
||
|
||
### mainmenu
|
||
|
||
The 'mainmenu' keyword sets the title or title bar of the configuration front
|
||
end, depending on how the configuration program decides to use it. It can only
|
||
be specified once and at the very beginning of the top level Kconfig file,
|
||
before any other statements.
|
||
|
||
|
||
##### Usage:
|
||
mainmenu <prompt>
|
||
|
||
##### Example:
|
||
mainmenu "coreboot configuration"
|
||
|
||
##### Restrictions:
|
||
- Must be the first statement in the top level Kconfig.
|
||
- Must only be used once in the entire Kconfig tree.
|
||
|
||
--------------------------------------------------------------------------------
|
||
|
||
### menu
|
||
|
||
The 'menu' and 'endmenu' keywords tell the configuration front end that the
|
||
enclosed statements are part of a group of related pieces.
|
||
|
||
|
||
##### Usage:
|
||
menu <prompt>
|
||
|
||
- \[choice\]
|
||
- \[config\]
|
||
- \[menu\]
|
||
- \[if/endif\]
|
||
|
||
endmenu
|
||
|
||
|
||
##### Example:
|
||
menu "On-Chip Device Power Down Control"
|
||
config TEMP_POWERDOWN
|
||
bool "Temperature sensor power-down"
|
||
|
||
config SATA_POWERDOWN
|
||
bool "SATA power-down"
|
||
|
||
config ADC_POWERDOWN
|
||
bool "ADC power-down"
|
||
|
||
config PCIE0_POWERDOWN
|
||
bool "PCIE0 power-down"
|
||
|
||
config MAC_POWERDOWN
|
||
bool "MAC power-down"
|
||
|
||
config USB1_POWERDOWN
|
||
bool "USB2.0 Host Controller 1 power-down"
|
||
|
||
config IDE_POWERDOWN
|
||
bool "IDE power-down"
|
||
|
||
endmenu
|
||
|
||
##### Restrictions:
|
||
- Must be closed by a corresponding ‘endmenu’ keyword in the same file.
|
||
|
||
--------------------------------------------------------------------------------
|
||
|
||
### prompt
|
||
|
||
The 'prompt' keyword sets the text displayed for a config symbol or choice in
|
||
configuration front end.
|
||
|
||
|
||
##### Usage:
|
||
prompt <prompt> \[if <expr>\]
|
||
|
||
|
||
##### Example:
|
||
config REALMODE_DEBUG
|
||
prompt "Enable debug messages for option ROM execution"
|
||
bool
|
||
default n
|
||
depends on PCI_OPTION_ROM_RUN_REALMODE
|
||
depends on DEFAULT_CONSOLE_LOGLEVEL_7 || DEFAULT_CONSOLE_LOGLEVEL_8
|
||
help
|
||
This option enables additional x86emu related debug
|
||
messages. Note: This option will increase the time to emulate a ROM.
|
||
|
||
If unsure, say N.
|
||
|
||
|
||
##### Notes:
|
||
- The same rules apply for menu entries defined by the 'prompt' keyword and
|
||
other prompt types such as those defined by the 'int' or 'string' keywords.
|
||
- Redefining the prompt text in multiple instances of config symbols is allowed.
|
||
Only the current prompt statement for a particular entry will be displayed by
|
||
the front end in any given location. This means that multiple mainboards can
|
||
set different prompt values for a symbol, and it would appear differently in
|
||
each mainboard’s menu. The symbol can even have multiple entries in the same
|
||
menu with different prompts if desired. For example, both of these would get
|
||
printed, and changing either entry would change the other.
|
||
|
||
config PROMPT_TEST
|
||
string "Prompt value 1"
|
||
|
||
config PROMPT_TEST
|
||
prompt "Prompt value 2"
|
||
|
||
- Although not required, it's recommended that you use quotes around prompt
|
||
statements.
|
||
* If the prompt is redefined inside the SAME config entry, you will get a
|
||
warning:
|
||
_warning: prompt redefined_.
|
||
For example, this is not allowed:
|
||
|
||
config PROMPT_TEST
|
||
string "Prompt value 1"
|
||
prompt "Prompt value 2"
|
||
--------------------------------------------------------------------------------
|
||
|
||
### range
|
||
|
||
This sets the allowable minimum and maximum entries for hex or int type config
|
||
symbols.
|
||
|
||
|
||
##### Usage:
|
||
range <symbol> <symbol> \[if <expr>\]
|
||
|
||
|
||
##### Example:
|
||
config TEST1
|
||
hex "test 1"
|
||
range 0x0 0x10
|
||
|
||
|
||
##### Notes:
|
||
- Only the first definition of a range is used for any symbol. Further
|
||
definitions will be ignored without warning.
|
||
|
||
--------------------------------------------------------------------------------
|
||
|
||
### select
|
||
|
||
The ‘select’ keyword is used within a bool type config block. In coreboot (and
|
||
other projects that don't use modules), the 'select' keyword can force an
|
||
unassociated bool type symbol to 'y'. When the symbol for the config block is
|
||
‘y’, the ‘select’ action is taken. Otherwise the bool is unaffected.
|
||
|
||
|
||
##### Usage:
|
||
select <symbol> \[if <expr>\]
|
||
|
||
|
||
##### Example:
|
||
config TPM
|
||
bool
|
||
default n
|
||
select LPC_TPM if ARCH_X86
|
||
select I2C_TPM if ARCH_ARM
|
||
select I2C_TPM if ARCH_ARM64
|
||
help
|
||
Enable this option to enable TPM support in coreboot.
|
||
If unsure, say N.
|
||
|
||
##### Notes:
|
||
- Using the 'select' keyword can create logical contradictions in Kconfig, which
|
||
will create warnings and fail to save the .config. Following is an example of
|
||
an obviously invalid configuration, where selecting BOOLTEST violates the
|
||
‘depends on’ of BOOLTEST2:
|
||
|
||
config BOOLTEST
|
||
bool "bool Test"
|
||
select BOOLTEST2
|
||
|
||
config BOOLTEST2
|
||
bool "Bool Test 2"
|
||
depends on !BOOLTEST
|
||
|
||
##### Restrictions:
|
||
- The ‘select’ keyword only works on bool type symbols.
|
||
- Symbols created inside of choice blocks cannot be selected, and should be
|
||
enabled by using default values instead.
|
||
|
||
--------------------------------------------------------------------------------
|
||
|
||
### source
|
||
|
||
The 'source' keyword functions much the same as an 'include' statement in c.
|
||
This pulls one or more files into Kconfig at the location of the 'source'
|
||
command. This statement is always parsed - there is no way to conditionally
|
||
source a file. coreboot has modified the source statement slightly to handle
|
||
directory globbing. The '*' character will match with any directory.
|
||
|
||
|
||
##### Usage:
|
||
source <prompt>
|
||
|
||
|
||
##### Example:
|
||
|
||
choice
|
||
prompt "Mainboard vendor"
|
||
default VENDOR_EMULATION
|
||
|
||
source "src/mainboard/*/Kconfig.name"
|
||
|
||
endchoice
|
||
|
||
source "src/mainboard/*/Kconfig"
|
||
|
||
|
||
##### Notes:
|
||
- As with all prompt values, the 'source' prompt may be enclosed in single or
|
||
double quotes, or left without any quotes. Using quotes is highly recommended
|
||
however.
|
||
- The 'source' keyword loads files relative to the working directory where the
|
||
Kconfig command was run. For coreboot, this is the root coreboot directory, so
|
||
all source commands in the src directory need to start with ‘src/’.
|
||
- In coreboot's Kconfig, if a sourced file does not exist, the statement is
|
||
simply ignored. This is different than other versions of Kconfig.
|
||
- 'source' pulls a file into the Kconfig tree at the location of the keyword.
|
||
This allows for files containing small bits of the Kconfig tree to be pulled
|
||
into a larger construct. A restriction on this is that the starting/ending
|
||
keyword pairs must be within the same file - ‘endif’ cannot appear in a
|
||
different file than the ‘if’ statement that it ends. The same is true of
|
||
menu/endmenu and choice/endchoice pairs.
|
||
|
||
The coreboot Kconfig structure uses this along with globbing to build up the
|
||
mainboard directory. Each mainboard’s Kconfig.name file contains just two
|
||
statements that generate a list of all the platform names:
|
||
|
||
config BOARD_AMD_NORWICH
|
||
bool "Norwich"
|
||
|
||
|
||
##### Restrictions:
|
||
- 'source' keywords always load in the specified file or files. There is no way
|
||
to optionally pull in a file. Putting an if/endif block around a source
|
||
command does not affect the source command, although it does affect the
|
||
content. To avoid confusion, use if/endif blocks inside sourced files to
|
||
remove their content if necessary.
|
||
|
||
--------------------------------------------------------------------------------
|
||
|
||
### string
|
||
|
||
The last of the symbol type assignment keywords. 'string' allows a text value to
|
||
be entered.
|
||
|
||
|
||
##### Usage:
|
||
string <expr> \[if <expr>\]
|
||
|
||
|
||
##### Example:
|
||
config BOOTBLOCK_SOUTHBRIDGE_INIT
|
||
string
|
||
default "southbridge/amd/pi/hudson/bootblock.c"
|
||
|
||
config HUDSON_GEC_FWM_FILE
|
||
string "GEC firmware path and filename"
|
||
depends on HUDSON_GEC_FWM
|
||
|
||
|
||
##### Notes:
|
||
- Putting the prompt after the 'string' keyword is the same as using a 'prompt'
|
||
keyword later. See the prompt keyword for more notes.
|
||
- Only the first type definition for each symbol is valid. Further matching
|
||
definitions are fine, although unnecessary. Conflicting type definitions will
|
||
be ignored, and a warning will be presented on the console where the
|
||
configuration front end was run:
|
||
_warning: ignoring type redefinition of 'SYMBOL' from 'hex' to 'string'_.
|
||
- Some characters may not get interpreted correctly when inside a string entry
|
||
depending on how they are used - inside a C file, inside a Makefile, passed
|
||
through a Makefile to a C file, or something else. It may be necessary to
|
||
escape the characters at times. Because this is very dependent upon how the
|
||
symbol is actually used, a definitive guide cannot be given here.
|
||
- 'string' type variables do NOT need a default, and will default to the
|
||
value “”.
|
||
|
||
|
||
##### Restrictions:
|
||
- This keyword must be within a symbol definition block, started by the 'config'
|
||
keyword.
|
||
|
||
--------------------------------------------------------------------------------
|
||
|
||
|
||
|
||
|
||
## Keywords not used in coreboot at the time of writing:
|
||
|
||
- allnoconfig_y:
|
||
- defconfig_list
|
||
- def_tristate
|
||
- env
|
||
- ---help---
|
||
- menuconfig
|
||
- modules
|
||
- optional
|
||
- option
|
||
- tristate
|
||
- visible if
|
||
|
||
|
||
## Build files generated by Kconfig
|
||
|
||
### build/config.h
|
||
|
||
The config.h file is a very basic header file made up of a list of #define
|
||
statements:
|
||
|
||
#define SYMBOL NAME XXX
|
||
|
||
|
||
##### Symbol types:
|
||
- bool, int, and hex types - Every symbol of one of these types created in the
|
||
Kconfig tree is defined. It doesn’t matter whether they’re in an if/endif
|
||
block, or have a ‘depends on’ statement - they ALL end up being defined in
|
||
this file.
|
||
- String - Only string types that actually have a value associated with them
|
||
are defined.
|
||
|
||
The config.h file uses 0 and 1 to represent Kconfig's 'n' and 'y' values
|
||
respectively. String values are placed inside double quotes.
|
||
|
||
The name of the file is controlled by the $KCONFIG_AUTOHEADER environment
|
||
variable, which is set to $(obj)/config.h by the coreboot makefiles.
|
||
|
||
The prefix used for the symbols is controlled by the $CONFIG_ environment
|
||
variable. This is not set in coreboot, which uses the default CONFIG_ prefix
|
||
for all of its symbols.
|
||
|
||
The coreboot makefile forces the config.h file to be included into all coreboot
|
||
C files. This is done in Makefile.inc on the compiler command line using the
|
||
“-include $(obj)/config.h” command line option.
|
||
|
||
Example of various symbol types in the config.h file:
|
||
|
||
#define CONFIG_BOOTBLOCK_SOURCE "bootblock_simple.c" # String
|
||
#define CONFIG_CBFS_SIZE 0x00300000 # Hex
|
||
#define CONFIG_TTYS0_BAUD 115200 # Int
|
||
#define CONFIG_HAVE_ACPI_TABLES 1 # Bool enabled
|
||
#define CONFIG_EXPERT 0 # Bool disabled
|
||
#define CONFIG_NORTHBRIDGE_INTEL_I440LX 0 # Bool excluded
|
||
|
||
|
||
### .config
|
||
|
||
The .config file in the root directory is used as the input file, but also by
|
||
the makefiles to set variable values. The main difference is that it does not
|
||
contain all of the symbols. It excludes symbols defined in an if/endif block
|
||
whose expression evaluated as false. Note that the symbol
|
||
CONFIG_NORTHBRIDGE_INTEL_I440LX shown in the config.h example above is not
|
||
present in the .config file.
|
||
|
||
In addition, the .config file below contains the 'comment' prompt text from the
|
||
Kconfig, separating the blocks.
|
||
|
||
## General setup ##
|
||
CONFIG_BOOTBLOCK_SOURCE="bootblock_simple.c" # String
|
||
CONFIG_CBFS_SIZE=0x00300000 # Hex
|
||
CONFIG_TTYS0_BAUD=115200 # Int
|
||
CONFIG_HAVE_ACPI_TABLES=y # Bool enabled
|
||
# CONFIG_EXPERT is not set # Bool disabled
|
||
|
||
This file is included directly by the makefile, and sets the CONFIG symbols so
|
||
that they are available during the build process.
|
||
|
||
|
||
### build/auto.conf
|
||
|
||
Although the controlling variable for the auto.conf filename,
|
||
KCONFIG_AUTOCONFIG, is set in the coreboot makefiles, the auto.conf file itself
|
||
is not used by coreboot. This file has the same syntax and structure as the
|
||
.config file, but contains all symbols in the Kconfig tree, including those that
|
||
are not enabled, or are excluded by if/endif blocks, or the 'depends on'
|
||
keyword. The kconfig tool could be updated to not generate this file, but since
|
||
it's not hurting anything, it's still being generated.
|
||
|
||
|
||
|
||
## Defconfig or Miniconfig files
|
||
|
||
Miniconfig files are the standard .config files with all of the symbols which
|
||
are set to their default values stripped out. These files are very useful for
|
||
debugging your config, as well as being the best way to store your .config file.
|
||
If you store your config as a full config file, it will be much harder to
|
||
maintain. Any Kconfig symbols with updated default values will retain their old
|
||
values, and any symbols which have been removed will still remain in the file.
|
||
Storing full config files just generally leads to a lot more maintenance than
|
||
storing miniconfig files.
|
||
|
||
The easiest way to generate the miniconfig file is by running
|
||
|
||
make savedefconfig DOTCONFIG=.config DEFCONFIG=[output file]
|
||
|
||
DEFCONFIG defaults to ‘defconfig’, DOTCONFIG defaults to ‘.config’.
|
||
|
||
|
||
To turn the miniconfig back into a full config file, use one of the two targets:
|
||
|
||
make olddefconfig DOTCONFIG=[input/output file]
|
||
|
||
or
|
||
|
||
make defconfig KBUILD_DEFCONFIG=[input file] DOTCONFIG=[output file]
|
||
|
||
In both of these cases, DOTCONFIG defaults to .config.
|
||
|
||
|
||
|
||
## Editing and updating saved .config files
|
||
|
||
|
||
### Don’t save full config files
|
||
|
||
Save miniconfig files, as mentioned in the previous section.
|
||
|
||
|
||
### Disable values with ‘# CONFIG_SYMBOL is not set’
|
||
|
||
A common mistake when trying to disable a value is to edit the .config file and
|
||
change it from ‘CONFIG_SYMBOL=y’ to ‘CONFIG_SYMBOL=n’, but this doesn’t
|
||
correctly disable the symbol. If the default value for the symbol is ‘n’ to
|
||
begin with, this isn’t an issue - the symbol just gets ignored, and the default
|
||
value is used. The problem is where the default for the symbol is ‘y’. When
|
||
the bad entry in the .config file gets ignored, the value is set back to ‘y’,
|
||
leading to much frustration.
|
||
|
||
Always disable the Kconfig symbols in the .config file with the syntax:
|
||
|
||
# CONFIG_SYMBOL is not set
|
||
|
||
### Only the LAST instance of a symbol is used
|
||
|
||
When reading a saved .config file, Kconfig uses the LAST instance of a symbol
|
||
that it comes across, and ignores any previous instances. This can be used to
|
||
override symbols in a saved .config file by appending the new value to a config
|
||
file.
|
||
|
||
For example:
|
||
|
||
A .config file that contains these two lines:
|
||
|
||
# CONFIG_BOOLTEST is not set
|
||
CONFIG_BOOLTEST=y
|
||
|
||
After running ‘make olddefconfig’, ends up with the value:
|
||
|
||
CONFIG_BOOLTEST=y
|
||
|
||
A case where this can be used is by a making a script to create two versions of
|
||
a coreboot rom for a single platform. The first ROM could be built with serial
|
||
console disabled, and the second ROM, built as a debug version, could have
|
||
serial console enabled by overriding the "CONFIG_CONSOLE_SERIAL" symbol, and
|
||
setting it to enabled.
|
||
|
||
## General Kconfig Tips and Notes
|
||
|
||
### Default values for config options
|
||
|
||
The FIRST valid default that the Kconfig parser comes across will be used for
|
||
each symbol. This means that the organization of the tree is very important.
|
||
The structure should go from most specific at the top of the Kconfig tree to the
|
||
most general later in the tree. In coreboot, the mainboard directories get
|
||
loaded first, as they are sourced very early in the src/Kconfig file. Chipset
|
||
Kconfig files get sourced later, and the architecture specific Kconfig files get
|
||
sourced even later. This allows the mainboards to set their defaults early,
|
||
overriding the default values set in chipset or architecture.
|
||
|
||
Due to this mechanism, a default defined early cannot be changed by a default
|
||
set in a later Kconfig file. There are ways around this, involving 'depends on'
|
||
statements, but they add additional variables which are generally just used
|
||
internal to Kconfig.
|
||
|
||
|
||
### Select statement usage
|
||
|
||
The 'select' keyword forces the value of a symbol with a bool type to 'y'. It
|
||
overrides any dependencies of the symbol, so using it carelessly can lead to
|
||
unpredictable results.
|
||
|
||
|
||
|
||
### All bool, int, and hex Kconfig symbols are ALWAYS defined in the C code
|
||
|
||
All bool, int, and hex Kconfig symbols are ALWAYS defined in the C code if they
|
||
are in a sourced Kconfig - do NOT use #ifdef CONFIG_SYMBOL
|
||
|
||
String symbols are the exception. All others (int, hex, etc.) are always
|
||
defined in config.h. Never use an #ifdef statement for a Kconfig symbol other
|
||
than strings in C to determine whether the symbol is enabled or disabled. So
|
||
long as the symbol is in ANY sourced Kconfig file, it will be defined. Even if
|
||
the symbol is only inside of an if/endif block where the if expression evaluates
|
||
as false, the symbol STILL gets defined in the config.h file (though not in the
|
||
.config file).
|
||
|
||
Use \#if IS_ENABLED(CONFIG_*) to be sure (it returns false for undefined symbols
|
||
and defined-to-0 symbols alike).
|
||
|
||
|
||
|
||
### Symbols with prompts use defaults *ONLY* when initially created or enabled.
|
||
|
||
Symbols with a prompt which may be user-modified are NOT updated to default
|
||
values when changing between platforms or modifying other symbols. There are
|
||
only two times the default values are used:
|
||
1. When a config is initially created.
|
||
2. When a dependency which had previously kept the symbol from being active
|
||
changes to allowing it to be active.
|
||
|
||
Because of this, starting with a saved .config for one platform and updating it
|
||
for another platform can lead to very different results than creating a platform
|
||
from scratch.
|
||
|
||
|
||
|
||
### Symbols with no prompt will be the default value (unless 'select' is used).
|
||
|
||
Symbols that do not have a prompt will always use the first valid default value
|
||
specified in Kconfig. They cannot be updated, even if they are modified in a
|
||
saved .config file. As always, a 'select' statement overrides any specified
|
||
'default' or 'depends on' statement.
|
||
|
||
|
||
## Differences between coreboot's Kconfig and other Kconfig implementations.
|
||
|
||
- coreboot has added the glob operator '*' for the 'source' keyword.
|
||
- coreboot’s Kconfig always defines variables except for strings. In other
|
||
Kconfig implementations, bools set to false/0/no are not defined.
|
||
- IS_ENABLED() is ‘false’ for undefined variables and ‘0’ variables. In Linux
|
||
(where the macro comes from) it’s ‘true’ as soon as the variable is defined.
|
||
- coreboot’s version of Kconfig adds the KCONFIG_STRICT environment variable to
|
||
error out if there are any issues in the Kconfig files. In the Linux kernel,
|
||
Kconfig will generate a warning, but will still output an updated .config or
|
||
config.h file.
|
||
|
||
|
||
## Kconfig Editor Highlighting
|
||
|
||
#### vim:
|
||
|
||
vim has syntax highlighting for Kconfig built in (or at least as a part of
|
||
vim-common), but most editors do not.
|
||
|
||
|
||
#### ultraedit:
|
||
|
||
https://github.com/martinlroth/wordfiles/blob/master/kconfig.uew
|
||
|
||
|
||
|
||
#### atom:
|
||
|
||
https://github.com/martinlroth/language-kconfig
|
||
|
||
|
||
## Syntax Checking:
|
||
|
||
The Kconfig utility does some basic syntax checking on the Kconfig tree.
|
||
Running "make silentoldconfig" will show any errors that the Kconfig utility
|
||
sees.
|
||
|
||
### util/kconfig_lint
|
||
|
||
Because the Kconfig utility is relatively forgiving, and ignores issues that a
|
||
developer might be interested in, kconfig_lint, another Kconfig checker has been
|
||
written.
|
||
|
||
The file kconfig_lint and its associated readme can be found in the coreboot
|
||
utils/lint directory. It is useful for parsing the Kconfig tree, and for
|
||
showing warnings, errors, and notes about coreboot’s Kconfig files.
|
||
|
||
|
||
kconfig_lint <options>
|
||
-o|--output=file Set output filename
|
||
-p|--print Print full output
|
||
-e|--errors_off Don't print warnings or errors
|
||
-w|--warnings_off Don't print warnings
|
||
-n|--notes Show minor notes
|
||
--path=dir Path to top level kconfig
|
||
-c|--config=file Filename of config file to load
|
||
-G|--no_git_grep Use standard grep tools instead of git grep
|
||
|
||
|
||
The -p option is very useful for debugging Kconfig issues, because it reads all
|
||
of the Kconfig files in the order that the Kconfig tools would read them, and
|
||
prints it out, along with where each line came from and which menu it appears
|
||
in.
|
||
|
||
## License:
|
||
This work is licensed under the Creative Commons Attribution 4.0 International
|
||
License. To view a copy of this license, visit
|
||
https://creativecommons.org/licenses/by/4.0/ or send a letter to Creative
|
||
Commons, PO Box 1866, Mountain View, CA 94042, USA.
|
||
|
||
Code examples snippets are licensed under GPLv2, and are used here under fair
|
||
use laws.
|