From: Markus Trippelsdorf <markus@trippelsdorf.de>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Kyle McMartin <kyle@kernel.org>,
Andrew Morton <akpm@linux-foundation.org>,
Michal Marek <mmarek@suse.com>,
Masahiro Yamada <yamada.masahiro@socionext.com>,
David Woodhouse <dwmw2@infradead.org>,
linux-kernel@vger.kernel.org,
Greg KH <gregkh@linuxfoundation.org>
Subject: [PATCH] firmware: Restore support for built-in firmware
Date: Sat, 16 Sep 2017 11:01:16 +0200 [thread overview]
Message-ID: <20170916090116.GA1846@x4> (raw)
Commit 5620a0d1aac ("firmware: delete in-kernel firmware") removed the
entire firmware directory. Unfortunately it thereby also removed the
support for built-in firmware.
This restores the ability to build firmware directly into the kernel by
pruning the original Makefile to the necessary minimum. The default for
EXTRA_FIRMWARE_DIR is now the standard directory /lib/firmware/.
Fixes: 5620a0d1aac ("firmware: delete in-kernel firmware")
Signed-off-by: Markus Trippelsdorf <markus@trippelsdorf.de>
---
Makefile | 2 +-
drivers/base/Kconfig | 5 +----
firmware/.gitignore | 6 +++++
firmware/Makefile | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 71 insertions(+), 5 deletions(-)
create mode 100644 firmware/.gitignore
create mode 100644 firmware/Makefile
diff --git a/Makefile b/Makefile
index 7e2ca4971a39..9f86816c41fd 100644
--- a/Makefile
+++ b/Makefile
@@ -562,7 +562,7 @@ scripts: scripts_basic include/config/auto.conf include/config/tristate.conf \
# Objects we will link into vmlinux / subdirs we need to visit
init-y := init/
-drivers-y := drivers/ sound/
+drivers-y := drivers/ sound/ firmware/
net-y := net/
libs-y := lib/
core-y := usr/
diff --git a/drivers/base/Kconfig b/drivers/base/Kconfig
index f046d21de57d..1a5f6a157a57 100644
--- a/drivers/base/Kconfig
+++ b/drivers/base/Kconfig
@@ -140,13 +140,10 @@ config EXTRA_FIRMWARE
config EXTRA_FIRMWARE_DIR
string "Firmware blobs root directory"
depends on EXTRA_FIRMWARE != ""
- default "firmware"
+ default "/lib/firmware"
help
This option controls the directory in which the kernel build system
looks for the firmware files listed in the EXTRA_FIRMWARE option.
- The default is firmware/ in the kernel source tree, but by changing
- this option you can point it elsewhere, such as /lib/firmware/ or
- some other directory containing the firmware files.
config FW_LOADER_USER_HELPER
bool
diff --git a/firmware/.gitignore b/firmware/.gitignore
new file mode 100644
index 000000000000..d9c69017bc9a
--- /dev/null
+++ b/firmware/.gitignore
@@ -0,0 +1,6 @@
+*.gen.S
+*.fw
+*.bin
+*.csp
+*.dsp
+ihex2fw
diff --git a/firmware/Makefile b/firmware/Makefile
new file mode 100644
index 000000000000..fa0808853883
--- /dev/null
+++ b/firmware/Makefile
@@ -0,0 +1,63 @@
+#
+# kbuild file for firmware/
+#
+
+# Create $(fwabs) from $(CONFIG_EXTRA_FIRMWARE_DIR) -- if it doesn't have a
+# leading /, it's relative to $(srctree).
+fwdir := $(subst $(quote),,$(CONFIG_EXTRA_FIRMWARE_DIR))
+fwabs := $(addprefix $(srctree)/,$(filter-out /%,$(fwdir)))$(filter /%,$(fwdir))
+
+fw-external-y := $(subst $(quote),,$(CONFIG_EXTRA_FIRMWARE))
+
+quiet_cmd_fwbin = MK_FW $@
+ cmd_fwbin = FWNAME="$(patsubst firmware/%.gen.S,%,$@)"; \
+ FWSTR="$(subst /,_,$(subst .,_,$(subst -,_,$(patsubst \
+ firmware/%.gen.S,%,$@))))"; \
+ ASM_WORD=$(if $(CONFIG_64BIT),.quad,.long); \
+ ASM_ALIGN=$(if $(CONFIG_64BIT),3,2); \
+ PROGBITS=$(if $(CONFIG_ARM),%,@)progbits; \
+ echo "/* Generated by firmware/Makefile */" > $@;\
+ echo " .section .rodata" >>$@;\
+ echo " .p2align $${ASM_ALIGN}" >>$@;\
+ echo "_fw_$${FWSTR}_bin:" >>$@;\
+ echo " .incbin \"$(2)\"" >>$@;\
+ echo "_fw_end:" >>$@;\
+ echo " .section .rodata.str,\"aMS\",$${PROGBITS},1" >>$@;\
+ echo " .p2align $${ASM_ALIGN}" >>$@;\
+ echo "_fw_$${FWSTR}_name:" >>$@;\
+ echo " .string \"$$FWNAME\"" >>$@;\
+ echo " .section .builtin_fw,\"a\",$${PROGBITS}" >>$@;\
+ echo " .p2align $${ASM_ALIGN}" >>$@;\
+ echo " $${ASM_WORD} _fw_$${FWSTR}_name" >>$@;\
+ echo " $${ASM_WORD} _fw_$${FWSTR}_bin" >>$@;\
+ echo " $${ASM_WORD} _fw_end - _fw_$${FWSTR}_bin" >>$@;
+
+# One of these files will change, or come into existence, whenever
+# the configuration changes between 32-bit and 64-bit. The .S files
+# need to change when that happens.
+wordsize_deps := $(wildcard include/config/64bit.h include/config/32bit.h \
+ include/config/ppc32.h include/config/ppc64.h \
+ include/config/superh32.h include/config/superh64.h \
+ include/config/x86_32.h include/config/x86_64.h \
+ firmware/Makefile)
+
+$(patsubst %,$(obj)/%.gen.S, $(fw-external-y)): %: $(wordsize_deps) \
+ include/config/extra/firmware/dir.h
+ $(call cmd,fwbin,$(fwabs)/$(patsubst $(obj)/%.gen.S,%,$@))
+
+# The .o files depend on the binaries directly; the .S files don't.
+$(patsubst %,$(obj)/%.gen.o, $(fw-external-y)): $(obj)/%.gen.o: $(fwdir)/%
+
+obj-y += $(patsubst %,%.gen.o, $(fw-external-y))
+
+ifeq ($(KBUILD_SRC),)
+# Makefile.build only creates subdirectories for O= builds, but external
+# firmware might live outside the kernel source tree
+_dummy := $(foreach d,$(addprefix $(obj)/,$(dir $(fw-external-y))), $(shell [ -d $(d) ] || mkdir -p $(d)))
+endif
+
+targets := $(patsubst $(obj)/%,%, \
+ $(shell find $(obj) -name \*.gen.S 2>/dev/null))
+# Without this, built-in.o won't be created when it's empty, and the
+# final vmlinux link will fail.
+obj- := dummy
--
Markus
next reply other threads:[~2017-09-16 9:01 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-09-16 9:01 Markus Trippelsdorf [this message]
2017-09-16 16:57 ` [PATCH] firmware: Restore support for built-in firmware Greg KH
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=20170916090116.GA1846@x4 \
--to=markus@trippelsdorf.de \
--cc=akpm@linux-foundation.org \
--cc=dwmw2@infradead.org \
--cc=gregkh@linuxfoundation.org \
--cc=kyle@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mmarek@suse.com \
--cc=torvalds@linux-foundation.org \
--cc=yamada.masahiro@socionext.com \
/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.