From 79f92910ebb1a281b87cd2586cff9c5d06478d6c Mon Sep 17 00:00:00 2001
From: Marcello Sylvester Bauer <info@marcellobauer.com>
Date: Wed, 5 Dec 2018 08:45:26 +0100
Subject: LinuxBoot/targets/linux.mk: refactor kernel compilation

Refactor the linux kernel compilation.

Change-Id: Iea2e2c8a22a91bdd2e3f83cd3058426acec3eaba
Signed-off-by: Marcello Sylvester Bauer <info@marcellobauer.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/30053
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Philipp Deppenwiese <zaolin.daisuki@gmail.com>
---
 payloads/external/LinuxBoot/Kconfig                |  89 ++++++++++---
 payloads/external/LinuxBoot/Makefile               |   4 +
 .../external/LinuxBoot/arm64/kernel_fdt_lzma.its   |   2 +-
 payloads/external/LinuxBoot/targets/linux.mk       | 147 +++++++++++++--------
 payloads/external/LinuxBoot/targets/u-root.mk      |   6 +-
 payloads/external/Makefile.inc                     |  13 +-
 6 files changed, 183 insertions(+), 78 deletions(-)

(limited to 'payloads')

diff --git a/payloads/external/LinuxBoot/Kconfig b/payloads/external/LinuxBoot/Kconfig
index 31b238ca4f..ccf62b8237 100644
--- a/payloads/external/LinuxBoot/Kconfig
+++ b/payloads/external/LinuxBoot/Kconfig
@@ -41,18 +41,16 @@ config LINUXBOOT_ARM64
 
 endchoice
 
-config LINUXBOOT_ARCH
-	string
-	default "amd64" if LINUXBOOT_X86_64
-	default "i386" if LINUXBOOT_X86
-	default "arm64" if LINUXBOOT_ARM64
-
 comment "Linux kernel"
 
 config LINUXBOOT_COMPILE_KERNEL
 	bool "Compile kernel"
 	default n
 
+if LINUXBOOT_COMPILE_KERNEL
+comment "parse linux crosscompiler with: LINUXBOOT_CROSS_COMPILE"
+endif
+
 config LINUXBOOT_KERNEL_PATH
 	string "Path to kernel"
 	default "Image"
@@ -61,32 +59,85 @@ config LINUXBOOT_KERNEL_PATH
 if LINUXBOOT_COMPILE_KERNEL
 
 choice
-	prompt "Kernel version"
+	prompt "Kernel release"
 	default LINUXBOOT_KERNEL_STABLE
+	help
+	  Choose the kernel release.
+
+	  Select 'custom' if your want to define the kernel version.
+	  For more information about the current 'mainline', 'stable' or 'longterm'
+	  version, visit: https://www.kernel.org/
+
+config LINUXBOOT_KERNEL_MAINLINE
+	bool "mainline"
+	help
+	  Mainline kernel version
 
 config LINUXBOOT_KERNEL_STABLE
-	bool "4.14.67"
+	bool "stable"
 	help
 	  Stable kernel version
 
-config LINUXBOOT_KERNEL_LATEST
-	bool "4.18.5"
+config LINUXBOOT_KERNEL_LONGTERM
+	bool "longterm"
 	help
-	  Latest kernel version
+	  Longterm (LTS) kernel version
+
+config LINUXBOOT_KERNEL_CUSTOM
+	bool "custom"
+	help
+	  Custom kernel version
 
 endchoice
 
-config LINUXBOOT_KERNEL_VERSION
-	string
-	default "4.18.5" if LINUXBOOT_KERNEL_LATEST
-	default "4.14.67" if LINUXBOOT_KERNEL_STABLE
+config LINUXBOOT_KERNEL_CUSTOM_VERSION
+	string "kernel version"
+	default ""
+	depends on LINUXBOOT_KERNEL_CUSTOM
+	help
+	  Choose the Linux kernel version number. (x.x.x)
+	  Release candidate kernels (rc) are currently are not supported.
+
+choice
+	prompt "Kernel configuration"
+	default LINUXBOOT_KERNEL_ARCH_DEFAULT_CONFIG
+
+config LINUXBOOT_KERNEL_ARCH_DEFAULT_CONFIG
+	bool "Default architecture configuration"
+	help
+	  This option will use the default configuration for the
+	  selected architecture.
+
+config LINUXBOOT_KERNEL_CUSTOM_CONFIG
+	bool "Custom (def)config file"
+	help
+
+endchoice
 
 config LINUXBOOT_KERNEL_CONFIGFILE
-	string "Kernel config file"
-	default ""
+	string "Config file path"
+	default "defconfig"
+	depends on LINUXBOOT_KERNEL_CUSTOM_CONFIG
 	help
-	  Add your own kernel configuration file. Otherwise a default
-	  minimal defconfig is used.
+	  Path to the kernel configuration file.
+
+	  Note: this can be a defconfig file or a complete .config file.
+
+choice LINUXBOOT_KERNEL_FORMAT
+	prompt "Kernel binary format"
+	default LINUXBOOT_KERNEL_BZIMAGE if LINUXBOOT_X86 || LINUXBOOT_X86_64
+	default LINUXBOOT_KERNEL_UIMAGE if LINUXBOOT_ARM64
+
+config LINUXBOOT_KERNEL_BZIMAGE
+	bool "bzImage"
+	depends on LINUXBOOT_X86 || LINUXBOOT_X86_64
+
+config LINUXBOOT_KERNEL_UIMAGE
+	bool "uImage"
+	depends on LINUXBOOT_ARM64
+
+endchoice
+
 
 config LINUXBOOT_DTB_FILE
 	string "Compiled devicetree file"
diff --git a/payloads/external/LinuxBoot/Makefile b/payloads/external/LinuxBoot/Makefile
index a67b16ae70..5840e8e211 100644
--- a/payloads/external/LinuxBoot/Makefile
+++ b/payloads/external/LinuxBoot/Makefile
@@ -45,6 +45,10 @@ endif
 ifeq ($(CONFIG_LINUXBOOT_COMPILE_KERNEL),y)
 ifeq ($(CONFIG_LINUXBOOT_ARCH),arm64)
 kernel: initramfs
+	if [[ ! -f "$(top)/$(CONFIG_LINUXBOOT_DTB_FILE)" ]]; then \
+	echo "<< Linux kernel devicetree is missing. >>"; \
+	exit 1; \
+	fi
 	$(MAKE) -f targets/linux.mk
 else
 kernel:
diff --git a/payloads/external/LinuxBoot/arm64/kernel_fdt_lzma.its b/payloads/external/LinuxBoot/arm64/kernel_fdt_lzma.its
index 26a81207b5..3087e69a74 100644
--- a/payloads/external/LinuxBoot/arm64/kernel_fdt_lzma.its
+++ b/payloads/external/LinuxBoot/arm64/kernel_fdt_lzma.its
@@ -46,7 +46,7 @@
 		};
 		ramdisk-1 {
 			description = "Compressed Initramfs";
-			data = /incbin/("u-initramfs");
+			data = /incbin/("initramfs");
 			type = "ramdisk";
 			arch = "arm64";
 			os = "linux";
diff --git a/payloads/external/LinuxBoot/targets/linux.mk b/payloads/external/LinuxBoot/targets/linux.mk
index 91118d4496..5632a0b923 100644
--- a/payloads/external/LinuxBoot/targets/linux.mk
+++ b/payloads/external/LinuxBoot/targets/linux.mk
@@ -13,83 +13,120 @@
 ## GNU General Public License for more details.
 ##
 
-kernel_tarball=https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-$(CONFIG_LINUXBOOT_KERNEL_VERSION).tar.xz
+ARCH-$(CONFIG_LINUXBOOT_X86_64)=x86_64
+ARCH-$(CONFIG_LINUXBOOT_X86)=x86
+ARCH-$(CONFIG_LINUXBOOT_ARM64)=arm64
+
+TAG-$(CONFIG_LINUXBOOT_KERNEL_MAINLINE)=mainline
+TAG-$(CONFIG_LINUXBOOT_KERNEL_STABLE)=stable
+TAG-$(CONFIG_LINUXBOOT_KERNEL_LONGTERM)=longterm
+
+pwd:=$(shell pwd)
+top:=../../..
 project_dir=linuxboot
-kernel_dir=$(project_dir)/kernel
-
-XGCCPATH?=$(PWD)/util/crossgcc/xgcc/bin
-ifeq ($(CONFIG_LINUXBOOT_ARCH),i386)
-LINUXBOOT_COMPILE?=$(XGCCPATH)/i386-linux-
-ARCH?=x86
-else ifeq ($(CONFIG_LINUXBOOT_ARCH),amd64)
-LINUXBOOT_COMPILE?=$(XGCCPATH)/x86_64-linux-
-ARCH?=x86_64
-else ifeq ($(CONFIG_LINUXBOOT_ARCH),arm64)
-LINUXBOOT_COMPILE?=$(XGCCPATH)/aarch64-linux-
-ARCH?=arm64
+tarball_dir:=$(project_dir)/tarball
+decompress_flag=.done
+
+OBJCOPY:=$(LINUXBOOT_CROSS_COMPILE)objcopy
+
+ifeq ($(CONFIG_LINUXBOOT_KERNEL_CUSTOM),y)
+	kernel_version:=$(CONFIG_LINUXBOOT_KERNEL_CUSTOM_VERSION)
+else
+	kernel_version:=$(shell curl -s -k https://www.kernel.org/feeds/kdist.xml | \
+		sed -n -e 's@.*<guid isPermaLink="false">\(.*\)</guid>.*@\1@p' | \
+		awk -F ',' '/$(TAG-y)/{ print $$3 }' | \
+		head -n 1)
 endif
 
-OBJCOPY:=$(LINUXBOOT_COMPILE)objcopy
+kernel_dir=$(project_dir)/kernel-$(subst .,_,$(kernel_version))
+kernel_tarball=linux-$(kernel_version).tar
+kernel_mirror=https://mirrors.edge.kernel.org/pub/linux/kernel
+
+ifeq ($(findstring x2.6.,x$(kernel_version)),x2.6.)
+kernel_mirror_path := $(kernel_mirror)/v2.6
+else ifeq ($(findstring x3.,x$(kernel_version)),x3.)
+kernel_mirror_path := $(kernel_mirror)/v3.x
+else ifeq ($(findstring x4.,x$(kernel_version)),x4.)
+kernel_mirror_path := $(kernel_mirror)/v4.x
+else ifeq ($(findstring x5.,x$(kernel_version)),x5.)
+kernel_mirror_path := $(kernel_mirror)/v5.x
+endif
 
 all: kernel
 
-toolchain:
-	if [[ ! -x "$(LINUXBOOT_COMPILE)gcc" ]]; then \
-	echo "Toolchain '$(LINUXBOOT_COMPILE)*' is missing."; \
-	exit 1; \
-	fi
+lookup:
+ifeq ($(kernel_version),)
+	$(error kernel version lookup failed for $(TAG-y) release)
+endif
+	@echo "    WWW        Kernel [$(TAG-y)] $(kernel_version)"
 
-$(kernel_dir)/.config:
-	echo "    WWW        Download Linux $(CONFIG_LINUXBOOT_KERNEL_VERSION)"
-	mkdir -p $(kernel_dir)
-ifeq ("$(wildcard $(kernel_dir)/README)","")
-	curl -s $(kernel_tarball) | tar xJ -C $(kernel_dir) --strip 1
+fetch:
+ifneq ($(shell [[ -d "$(kernel_dir)" && -f "$(kernel_dir)/$(decompress_flag)" ]];echo $$?),0)
+	mkdir -p $(tarball_dir)
+	if [[ ! -f $(tarball_dir)/$(kernel_tarball).xz && ! -f $(tarball_dir)/$(kernel_tarball).xz ]]; then \
+	echo "    WWW        $(kernel_tarball).xz"; \
+	cd $(tarball_dir); \
+	curl -OLs "$(kernel_mirror_path)/$(kernel_tarball).xz"; \
+	cd $(pwd); \
+	fi
 endif
 
-config: $(kernel_dir)/.config
-	echo "    CONFIG     Linux $(CONFIG_LINUXBOOT_KERNEL_VERSION)"
-ifneq ($(CONFIG_LINUXBOOT_KERNEL_CONFIGFILE),)
+unpack: fetch
+	if [[ -d "$(kernel_dir)" && ! -f "$(kernel_dir)/$(decompress_flag)" ]]; then \
+	rm -rf $(kernel_dir); \
+	fi
+	if [[ ! -d "$(kernel_dir)" ]]; then \
+	mkdir $(kernel_dir); \
+	echo "    XZ         $(kernel_tarball).xz"; \
+	tar xJf $(tarball_dir)/$(kernel_tarball).xz --strip 1 -C $(kernel_dir); \
+	fi
+	touch $(kernel_dir)/$(decompress_flag)
+
+$(kernel_dir)/.config: unpack
+	@echo "    CONFIG     Linux $(kernel_version)"
+ifeq ($(CONFIG_LINUXBOOT_KERNEL_CUSTOM_CONFIG),y)
 	cp $(CONFIG_LINUXBOOT_KERNEL_CONFIGFILE) $(kernel_dir)/.config
-else ifeq ($(CONFIG_LINUXBOOT_ARCH),i386)
-	cp x86/defconfig $(kernel_dir)/.config
-else ifeq ($(CONFIG_LINUXBOOT_ARCH),amd64)
-	cp x86_64/defconfig $(kernel_dir)/.config
-else ifeq ($(CONFIG_LINUXBOOT_ARCH),arm64)
-	cp arm64/defconfig $(kernel_dir)/.config
+else
+	cp $(ARCH-y)/defconfig $(kernel_dir)/.config
 endif
+	$(MAKE) -C $(kernel_dir) olddefconfig ARCH=$(ARCH-y)
 
-ifneq (,$(filter $(CONFIG_LINUXBOOT_ARCH),i386 amd64))
-$(kernel_dir)/arch/x86/boot/bzImage: config toolchain
-else ifeq ($(CONFIG_LINUXBOOT_ARCH),arm64)
-$(kernel_dir)/vmlinux: config toolchain
+build: $(kernel_dir)/.config
+	@echo "    MAKE       Linux $(kernel_version)"
+ifeq ($(CONFIG_LINUXBOOT_KERNEL_BZIMAGE),y)
+	$(MAKE) -C $(kernel_dir) CROSS_COMPILE=$(LINUXBOOT_CROSS_COMPILE) ARCH=$(ARCH-y) bzImage
+else
+ifeq ($(CONFIG_LINUXBOOT_KERNEL_UIMAGE),y)
+	$(MAKE) -C $(kernel_dir) CROSS_COMPILE=$(LINUXBOOT_CROSS_COMPILE) ARCH=$(ARCH-y) vmlinux
+endif
 endif
-	echo "    MAKE       Kernel $(CONFIG_LINUXBOOT_KERNEL_VERSION)"
-	$(MAKE) -C $(kernel_dir) olddefconfig CROSS_COMPILE=$(LINUXBOOT_COMPILE) ARCH=$(ARCH)
-	$(MAKE) -C $(kernel_dir) -j $(CPUS) CROSS_COMPILE=$(LINUXBOOT_COMPILE) ARCH=$(ARCH)
 
-ifneq (,$(filter $(CONFIG_LINUXBOOT_ARCH),i386 amd64))
-$(project_dir)/bzImage: $(kernel_dir)/arch/x86/boot/bzImage
+ifeq ($(CONFIG_LINUXBOOT_KERNEL_BZIMAGE),y)
+$(top)/$(CONFIG_LINUXBOOT_KERNEL): build
+	@echo "    CP         bzImage"
+	cp $(kernel_dir)/arch/x86/boot/bzImage $@
+else
+ifeq ($(CONFIG_LINUXBOOT_KERNEL_UIMAGE),y)
+$(project_dir)/target.dtb: $(top)/$(CONFIG_LINUXBOOT_DTB_FILE)
 	cp $< $@
-else ifeq ($(CONFIG_LINUXBOOT_ARCH),arm64)
 $(project_dir)/vmlinux.bin: $(kernel_dir)/vmlinux
 	$(OBJCOPY) -O binary $< $@
-
-$(project_dir)/target.dtb: $(PWD)/$(CONFIG_LINUXBOOT_DTB_FILE)
-	cp $< $@
-
 $(project_dir)/vmlinux.bin.lzma: $(project_dir)/vmlinux.bin
 	xz -c -k -f --format=lzma --lzma1=dict=1MiB,lc=3,lp=0,pb=3 $< > $@
-
-$(project_dir)/uImage: $(project_dir)/vmlinux.bin.lzma $(project_dir)/../arm64/kernel_fdt_lzma.its $(project_dir)/target.dtb
+$(top)/$(CONFIG_LINUXBOOT_KERNEL): build $(project_dir)/vmlinux.bin.lzma $(project_dir)/target.dtb
 	cp $(project_dir)/../arm64/kernel_fdt_lzma.its $(project_dir)
-	cp $(PWD)/$(CONFIG_LINUXBOOT_INITRAMFS)$(CONFIG_LINUXBOOT_INITRAMFS_SUFFIX) $(project_dir)/u-initramfs
+	cp $(top)/$(CONFIG_LINUXBOOT_INITRAMFS)$(CONFIG_LINUXBOOT_INITRAMFS_SUFFIX) $(project_dir)/initramfs
 	mkimage -f $(project_dir)/kernel_fdt_lzma.its $@
+else
+	$(error Kernel image format not found)
+	exit 1
+endif
 endif
 
-ifneq (,$(filter $(CONFIG_LINUXBOOT_ARCH),i386 amd64))
-kernel: $(project_dir)/bzImage
-else ifeq ($(CONFIG_LINUXBOOT_ARCH),arm64)
-kernel: $(project_dir)/uImage
+ifneq ($(TAG-y),)
+kernel: lookup $(top)/$(CONFIG_LINUXBOOT_KERNEL)
+else
+kernel: $(top)/$(CONFIG_LINUXBOOT_KERNEL)
 endif
 
-.PHONY: kernel config toolchain
+.PHONY: all kernel build unpack fetch check
diff --git a/payloads/external/LinuxBoot/targets/u-root.mk b/payloads/external/LinuxBoot/targets/u-root.mk
index 86c9019dce..28d7dbbb33 100644
--- a/payloads/external/LinuxBoot/targets/u-root.mk
+++ b/payloads/external/LinuxBoot/targets/u-root.mk
@@ -18,6 +18,10 @@ go_path_dir=$(project_dir)/go
 uroot_bin=$(project_dir)/u-root
 uroot_package=github.com/u-root/u-root
 
+ARCH-$(CONFIG_LIBUXBOOT_X86_64)=amd64
+ARCH-$(CONFIG_LINUXBOOT_X86)=i386
+ARCH-$(CONFIG_LINUXBOOT_ARM64)=arm64
+
 go_version=$(shell go version | sed -nr 's/.*go([0-9]+\.[0-9]+.?[0-9]?).*/\1/p' )
 go_version_major=$(shell echo $(go_version) |  sed -nr 's/^([0-9]+)\.([0-9]+)\.?([0-9]*)$$/\1/p')
 go_version_minor=$(shell echo $(go_version) |  sed -nr 's/^([0-9]+)\.([0-9]+)\.?([0-9]*)$$/\2/p')
@@ -64,7 +68,7 @@ build: checkout
 	GOPATH=$(go_path_dir) go build -o $(uroot_bin) $(uroot_package)
 
 u-root: build
-	GOARCH=$(CONFIG_LINUXBOOT_ARCH) GOPATH=$(go_path_dir) $(uroot_bin) \
+	GOARCH=$(ARCH-y) GOPATH=$(go_path_dir) $(uroot_bin) \
 	$(uroot_args) -o $(project_dir)/initramfs_u-root.cpio $(uroot_cmds)
 
 .PHONY: all u-root build checkout get version
diff --git a/payloads/external/Makefile.inc b/payloads/external/Makefile.inc
index 5f9d8006d3..5edbb81b18 100644
--- a/payloads/external/Makefile.inc
+++ b/payloads/external/Makefile.inc
@@ -260,13 +260,22 @@ payloads/external/iPXE/ipxe/ipxe.rom ipxe: $(DOTCONFIG)
 linuxboot:
 	$(MAKE) -C payloads/external/LinuxBoot \
 		CPUS=$(CPUS) \
-		CONFIG_LINUXBOOT_ARCH=$(CONFIG_LINUXBOOT_ARCH) \
+		CONFIG_LINUXBOOT_X86_64=$(CONFIG_LINUXBOOT_X86_64) \
+		CONFIG_LINUXBOOT_X86=$(CONFIG_LINUXBOOT_X86) \
+		CONFIG_LINUXBOOT_ARM64=$(CONFIG_LINUXBOOT_ARM64) \
 		CONFIG_LINUXBOOT_KERNEL=$(CONFIG_PAYLOAD_FILE) \
 		CONFIG_LINUXBOOT_INITRAMFS=$(CONFIG_LINUX_INITRD) \
 		CONFIG_LINUXBOOT_INITRAMFS_SUFFIX=$(CONFIG_LINUXBOOT_INITRAMFS_SUFFIX) \
 		CONFIG_LINUXBOOT_COMPILE_KERNEL=$(CONFIG_LINUXBOOT_COMPILE_KERNEL) \
 		CONFIG_LINUXBOOT_BUILD_INITRAMFS=$(CONFIG_LINUXBOOT_BUILD_INITRAMFS) \
-		CONFIG_LINUXBOOT_KERNEL_VERSION=$(CONFIG_LINUXBOOT_KERNEL_VERSION) \
+		CONFIG_LINUXBOOT_KERNEL_MAINLINE=$(CONFIG_LINUXBOOT_KERNEL_MAINLINE) \
+		CONFIG_LINUXBOOT_KERNEL_STABLE=$(CONFIG_LINUXBOOT_KERNEL_STABLE) \
+		CONFIG_LINUXBOOT_KERNEL_LONGTERM=$(CONFIG_LINUXBOOT_KERNEL_LONGTERM) \
+		CONFIG_LINUXBOOT_KERNEL_CUSTOM=$(CONFIG_LINUXBOOT_KERNEL_CUSTOM) \
+		CONFIG_LINUXBOOT_KERNEL_CUSTOM_VERSION=$(CONFIG_LINUXBOOT_KERNEL_CUSTOM_VERSION) \
+		CONFIG_LINUXBOOT_KERNEL_CUSTOM_CONFIG=$(CONFIG_LINUXBOOT_KERNEL_CUSTOM_CONFIG) \
+		CONFIG_LINUXBOOT_KERNEL_BZIMAGE=$(CONFIG_LINUXBOOT_KERNEL_BZIMAGE) \
+		CONFIG_LINUXBOOT_KERNEL_UIMAGE=$(CONFIG_LINUXBOOT_KERNEL_UIMAGE) \
 		CONFIG_LINUXBOOT_KERNEL_CONFIGFILE=$(CONFIG_LINUXBOOT_KERNEL_CONFIGFILE) \
 		CONFIG_LINUXBOOT_INITRAMFS_COMPRESSION_XZ=$(CONFIG_LINUXBOOT_INITRAMFS_COMPRESSION_XZ) \
 		CONFIG_LINUXBOOT_UROOT=$(CONFIG_LINUXBOOT_UROOT) \
-- 
cgit v1.2.3