# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
# Distributed under the terms of the GNU General Public License v2
CROS_WORKON_COMMIT="50f04d037b0a70ce6ba988c24f1f68b96b0db645"
CROS_WORKON_TREE="6a610276e2cc60d311c399d09afbb9a8b6150ea7"

EAPI=4
CROS_WORKON_PROJECT="chromiumos/third_party/u-boot"

inherit cros-debug toolchain-funcs cros-board flag-o-matic

DESCRIPTION="Das U-Boot boot loader"
HOMEPAGE="http://www.denx.de/wiki/U-Boot"
LICENSE="GPL-2"
SLOT="0"
KEYWORDS="amd64 arm x86"
IUSE="profiling factory-mode"

DEPEND=">=chromeos-base/vboot_reference-firmware-0.0.1-r175
	!sys-boot/x86-firmware-fdts
	!sys-boot/exynos-u-boot
	!sys-boot/tegra2-public-firmware-fdts
	"

RDEPEND="${DEPEND}
	"

CROS_WORKON_LOCALNAME="u-boot"
CROS_WORKON_SUBDIR="files"

# This must be inherited *after* EGIT/CROS_WORKON variables defined
inherit cros-workon

UB_BUILD_DIR="${WORKDIR}/${ROOT}"
UB_BUILD_DIR_NB="${UB_BUILD_DIR%/}_nb"

U_BOOT_CONFIG_USE_PREFIX="u_boot_config_use_"
ALL_CONFIGS=(
	coreboot
	daisy
	seaboard
	waluigi
)
IUSE_CONFIGS=${ALL_CONFIGS[@]/#/${U_BOOT_CONFIG_USE_PREFIX}}

U_BOOT_FDT_USE_PREFIX="u_boot_fdt_use_"
ALL_FDTS=(
	alex
	emeraldlake2
	link
	lumpy
	mario
	stumpy
	tegra2-aebl
	tegra2-arthur
	tegra2-asymptote
	tegra2-dev-board
	tegra2-kaen
	tegra2-seaboard
	tegra3-waluigi
)
IUSE_FDTS=${ALL_FDTS[@]/#/${U_BOOT_FDT_USE_PREFIX}}

IUSE="${IUSE} ${IUSE_CONFIGS} ${IUSE_FDTS}"

REQUIRED_USE="${REQUIRED_USE} ^^ ( ${IUSE_CONFIGS} )"

get_current_u_boot_config() {
	local use_config
	for use_config in ${IUSE_CONFIGS}; do
		if use ${use_config}; then
			echo "chromeos_${use_config#${U_BOOT_CONFIG_USE_PREFIX}}_config"
			return
		fi
	done
	die "Unable to determine current U-Boot config."
}

netboot_required() {
	# Build netbootable image for Link unconditionally for now.
	# TODO (vbendeb): come up with a better scheme of determining what
	#                 platforms should always generate the netboot capable
	#                 legacy image.
	local board=$(get_current_board_no_variant)

	use factory-mode || [[ "${board}" == "link" ]]
}

get_current_u_boot_fdt() {
	local use_fdt
	for use_fdt in ${IUSE_FDTS}; do
		if use ${use_fdt}; then
			echo ${use_fdt#${U_BOOT_FDT_USE_PREFIX}}
			return
		fi
	done
	local ub_soc="$(get_config_var ${CROS_U_BOOT_CONFIG} SOC)"
	local ub_board="$(get_config_var ${CROS_U_BOOT_CONFIG} BOARD)"
	echo "${ub_soc}-${ub_board}"
}

# This function can only be called after make config
get_config_var() {
	local config="${1%_config}"
	local var="${2}"
	local boards_cfg="${S}/boards.cfg"
	local i
	case "${var}" in
	ARCH)	i=2;;
	CPU)	i=3;;
	BOARD)	i=4;;
	VENDOR)	i=5;;
	SOC)	i=6;;
	*)	die "Unsupported field: ${var}"
	esac
	grep "^${config}" "${boards_cfg}" | tr -s '[:space:]' ' ' | \
		cut -d' ' -f${i}
}

umake() {
	# Add `ARCH=` to reset ARCH env and let U-Boot choose it.
	ARCH= emake ${COMMON_MAKE_FLAGS} $@
}

src_configure() {
	export LDFLAGS=$(raw-ldflags)

	CROS_U_BOOT_CONFIG="$(get_current_u_boot_config)"
	elog "Using U-Boot config: ${CROS_U_BOOT_CONFIG}"

	CROS_FDT_FILE="$(get_current_u_boot_fdt)"
	elog "Using device tree:   ${CROS_FDT_FILE}"

	# Firmware related binaries are compiled with 32-bit toolchain
	# on 64-bit platforms
	if use amd64 ; then
		CROSS_PREFIX="i686-pc-linux-gnu-"
	else
		CROSS_PREFIX="${CHOST}-"
	fi

	COMMON_MAKE_FLAGS="CROSS_COMPILE=${CROSS_PREFIX}"
	COMMON_MAKE_FLAGS+=" -k"
	COMMON_MAKE_FLAGS+=" VBOOT=${ROOT%/}/usr"
	COMMON_MAKE_FLAGS+=" DEV_TREE_SEPARATE=1"
	if use x86 || use amd64 || use cros-debug; then
		COMMON_MAKE_FLAGS+=" VBOOT_DEBUG=1"
	fi
	if use profiling; then
		COMMON_MAKE_FLAGS+=" VBOOT_PERFORMANCE=1"
	fi

	COMMON_MAKE_FLAGS+=" DEV_TREE_SRC=${CROS_FDT_FILE}"

	local BUILD_FLAGS="O=${UB_BUILD_DIR}"

	umake ${BUILD_FLAGS} distclean
	umake ${BUILD_FLAGS} ${CROS_U_BOOT_CONFIG}

	if netboot_required; then
		BUILD_FLAGS=" O=${UB_BUILD_DIR_NB}"
		BUILD_FLAGS+=" BUILD_FACTORY_IMAGE=1"
		umake ${BUILD_FLAGS} distclean
		umake ${BUILD_FLAGS} ${CROS_U_BOOT_CONFIG}
	fi
}

src_compile() {
	tc-export BUILD_CC
	local BUILD_FLAGS="O=${UB_BUILD_DIR}"

	umake ${BUILD_FLAGS} HOSTCC=${BUILD_CC} HOSTSTRIP=true all

	if netboot_required; then
		BUILD_FLAGS="O=${UB_BUILD_DIR_NB}"
		BUILD_FLAGS+=" BUILD_FACTORY_IMAGE=1"
		umake ${BUILD_FLAGS} HOSTCC=${BUILD_CC} HOSTSTRIP=true all
	fi
}

src_install() {
	local inst_dir="/firmware"
	local files_to_copy="System.map u-boot.bin"
	local ub_vendor="$(get_config_var ${CROS_U_BOOT_CONFIG} VENDOR)"
	local ub_board="$(get_config_var ${CROS_U_BOOT_CONFIG} BOARD)"
	local ub_arch="$(get_config_var ${CROS_U_BOOT_CONFIG} ARCH)"
	local file
	local dts_dir

	# Daisy and its variants need an SPL binary.
	if use u_boot_config_use_daisy; then
		files_to_copy+=" spl/${ub_board}-spl.bin"
	fi

	insinto "${inst_dir}"
	for file in ${files_to_copy}; do
		doins "${UB_BUILD_DIR}/${file}"
	done
	newins "${UB_BUILD_DIR}/u-boot" u-boot.elf

	if netboot_required; then
		newins "${UB_BUILD_DIR_NB}/u-boot.bin" u-boot_netboot.bin
		newins "${UB_BUILD_DIR_NB}/u-boot" u-boot_netboot.elf
	fi

	insinto "${inst_dir}/dtb"
	elog "Using fdt: ${CROS_FDT_FILE}.dtb"
	newins "${UB_BUILD_DIR}/u-boot.dtb" "${CROS_FDT_FILE}.dtb"

	insinto "${inst_dir}/dts"
	for dts_dir in "${S}/board/${ub_vendor}/dts" \
			"board/${ub_vendor}/${ub_board}" \
			"${S}/arch/${ub_arch}/dts" \
			cros/dts; do
		files_to_copy="$(find ${dts_dir} -regex '.*\.dtsi?')"
		elog "Installing device tree files in ${dts_dir}"
		if [ -n "${files_to_copy}" ]; then
			doins ${files_to_copy}
		fi
	done
}
