aboutsummaryrefslogtreecommitdiffstats
path: root/Documentation/driver-api/firmware
diff options
context:
space:
mode:
authorLuis R. Rodriguez <mcgrof@kernel.org>2016-12-16 06:10:36 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-01-11 03:42:59 -0500
commit113ccc38378b6f0b24c0993040c6044e35163a51 (patch)
tree2a1fbd9a1ad5144dc316834ccf52505a84191cb3 /Documentation/driver-api/firmware
parent880444e214cfd293a2e8cc4bd3505f7ffa6ce33a (diff)
firmware: revamp firmware documentation
Understanding this code is getting out of control without any notes. Give the firmware_class driver a much needed documentation love, and while at it convert it to the new sphinx documentation format. v2: typos and small fixes Signed-off-by: Luis R. Rodriguez <mcgrof@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'Documentation/driver-api/firmware')
-rw-r--r--Documentation/driver-api/firmware/built-in-fw.rst38
-rw-r--r--Documentation/driver-api/firmware/core.rst16
-rw-r--r--Documentation/driver-api/firmware/direct-fs-lookup.rst30
-rw-r--r--Documentation/driver-api/firmware/fallback-mechanisms.rst195
-rw-r--r--Documentation/driver-api/firmware/firmware_cache.rst51
-rw-r--r--Documentation/driver-api/firmware/fw_search_path.rst26
-rw-r--r--Documentation/driver-api/firmware/index.rst16
-rw-r--r--Documentation/driver-api/firmware/introduction.rst27
-rw-r--r--Documentation/driver-api/firmware/lookup-order.rst18
-rw-r--r--Documentation/driver-api/firmware/request_firmware.rst56
10 files changed, 473 insertions, 0 deletions
diff --git a/Documentation/driver-api/firmware/built-in-fw.rst b/Documentation/driver-api/firmware/built-in-fw.rst
new file mode 100644
index 000000000000..7300e66857f8
--- /dev/null
+++ b/Documentation/driver-api/firmware/built-in-fw.rst
@@ -0,0 +1,38 @@
1=================
2Built-in firmware
3=================
4
5Firmware can be built-in to the kernel, this means building the firmware
6into vmlinux directly, to enable avoiding having to look for firmware from
7the filesystem. Instead, firmware can be looked for inside the kernel
8directly. You can enable built-in firmware using the kernel configuration
9options:
10
11 * CONFIG_EXTRA_FIRMWARE
12 * CONFIG_EXTRA_FIRMWARE_DIR
13
14This should not be confused with CONFIG_FIRMWARE_IN_KERNEL, this is for drivers
15which enables firmware to be built as part of the kernel build process. This
16option, CONFIG_FIRMWARE_IN_KERNEL, will build all firmware for all drivers
17enabled which ship its firmware inside the Linux kernel source tree.
18
19There are a few reasons why you might want to consider building your firmware
20into the kernel with CONFIG_EXTRA_FIRMWARE though:
21
22* Speed
23* Firmware is needed for accessing the boot device, and the user doesn't
24 want to stuff the firmware into the boot initramfs.
25
26Even if you have these needs there are a few reasons why you may not be
27able to make use of built-in firmware:
28
29* Legalese - firmware is non-GPL compatible
30* Some firmware may be optional
31* Firmware upgrades are possible, therefore a new firmware would implicate
32 a complete kernel rebuild.
33* Some firmware files may be really large in size. The remote-proc subsystem
34 is an example subsystem which deals with these sorts of firmware
35* The firmware may need to be scraped out from some device specific location
36 dynamically, an example is calibration data for for some WiFi chipsets. This
37 calibration data can be unique per sold device.
38
diff --git a/Documentation/driver-api/firmware/core.rst b/Documentation/driver-api/firmware/core.rst
new file mode 100644
index 000000000000..1d1688cbc078
--- /dev/null
+++ b/Documentation/driver-api/firmware/core.rst
@@ -0,0 +1,16 @@
1==========================
2Firmware API core features
3==========================
4
5The firmware API has a rich set of core features available. This section
6documents these features.
7
8.. toctree::
9
10 fw_search_path
11 built-in-fw
12 firmware_cache
13 direct-fs-lookup
14 fallback-mechanisms
15 lookup-order
16
diff --git a/Documentation/driver-api/firmware/direct-fs-lookup.rst b/Documentation/driver-api/firmware/direct-fs-lookup.rst
new file mode 100644
index 000000000000..82b4d585a213
--- /dev/null
+++ b/Documentation/driver-api/firmware/direct-fs-lookup.rst
@@ -0,0 +1,30 @@
1========================
2Direct filesystem lookup
3========================
4
5Direct filesystem lookup is the most common form of firmware lookup performed
6by the kernel. The kernel looks for the firmware directly on the root
7filesystem in the paths documented in the section 'Firmware search paths'.
8The filesystem lookup is implemented in fw_get_filesystem_firmware(), it
9uses common core kernel file loader facility kernel_read_file_from_path().
10The max path allowed is PATH_MAX -- currently this is 4096 characters.
11
12It is recommended you keep /lib/firmware paths on your root filesystem,
13avoid having a separate partition for them in order to avoid possible
14races with lookups and avoid uses of the custom fallback mechanisms
15documented below.
16
17Firmware and initramfs
18----------------------
19
20Drivers which are built-in to the kernel should have the firmware integrated
21also as part of the initramfs used to boot the kernel given that otherwise
22a race is possible with loading the driver and the real rootfs not yet being
23available. Stuffing the firmware into initramfs resolves this race issue,
24however note that using initrd does not suffice to address the same race.
25
26There are circumstances that justify not wanting to include firmware into
27initramfs, such as dealing with large firmware firmware files for the
28remote-proc subsystem. For such cases using a userspace fallback mechanism
29is currently the only viable solution as only userspace can know for sure
30when the real rootfs is ready and mounted.
diff --git a/Documentation/driver-api/firmware/fallback-mechanisms.rst b/Documentation/driver-api/firmware/fallback-mechanisms.rst
new file mode 100644
index 000000000000..d19354794e67
--- /dev/null
+++ b/Documentation/driver-api/firmware/fallback-mechanisms.rst
@@ -0,0 +1,195 @@
1===================
2Fallback mechanisms
3===================
4
5A fallback mechanism is supported to allow to overcome failures to do a direct
6filesystem lookup on the root filesystem or when the firmware simply cannot be
7installed for practical reasons on the root filesystem. The kernel
8configuration options related to supporting the firmware fallback mechanism are:
9
10 * CONFIG_FW_LOADER_USER_HELPER: enables building the firmware fallback
11 mechanism. Most distributions enable this option today. If enabled but
12 CONFIG_FW_LOADER_USER_HELPER_FALLBACK is disabled, only the custom fallback
13 mechanism is available and for the request_firmware_nowait() call.
14 * CONFIG_FW_LOADER_USER_HELPER_FALLBACK: force enables each request to
15 enable the kobject uevent fallback mechanism on all firmware API calls
16 except request_firmware_direct(). Most distributions disable this option
17 today. The call request_firmware_nowait() allows for one alternative
18 fallback mechanism: if this kconfig option is enabled and your second
19 argument to request_firmware_nowait(), uevent, is set to false you are
20 informing the kernel that you have a custom fallback mechanism and it will
21 manually load the firmware. Read below for more details.
22
23Note that this means when having this configuration:
24
25CONFIG_FW_LOADER_USER_HELPER=y
26CONFIG_FW_LOADER_USER_HELPER_FALLBACK=n
27
28the kobject uevent fallback mechanism will never take effect even
29for request_firmware_nowait() when uevent is set to true.
30
31Justifying the firmware fallback mechanism
32==========================================
33
34Direct filesystem lookups may fail for a variety of reasons. Known reasons for
35this are worth itemizing and documenting as it justifies the need for the
36fallback mechanism:
37
38* Race against access with the root filesystem upon bootup.
39
40* Races upon resume from suspend. This is resolved by the firmware cache, but
41 the firmware cache is only supported if you use uevents, and its not
42 supported for request_firmware_into_buf().
43
44* Firmware is not accessible through typical means:
45 * It cannot be installed into the root filesystem
46 * The firmware provides very unique device specific data tailored for
47 the unit gathered with local information. An example is calibration
48 data for WiFi chipsets for mobile devices. This calibration data is
49 not common to all units, but tailored per unit. Such information may
50 be installed on a separate flash partition other than where the root
51 filesystem is provided.
52
53Types of fallback mechanisms
54============================
55
56There are really two fallback mechanisms available using one shared sysfs
57interface as a loading facility:
58
59* Kobject uevent fallback mechanism
60* Custom fallback mechanism
61
62First lets document the shared sysfs loading facility.
63
64Firmware sysfs loading facility
65===============================
66
67In order to help device drivers upload firmware using a fallback mechanism
68the firmware infrastructure creates a sysfs interface to enable userspace
69to load and indicate when firmware is ready. The sysfs directory is created
70via fw_create_instance(). This call creates a new struct device named after
71the firmware requested, and establishes it in the device hierarchy by
72associating the device used to make the request as the device's parent.
73The sysfs directory's file attributes are defined and controlled through
74the new device's class (firmare_class) and group (fw_dev_attr_groups).
75This is actually where the original firmware_class.c file name comes from,
76as originally the only firmware loading mechanism available was the
77mechanism we now use as a fallback mechanism.
78
79To load firmware using the sysfs interface we expose a loading indicator,
80and a file upload firmware into:
81
82 * /sys/$DEVPATH/loading
83 * /sys/$DEVPATH/data
84
85To upload firmware you will echo 1 onto the loading file to indicate
86you are loading firmware. You then cat the firmware into the data file,
87and you notify the kernel the firmware is ready by echo'ing 0 onto
88the loading file.
89
90The firmware device used to help load firmware using sysfs is only created if
91direct firmware loading fails and if the fallback mechanism is enabled for your
92firmware request, this is set up with fw_load_from_user_helper(). It is
93important to re-iterate that no device is created if a direct filesystem lookup
94succeeded.
95
96Using::
97
98 echo 1 > /sys/$DEVPATH/loading
99
100Will clean any previous partial load at once and make the firmware API
101return an error. When loading firmware the firmware_class grows a buffer
102for the firmware in PAGE_SIZE increments to hold the image as it comes in.
103
104firmware_data_read() and firmware_loading_show() are just provided for the
105test_firmware driver for testing, they are not called in normal use or
106expected to be used regularly by userspace.
107
108Firmware kobject uevent fallback mechanism
109==========================================
110
111Since a device is created for the sysfs interface to help load firmware as a
112fallback mechanism userspace can be informed of the addition of the device by
113relying on kobject uevents. The addition of the device into the device
114hierarchy means the fallback mechanism for firmware loading has been initiated.
115For details of implementation refer to _request_firmware_load(), in particular
116on the use of dev_set_uevent_suppress() and kobject_uevent().
117
118The kernel's kobject uevent mechanism is implemented in lib/kobject_uevent.c,
119it issues uevents to userspace. As a supplement to kobject uevents Linux
120distributions could also enable CONFIG_UEVENT_HELPER_PATH, which makes use of
121core kernel's usermode helper (UMH) functionality to call out to a userspace
122helper for kobject uevents. In practice though no standard distribution has
123ever used the CONFIG_UEVENT_HELPER_PATH. If CONFIG_UEVENT_HELPER_PATH is
124enabled this binary would be called each time kobject_uevent_env() gets called
125in the kernel for each kobject uevent triggered.
126
127Different implementations have been supported in userspace to take advantage of
128this fallback mechanism. When firmware loading was only possible using the
129sysfs mechanism the userspace component "hotplug" provided the functionality of
130monitoring for kobject events. Historically this was superseded be systemd's
131udev, however firmware loading support was removed from udev as of systemd
132commit be2ea723b1d0 ("udev: remove userspace firmware loading support")
133as of v217 on August, 2014. This means most Linux distributions today are
134not using or taking advantage of the firmware fallback mechanism provided
135by kobject uevents. This is specially exacerbated due to the fact that most
136distributions today disable CONFIG_FW_LOADER_USER_HELPER_FALLBACK.
137
138Refer to do_firmware_uevent() for details of the kobject event variables
139setup. Variables passwdd with a kobject add event:
140
141* FIRMWARE=firmware name
142* TIMEOUT=timeout value
143* ASYNC=whether or not the API request was asynchronous
144
145By default DEVPATH is set by the internal kernel kobject infrastructure.
146Below is an example simple kobject uevent script::
147
148 # Both $DEVPATH and $FIRMWARE are already provided in the environment.
149 MY_FW_DIR=/lib/firmware/
150 echo 1 > /sys/$DEVPATH/loading
151 cat $MY_FW_DIR/$FIRMWARE > /sys/$DEVPATH/data
152 echo 0 > /sys/$DEVPATH/loading
153
154Firmware custom fallback mechanism
155==================================
156
157Users of the request_firmware_nowait() call have yet another option available
158at their disposal: rely on the sysfs fallback mechanism but request that no
159kobject uevents be issued to userspace. The original logic behind this
160was that utilities other than udev might be required to lookup firmware
161in non-traditional paths -- paths outside of the listing documented in the
162section 'Direct filesystem lookup'. This option is not available to any of
163the other API calls as uevents are always forced for them.
164
165Since uevents are only meaningful if the fallback mechanism is enabled
166in your kernel it would seem odd to enable uevents with kernels that do not
167have the fallback mechanism enabled in their kernels. Unfortunately we also
168rely on the uevent flag which can be disabled by request_firmware_nowait() to
169also setup the firmware cache for firmware requests. As documented above,
170the firmware cache is only set up if uevent is enabled for an API call.
171Although this can disable the firmware cache for request_firmware_nowait()
172calls, users of this API should not use it for the purposes of disabling
173the cache as that was not the original purpose of the flag. Not setting
174the uevent flag means you want to opt-in for the firmware fallback mechanism
175but you want to suppress kobject uevents, as you have a custom solution which
176will monitor for your device addition into the device hierarchy somehow and
177load firmware for you through a custom path.
178
179Firmware fallback timeout
180=========================
181
182The firmware fallback mechanism has a timeout. If firmware is not loaded
183onto the sysfs interface by the timeout value an error is sent to the
184driver. By default the timeout is set to 60 seconds if uevents are
185desirable, otherwise MAX_JIFFY_OFFSET is used (max timeout possible).
186The logic behind using MAX_JIFFY_OFFSET for non-uevents is that a custom
187solution will have as much time as it needs to load firmware.
188
189You can customize the firmware timeout by echo'ing your desired timeout into
190the following file:
191
192* /sys/class/firmware/timeout
193
194If you echo 0 into it means MAX_JIFFY_OFFSET will be used. The data type
195for the timeout is an int.
diff --git a/Documentation/driver-api/firmware/firmware_cache.rst b/Documentation/driver-api/firmware/firmware_cache.rst
new file mode 100644
index 000000000000..2210e5bfb332
--- /dev/null
+++ b/Documentation/driver-api/firmware/firmware_cache.rst
@@ -0,0 +1,51 @@
1==============
2Firmware cache
3==============
4
5When Linux resumes from suspend some device drivers require firmware lookups to
6re-initialize devices. During resume there may be a period of time during which
7firmware lookups are not possible, during this short period of time firmware
8requests will fail. Time is of essence though, and delaying drivers to wait for
9the root filesystem for firmware delays user experience with device
10functionality. In order to support these requirements the firmware
11infrastructure implements a firmware cache for device drivers for most API
12calls, automatically behind the scenes.
13
14The firmware cache makes using certain firmware API calls safe during a device
15driver's suspend and resume callback. Users of these API calls needn't cache
16the firmware by themselves for dealing with firmware loss during system resume.
17
18The firmware cache works by requesting for firmware prior to suspend and
19caching it in memory. Upon resume device drivers using the firmware API will
20have access to the firmware immediately, without having to wait for the root
21filesystem to mount or dealing with possible race issues with lookups as the
22root filesystem mounts.
23
24Some implementation details about the firmware cache setup:
25
26* The firmware cache is setup by adding a devres entry for each device that
27 uses all synchronous call except :c:func:`request_firmware_into_buf`.
28
29* If an asynchronous call is used the firmware cache is only set up for a
30 device if if the second argument (uevent) to request_firmware_nowait() is
31 true. When uevent is true it requests that a kobject uevent be sent to
32 userspace for the firmware request. For details refer to the Fackback
33 mechanism documented below.
34
35* If the firmware cache is determined to be needed as per the above two
36 criteria the firmware cache is setup by adding a devres entry for the
37 device making the firmware request.
38
39* The firmware devres entry is maintained throughout the lifetime of the
40 device. This means that even if you release_firmware() the firmware cache
41 will still be used on resume from suspend.
42
43* The timeout for the fallback mechanism is temporarily reduced to 10 seconds
44 as the firmware cache is set up during suspend, the timeout is set back to
45 the old value you had configured after the cache is set up.
46
47* Upon suspend any pending non-uevent firmware requests are killed to avoid
48 stalling the kernel, this is done with kill_requests_without_uevent(). Kernel
49 calls requiring the non-uevent therefore need to implement their own firmware
50 cache mechanism but must not use the firmware API on suspend.
51
diff --git a/Documentation/driver-api/firmware/fw_search_path.rst b/Documentation/driver-api/firmware/fw_search_path.rst
new file mode 100644
index 000000000000..a360f1009fa3
--- /dev/null
+++ b/Documentation/driver-api/firmware/fw_search_path.rst
@@ -0,0 +1,26 @@
1=====================
2Firmware search paths
3=====================
4
5The following search paths are used to look for firmware on your
6root filesystem.
7
8* fw_path_para - module parameter - default is empty so this is ignored
9* /lib/firmware/updates/UTS_RELEASE/
10* /lib/firmware/updates/
11* /lib/firmware/UTS_RELEASE/
12* /lib/firmware/
13
14The module parameter ''path'' can be passed to the firmware_class module
15to activate the first optional custom fw_path_para. The custom path can
16only be up to 256 characters long. The kernel parameter passed would be:
17
18* 'firmware_class.path=$CUSTOMIZED_PATH'
19
20There is an alternative to customize the path at run time after bootup, you
21can use the file:
22
23* /sys/module/firmware_class/parameters/path
24
25You would echo into it your custom path and firmware requested will be
26searched for there first.
diff --git a/Documentation/driver-api/firmware/index.rst b/Documentation/driver-api/firmware/index.rst
new file mode 100644
index 000000000000..1abe01793031
--- /dev/null
+++ b/Documentation/driver-api/firmware/index.rst
@@ -0,0 +1,16 @@
1==================
2Linux Firmware API
3==================
4
5.. toctree::
6
7 introduction
8 core
9 request_firmware
10
11.. only:: subproject and html
12
13 Indices
14 =======
15
16 * :ref:`genindex`
diff --git a/Documentation/driver-api/firmware/introduction.rst b/Documentation/driver-api/firmware/introduction.rst
new file mode 100644
index 000000000000..211cb44eb972
--- /dev/null
+++ b/Documentation/driver-api/firmware/introduction.rst
@@ -0,0 +1,27 @@
1============
2Introduction
3============
4
5The firmware API enables kernel code to request files required
6for functionality from userspace, the uses vary:
7
8* Microcode for CPU errata
9* Device driver firmware, required to be loaded onto device
10 microcontrollers
11* Device driver information data (calibration data, EEPROM overrides),
12 some of which can be completely optional.
13
14Types of firmware requests
15==========================
16
17There are two types of calls:
18
19* Synchronous
20* Asynchronous
21
22Which one you use vary depending on your requirements, the rule of thumb
23however is you should strive to use the asynchronous APIs unless you also
24are already using asynchronous initialization mechanisms which will not
25stall or delay boot. Even if loading firmware does not take a lot of time
26processing firmware might, and this can still delay boot or initialization,
27as such mechanisms such as asynchronous probe can help supplement drivers.
diff --git a/Documentation/driver-api/firmware/lookup-order.rst b/Documentation/driver-api/firmware/lookup-order.rst
new file mode 100644
index 000000000000..88c81739683c
--- /dev/null
+++ b/Documentation/driver-api/firmware/lookup-order.rst
@@ -0,0 +1,18 @@
1=====================
2Firmware lookup order
3=====================
4
5Different functionality is available to enable firmware to be found.
6Below is chronological order of how firmware will be looked for once
7a driver issues a firmware API call.
8
9* The ''Built-in firmware'' is checked first, if the firmware is present we
10 return it immediately
11* The ''Firmware cache'' is looked at next. If the firmware is found we
12 return it immediately
13* The ''Direct filesystem lookup'' is performed next, if found we
14 return it immediately
15* If no firmware has been found and the fallback mechanism was enabled
16 the sysfs interface is created. After this either a kobject uevent
17 is issued or the custom firmware loading is relied upon for firmware
18 loading up to the timeout value.
diff --git a/Documentation/driver-api/firmware/request_firmware.rst b/Documentation/driver-api/firmware/request_firmware.rst
new file mode 100644
index 000000000000..cc0aea880824
--- /dev/null
+++ b/Documentation/driver-api/firmware/request_firmware.rst
@@ -0,0 +1,56 @@
1====================
2request_firmware API
3====================
4
5You would typically load firmware and then load it into your device somehow.
6The typical firmware work flow is reflected below::
7
8 if(request_firmware(&fw_entry, $FIRMWARE, device) == 0)
9 copy_fw_to_device(fw_entry->data, fw_entry->size);
10 release_firmware(fw_entry);
11
12Synchronous firmware requests
13=============================
14
15Synchronous firmware requests will wait until the firmware is found or until
16an error is returned.
17
18request_firmware
19----------------
20.. kernel-doc:: drivers/base/firmware_class.c
21 :functions: request_firmware
22
23request_firmware_direct
24-----------------------
25.. kernel-doc:: drivers/base/firmware_class.c
26 :functions: request_firmware_direct
27
28request_firmware_into_buf
29-------------------------
30.. kernel-doc:: drivers/base/firmware_class.c
31 :functions: request_firmware_into_buf
32
33Asynchronous firmware requests
34==============================
35
36Asynchronous firmware requests allow driver code to not have to wait
37until the firmware or an error is returned. Function callbacks are
38provided so that when the firmware or an error is found the driver is
39informed through the callback. request_firmware_nowait() cannot be called
40in atomic contexts.
41
42request_firmware_nowait
43-----------------------
44.. kernel-doc:: drivers/base/firmware_class.c
45 :functions: request_firmware_nowait
46
47request firmware API expected driver use
48========================================
49
50Once an API call returns you process the firmware and then release the
51firmware. For example if you used request_firmware() and it returns,
52the driver has the firmware image accessible in fw_entry->{data,size}.
53If something went wrong request_firmware() returns non-zero and fw_entry
54is set to NULL. Once your driver is done with processing the firmware it
55can call call release_firmware(fw_entry) to release the firmware image
56and any related resource.