All of lore.kernel.org
 help / color / mirror / Atom feed
From: Rusty Russell <rusty@rustcorp.com.au>
To: David Woodhouse <dwmw2@infradead.org>
Cc: linux-kernel@vger.kernel.org, sam@ravnborg.org,
	alan@lxorguk.ukuu.org.uk, akpm@linux-foundation.org
Subject: Re: [PATCHv2 26/28] firmware: allow firmware files to be built into kernel image
Date: Fri, 30 May 2008 15:08:34 +1000	[thread overview]
Message-ID: <200805301508.34635.rusty@rustcorp.com.au> (raw)
In-Reply-To: <E1K0DOO-0007ES-DU@shinybook.infradead.org>

On Sunday 25 May 2008 20:23:56 David Woodhouse wrote:
> Some drivers have their own hacks to bypass the kernel's firmware loader
> and build their firmware into the kernel; this renders those unnecessary.
>
> Other drivers don't use the firmware loader at all, because they always
> want the firmware to be available. This allows them to start using the
> firmware loader.
>
> A third set of drivers already use the firmware loader, but can't be
> used without help from userspace, which sometimes requires an initrd.
> This allows them to work in a static kernel.
>
> Signed-off-by: David Woodhouse <dwmw2@infradead.org>
> ---
>  drivers/base/firmware_class.c     |   33 +++++++++++++++++++++++++++++++--
>  include/asm-generic/vmlinux.lds.h |    7 +++++++
>  include/linux/firmware.h          |   21 +++++++++++++++++++++
>  3 files changed, 59 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c
> index 264b3a2..c09f060 100644
> --- a/drivers/base/firmware_class.c
> +++ b/drivers/base/firmware_class.c
> @@ -49,6 +49,14 @@ struct firmware_priv {
>  	struct timer_list timeout;
>  };
>
> +#ifdef CONFIG_FW_LOADER
> +extern struct builtin_fw __start_builtin_fw[];
> +extern struct builtin_fw __end_builtin_fw[];
> +#else /* Module case. Avoid ifdefs later; it'll all optimise out */
> +static struct builtin_fw *__start_builtin_fw = NULL;
> +static struct builtin_fw *__end_builtin_fw = NULL;
> +#endif
> +
>  static void
>  fw_load_abort(struct firmware_priv *fw_priv)
>  {
> @@ -391,13 +399,12 @@ _request_firmware(const struct firmware **firmware_p,
> const char *name, struct device *f_dev;
>  	struct firmware_priv *fw_priv;
>  	struct firmware *firmware;
> +	struct builtin_fw *builtin;
>  	int retval;
>
>  	if (!firmware_p)
>  		return -EINVAL;
>
> -	printk(KERN_INFO "firmware: requesting %s\n", name);
> -
>  	*firmware_p = firmware = kzalloc(sizeof(*firmware), GFP_KERNEL);
>  	if (!firmware) {
>  		printk(KERN_ERR "%s: kmalloc(struct firmware) failed\n",
> @@ -406,6 +413,20 @@ _request_firmware(const struct firmware **firmware_p,
> const char *name, goto out;
>  	}
>
> +	for (builtin = __start_builtin_fw; builtin != __end_builtin_fw;
> +	     builtin++) {
> +		if (strcmp(name, builtin->name))
> +			continue;
> +		printk(KERN_INFO "firmware: using built-in firmware %s\n",
> +		       name);
> +		firmware->size = builtin->size;
> +		firmware->data = builtin->data;
> +		return 0;
> +	}
> +
> +	if (uevent)
> +		printk(KERN_INFO "firmware: requesting %s\n", name);
> +
>  	retval = fw_setup_device(firmware, &f_dev, name, device, uevent);
>  	if (retval)
>  		goto error_kfree_fw;
> @@ -473,8 +494,16 @@ request_firmware(const struct firmware **firmware_p,
> const char *name, void
>  release_firmware(const struct firmware *fw)
>  {
> +	struct builtin_fw *builtin;
> +
>  	if (fw) {
> +		for (builtin = __start_builtin_fw; builtin != __end_builtin_fw;
> +		     builtin++) {
> +			if (fw->data == builtin->data)
> +				goto free_fw;
> +		}
>  		vfree(fw->data);
> +	free_fw:
>  		kfree(fw);
>  	}
>  }
> diff --git a/include/asm-generic/vmlinux.lds.h
> b/include/asm-generic/vmlinux.lds.h index f054778..8d71a40 100644
> --- a/include/asm-generic/vmlinux.lds.h
> +++ b/include/asm-generic/vmlinux.lds.h
> @@ -86,6 +86,13 @@
>  		VMLINUX_SYMBOL(__end_pci_fixups_resume) = .;		\
>  	}								\
>  									\
> +	/* Built-in firmware blobs */					\
> +	.builtin_fw        : AT(ADDR(.builtin_fw) - LOAD_OFFSET) {	\
> +		VMLINUX_SYMBOL(__start_builtin_fw) = .;			\
> +		*(.builtin_fw)						\
> +		VMLINUX_SYMBOL(__end_builtin_fw) = .;			\
> +	}								\
> +									\
>  	/* RapidIO route ops */						\
>  	.rio_route        : AT(ADDR(.rio_route) - LOAD_OFFSET) {	\
>  		VMLINUX_SYMBOL(__start_rio_route_ops) = .;		\
> diff --git a/include/linux/firmware.h b/include/linux/firmware.h
> index 5e73f3f..279eaad 100644
> --- a/include/linux/firmware.h
> +++ b/include/linux/firmware.h
> @@ -1,7 +1,10 @@
>  #ifndef _LINUX_FIRMWARE_H
>  #define _LINUX_FIRMWARE_H
> +
>  #include <linux/module.h>
>  #include <linux/types.h>
> +#include <linux/compiler.h>
> +
>  #define FIRMWARE_NAME_MAX 30
>  #define FW_ACTION_NOHOTPLUG 0
>  #define FW_ACTION_HOTPLUG 1
> @@ -13,6 +16,24 @@ struct firmware {
>
>  struct device;
>
> +struct builtin_fw {
> +	char *name;
> +	void *data;
> +	unsigned long size;
> +};
> +
> +/* We have to play tricks here much like stringify() to get the
> +   __COUNTER__ macro to be expanded as we want it */
> +#define __fw_concat1(x,y) x##y
> +#define __fw_concat(x,y) __fw_concat1(x,y)

Hmm, linux/module.h does this too, perhaps some enthusiast can implement 
__concat() and use it everywhere.

Cheers,
Rusty.

  reply	other threads:[~2008-05-30  5:09 UTC|newest]

Thread overview: 72+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-05-25 10:23 [PATCHv2 00/28] Allow built-in firmware to be accessed by request_firmware() David Woodhouse
2008-05-25 10:23 ` [PATCHv2 01/28] libertas: treat firmware data as const David Woodhouse
2008-05-25 13:06   ` Alan Cox
2008-05-25 10:23 ` [PATCHv2 02/28] bluetooth: " David Woodhouse
2008-05-25 13:07   ` Alan Cox
2008-05-25 10:23 ` [PATCHv2 03/28] cyclades: " David Woodhouse
2008-05-25 13:07   ` Alan Cox
2008-05-25 10:23 ` [PATCHv2 04/28] cx25840: " David Woodhouse
2008-05-25 10:51   ` Hans Verkuil
2008-05-25 14:36     ` David Woodhouse
2008-05-25 14:56     ` David Woodhouse
2008-05-25 15:04       ` Hans Verkuil
2008-05-25 15:37       ` Mike Isely
2008-05-25 15:20     ` Mike Isely
2008-05-25 16:16       ` Tyler Trafford
2008-05-25 10:23 ` [PATCHv2 05/28] myri10ge: " David Woodhouse
2008-05-25 10:23 ` [PATCHv2 06/28] vx222: " David Woodhouse
2008-05-25 10:23 ` [PATCHv2 07/28] riptide: " David Woodhouse
2008-05-25 10:23 ` [PATCHv2 08/28] pcxhr: " David Woodhouse
2008-05-25 10:23 ` [PATCHv2 09/28] vx: " David Woodhouse
2008-05-25 10:23 ` [PATCHv2 10/28] ueagle-atm: " David Woodhouse
2008-05-25 10:23 ` [PATCHv2 11/28] cxacru: " David Woodhouse
2008-05-25 10:23 ` [PATCHv2 12/28] aic94xx: " David Woodhouse
2008-05-25 10:23 ` [PATCHv2 13/28] zd1201: " David Woodhouse
2008-05-25 10:23 ` [PATCHv2 14/28] rt2x00: " David Woodhouse
2008-05-25 10:23 ` [PATCHv2 15/28] p54: " David Woodhouse
2008-05-25 10:23 ` [PATCHv2 16/28] atmel: " David Woodhouse
2008-05-25 10:23 ` [PATCHv2 17/28] irda-usb: " David Woodhouse
2008-05-25 10:23 ` [PATCHv2 18/28] cxgb3: " David Woodhouse
2008-05-25 10:23 ` [PATCHv2 19/28] bt8xx: " David Woodhouse
2008-05-25 10:23 ` [PATCHv2 20/28] ttusb-dec: " David Woodhouse
2008-05-25 10:23 ` [PATCHv2 21/28] dvb frontends: " David Woodhouse
2008-05-25 10:23 ` [PATCHv2 22/28] cxusb: " David Woodhouse
2008-05-25 14:14   ` Michael Krufky
2008-05-25 14:27     ` David Woodhouse
2008-05-25 15:02     ` David Woodhouse
2008-05-25 10:23 ` [PATCHv2 23/28] gp8psk: " David Woodhouse
2008-05-25 10:23 ` [PATCHv2 24/28] tuners: " David Woodhouse
2008-05-25 10:23 ` [PATCHv2 25/28] firmware: make fw->data const David Woodhouse
2008-05-25 10:23 ` [PATCHv2 26/28] firmware: allow firmware files to be built into kernel image David Woodhouse
2008-05-30  5:08   ` Rusty Russell [this message]
2008-05-31  8:39     ` David Woodhouse
2008-05-25 10:23 ` [PATCHv2 27/28] firmware: Add CONFIG_BUILTIN_FIRMWARE option David Woodhouse
2008-05-25 17:00   ` [PATCHv3 " David Woodhouse
2008-05-26  8:58     ` David Woodhouse
2008-05-28 11:46       ` [PATCHv4 " David Woodhouse
2008-05-29  8:29         ` [PATCH 29/28] firmware: Add 'firmware_install' make target David Woodhouse
2008-05-25 10:23 ` [PATCHv2 28/28] firmware: convert korg1212 driver to use firmware loader exclusively David Woodhouse
2008-05-25 13:11   ` Alan Cox
2008-05-27 18:33     ` Yinghai Lu
2008-05-27 21:24       ` David Woodhouse
2008-05-29  9:09 ` [PATCHv2 #ERROR!/28] maestro3: treat firmware data as const David Woodhouse
2008-05-29 10:49   ` [PATCHv2 30/28] firmware: convert maestro3 driver to use firmware loader exclusively David Woodhouse
2008-05-29 12:21 ` [PATCH N/28] ymfpci: treat firmware data as const David Woodhouse
2008-05-29 12:23   ` [PATCH N/28] firmware: convert ymfpci driver to use firmware loader exclusively David Woodhouse
2008-05-29 13:47 ` [PATCH] smctr: use request_firmware() David Woodhouse
2008-05-29 19:30   ` maximilian attems
2008-05-29 21:02     ` David Woodhouse
2008-05-29 14:20 ` [PATCH] kaweth: " David Woodhouse
2008-05-30 13:55   ` Oliver Neukum
2008-05-30 15:16     ` David Woodhouse
2008-05-30 15:26       ` Marcel Holtmann
2008-05-30 15:48         ` Alan Cox
2008-05-30 21:02           ` Oliver Neukum
2008-05-31  0:00             ` Alexandre Oliva
2008-05-31  6:51           ` Marcel Holtmann
2008-05-31 12:35             ` Alan Cox
2008-05-29 17:49 ` [PATCH] ttusb-budget: " David Woodhouse
2008-06-13 19:23   ` Mauro Carvalho Chehab
2008-05-30 11:45 ` [PATCH] keyspan: " David Woodhouse
2008-05-30 13:54   ` Hugh Blemings
2008-05-30 12:19 ` [PATCH] keyspan_pda: " David Woodhouse

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200805301508.34635.rusty@rustcorp.com.au \
    --to=rusty@rustcorp.com.au \
    --cc=akpm@linux-foundation.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=dwmw2@infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=sam@ravnborg.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.