Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
FIRMWARE(9)		   Kernel Developer's Manual		   FIRMWARE(9)

NAME
       firmware_register,	   firmware_unregister,		 firmware_get,
       firmware_get_flags, firmware_put	-- firmware image loading and  manage-
       ment

SYNOPSIS
       #include	<sys/param.h>
       #include	<sys/systm.h>
       #include	<sys/linker.h>
       #include	<sys/firmware.h>

       struct firmware {
	       const char      *name;	       /* system-wide name */
	       const void      *data;	       /* location of image */
	       size_t	       datasize;       /* size of image	in bytes */
	       unsigned	int    version;	       /* version of the image */
       };

       const struct firmware *
       firmware_register(const char *imagename,		     const void	*data,
	   size_t datasize,				 unsigned int version,
	   const struct	firmware *parent);

       int
       firmware_unregister(const char *imagename);

       const struct firmware *
       firmware_get(const char *imagename);

       const struct firmware *
       firmware_get_flags(const	char *imagename, uint32_t flags);

       void
       firmware_put(const struct firmware *fp, int flags);

DESCRIPTION
       The  firmware  abstraction  provides a convenient interface for loading
       firmware	images into the	kernel,	and for	 accessing  such  images  from
       kernel components.

       A  firmware image (or image for brevity)	is an opaque block of data re-
       siding in kernel	memory.	 It is associated to a unique imagename	 which
       constitutes  a  search  key, and	to an integer version number, which is
       also an opaque piece of information for the firmware subsystem.

       An image	is registered with the firmware	subsystem by calling the func-
       tion    firmware_register(),    and     unregistered	by     calling
       firmware_unregister().	These  functions  are  usually (but not	exclu-
       sively) called by specially crafted kernel  modules  that  contain  the
       firmware	 image.	 The modules can be statically compiled	in the kernel,
       or loaded by /boot/loader, manually at runtime, or  on  demand  by  the
       firmware	subsystem.

       Firmware	 binary	files may also be loaded directly rather than embedded
       into kernel modules.

       Clients of the firmware subsystem can request access to a  given	 image
       by  calling the function	firmware_get() with the	imagename they want as
       an argument, or by calling firmware_get_flags() with the	imagename  and
       flags  they  want  as an	arguments.  If a matching image	is not already
       registered, the firmware	subsystem will try to load it using the	mecha-
       nisms   specified   below   (typically,	 a    kernel	module	  with
       firmware_register the same name as the image).

API DESCRIPTION
       The  kernel  firmware_register  firmware	 API  is made of the following
       functions:

       firmware_register() registers with the kernel an	image of size datasize
       located at address data,	under the name imagename.

       The function returns NULL on error (e.g.	because	an image with the same
       name already exists, or the image table is full),  or  a	 const	struct
       firmware	* pointer to the image requested.

       firmware_unregister()  tries to unregister the firmware image imagename
       from the	system.	 The function is successful and	returns	0 if there are
       no pending references to	the image, otherwise it	 does  not  unregister
       the image and returns EBUSY.

       firmware_get()  and  firmware_get_flags() return	the requested firmware
       image.  The flags argument may be set to	FIRMWARE_GET_NOWARN  to	 indi-
       cate that errors	on firmware load or registration should	only be	logged
       in  case	 of  booverbose.   If the image	is not yet registered with the
       system, the functions try to load it.  This involves the	linker subsys-
       tem and disk access, so firmware_get() or firmware_get_flags() must not
       be called with any locks	(except	for Giant).  Note  also	 that  if  the
       firmware	 image is loaded from a	filesystem it must already be mounted.
       In particular this means	that it	may be	necessary  to  defer  requests
       from  a	driver attach method unless it is known	the root filesystem is
       already mounted.

       On success, firmware_get() and firmware_get_flags() return a pointer to
       the image description and increase the reference	count for this	image.
       On failure, the functions return	NULL.

       firmware_put()  drops a reference to a firmware image.  The flags argu-
       ment may	be set to FIRMWARE_UNLOAD to  indicate	that  firmware_put  is
       free to reclaim resources associated with the firmware image if this is
       the  last reference.  By	default	a firmware image will be deferred to a
       taskqueue(9) thread so the call may be done while holding a  lock.   In
       certain cases, such as on driver	detach,	this cannot be allowed.

FIRMWARE LOADING VIA MODULES
       As  mentioned before, any component of the system can register firmware
       images at any time by simply calling firmware_register().

       This is typically done when a module containing	a  firmware  image  is
       given  control,	whether	 compiled in, or preloaded by /boot/loader, or
       manually	loaded with kldload(8).	 However, a system can implement addi-
       tional mechanisms to bring these	 images	 into  memory  before  calling
       firmware_register().

       When firmware_get() or firmware_get_flags() does	not find the requested
       image,  it  tries  to load it using one of the available	loading	mecha-
       nisms.  At the moment,  there  is  only	one,  namely  Loadable	kernel
       modules.

       A  firmware  image  named foo is	looked up by trying to load the	module
       named foo.ko, using the facilities described in kld(4).	In particular,
       images are looked up in the directories specified by the	 sysctl	 vari-
       able    kern.module_path	   which   on	most   systems	 defaults   to
       /boot/kernel;/boot/modules.

       Note that in case a module contains multiple images, the	caller	should
       first  request  a  firmware_get() or firmware_get_flags() for the first
       image contained in the module, followed by requests for the  other  im-
       ages.

BUILDING FIRMWARE LOADABLE MODULES
       A firmware module is built by embedding the firmware image into a suit-
       able  loadable kernel module that calls firmware_register() on loading,
       and firmware_unregister() on unloading.

       Various system scripts and makefiles let	you build a module  by	simply
       writing a Makefile with the following entries:

	       KMOD=   imagename
	       FIRMWS= image_file:imagename[:version]
	       .include	<bsd.kmod.mk>

       where  KMOD  is	the basename of	the module; FIRMWS is a	list of	colon-
       separated tuples	indicating the image_file's to be embedded in the mod-
       ule, the	imagename and version of each firmware image.

       If you need to embed firmware images into a system,  you	 should	 write
       appropriate  entries in the <files.arch>	or <files> file, e.g. this ex-
       ample is	from sys/conf/files

       iwn1000fw.c		       optional	iwn1000fw | iwnfw	       \
	       compile-with    "${AWK} -f $S/tools/fw_stub.awk iwn1000.fw:iwn1000fw -miwn1000fw	-c${.TARGET}" \
	       no-ctfconvert no-implicit-rule before-depend local	       \
	       clean	       "iwn1000fw.c"
       #
       # NB: ld	encodes	the path in the	binary symbols generated for the
       #     firmware image so link the	file to	the object directory to
       #     get known values for reference in the _fw.c file.
       #
       iwn1000fw.fwo		       optional	iwn1000fw | iwnfw	       \
	       dependency      "iwn1000.fw"				       \
	       compile-with    "${NORMAL_FWO}"				       \
	       no-implicit-rule						       \
	       clean	       "iwn1000fw.fwo"

       Firmware	was previously committed  to  the  source  tree	 as  uuencoded
       files,  but this	is no longer required; the binary firmware file	should
       be committed to the tree	as provided by the vendor.

       Note that generating the	firmware modules  in  this  way	 requires  the
       availability  of	the following tools: awk(1), make(1), the compiler and
       the linker.

LOADING	BINARY FIRMWARE	FILES
   Binary Firmware Format
       Binary firmware files can also be loaded, either	from /boot/loader,  or
       when  firmware_get  cannot  find	 the registered	firmware from a	kernel
       module.	Binary firmware	files are raw binary files that	the creator of
       the firmware made.  They	offer an easier	way to load firmware, but  one
       that  lacks  the	full flexibility and generality	of kernel modules with
       the following restrictions:
          Binary firmware files only hold one set of firmware.
          They	do not offer kernel module dependencies	 to  ensure  they  are
	   loaded automatically	by the boot loader.
          They	cannot be compiled into	the kernel.
          The	imagename  is identical	to the full path name used to load the
	   module.
          The version number is assumed to be zero.

   Loading from	/boot/loader
       Binary firmware files may be loaded either from the command  line  with
       "load  -t firmware /boot/firmware/filename" or using the	loader.conf(5)
       mechanism to load modules with a	type of	"firmware" For example

       wififw_load="YES"
       wififw_name="/boot/firmware/wifi2034_fw.bin"
       wififw_type="firmware"

   On demand loading from firmware_get
       If no kernel module with	an embedded firmware image named imagename  is
       loaded,	then imagename will be appended	to the module path (by default
       /boot/firmware/)	and if that file exists, it will be loaded and	regis-
       tered  using  firmware_register	using the full path to the filename as
       imagename.

   Searching for imagename
       firmware_get uses the following algorithm to find firmware images:
          If an existing firmware image is registered for imagename, that im-
	   age is returned.
          If imagename	matches	the trailing subpath  of  a  registered	 image
	   with	a full path, that image	is returned.
          The kernel linker searches for a kernel module named	imagename.  If
	   a  kernel module is found, it is loaded, and	the list of registered
	   firmware images is searched again.  If a match is found, the	match-
	   ing image is	returned.
          The kernel searches for a file named	imagename in the firmware  im-
	   age path (by	default	/boot/firmware/).  If that file	exists and can
	   be  read,  it  contents are registered as a firmware	image with the
	   full	path as	the imagename and that	firmware  is  returned.	  Cur-
	   rently,  there  is  an 8MB limit on the size	of the firmware	image.
	   This	  can	be    changed	 by    by    the    sysctl    variable
	   debug.max_firmware_size.

SEE ALSO
       kld(4), module(9)

       /boot/firmware

       /usr/share/examples/kld/firmware

HISTORY
       The  firmware  system  was  introduced in FreeBSD 6.1.  Binary firmware
       loading was introduced in FreeBSD 15.0.

AUTHORS
       This manual page	was written by Max Laier <mlaier@FreeBSD.org>.

FreeBSD	15.0		       January 25, 2024			   FIRMWARE(9)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=firmware&sektion=9&manpath=FreeBSD+15.0-RELEASE+and+Ports>

home | help