diff options
| author | Max Laier <mlaier@FreeBSD.org> | 2006-01-29 02:52:42 +0000 |
|---|---|---|
| committer | Max Laier <mlaier@FreeBSD.org> | 2006-01-29 02:52:42 +0000 |
| commit | 6aec1278dc6fd4790208608ee99bdc84dcf0b3da (patch) | |
| tree | 079b229b1f501b3c6590ffcfca8239fa263fc270 /share | |
| parent | 69e99c5d4c348234b9a40ff14d4586e44e74eb63 (diff) | |
Notes
Diffstat (limited to 'share')
| -rw-r--r-- | share/examples/kld/Makefile | 2 | ||||
| -rw-r--r-- | share/examples/kld/firmware/Makefile | 5 | ||||
| -rw-r--r-- | share/examples/kld/firmware/README | 18 | ||||
| -rw-r--r-- | share/examples/kld/firmware/fwconsumer/Makefile | 6 | ||||
| -rw-r--r-- | share/examples/kld/firmware/fwconsumer/fw_consumer.c | 78 | ||||
| -rw-r--r-- | share/examples/kld/firmware/fwimage/Makefile | 6 | ||||
| -rw-r--r-- | share/examples/kld/firmware/fwimage/firmware.img | bin | 0 -> 537 bytes | |||
| -rw-r--r-- | share/man/man9/Makefile | 1 | ||||
| -rw-r--r-- | share/man/man9/firmware.9 | 115 |
9 files changed, 230 insertions, 1 deletions
diff --git a/share/examples/kld/Makefile b/share/examples/kld/Makefile index 6c539bd50ac4..908f68e37aa9 100644 --- a/share/examples/kld/Makefile +++ b/share/examples/kld/Makefile @@ -67,6 +67,6 @@ # $FreeBSD$ # -SUBDIR= cdev syscall dyn_sysctl +SUBDIR= cdev dyn_sysctl firmware syscall .include <bsd.subdir.mk> diff --git a/share/examples/kld/firmware/Makefile b/share/examples/kld/firmware/Makefile new file mode 100644 index 000000000000..b4b733faae98 --- /dev/null +++ b/share/examples/kld/firmware/Makefile @@ -0,0 +1,5 @@ +# $FreeBSD$ + +SUBDIR= fwimage fwconsumer + +.include <bsd.subdir.mk> diff --git a/share/examples/kld/firmware/README b/share/examples/kld/firmware/README new file mode 100644 index 000000000000..075c5e5723b5 --- /dev/null +++ b/share/examples/kld/firmware/README @@ -0,0 +1,18 @@ +$FreeBSD$ + +This is a simple example of the firmware(9) system. It consists of two +parts: + +1) fwimage + This is the firmware image (the ascii art of beastie from the boot + menu). The Makefile lists the firmware file "firmware.img" and the + short handle for this firmware image "beastie". + Note that the module is called "beastie" as well so that it can be + loaded automatically if requested. + +2) fwconsumer + This module tries to get the a firmware image called "beastie", + checks if the data is '\0'-terminated and prints it to the console. + It keeps a reference to the firmware until it is unloaded. + +This is mainly to demonstrate how to construct firmware image modules. diff --git a/share/examples/kld/firmware/fwconsumer/Makefile b/share/examples/kld/firmware/fwconsumer/Makefile new file mode 100644 index 000000000000..1dea0c7eab69 --- /dev/null +++ b/share/examples/kld/firmware/fwconsumer/Makefile @@ -0,0 +1,6 @@ +# $FreeBSD$ + +KMOD= fw_consumer +SRCS= fw_consumer.c + +.include <bsd.kmod.mk> diff --git a/share/examples/kld/firmware/fwconsumer/fw_consumer.c b/share/examples/kld/firmware/fwconsumer/fw_consumer.c new file mode 100644 index 000000000000..97ab99aa0f7a --- /dev/null +++ b/share/examples/kld/firmware/fwconsumer/fw_consumer.c @@ -0,0 +1,78 @@ +/*- + * Copyright (c) 2006, Max Laier <mlaier@FreeBSD.org> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice unmodified, this list of conditions, and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include <sys/param.h> +#include <sys/kernel.h> +#include <sys/errno.h> +#include <sys/systm.h> +#include <sys/linker.h> +#include <sys/firmware.h> +#include <sys/proc.h> +#include <sys/module.h> + +static struct firmware *fp; + +static int +fw_consumer_modevent(module_t mod, int type, void *unused) +{ + switch (type) { + case MOD_LOAD: + fp = firmware_get("beastie"); + + if (fp == NULL) + return (ENOENT); + + if (((const char *)fp->data)[fp->datasize - 1] != '\0') { + firmware_put(fp, FIRMWARE_UNLOAD); + return (EINVAL); + } + printf("%s", (const char *)fp->data); + + return (0); + case MOD_UNLOAD: + printf("Bye!\n"); + + if (fp != NULL) { + printf("%s", (const char *)fp->data); + firmware_put(fp, FIRMWARE_UNLOAD); + } + + return (0); + } + return (EINVAL); +} + +static moduledata_t fw_consumer_mod = { + "fw_consumer", + fw_consumer_modevent, + 0 +}; +DECLARE_MODULE(fw_consumer, fw_consumer_mod, SI_SUB_DRIVERS, SI_ORDER_ANY); +MODULE_VERSION(fw_consumer, 1); +MODULE_DEPEND(fw_consumer, firmware, 1, 1, 1); diff --git a/share/examples/kld/firmware/fwimage/Makefile b/share/examples/kld/firmware/fwimage/Makefile new file mode 100644 index 000000000000..5c0ad7a8b49b --- /dev/null +++ b/share/examples/kld/firmware/fwimage/Makefile @@ -0,0 +1,6 @@ +# $FreeBSD$ + +KMOD= beastie +FIRMWS= firmware.img:beastie + +.include <bsd.kmod.mk> diff --git a/share/examples/kld/firmware/fwimage/firmware.img b/share/examples/kld/firmware/fwimage/firmware.img Binary files differnew file mode 100644 index 000000000000..afc3c23287e7 --- /dev/null +++ b/share/examples/kld/firmware/fwimage/firmware.img diff --git a/share/man/man9/Makefile b/share/man/man9/Makefile index bde16291dae0..63eb6fccf06e 100644 --- a/share/man/man9/Makefile +++ b/share/man/man9/Makefile @@ -94,6 +94,7 @@ MAN= accept_filter.9 \ EVENTHANDLER.9 \ extattr.9 \ fetch.9 \ + firmware.9 \ g_access.9 \ g_attach.9 \ g_bio.9 \ diff --git a/share/man/man9/firmware.9 b/share/man/man9/firmware.9 new file mode 100644 index 000000000000..900c07cee33f --- /dev/null +++ b/share/man/man9/firmware.9 @@ -0,0 +1,115 @@ +.\" Copyright (c) 2006 Max Laier <mlaier@FreeBSD.org> +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR +.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +.\" IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT, +.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd January 6, 2006 +.Os +.Dt FIRMWARE 9 +.Sh NAME +.Nm firmware_register , +.Nm firmware_unregister , +.Nm firmware_get , +.Nm firmware_put +.Nd firmware image loading and management +.Sh SYNOPSIS +.In sys/param.h +.In sys/linker.h +.In sys/firmware.h +.Bd -literal +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 */ + int refcnt; /* held references */ + struct firmware *parent; /* not null if a subimage */ + linker_file_t file; /* loadable module */ +}; +.Ed +.Ft struct firmware * +.Fo firmware_register +.Fa "const char *imagename" +.Fa "const void *data" +.Fa "size_t datasize" +.Fa "unsigned int version" +.Fa "struct firmware *parent" +.Fc +.Ft int +.Fn firmware_unregister "const char *imagename" +.Ft struct firmware * +.Fn firmware_get "const char *imagename" +.Ft void +.Fn firmware_put "struct firmware *fp" "int flags" +.Sh DESCRIPTION +The firmware abstraction provides a convenient interface for loading firmware +images into the kernel. +Specially crafted kernel modules are used to hold the firmware images. +.Pp +The function +.Fn firmware_register +is used on load of such modules to register contained firmware images. +The arguments to +.Fn firmware_register +include a name that identifies the image for later requests to the firmware +system, a pointer to the actual image, the size of the image and an optional +parent image. +The parent image is used to keep track of references to a given module so that +it can be unloaded on last reference. +.Pp +The function +.Fn firmware_unregister +removes the firmware image identified by the name from the system if there +are no pending references or returns an error otherwise. +.Pp +The function +.Fn firmware_get +returns the requested firmware image. +If the image is not yet registered with the system +.Fn firmware_get +tries to load a module with the corresponding name. +This involves the linker subsystem and disk access which is why +.Fn firmware_get +must not be called with any locks (except for Giant). +On success +.Fn firmware_get +returns a pointer to the image description and increases the reference count +for this image. +.Pp +The function +.Fn firmware_put +is used to drop the reference to a firmware image. +The flags argument may be set to +.Dv FIRMWARE_UNLOAD +to indicate that the caller wishes to unload the corresponding module if the +image becomes unreferenced. +.Sh SEE ALSO +.Xr module 9 +.Pp +.Pa /usr/share/examples/kld +.Sh HISTORY +The firmware system was introduced in +.Fx 7.0 . +.Sh AUTHORS +This manual page was written by +.An Max Laier Aq mlaier@FreeBSD.org . |
