summaryrefslogtreecommitdiffstats
path: root/Documentation/driver-api/firmware/built-in-fw.rst
blob: 7300e66857f8751331bdeab262205fe3f6ccc8de (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
=================
Built-in firmware
=================

Firmware can be built-in to the kernel, this means building the firmware
into vmlinux directly, to enable avoiding having to look for firmware from
the filesystem. Instead, firmware can be looked for inside the kernel
directly. You can enable built-in firmware using the kernel configuration
options:

  * CONFIG_EXTRA_FIRMWARE
  * CONFIG_EXTRA_FIRMWARE_DIR

This should not be confused with CONFIG_FIRMWARE_IN_KERNEL, this is for drivers
which enables firmware to be built as part of the kernel build process. This
option, CONFIG_FIRMWARE_IN_KERNEL, will build all firmware for all drivers
enabled which ship its firmware inside the Linux kernel source tree.

There are a few reasons why you might want to consider building your firmware
into the kernel with CONFIG_EXTRA_FIRMWARE though:

* Speed
* Firmware is needed for accessing the boot device, and the user doesn't
  want to stuff the firmware into the boot initramfs.

Even if you have these needs there are a few reasons why you may not be
able to make use of built-in firmware:

* Legalese - firmware is non-GPL compatible
* Some firmware may be optional
* Firmware upgrades are possible, therefore a new firmware would implicate
  a complete kernel rebuild.
* Some firmware files may be really large in size. The remote-proc subsystem
  is an example subsystem which deals with these sorts of firmware
* The firmware may need to be scraped out from some device specific location
  dynamically, an example is calibration data for for some WiFi chipsets. This
  calibration data can be unique per sold device.