Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751330AbdIPGZG (ORCPT ); Sat, 16 Sep 2017 02:25:06 -0400 Received: from ud10.udmedia.de ([194.117.254.50]:50840 "EHLO mail.ud10.udmedia.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751170AbdIPGZF (ORCPT ); Sat, 16 Sep 2017 02:25:05 -0400 Date: Sat, 16 Sep 2017 08:25:03 +0200 From: Markus Trippelsdorf To: Greg KH Cc: Linus Torvalds , Andrew Morton , linux-kernel@vger.kernel.org Subject: Re: [GIT PULL] Firmware files removal for 4.14-rc1 Message-ID: <20170916062503.GA278@x4> References: <20170915185652.GA18602@kroah.com> <20170916045106.GA286@x4> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20170916045106.GA286@x4> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 6597 Lines: 168 On 2017.09.16 at 06:51 +0200, Markus Trippelsdorf wrote: > On 2017.09.15 at 11:56 -0700, Greg KH wrote: > > The following changes since commit 569dbb88e80deb68974ef6fdd6a13edb9d686261: > > > > Linux 4.13 (2017-09-03 13:56:17 -0700) > > > > are available in the git repository at: > > > > git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core.git/ tags/firmware_removal-4.14-rc1 > > > > for you to fetch changes up to 5620a0d1aacd554ebebcff373e31107bb1ef7769: > > > > firmware: delete in-kernel firmware (2017-09-14 14:49:41 -0700) > > > > ---------------------------------------------------------------- > > Firmware removal patch for 4.14-rc1 > > > > Many many years ago (at the kernel summit in Boston), we all came to the > > agreement that the firmware/ tree should be dropped from the kernel, and > > everyone use the linux-firmware package instead. For some minor reason, > > David Woodhouse didn't send the pull request at that point in time, and > > everyone forgot about this. > > > > The topic came up in the hallway track at the Plumbers conference this > > week, so here's a single patch that drops the whole firmware tree. The > > last firmware update was back in 2013, and all distros have been using > > linux-firmware instead since at least that year, if not before. The > > only commits to that directory since 2013 was some kbuild fixups for > > various build tool issues. > > > > So lets finally drop this, we don't need to lug them around in the > > kernel source tree anymore, especially as no one wants or uses them. > > Well, it is one thing to drop the redundant binary blobs. But is another > to break perfectly fine setups that worked for years, e.g.: > > CONFIG_FW_LOADER=y > CONFIG_FIRMWARE_IN_KERNEL=y > CONFIG_EXTRA_FIRMWARE="amd-ucode/microcode_amd.bin radeon/R600_rlc.bin" > CONFIG_EXTRA_FIRMWARE_DIR="/lib/firmware" > > Please restore the support for built-in firmware. The following patch seems to work for me. 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