diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2018-06-07 06:00:52 -0700 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2018-06-08 08:40:54 +0200 |
commit | 6b63e46e74705440ba3ebfa8cd2187f4d6a4f53f (patch) | |
tree | a31f54e99abffa3a6d20a2a52ca9241e3f5acac8 /firmware | |
parent | 711e3fbecea59b6e4383ad8a533bf9c1d06e33b3 (diff) | |
download | barebox-6b63e46e74705440ba3ebfa8cd2187f4d6a4f53f.tar.gz barebox-6b63e46e74705440ba3ebfa8cd2187f4d6a4f53f.tar.xz |
Add builtin firmware support
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
[andrew.smirnov@gmail.com: Add dummy.o in case directory is empty]
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/Kconfig | 7 | ||||
-rw-r--r-- | firmware/Makefile | 54 |
2 files changed, 61 insertions, 0 deletions
diff --git a/firmware/Kconfig b/firmware/Kconfig new file mode 100644 index 0000000000..e0cc7abefd --- /dev/null +++ b/firmware/Kconfig @@ -0,0 +1,7 @@ +menu "Firmware files" + +config EXTRA_FIRMWARE_DIR + string "Firmware blobs root directory" + default "firmware" + +endmenu diff --git a/firmware/Makefile b/firmware/Makefile new file mode 100644 index 0000000000..52984fd165 --- /dev/null +++ b/firmware/Makefile @@ -0,0 +1,54 @@ +# SPDX-License-Identifier: GPL-2.0 +# +# 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 := $(firmware-y) + +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.$${FWSTR}" >>$@;\ + echo " .p2align $${ASM_ALIGN}" >>$@;\ + echo ".global _fw_$${FWSTR}_start" >>$@;\ + echo "_fw_$${FWSTR}_start:" >>$@;\ + echo " .incbin \"$(2)\"" >>$@;\ + echo ".global _fw_$${FWSTR}_end" >>$@;\ + echo "_fw_$${FWSTR}_end:" >>$@; + +# 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) + +$(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-pbl-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)) + +# just to build a built-in.o. Otherwise compilation fails when no devicetree is +# created. +obj- += dummy.o |