forked from spotify/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
firmware: Add CONFIG_EXTRA_FIRMWARE option
This allows arbitrary firmware files to be included in the static kernel where the firmware loader can find them without requiring userspace to be alive. (Updated and CONFIG_EXTRA_FIRMWARE_DIR added with lots of help from Johannes Berg). Signed-off-by: David Woodhouse <[email protected]> Signed-off-by: Johannes Berg <[email protected]>
- Loading branch information
Showing
3 changed files
with
128 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
# | ||
# 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 ",,$(CONFIG_EXTRA_FIRMWARE_DIR)) | ||
fwabs := $(addprefix $(srctree)/,$(filter-out /%,$(fwdir)))$(filter /%,$(fwdir)) | ||
|
||
fw-external-y := $(subst ",,$(CONFIG_EXTRA_FIRMWARE)) | ||
|
||
firmware-y := $(fw-external-y) $(fw-shipped-y) | ||
firmware-dirs := $(sort $(patsubst %,$(objtree)/$(obj)/%/,$(dir $(firmware-y) $(fw-shipped-)))) | ||
|
||
quiet_cmd_mkdir = MKDIR $(patsubst $(objtree)/%,%,$@) | ||
cmd_mkdir = mkdir -p $@ | ||
|
||
quiet_cmd_ihex = IHEX $@ | ||
cmd_ihex = $(OBJCOPY) -Iihex -Obinary $< $@ | ||
|
||
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) | ||
|
||
# Workaround for make < 3.81, where .SECONDEXPANSION doesn't work. | ||
# It'll end up depending on these targets, so make them a PHONY rule which | ||
# depends on _all_ the directories in $(firmware-dirs), and it'll work out OK. | ||
PHONY += $(objtree)/$$(%) $(objtree)/$(obj)/$$(%) | ||
$(objtree)/$$(%) $(objtree)/$(obj)/$$(%): $(firmware-dirs) | ||
@true | ||
|
||
# For the $$(dir %) trick, where we need % to be expanded first. | ||
.SECONDEXPANSION: | ||
|
||
$(patsubst %,$(obj)/%.gen.S, $(fw-shipped-y)): %: $(wordsize_deps) \ | ||
| $(objtree)/$$(dir %) | ||
$(call cmd,fwbin,$(patsubst %.gen.S,%,$@)) | ||
$(patsubst %,$(obj)/%.gen.S, $(fw-external-y)): %: $(wordsize_deps) \ | ||
include/config/builtin/firmware/dir.h | $(objtree)/$$(dir %) | ||
$(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-shipped-y)): %.gen.o: % | ||
$(patsubst %,$(obj)/%.gen.o, $(fw-external-y)): $(obj)/%.gen.o: $(fwdir)/% | ||
|
||
$(obj)/%: $(obj)/%.ihex | $(objtree)/$(obj)/$$(dir %) | ||
$(call cmd,ihex) | ||
|
||
$(firmware-dirs): | ||
$(call cmd,mkdir) | ||
|
||
obj-y := $(patsubst %,%.gen.o, $(firmware-y)) | ||
|
||
# Remove .S files and binaries created from ihex | ||
# (during 'make clean' .config isn't included so they're all in $(fw-shipped-)) | ||
targets := $(fw-shipped-) $(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-n := dummy |