mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: David Woodhouse <dwmw2@infradead.org>
To: linux-kernel@vger.kernel.org
Cc: aoliva@redhat.com, alan@lxorguk.ukuu.org.uk,
	Abhay Salunke <Abhay_Salunke@dell.com>,
	kay.sievers@vrfy.org, Haroldo Gamal <gamal@alternex.com.br>,
	Takashi Iwai <tiwai@suse.de>
Subject: [PATCH 1/3] firmware: allow firmware files to be built into kernel image
Date: Fri, 23 May 2008 14:44:42 +0100	[thread overview]
Message-ID: <1211550282.28967.8.camel@pmac.infradead.org> (raw)

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     |   22 ++++++++++++++++++++--
 include/asm-generic/vmlinux.lds.h |    7 +++++++
 include/linux/firmware.h          |   20 ++++++++++++++++++++
 3 files changed, 47 insertions(+), 2 deletions(-)

diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c
index 9fd4a85..55b9c80 100644
--- a/drivers/base/firmware_class.c
+++ b/drivers/base/firmware_class.c
@@ -49,6 +49,9 @@ struct firmware_priv {
 	struct timer_list timeout;
 };
 
+extern struct builtin_fw __start_builtin_fw[];
+extern struct builtin_fw __end_builtin_fw[];
+
 static void
 fw_load_abort(struct firmware_priv *fw_priv)
 {
@@ -391,13 +394,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 +408,22 @@ _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->data = vmalloc(builtin->size);
+		if (!firmware->data)
+			return -ENOMEM;
+		firmware->size = builtin->size;
+		memcpy(firmware->data, builtin->data, builtin->size);
+		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;
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 4d10c73..d014589 100644
--- a/include/linux/firmware.h
+++ b/include/linux/firmware.h
@@ -13,6 +13,26 @@ 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)
+
+#define DECLARE_BUILTIN_FIRMWARE(name, blob)				\
+	DECLARE_BUILTIN_FIRMWARE_SIZE(name, &(blob), sizeof(blob))
+
+
+#define DECLARE_BUILTIN_FIRMWARE_SIZE(name, blob, size)			     \
+	static const struct builtin_fw __fw_concat(__builtin_fw,__COUNTER__) \
+	__used __attribute__((__section__(".builtin_fw"))) =		     \
+	{ name, blob, size }
+
 #if defined(CONFIG_FW_LOADER) || defined(CONFIG_FW_LOADER_MODULE)
 int request_firmware(const struct firmware **fw, const char *name,
 		     struct device *device);
-- 
1.5.4.5


-- 
dwmw2
-- 
dwmw2


             reply	other threads:[~2008-05-23 13:48 UTC|newest]

Thread overview: 82+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-05-23 13:44 David Woodhouse [this message]
2008-05-23 13:46 ` [PATCH 2/3] firmware: Add CONFIG_BUILTIN_FIRMWARE option David Woodhouse
2008-05-23 13:50   ` [PATCH 2/3] firmware: convert korg1212 driver to use firmware loader exclusively David Woodhouse
2008-05-23 14:56     ` Takashi Iwai
2008-05-23 14:59       ` David Woodhouse
2008-05-23 16:41   ` [PATCH 2/3] firmware: Add CONFIG_BUILTIN_FIRMWARE option Sam Ravnborg
2008-05-23 17:13     ` David Woodhouse
2008-05-23 18:07     ` David Woodhouse
2008-05-23 18:11       ` Sam Ravnborg
2008-05-24 14:46     ` David Woodhouse
2008-05-24 15:22       ` Sam Ravnborg
2008-05-24 15:25         ` David Woodhouse
2008-05-24 15:34           ` David Woodhouse
2008-05-24 18:18             ` Marcel Holtmann
2008-05-24 19:23               ` David Woodhouse
2008-05-24 19:31                 ` Marcel Holtmann
2008-05-25  9:30               ` Johannes Berg
2008-05-25  9:49                 ` Michael Buesch
2008-05-25 11:54                   ` Marcel Holtmann
2008-05-25 12:14                     ` Michael Buesch
2008-05-25 13:16                       ` Alan Cox
2008-05-25 13:46                         ` David Woodhouse
2008-05-25 18:07                           ` Marcel Holtmann
2008-05-25 11:49                 ` Marcel Holtmann
2008-05-25 11:59                   ` Johannes Berg
2008-05-25 13:12                     ` Marcel Holtmann
2008-05-25 13:40                       ` Johannes Berg
2008-05-25 18:12                         ` Marcel Holtmann
2008-05-25 18:18                           ` Michael Buesch
2008-05-25 18:28                             ` Marcel Holtmann
2008-05-26  8:57                           ` Johannes Berg
2008-05-25 12:05                   ` Michael Buesch
2008-05-25 13:19                     ` Marcel Holtmann
2008-05-25 13:45                       ` Michael Buesch
2008-05-25 18:15                         ` Marcel Holtmann
2008-05-25 18:27                           ` Michael Buesch
2008-05-25 18:34                             ` Marcel Holtmann
2008-05-25 14:13                       ` Johannes Berg
2008-05-25 14:18                         ` David Woodhouse
2008-05-25 14:22                           ` Johannes Berg
2008-05-25 18:23                         ` Marcel Holtmann
2008-05-25 18:39                           ` Michael Buesch
2008-05-25 18:46                             ` Marcel Holtmann
2008-05-25 18:53                               ` Michael Buesch
2008-05-25 19:03                                 ` Marcel Holtmann
2008-05-25 19:21                                   ` Michael Buesch
2008-05-26  8:52                               ` Johannes Berg
2008-05-25 17:17                   ` Alexandre Oliva
2008-05-25 18:49                     ` Marcel Holtmann
2008-05-25 19:53                       ` Alan Cox
2008-05-26  3:30                       ` Alexandre Oliva
2008-05-25 18:49                     ` Michael Buesch
2008-05-25 19:01                       ` Marcel Holtmann
2008-05-25 19:09                         ` Michael Buesch
2008-05-26  3:13                       ` Alexandre Oliva
2008-05-26 12:53                         ` Michael Buesch
2008-05-26 13:08                           ` Johannes Berg
2008-05-26 17:09                           ` Alexandre Oliva
2008-05-26 17:11                             ` Michael Buesch
2008-05-23 14:53 ` [PATCH 1/3] firmware: allow firmware files to be built into kernel image Takashi Iwai
2008-05-23 14:58   ` David Woodhouse
2008-05-23 15:19     ` Takashi Iwai
2008-05-23 15:25       ` David Woodhouse
2008-05-23 15:33     ` Alan Cox
2008-05-23 17:21       ` David Woodhouse
2008-05-23 19:14       ` David Woodhouse
2008-05-23 19:42         ` David Woodhouse
2008-05-23 20:31           ` Alan Cox
2008-05-23 21:04             ` David Woodhouse
2008-05-23 23:28             ` David Woodhouse
2008-05-23 14:56 ` Alan Cox
2008-05-23 15:11   ` David Woodhouse
2008-05-23 15:00 ` Clemens Ladisch
2008-05-23 15:20   ` David Woodhouse
2008-05-23 15:32   ` Alan Cox
2008-05-23 16:21 ` Sam Ravnborg
2008-05-23 16:37   ` David Dillow
2008-05-23 16:38   ` Lennart Sorensen
2008-05-23 16:44     ` Sam Ravnborg
2008-05-23 16:53       ` Rene Herman
2008-05-23 17:06         ` David Woodhouse
2008-05-23 17:49   ` 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=1211550282.28967.8.camel@pmac.infradead.org \
    --to=dwmw2@infradead.org \
    --cc=Abhay_Salunke@dell.com \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=aoliva@redhat.com \
    --cc=gamal@alternex.com.br \
    --cc=kay.sievers@vrfy.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=tiwai@suse.de \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®