modules-$(CONFIG_COREBOOT) += coreboot

#coreboot_version := git
#coreboot_repo := https://github.com/osresearch/coreboot
coreboot_version := 4.8.1
coreboot_base_dir := coreboot-$(coreboot_version)
coreboot_dir := $(coreboot_base_dir)/$(BOARD)
coreboot_tar := coreboot-$(coreboot_version).tar.xz
coreboot_url := https://www.coreboot.org/releases/$(coreboot_tar)
coreboot_hash := f0ddf4db0628c1fe1e8348c40084d9cbeb5771400c963fd419cda3995b69ad23

# Coreboot builds are specialized on a per-target basis.
# The builds are done in a per-target subdirectory
CONFIG_COREBOOT_CONFIG ?= config/coreboot-$(BOARD).config

# Ensure that touching the config file will force a rebuild
$(build)/$(coreboot_dir)/.configured: $(CONFIG_COREBOOT_CONFIG)

EXTRA_FLAGS := -fdebug-prefix-map=$(pwd)=heads -gno-record-gcc-switches

coreboot_configure := \
	mkdir -p "$(build)/$(coreboot_dir)" \
	&& cp "$(pwd)/$(CONFIG_COREBOOT_CONFIG)" "$(build)/$(coreboot_dir)/.config" \
	&& $(MAKE) olddefconfig \
		-C "$(build)/$(coreboot_base_dir)" \
		obj="$(build)/$(coreboot_dir)" \
		DOTCONFIG="$(build)/$(coreboot_dir)/.config" \
		BUILD_TIMELESS=1 \
		CFLAGS_x86_32="$(EXTRA_FLAGS)" \
		CFLAGS_x86_64="$(EXTRA_FLAGS)" \

coreboot_target := \
	-C "$(build)/$(coreboot_base_dir)" \
	obj="$(build)/$(coreboot_dir)" \
	DOTCONFIG="$(build)/$(coreboot_dir)/.config" \
	BUILD_TIMELESS=1 \
	CFLAGS_x86_32="$(EXTRA_FLAGS)" \
	CFLAGS_x86_64="$(EXTRA_FLAGS)" \
	$(MAKE_JOBS)

coreboot_output := coreboot.rom
coreboot_depend += linux initrd

COREBOOT_XGCC_REL := $(coreboot_base_dir)/util/crossgcc/xgcc
COREBOOT_XGCC_PATH := $(build)/$(COREBOOT_XGCC_REL)
COREBOOT_XGCC := $(COREBOOT_XGCC_PATH)/bin/i386-elf-gcc

# hack to force a build dependency on the cross compiler
coreboot-gcc $(build)/$(coreboot_dir)/.configured: $(COREBOOT_XGCC)

ifeq "$(TOOLCHAIN)" ""
# Force a rebuild of the entire coreboot toolchain
$(COREBOOT_XGCC): $(build)/$(coreboot_base_dir)/.canary
	echo '******* Building crossgcc-i386 (this might take a while) ******'
	$(MAKE) -C "$(build)/$(coreboot_base_dir)" CPUS=`nproc` crossgcc-i386
	#echo '******* Building crossgcc-arm (this might take a while) ******'
	#$(MAKE) -C "$(build)/$(coreboot_base_dir)" crossgcc-arm
else
# Use the pre-build one from the external toolchain build
$(COREBOOT_XGCC): $(build)/$(coreboot_base_dir)/.canary
	if [ ! -e "$(TOOLCHAIN)/build/$(COREBOOT_XGCC_REL)" ]; then \
		echo >&2 "ERROR: TOOLCHAIN=$(TOOLCHAIN) does not have coreboot" ; \
		exit 1 ; \
	fi
	if [ ! -e "$(COREBOOT_XGCC_PATH)" ]; then \
		ln -s \
			"$(TOOLCHAIN)/build/$(COREBOOT_XGCC_REL)" \
			"$(COREBOOT_XGCC_PATH)" ; \
	fi
endif

# Force a rebuild if the inputs have changed
$(build)/$(coreboot_dir)/.build: \
	$(build)/$(BOARD)/bzImage \
	$(build)/$(BOARD)/initrd.cpio.xz \

# This produces a ROM image that is written with the flashrom program
$(build)/$(BOARD)/coreboot.rom: $(build)/$(coreboot_dir)/.build
	"$(build)/$(coreboot_dir)/cbfstool" "$(dir $<)coreboot.rom" print
	$(call do-copy,$(dir $<)coreboot.rom,$@)
	@touch $@   # update the time stamp

#
# Helpful target for reconfiguring the coreboot target
#
coreboot.menuconfig:
	$(MAKE) \
		-C "$(build)/$(coreboot_base_dir)" \
		DOTCONFIG="$(build)/$(coreboot_dir)/.config" \
		menuconfig

# The config file in the repo is stored as a "defconfig" format
# which only includes the options that have changed from the defaults.
coreboot.saveconfig:
	$(MAKE) \
		-C "$(build)/$(coreboot_base_dir)" \
		DOTCONFIG="$(build)/$(coreboot_dir)/.config" \
		DEFCONFIG="$(pwd)/$(CONFIG_COREBOOT_CONFIG)" \
		savedefconfig


# if we are not building from a git checkout,
# we must also download the coreboot-blobs tree
ifneq "$(coreboot_version)" "git"

coreboot_depends += coreboot-blobs
modules-y += coreboot-blobs

coreboot-blobs_version := $(coreboot_version)
coreboot-blobs_tar := coreboot-blobs-$(coreboot-blobs_version).tar.xz
coreboot-blobs_dir := coreboot-$(coreboot-blobs_version)/3rdparty/blobs
coreboot-blobs_url := https://www.coreboot.org/releases/$(coreboot-blobs_tar)
coreboot-blobs_hash := 18aa509ae3af005a05d7b1e0b0246dc640249c14fc828f5144b6fd20bb10e295

## there is nothing to build for the blobs, this should be
## made easier to make happen
coreboot-blobs_output := .built
coreboot-blobs_configure := echo -e 'all:\n\ttouch .built' > Makefile

endif
