|  | # SPDX-License-Identifier: GPL-2.0 | 
|  | menu "Firmware loader" | 
|  |  | 
|  | config FW_LOADER | 
|  | tristate "Firmware loading facility" if EXPERT | 
|  | default y | 
|  | help | 
|  | This enables the firmware loading facility in the kernel. The kernel | 
|  | will first look for built-in firmware, if it has any. Next, it will | 
|  | look for the requested firmware in a series of filesystem paths: | 
|  |  | 
|  | o firmware_class path module parameter or kernel boot param | 
|  | o /lib/firmware/updates/UTS_RELEASE | 
|  | o /lib/firmware/updates | 
|  | o /lib/firmware/UTS_RELEASE | 
|  | o /lib/firmware | 
|  |  | 
|  | Enabling this feature only increases your kernel image by about | 
|  | 828 bytes, enable this option unless you are certain you don't | 
|  | need firmware. | 
|  |  | 
|  | You typically want this built-in (=y) but you can also enable this | 
|  | as a module, in which case the firmware_class module will be built. | 
|  | You also want to be sure to enable this built-in if you are going to | 
|  | enable built-in firmware (CONFIG_EXTRA_FIRMWARE). | 
|  |  | 
|  | if FW_LOADER | 
|  |  | 
|  | config FW_LOADER_PAGED_BUF | 
|  | bool | 
|  |  | 
|  | config EXTRA_FIRMWARE | 
|  | string "Build named firmware blobs into the kernel binary" | 
|  | help | 
|  | Device drivers which require firmware can typically deal with | 
|  | having the kernel load firmware from the various supported | 
|  | /lib/firmware/ paths. This option enables you to build into the | 
|  | kernel firmware files. Built-in firmware searches are preceded | 
|  | over firmware lookups using your filesystem over the supported | 
|  | /lib/firmware paths documented on CONFIG_FW_LOADER. | 
|  |  | 
|  | This may be useful for testing or if the firmware is required early on | 
|  | in boot and cannot rely on the firmware being placed in an initrd or | 
|  | initramfs. | 
|  |  | 
|  | This option is a string and takes the (space-separated) names of the | 
|  | firmware files -- the same names that appear in MODULE_FIRMWARE() | 
|  | and request_firmware() in the source. These files should exist under | 
|  | the directory specified by the EXTRA_FIRMWARE_DIR option, which is | 
|  | /lib/firmware by default. | 
|  |  | 
|  | For example, you might set CONFIG_EXTRA_FIRMWARE="usb8388.bin", copy | 
|  | the usb8388.bin file into /lib/firmware, and build the kernel. Then | 
|  | any request_firmware("usb8388.bin") will be satisfied internally | 
|  | inside the kernel without ever looking at your filesystem at runtime. | 
|  |  | 
|  | WARNING: If you include additional firmware files into your binary | 
|  | kernel image that are not available under the terms of the GPL, | 
|  | then it may be a violation of the GPL to distribute the resulting | 
|  | image since it combines both GPL and non-GPL work. You should | 
|  | consult a lawyer of your own before distributing such an image. | 
|  |  | 
|  | config EXTRA_FIRMWARE_DIR | 
|  | string "Firmware blobs root directory" | 
|  | depends on EXTRA_FIRMWARE != "" | 
|  | default "/lib/firmware" | 
|  | help | 
|  | This option controls the directory in which the kernel build system | 
|  | looks for the firmware files listed in the EXTRA_FIRMWARE option. | 
|  |  | 
|  | config FW_LOADER_USER_HELPER | 
|  | bool "Enable the firmware sysfs fallback mechanism" | 
|  | select FW_LOADER_PAGED_BUF | 
|  | help | 
|  | This option enables a sysfs loading facility to enable firmware | 
|  | loading to the kernel through userspace as a fallback mechanism | 
|  | if and only if the kernel's direct filesystem lookup for the | 
|  | firmware failed using the different /lib/firmware/ paths, or the | 
|  | path specified in the firmware_class path module parameter, or the | 
|  | firmware_class path kernel boot parameter if the firmware_class is | 
|  | built-in. For details on how to work with the sysfs fallback mechanism | 
|  | refer to Documentation/driver-api/firmware/fallback-mechanisms.rst. | 
|  |  | 
|  | The direct filesystem lookup for firmware is always used first now. | 
|  |  | 
|  | If the kernel's direct filesystem lookup for firmware fails to find | 
|  | the requested firmware a sysfs fallback loading facility is made | 
|  | available and userspace is informed about this through uevents. | 
|  | The uevent can be suppressed if the driver explicitly requested it, | 
|  | this is known as the driver using the custom fallback mechanism. | 
|  | If the custom fallback mechanism is used userspace must always | 
|  | acknowledge failure to find firmware as the timeout for the fallback | 
|  | mechanism is disabled, and failed requests will linger forever. | 
|  |  | 
|  | This used to be the default firmware loading facility, and udev used | 
|  | to listen for uvents to load firmware for the kernel. The firmware | 
|  | loading facility functionality in udev has been removed, as such it | 
|  | can no longer be relied upon as a fallback mechanism. Linux no longer | 
|  | relies on or uses a fallback mechanism in userspace. If you need to | 
|  | rely on one refer to the permissively licensed firmwared: | 
|  |  | 
|  | https://github.com/teg/firmwared | 
|  |  | 
|  | Since this was the default firmware loading facility at one point, | 
|  | old userspace may exist which relies upon it, and as such this | 
|  | mechanism can never be removed from the kernel. | 
|  |  | 
|  | You should only enable this functionality if you are certain you | 
|  | require a fallback mechanism and have a userspace mechanism ready to | 
|  | load firmware in case it is not found. One main reason for this may | 
|  | be if you have drivers which require firmware built-in and for | 
|  | whatever reason cannot place the required firmware in initramfs. | 
|  | Another reason kernels may have this feature enabled is to support a | 
|  | driver which explicitly relies on this fallback mechanism. Only two | 
|  | drivers need this today: | 
|  |  | 
|  | o CONFIG_LEDS_LP55XX_COMMON | 
|  | o CONFIG_DELL_RBU | 
|  |  | 
|  | Outside of supporting the above drivers, another reason for needing | 
|  | this may be that your firmware resides outside of the paths the kernel | 
|  | looks for and cannot possibly be specified using the firmware_class | 
|  | path module parameter or kernel firmware_class path boot parameter | 
|  | if firmware_class is built-in. | 
|  |  | 
|  | A modern use case may be to temporarily mount a custom partition | 
|  | during provisioning which is only accessible to userspace, and then | 
|  | to use it to look for and fetch the required firmware. Such type of | 
|  | driver functionality may not even ever be desirable upstream by | 
|  | vendors, and as such is only required to be supported as an interface | 
|  | for provisioning. Since udev's firmware loading facility has been | 
|  | removed you can use firmwared or a fork of it to customize how you | 
|  | want to load firmware based on uevents issued. | 
|  |  | 
|  | Enabling this option will increase your kernel image size by about | 
|  | 13436 bytes. | 
|  |  | 
|  | If you are unsure about this, say N here, unless you are Linux | 
|  | distribution and need to support the above two drivers, or you are | 
|  | certain you need to support some really custom firmware loading | 
|  | facility in userspace. | 
|  |  | 
|  | config FW_LOADER_USER_HELPER_FALLBACK | 
|  | bool "Force the firmware sysfs fallback mechanism when possible" | 
|  | depends on FW_LOADER_USER_HELPER | 
|  | help | 
|  | Enabling this option forces a sysfs userspace fallback mechanism | 
|  | to be used for all firmware requests which explicitly do not disable a | 
|  | a fallback mechanism. Firmware calls which do prohibit a fallback | 
|  | mechanism is request_firmware_direct(). This option is kept for | 
|  | backward compatibility purposes given this precise mechanism can also | 
|  | be enabled by setting the proc sysctl value to true: | 
|  |  | 
|  | /proc/sys/kernel/firmware_config/force_sysfs_fallback | 
|  |  | 
|  | If you are unsure about this, say N here. | 
|  |  | 
|  | config FW_LOADER_COMPRESS | 
|  | bool "Enable compressed firmware support" | 
|  | select FW_LOADER_PAGED_BUF | 
|  | select XZ_DEC | 
|  | help | 
|  | This option enables the support for loading compressed firmware | 
|  | files. The caller of firmware API receives the decompressed file | 
|  | content. The compressed file is loaded as a fallback, only after | 
|  | loading the raw file failed at first. | 
|  |  | 
|  | Currently only XZ-compressed files are supported, and they have to | 
|  | be compressed with either none or crc32 integrity check type (pass | 
|  | "-C crc32" option to xz command). | 
|  |  | 
|  | config FW_CACHE | 
|  | bool "Enable firmware caching during suspend" | 
|  | depends on PM_SLEEP | 
|  | default y if PM_SLEEP | 
|  | help | 
|  | Because firmware caching generates uevent messages that are sent | 
|  | over a netlink socket, it can prevent suspend on many platforms. | 
|  | It is also not always useful, so on such platforms we have the | 
|  | option. | 
|  |  | 
|  | If unsure, say Y. | 
|  |  | 
|  | endif # FW_LOADER | 
|  | endmenu |