]> git.proxmox.com Git - mirror_qemu.git/blob - docs/devel/kconfig.rst
Merge remote-tracking branch 'remotes/cschoenebeck/tags/pull-9p-20201106' into staging
[mirror_qemu.git] / docs / devel / kconfig.rst
1 .. _kconfig:
2
3 ================
4 QEMU and Kconfig
5 ================
6
7 QEMU is a very versatile emulator; it can be built for a variety of
8 targets, where each target can emulate various boards and at the same
9 time different targets can share large amounts of code. For example,
10 a POWER and an x86 board can run the same code to emulate a PCI network
11 card, even though the boards use different PCI host bridges, and they
12 can run the same code to emulate a SCSI disk while using different
13 SCSI adapters. Arm, s390 and x86 boards can all present a virtio-blk
14 disk to their guests, but with three different virtio guest interfaces.
15
16 Each QEMU target enables a subset of the boards, devices and buses that
17 are included in QEMU's source code. As a result, each QEMU executable
18 only links a small subset of the files that form QEMU's source code;
19 anything that is not needed to support a particular target is culled.
20
21 QEMU uses a simple domain-specific language to describe the dependencies
22 between components. This is useful for two reasons:
23
24 * new targets and boards can be added without knowing in detail the
25 architecture of the hardware emulation subsystems. Boards only have
26 to list the components they need, and the compiled executable will
27 include all the required dependencies and all the devices that the
28 user can add to that board;
29
30 * users can easily build reduced versions of QEMU that support only a subset
31 of boards or devices. For example, by default most targets will include
32 all emulated PCI devices that QEMU supports, but the build process is
33 configurable and it is easy to drop unnecessary (or otherwise unwanted)
34 code to make a leaner binary.
35
36 This domain-specific language is based on the Kconfig language that
37 originated in the Linux kernel, though it was heavily simplified and
38 the handling of dependencies is stricter in QEMU.
39
40 Unlike Linux, there is no user interface to edit the configuration, which
41 is instead specified in per-target files under the ``default-configs/``
42 directory of the QEMU source tree. This is because, unlike Linux,
43 configuration and dependencies can be treated as a black box when building
44 QEMU; the default configuration that QEMU ships with should be okay in
45 almost all cases.
46
47 The Kconfig language
48 --------------------
49
50 Kconfig defines configurable components in files named ``hw/*/Kconfig``.
51 Note that configurable components are _not_ visible in C code as preprocessor
52 symbols; they are only visible in the Makefile. Each configurable component
53 defines a Makefile variable whose name starts with ``CONFIG_``.
54
55 All elements have boolean (true/false) type; truth is written as ``y``, while
56 falsehood is written ``n``. They are defined in a Kconfig
57 stanza like the following::
58
59 config ARM_VIRT
60 bool
61 imply PCI_DEVICES
62 imply VFIO_AMD_XGBE
63 imply VFIO_XGMAC
64 select A15MPCORE
65 select ACPI
66 select ARM_SMMUV3
67
68 The ``config`` keyword introduces a new configuration element. In the example
69 above, Makefiles will have access to a variable named ``CONFIG_ARM_VIRT``,
70 with value ``y`` or ``n`` (respectively for boolean true and false).
71
72 Boolean expressions can be used within the language, whenever ``<expr>``
73 is written in the remainder of this section. The ``&&``, ``||`` and
74 ``!`` operators respectively denote conjunction (AND), disjunction (OR)
75 and negation (NOT).
76
77 The ``bool`` data type declaration is optional, but it is suggested to
78 include it for clarity and future-proofing. After ``bool`` the following
79 directives can be included:
80
81 **dependencies**: ``depends on <expr>``
82
83 This defines a dependency for this configurable element. Dependencies
84 evaluate an expression and force the value of the variable to false
85 if the expression is false.
86
87 **reverse dependencies**: ``select <symbol> [if <expr>]``
88
89 While ``depends on`` can force a symbol to false, reverse dependencies can
90 be used to force another symbol to true. In the following example,
91 ``CONFIG_BAZ`` will be true whenever ``CONFIG_FOO`` is true::
92
93 config FOO
94 select BAZ
95
96 The optional expression will prevent ``select`` from having any effect
97 unless it is true.
98
99 Note that unlike Linux's Kconfig implementation, QEMU will detect
100 contradictions between ``depends on`` and ``select`` statements and prevent
101 you from building such a configuration.
102
103 **default value**: ``default <value> [if <expr>]``
104
105 Default values are assigned to the config symbol if no other value was
106 set by the user via ``default-configs/*.mak`` files, and only if
107 ``select`` or ``depends on`` directives do not force the value to true
108 or false respectively. ``<value>`` can be ``y`` or ``n``; it cannot
109 be an arbitrary Boolean expression. However, a condition for applying
110 the default value can be added with ``if``.
111
112 A configuration element can have any number of default values (usually,
113 if more than one default is present, they will have different
114 conditions). If multiple default values satisfy their condition,
115 only the first defined one is active.
116
117 **reverse default** (weak reverse dependency): ``imply <symbol> [if <expr>]``
118
119 This is similar to ``select`` as it applies a lower limit of ``y``
120 to another symbol. However, the lower limit is only a default
121 and the "implied" symbol's value may still be set to ``n`` from a
122 ``default-configs/*.mak`` files. The following two examples are
123 equivalent::
124
125 config FOO
126 bool
127 imply BAZ
128
129 config BAZ
130 bool
131 default y if FOO
132
133 The next section explains where to use ``imply`` or ``default y``.
134
135 Guidelines for writing Kconfig files
136 ------------------------------------
137
138 Configurable elements in QEMU fall under five broad groups. Each group
139 declares its dependencies in different ways:
140
141 **subsystems**, of which **buses** are a special case
142
143 Example::
144
145 config SCSI
146 bool
147
148 Subsystems always default to false (they have no ``default`` directive)
149 and are never visible in ``default-configs/*.mak`` files. It's
150 up to other symbols to ``select`` whatever subsystems they require.
151
152 They sometimes have ``select`` directives to bring in other required
153 subsystems or buses. For example, ``AUX`` (the DisplayPort auxiliary
154 channel "bus") selects ``I2C`` because it can act as an I2C master too.
155
156 **devices**
157
158 Example::
159
160 config MEGASAS_SCSI_PCI
161 bool
162 default y if PCI_DEVICES
163 depends on PCI
164 select SCSI
165
166 Devices are the most complex of the five. They can have a variety
167 of directives that cooperate so that a default configuration includes
168 all the devices that can be accessed from QEMU.
169
170 Devices *depend on* the bus that they lie on, for example a PCI
171 device would specify ``depends on PCI``. An MMIO device will likely
172 have no ``depends on`` directive. Devices also *select* the buses
173 that the device provides, for example a SCSI adapter would specify
174 ``select SCSI``. Finally, devices are usually ``default y`` if and
175 only if they have at least one ``depends on``; the default could be
176 conditional on a device group.
177
178 Devices also select any optional subsystem that they use; for example
179 a video card might specify ``select EDID`` if it needs to build EDID
180 information and publish it to the guest.
181
182 **device groups**
183
184 Example::
185
186 config PCI_DEVICES
187 bool
188
189 Device groups provide a convenient mechanism to enable/disable many
190 devices in one go. This is useful when a set of devices is likely to
191 be enabled/disabled by several targets. Device groups usually need
192 no directive and are not used in the Makefile either; they only appear
193 as conditions for ``default y`` directives.
194
195 QEMU currently has two device groups, ``PCI_DEVICES`` and
196 ``TEST_DEVICES``. PCI devices usually have a ``default y if
197 PCI_DEVICES`` directive rather than just ``default y``. This lets
198 some boards (notably s390) easily support a subset of PCI devices,
199 for example only VFIO (passthrough) and virtio-pci devices.
200 ``TEST_DEVICES`` instead is used for devices that are rarely used on
201 production virtual machines, but provide useful hooks to test QEMU
202 or KVM.
203
204 **boards**
205
206 Example::
207
208 config SUN4M
209 bool
210 imply TCX
211 imply CG3
212 select CS4231
213 select ECCMEMCTL
214 select EMPTY_SLOT
215 select ESCC
216 select ESP
217 select FDC
218 select SLAVIO
219 select LANCE
220 select M48T59
221 select STP2000
222
223 Boards specify their constituent devices using ``imply`` and ``select``
224 directives. A device should be listed under ``select`` if the board
225 cannot be started at all without it. It should be listed under
226 ``imply`` if (depending on the QEMU command line) the board may or
227 may not be started without it. Boards also default to false; they are
228 enabled by the ``default-configs/*.mak`` for the target they apply to.
229
230 **internal elements**
231
232 Example::
233
234 config ECCMEMCTL
235 bool
236 select ECC
237
238 Internal elements group code that is useful in several boards or
239 devices. They are usually enabled with ``select`` and in turn select
240 other elements; they are never visible in ``default-configs/*.mak``
241 files, and often not even in the Makefile.
242
243 Writing and modifying default configurations
244 --------------------------------------------
245
246 In addition to the Kconfig files under hw/, each target also includes
247 a file called ``default-configs/TARGETNAME-softmmu.mak``. These files
248 initialize some Kconfig variables to non-default values and provide the
249 starting point to turn on devices and subsystems.
250
251 A file in ``default-configs/`` looks like the following example::
252
253 # Default configuration for alpha-softmmu
254
255 # Uncomment the following lines to disable these optional devices:
256 #
257 #CONFIG_PCI_DEVICES=n
258 #CONFIG_TEST_DEVICES=n
259
260 # Boards:
261 #
262 CONFIG_DP264=y
263
264 The first part, consisting of commented-out ``=n`` assignments, tells
265 the user which devices or device groups are implied by the boards.
266 The second part, consisting of ``=y`` assignments, tells the user which
267 boards are supported by the target. The user will typically modify
268 the default configuration by uncommenting lines in the first group,
269 or commenting out lines in the second group.
270
271 It is also possible to run QEMU's configure script with the
272 ``--without-default-devices`` option. When this is done, everything defaults
273 to ``n`` unless it is ``select``ed or explicitly switched on in the
274 ``.mak`` files. In other words, ``default`` and ``imply`` directives
275 are disabled. When QEMU is built with this option, the user will probably
276 want to change some lines in the first group, for example like this::
277
278 CONFIG_PCI_DEVICES=y
279 #CONFIG_TEST_DEVICES=n
280
281 and/or pick a subset of the devices in those device groups. Right now
282 there is no single place that lists all the optional devices for
283 ``CONFIG_PCI_DEVICES`` and ``CONFIG_TEST_DEVICES``. In the future,
284 we expect that ``.mak`` files will be automatically generated, so that
285 they will include all these symbols and some help text on what they do.
286
287 ``Kconfig.host``
288 ----------------
289
290 In some special cases, a configurable element depends on host features
291 that are detected by QEMU's configure script; for example some devices
292 depend on the availability of KVM or on the presence of a library on
293 the host.
294
295 These symbols should be listed in ``Kconfig.host`` like this::
296
297 config KVM
298 bool
299
300 and also listed as follows in the top-level Makefile's ``MINIKCONF_ARGS``
301 variable::
302
303 MINIKCONF_ARGS = \
304 $@ $*/config-devices.mak.d $< $(MINIKCONF_INPUTS) \
305 CONFIG_KVM=$(CONFIG_KVM) \
306 CONFIG_SPICE=$(CONFIG_SPICE) \
307 CONFIG_TPM=$(CONFIG_TPM) \
308 ...