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 management

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 residing
     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 function
     firmware_register(), and  unregistered  by  calling  firmware_unregister().
     These  functions  are  usually  (but  not	exclusively) 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  ar-
     gument,  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 mechanisms 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 func-
     tions:

     firmware_register() registers with the kernel an image of size datasize lo-
     cated 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 pend-
     ing references to the image, otherwise it does not unregister the image and
     returns EBUSY.

     firmware_get() and firmware_get_flags() return the requested  firmware  im-
     age.  The flags argument may be set to FIRMWARE_GET_NOWARN to indicate 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  func-
     tions  try to load it.  This involves the linker subsystem 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 argument
     may be set to FIRMWARE_UNLOAD to indicate that firmware_put is free to  re-
     claim resources associated with the firmware image if this is the last ref-
     erence.   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 im-
     ages 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 additional  mecha-
     nisms to bring these images into memory before calling firmware_register().

     When firmware_get() or firmware_get_flags() does not find the requested im-
     age, it tries to load it using one of the available loading mechanisms.  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	variable
     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 images.

BUILDING FIRMWARE LOADABLE MODULES
     A	firmware module is built by embedding the firmware image into a suitable
     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 writ-
     ing 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-sepa-
     rated tuples indicating the image_file's to be embedded in the module,  the
     imagename and version of each firmware image.

     If you need to embed firmware images into a system, you should write appro-
     priate  entries  in  the <files.arch> or <files> file, e.g. this example 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 commit-
     ted to the tree as provided by the vendor.

     Note that generating the firmware modules in this way requires  the  avail-
     ability  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.  Bi-
     nary 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  re-
     strictions:
     *	 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  mod-
	 ule.
     *	 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  registered
     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 image
	 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 matching
	 image is returned.
     *	 The kernel searches for a file named imagename in  the  firmware  image
	 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.  Currently, 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 ports 15.quarterly	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.1-RELEASE+and+Ports.quarterly>

home | help