mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	firmware: Restore support for built-in firmware
Commit5620a0d1aa("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:5620a0d1aa("firmware: delete in-kernel firmware") Signed-off-by: Markus Trippelsdorf <markus@trippelsdorf.de> Acked-by: Greg K-H <gregkh@linuxfoundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									7318413077
								
							
						
					
					
						commit
						df85b2d767
					
				
					 4 changed files with 71 additions and 5 deletions
				
			
		
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								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
 | 
					# Objects we will link into vmlinux / subdirs we need to visit
 | 
				
			||||||
init-y		:= init/
 | 
					init-y		:= init/
 | 
				
			||||||
drivers-y	:= drivers/ sound/
 | 
					drivers-y	:= drivers/ sound/ firmware/
 | 
				
			||||||
net-y		:= net/
 | 
					net-y		:= net/
 | 
				
			||||||
libs-y		:= lib/
 | 
					libs-y		:= lib/
 | 
				
			||||||
core-y		:= usr/
 | 
					core-y		:= usr/
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -140,13 +140,10 @@ config EXTRA_FIRMWARE
 | 
				
			||||||
config EXTRA_FIRMWARE_DIR
 | 
					config EXTRA_FIRMWARE_DIR
 | 
				
			||||||
	string "Firmware blobs root directory"
 | 
						string "Firmware blobs root directory"
 | 
				
			||||||
	depends on EXTRA_FIRMWARE != ""
 | 
						depends on EXTRA_FIRMWARE != ""
 | 
				
			||||||
	default "firmware"
 | 
						default "/lib/firmware"
 | 
				
			||||||
	help
 | 
						help
 | 
				
			||||||
	  This option controls the directory in which the kernel build system
 | 
						  This option controls the directory in which the kernel build system
 | 
				
			||||||
	  looks for the firmware files listed in the EXTRA_FIRMWARE option.
 | 
						  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
 | 
					config FW_LOADER_USER_HELPER
 | 
				
			||||||
	bool
 | 
						bool
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										6
									
								
								firmware/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								firmware/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,6 @@
 | 
				
			||||||
 | 
					*.gen.S
 | 
				
			||||||
 | 
					*.fw
 | 
				
			||||||
 | 
					*.bin
 | 
				
			||||||
 | 
					*.csp
 | 
				
			||||||
 | 
					*.dsp
 | 
				
			||||||
 | 
					ihex2fw
 | 
				
			||||||
							
								
								
									
										63
									
								
								firmware/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								firmware/Makefile
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -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
 | 
				
			||||||
		Loading…
	
		Reference in a new issue