xref: /freebsd/share/man/man9/firmware.9 (revision 2878d99dfcfbdd7a415a7f31cf95fbd53fc8e581)
16aec1278SMax Laier.\" Copyright (c) 2006 Max Laier <mlaier@FreeBSD.org>
26aec1278SMax Laier.\" All rights reserved.
36aec1278SMax Laier.\"
46aec1278SMax Laier.\" Redistribution and use in source and binary forms, with or without
56aec1278SMax Laier.\" modification, are permitted provided that the following conditions
66aec1278SMax Laier.\" are met:
76aec1278SMax Laier.\" 1. Redistributions of source code must retain the above copyright
86aec1278SMax Laier.\"    notice, this list of conditions and the following disclaimer.
96aec1278SMax Laier.\" 2. Redistributions in binary form must reproduce the above copyright
106aec1278SMax Laier.\"    notice, this list of conditions and the following disclaimer in the
116aec1278SMax Laier.\"    documentation and/or other materials provided with the distribution.
126aec1278SMax Laier.\"
136aec1278SMax Laier.\" THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR
146aec1278SMax Laier.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
156aec1278SMax Laier.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
166aec1278SMax Laier.\" IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT,
176aec1278SMax Laier.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
186aec1278SMax Laier.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
196aec1278SMax Laier.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
206aec1278SMax Laier.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
216aec1278SMax Laier.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
226aec1278SMax Laier.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
236aec1278SMax Laier.\"
249478c7f5SWarner Losh.Dd January 25, 2024
256aec1278SMax Laier.Dt FIRMWARE 9
26aa12cea2SUlrich Spörlein.Os
276aec1278SMax Laier.Sh NAME
286aec1278SMax Laier.Nm firmware_register ,
296aec1278SMax Laier.Nm firmware_unregister ,
306aec1278SMax Laier.Nm firmware_get ,
316f65b505SBjoern A. Zeeb.Nm firmware_get_flags ,
326aec1278SMax Laier.Nm firmware_put
336aec1278SMax Laier.Nd firmware image loading and management
346aec1278SMax Laier.Sh SYNOPSIS
356aec1278SMax Laier.In sys/param.h
36dad5bb64SMax Laier.In sys/systm.h
376aec1278SMax Laier.In sys/linker.h
386aec1278SMax Laier.In sys/firmware.h
396aec1278SMax Laier.Bd -literal
406aec1278SMax Laierstruct firmware {
416aec1278SMax Laier	const char	*name;		/* system-wide name */
426aec1278SMax Laier	const void	*data;		/* location of image */
436aec1278SMax Laier	size_t		datasize;	/* size of image in bytes */
446aec1278SMax Laier	unsigned int	version;	/* version of the image */
456aec1278SMax Laier};
466aec1278SMax Laier.Ed
47ddb53abcSLuigi Rizzo.Ft "const struct firmware *"
486aec1278SMax Laier.Fo firmware_register
496aec1278SMax Laier.Fa "const char *imagename"
506aec1278SMax Laier.Fa "const void *data"
516aec1278SMax Laier.Fa "size_t datasize"
526aec1278SMax Laier.Fa "unsigned int version"
53ddb53abcSLuigi Rizzo.Fa "const struct firmware *parent"
546aec1278SMax Laier.Fc
556aec1278SMax Laier.Ft int
566aec1278SMax Laier.Fn firmware_unregister "const char *imagename"
57ddb53abcSLuigi Rizzo.Ft "const struct firmware *"
586aec1278SMax Laier.Fn firmware_get "const char *imagename"
596f65b505SBjoern A. Zeeb.Ft "const struct firmware *"
606f65b505SBjoern A. Zeeb.Fn firmware_get_flags "const char *imagename" "uint32_t flags"
616aec1278SMax Laier.Ft void
62ddb53abcSLuigi Rizzo.Fn firmware_put "const struct firmware *fp" "int flags"
636aec1278SMax Laier.Sh DESCRIPTION
64bd84dd2fSRuslan ErmilovThe
65bd84dd2fSRuslan Ermilov.Nm firmware
6697070dd5SLuigi Rizzoabstraction provides a convenient interface for loading
6797070dd5SLuigi Rizzo.Nm firmware images
6897070dd5SLuigi Rizzointo the kernel, and for accessing such images from kernel components.
696aec1278SMax Laier.Pp
7097070dd5SLuigi RizzoA
7197070dd5SLuigi Rizzo.Nm firmware image
7297070dd5SLuigi Rizzo(or
7397070dd5SLuigi Rizzo.Nm image
7497070dd5SLuigi Rizzofor brevity)
7597070dd5SLuigi Rizzois an opaque block of data residing in kernel memory.
7697070dd5SLuigi RizzoIt is associated to a unique
7797070dd5SLuigi Rizzo.Nm imagename
7897070dd5SLuigi Rizzowhich constitutes a search key, and to an integer
7997070dd5SLuigi Rizzo.Nm version
8097070dd5SLuigi Rizzonumber, which is also an opaque piece of information for the
8197070dd5SLuigi Rizzofirmware subsystem.
8297070dd5SLuigi Rizzo.Pp
8397070dd5SLuigi RizzoAn image is registered with the
84bd84dd2fSRuslan Ermilov.Nm firmware
8597070dd5SLuigi Rizzosubsystem by calling the function
8697070dd5SLuigi Rizzo.Fn firmware_register ,
8797070dd5SLuigi Rizzoand unregistered by calling
8897070dd5SLuigi Rizzo.Fn firmware_unregister .
89ddb53abcSLuigi RizzoThese functions are usually (but not exclusively) called by
9097070dd5SLuigi Rizzospecially crafted kernel modules that contain the firmware image.
9197070dd5SLuigi RizzoThe modules can be statically compiled in the kernel, or loaded by
929478c7f5SWarner Losh.Pa /boot/loader ,
9397070dd5SLuigi Rizzomanually at runtime, or on demand by the firmware subsystem.
946aec1278SMax Laier.Pp
959478c7f5SWarner LoshFirmware binary files may also be loaded directly rather than embedded into
969478c7f5SWarner Loshkernel modules.
979478c7f5SWarner Losh.Pp
9897070dd5SLuigi Rizzo.Nm Clients
9997070dd5SLuigi Rizzoof the firmware subsystem can request access to a given image
10097070dd5SLuigi Rizzoby calling the function
10197070dd5SLuigi Rizzo.Fn firmware_get
10297070dd5SLuigi Rizzowith the
10397070dd5SLuigi Rizzo.Nm imagename
1046f65b505SBjoern A. Zeebthey want as an argument, or by calling
1056f65b505SBjoern A. Zeeb.Fn firmware_get_flags
1066f65b505SBjoern A. Zeebwith the
1076f65b505SBjoern A. Zeeb.Nm imagename
1086f65b505SBjoern A. Zeeband
1096f65b505SBjoern A. Zeeb.Nm flags
1106f65b505SBjoern A. Zeebthey want as an arguments.
1117851d429SEdward Tomasz NapieralaIf a matching image is not already registered,
11297070dd5SLuigi Rizzothe firmware subsystem will try to load it using the
11397070dd5SLuigi Rizzomechanisms specified below (typically, a kernel module
11497070dd5SLuigi Rizzowith
11573bbeaa5SGlen Barber.Nm
11673bbeaa5SGlen Barberthe same name
11797070dd5SLuigi Rizzoas the image).
11897070dd5SLuigi Rizzo.Sh API DESCRIPTION
11997070dd5SLuigi RizzoThe kernel
12073bbeaa5SGlen Barber.Nm
12173bbeaa5SGlen Barberfirmware API
12297070dd5SLuigi Rizzois made of the following functions:
12397070dd5SLuigi Rizzo.Pp
12497070dd5SLuigi Rizzo.Fn firmware_register
12597070dd5SLuigi Rizzoregisters with the kernel an image of size
12697070dd5SLuigi Rizzo.Nm datasize
12797070dd5SLuigi Rizzolocated at address
12897070dd5SLuigi Rizzo.Nm data ,
12997070dd5SLuigi Rizzounder the name
13097070dd5SLuigi Rizzo.Nm imagename .
13197070dd5SLuigi Rizzo.Pp
13297070dd5SLuigi RizzoThe function returns NULL on error (e.g. because an
13397070dd5SLuigi Rizzoimage with the same name already exists, or the image
13497070dd5SLuigi Rizzotable is full), or a
13597070dd5SLuigi Rizzo.Ft const struct firmware *
13697070dd5SLuigi Rizzopointer to the image requested.
13797070dd5SLuigi Rizzo.Pp
1386aec1278SMax Laier.Fn firmware_unregister
13997070dd5SLuigi Rizzotries to unregister the firmware image
14097070dd5SLuigi Rizzo.Nm imagename
1417851d429SEdward Tomasz Napieralafrom the system.
1427851d429SEdward Tomasz NapieralaThe function is successful and returns 0
14397070dd5SLuigi Rizzoif there are no pending references to the image, otherwise
14497070dd5SLuigi Rizzoit does not unregister the image and returns EBUSY.
1456aec1278SMax Laier.Pp
1466aec1278SMax Laier.Fn firmware_get
1476f65b505SBjoern A. Zeeband
1486f65b505SBjoern A. Zeeb.Fn firmware_get_flags
1496f65b505SBjoern A. Zeebreturn the requested firmware image.
1506f65b505SBjoern A. ZeebThe
1516f65b505SBjoern A. Zeeb.Fa flags
1526f65b505SBjoern A. Zeebargument may be set to
1536f65b505SBjoern A. Zeeb.Dv FIRMWARE_GET_NOWARN
1546f65b505SBjoern A. Zeebto indicate that errors on firmware load or registration should
1556f65b505SBjoern A. Zeebonly be logged in case of
1566f65b505SBjoern A. Zeeb.Nm booverbose .
157bd84dd2fSRuslan ErmilovIf the image is not yet registered with the system,
1586f65b505SBjoern A. Zeebthe functions try to load it.
15997070dd5SLuigi RizzoThis involves the linker subsystem and disk access, so
1606aec1278SMax Laier.Fn firmware_get
1616f65b505SBjoern A. Zeebor
1626f65b505SBjoern A. Zeeb.Fn firmware_get_flags
163bd84dd2fSRuslan Ermilovmust not be called with any locks (except for
164bd84dd2fSRuslan Ermilov.Va Giant ) .
1656e0186d5SSam LefflerNote also that if the firmware image is loaded from a filesystem
1666e0186d5SSam Lefflerit must already be mounted.
1676e0186d5SSam LefflerIn particular this means that it may be necessary to defer requests
1686e0186d5SSam Lefflerfrom a driver attach method unless it is known the root filesystem is
1696e0186d5SSam Leffleralready mounted.
17097070dd5SLuigi Rizzo.Pp
171bd84dd2fSRuslan ErmilovOn success,
1726aec1278SMax Laier.Fn firmware_get
1736f65b505SBjoern A. Zeeband
1746f65b505SBjoern A. Zeeb.Fn firmware_get_flags
1756f65b505SBjoern A. Zeebreturn a pointer to the image description and increase the reference count
1767851d429SEdward Tomasz Napieralafor this image.
1776f65b505SBjoern A. ZeebOn failure, the functions return NULL.
1786aec1278SMax Laier.Pp
1796aec1278SMax Laier.Fn firmware_put
18097070dd5SLuigi Rizzodrops a reference to a firmware image.
181bd84dd2fSRuslan ErmilovThe
182bd84dd2fSRuslan Ermilov.Fa flags
183bd84dd2fSRuslan Ermilovargument may be set to
1846aec1278SMax Laier.Dv FIRMWARE_UNLOAD
18597070dd5SLuigi Rizzoto indicate that
18697070dd5SLuigi Rizzofirmware_put is free to reclaim resources associated with
18797070dd5SLuigi Rizzothe firmware image if this is the last reference.
1886e0186d5SSam LefflerBy default a firmware image will be deferred to a
1896e0186d5SSam Leffler.Xr taskqueue 9
1906e0186d5SSam Lefflerthread so the call may be done while holding a lock.
1916e0186d5SSam LefflerIn certain cases, such as on driver detach, this cannot be allowed.
1929478c7f5SWarner Losh.Sh FIRMWARE LOADING VIA MODULES
19397070dd5SLuigi RizzoAs mentioned before, any component of the system can register
19497070dd5SLuigi Rizzofirmware images at any time by simply calling
19597070dd5SLuigi Rizzo.Fn firmware_register .
1966aec1278SMax Laier.Pp
19797070dd5SLuigi RizzoThis is typically done when a module containing
19897070dd5SLuigi Rizzoa firmware image is given control,
19997070dd5SLuigi Rizzowhether compiled in, or preloaded by
2009478c7f5SWarner Losh.Pa /boot/loader ,
20197070dd5SLuigi Rizzoor manually loaded with
20297070dd5SLuigi Rizzo.Xr kldload 8 .
20397070dd5SLuigi RizzoHowever, a system can implement additional mechanisms to bring
20497070dd5SLuigi Rizzothese images in memory before calling
20597070dd5SLuigi Rizzo.Fn firmware_register .
20697070dd5SLuigi Rizzo.Pp
20797070dd5SLuigi RizzoWhen
20897070dd5SLuigi Rizzo.Fn firmware_get
2096f65b505SBjoern A. Zeebor
2106f65b505SBjoern A. Zeeb.Fn firmware_get_flags
21197070dd5SLuigi Rizzodoes not find the requested image, it tries to load it using
21297070dd5SLuigi Rizzoone of the available loading mechanisms.
21397070dd5SLuigi RizzoAt the moment, there is only one, namely
2146f65b505SBjoern A. Zeeb.Nm Loadable kernel modules .
21597070dd5SLuigi Rizzo.Pp
21697070dd5SLuigi RizzoA firmware image named
21797070dd5SLuigi Rizzo.Nm foo
21897070dd5SLuigi Rizzois looked up by trying to load the module named
21997070dd5SLuigi Rizzo.Nm foo.ko ,
22097070dd5SLuigi Rizzousing the facilities described in
22197070dd5SLuigi Rizzo.Xr kld 4 .
22297070dd5SLuigi RizzoIn particular, images are looked up in the directories specified
22397070dd5SLuigi Rizzoby the sysctl variable
22497070dd5SLuigi Rizzo.Nm kern.module_path
22597070dd5SLuigi Rizzowhich on most systems defaults to
2269478c7f5SWarner Losh.Pa /boot/kernel;/boot/modules .
22797070dd5SLuigi Rizzo.Pp
22897070dd5SLuigi RizzoNote that in case a module contains multiple images,
22997070dd5SLuigi Rizzothe caller should first request a
23097070dd5SLuigi Rizzo.Fn firmware_get
2316f65b505SBjoern A. Zeebor
2326f65b505SBjoern A. Zeeb.Fn firmware_get_flags
23397070dd5SLuigi Rizzofor the first image contained in the module, followed by requests
23497070dd5SLuigi Rizzofor the other images.
23597070dd5SLuigi Rizzo.Sh BUILDING FIRMWARE LOADABLE MODULES
23697070dd5SLuigi RizzoA firmware module is built by embedding the
23797070dd5SLuigi Rizzo.Nm firmware image
23897070dd5SLuigi Rizzointo a suitable loadable kernel module that calls
23997070dd5SLuigi Rizzo.Fn firmware_register
24097070dd5SLuigi Rizzoon loading, and
24197070dd5SLuigi Rizzo.Fn firmware_unregister
24297070dd5SLuigi Rizzoon unloading.
24397070dd5SLuigi Rizzo.Pp
24497070dd5SLuigi RizzoVarious system scripts and makefiles let you build a module
24597070dd5SLuigi Rizzoby simply writing a Makefile with the following entries:
24697070dd5SLuigi Rizzo.Bd -literal
24797070dd5SLuigi Rizzo
24897070dd5SLuigi Rizzo        KMOD=   imagename
24997070dd5SLuigi Rizzo        FIRMWS= image_file:imagename[:version]
25097070dd5SLuigi Rizzo        .include <bsd.kmod.mk>
25197070dd5SLuigi Rizzo
25297070dd5SLuigi Rizzo.Ed
25397070dd5SLuigi Rizzowhere KMOD is the basename of the module; FIRMWS is a list of
25497070dd5SLuigi Rizzocolon-separated tuples indicating the image_file's to be embedded
25597070dd5SLuigi Rizzoin the module, the imagename and version of each firmware image.
25697070dd5SLuigi Rizzo.Pp
25797070dd5SLuigi RizzoIf you need to embed firmware images into a system, you should write
2585a1af07aSWarner Loshappropriate entries in the <files.arch> or <files> file, e.g. this example is
25997070dd5SLuigi Rizzofrom
2605a1af07aSWarner Losh.Nm sys/conf/files
26197070dd5SLuigi Rizzo.Bd -literal
2625a1af07aSWarner Loshiwn1000fw.c			optional iwn1000fw | iwnfw		\\
2635a1af07aSWarner Losh	compile-with	"${AWK} -f $S/tools/fw_stub.awk iwn1000.fw:iwn1000fw -miwn1000fw -c${.TARGET}" \\
2645a1af07aSWarner Losh	no-ctfconvert no-implicit-rule before-depend local		\\
2655a1af07aSWarner Losh	clean		"iwn1000fw.c"
26697070dd5SLuigi Rizzo#
26797070dd5SLuigi Rizzo# NB: ld encodes the path in the binary symbols generated for the
26897070dd5SLuigi Rizzo#     firmware image so link the file to the object directory to
26997070dd5SLuigi Rizzo#     get known values for reference in the _fw.c file.
27097070dd5SLuigi Rizzo#
2715a1af07aSWarner Loshiwn1000fw.fwo			optional iwn1000fw | iwnfw		\\
2725a1af07aSWarner Losh	dependency	"iwn1000.fw"					\\
2735a1af07aSWarner Losh	compile-with	"${NORMAL_FWO}"					\\
27497070dd5SLuigi Rizzo	no-implicit-rule						\\
2755a1af07aSWarner Losh	clean		"iwn1000fw.fwo"
27697070dd5SLuigi Rizzo.Ed
27797070dd5SLuigi Rizzo.Pp
27822ae5464SEd MasteFirmware was previously committed to the source tree as uuencoded files,
27922ae5464SEd Mastebut this is no longer required; the binary firmware file should be committed
28022ae5464SEd Masteto the tree as provided by the vendor.
28122ae5464SEd Maste.Pp
28297070dd5SLuigi RizzoNote that generating the firmware modules in this way requires
28397070dd5SLuigi Rizzothe availability of the following tools:
2842a6b4327SJohn-Mark Gurney.Xr awk 1 ,
2852a6b4327SJohn-Mark Gurney.Xr make 1 ,
28697070dd5SLuigi Rizzothe compiler and the linker.
2879478c7f5SWarner Losh.Sh LOADING BINARY FIRMWARE FILES
2889478c7f5SWarner Losh.Ss Binary Firmware Format
2899478c7f5SWarner LoshBinary firmware files can also be loaded, either from
2909478c7f5SWarner Losh.Pa /boot/loader ,
2919478c7f5SWarner Loshor when
2929478c7f5SWarner Losh.Nm firmware_get
2939478c7f5SWarner Loshcannot find the registered firmware from a kernel module.
2949478c7f5SWarner LoshBinary firmware files are raw binary files that the creator of the firmware
2959478c7f5SWarner Loshmade.
2969478c7f5SWarner LoshThey offer an easier way to load firmware, but one that lacks the full
2979478c7f5SWarner Loshflexibility and generality of kernel modules with the following restrictions:
2989478c7f5SWarner Losh.Bl -bullet -compact
2999478c7f5SWarner Losh.It
3009478c7f5SWarner LoshBinary firmware files only hold one set of firmware.
3019478c7f5SWarner Losh.It
3029478c7f5SWarner LoshThey do not offer kernel module dependencies to ensure they are loaded
3039478c7f5SWarner Loshautomatically by the boot loader.
3049478c7f5SWarner Losh.It
3059478c7f5SWarner LoshThey cannot be compiled into the kernel.
3069478c7f5SWarner Losh.It
3079478c7f5SWarner LoshThe
3089478c7f5SWarner Losh.Nm imagename
3099478c7f5SWarner Loshis identical to the full path name used to load the module.
3109478c7f5SWarner Losh.It
3119478c7f5SWarner LoshThe version number is assumed to be zero.
3129478c7f5SWarner Losh.El
3139478c7f5SWarner Losh.Ss Loading from Pa /boot/loader
3149478c7f5SWarner LoshBinary firmware files may be loaded either from the command line with
3159478c7f5SWarner Losh.Dq load -t firmware /boot/firmware/filename
3169478c7f5SWarner Loshor using the
3179478c7f5SWarner Losh.Xr loader.conf 5
3189478c7f5SWarner Loshmechanism to load modules with a type of
3199478c7f5SWarner Losh.Dq firmware
3209478c7f5SWarner LoshFor example
3219478c7f5SWarner Losh.Bd -literal
3229478c7f5SWarner Loshwififw_load="YES"
3239478c7f5SWarner Loshwififw_name="/boot/firmware/wifi2034_fw.bin"
3249478c7f5SWarner Loshwififw_type="firmware"
3259478c7f5SWarner Losh.Ed
3269478c7f5SWarner Losh.Ss On demand loading from Nm firmware_get
3279478c7f5SWarner LoshIf no kernel module with an embedded firmware image named
3289478c7f5SWarner Losh.Nm imagename
3299478c7f5SWarner Loshis loaded, then
3309478c7f5SWarner Losh.Nm imagename
3319478c7f5SWarner Loshwill be appended to the module path (by default
3329478c7f5SWarner Losh.Pa /boot/firmware/ )
3339478c7f5SWarner Loshand if that file exists, it will be loaded and registered using
3349478c7f5SWarner Losh.Nm firmware_register
3359478c7f5SWarner Loshusing the full path to the filename as
3369478c7f5SWarner Losh.Nm imagename .
3379478c7f5SWarner Losh.Ss Searching for imagename
3389478c7f5SWarner Losh.Nm firmware_get
3399478c7f5SWarner Loshuses the following algorithm to find firmware images:
3409478c7f5SWarner Losh.Bl -bullet -compact
3419478c7f5SWarner Losh.It
3429478c7f5SWarner LoshIf an existing firmware image is registered for
3439478c7f5SWarner Losh.Fa imagename,
344*2878d99dSGraham Percivalthat image is returned.
3459478c7f5SWarner Losh.It
3469478c7f5SWarner LoshIf
3479478c7f5SWarner Losh.Fa imagename
3489478c7f5SWarner Loshmatches the trailing subpath of a registered image with a full path, that image is returned.
3499478c7f5SWarner Losh.It
3509478c7f5SWarner Loshhe kernel linker searches for a kernel module named
3519478c7f5SWarner Losh.Fa imagename .
3529478c7f5SWarner LoshIf a kernel module is found, it is loaded, and
3539478c7f5SWarner Loshthe list of registered firmware images is searched again.
3549478c7f5SWarner LoshIf a match is found, the matching image is returned.
3559478c7f5SWarner Losh.It
3569478c7f5SWarner LoshThe kernel searches for a file named
3579478c7f5SWarner Losh.Fa imagename
3589478c7f5SWarner Loshin the firmware image path
3599478c7f5SWarner Losh(by default
3609478c7f5SWarner Losh.Pa /boot/firmware/ ) .
3619478c7f5SWarner LoshIf that file exists and can be read,
3629478c7f5SWarner Loshit contents are registered as a firmware image with the full path as the
3639478c7f5SWarner Losh.Nm imagename
3649478c7f5SWarner Loshand that firmware is returned.
3659478c7f5SWarner LoshCurrently, there is an 8MB limit on the size of the firmware image.
3669478c7f5SWarner LoshThis can be changed by by the sysctl variable
3679478c7f5SWarner Losh.Nm debug.max_firmware_size .
3689478c7f5SWarner Losh.El
36997070dd5SLuigi Rizzo.Sh SEE ALSO
370030c03b5SSergey Kandaurov.Xr kld 4 ,
371030c03b5SSergey Kandaurov.Xr module 9
37297070dd5SLuigi Rizzo.Pp
3739478c7f5SWarner Losh.Pa /boot/firmware
3749478c7f5SWarner Losh.Pp
37597070dd5SLuigi Rizzo.Pa /usr/share/examples/kld/firmware
3766aec1278SMax Laier.Sh HISTORY
377bd84dd2fSRuslan ErmilovThe
378bd84dd2fSRuslan Ermilov.Nm firmware
379bd84dd2fSRuslan Ermilovsystem was introduced in
380999b97c5SHiroki Sato.Fx 6.1 .
3819478c7f5SWarner LoshBinary firmware loading was introduced in
3829478c7f5SWarner Losh.Fx 15.0 .
3836aec1278SMax Laier.Sh AUTHORS
3846aec1278SMax LaierThis manual page was written by
3858a7314fcSBaptiste Daroussin.An Max Laier Aq Mt mlaier@FreeBSD.org .
386