blob: 7b214bc2a818f388f95730f828ee58cfd4c1d336 [file] [log] [blame]
# 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
}