# Copyright 2019 The Chromium OS Authors. All rights reserved.
# Distributed under the terms of the GNU General Public License v2

# @ECLASS: cros-ec-merge-ro.eclass
# @MAINTAINER:
# Chromium OS Firmware Team
# @BUGREPORTS:
# Please report bugs via http://crbug.com/new (with label Build)
# @VCSURL: https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/master/eclass/@ECLASS@
# @BLURB: helper eclass for merging RO firmware into EC firmware
# @DESCRIPTION:
# Merges a specific RO version of firmware into the firmware that was built
# during the build.
#
# NOTE: When making changes to this class, make sure to modify all the -9999
# ebuilds that inherit it to work around http://crbug.com/220902.

if [[ -z "${_ECLASS_CROS_EC_MERGE_RO}" ]]; then
_ECLASS_CROS_EC_MERGE_RO="1"

# Check for EAPI 6+
case "${EAPI:-0}" in
0|1|2|3|4|5|6) die "unsupported EAPI (${EAPI}) in eclass (${ECLASS})" ;;
*) ;;
esac

inherit cros-ec-utils

# Make sure that private files ebuild has run since it creates the symlink
# used in the src_install step below.
# We also use cros_config_host below.
DEPEND="
	virtual/chromeos-ec-private-files
"
BDEPEND="
	chromeos-base/chromeos-config-host
"

# @FUNCTION: cros-ec-merge-ro_do_merge
# @USAGE: <RO firmware path> <RW firmware path>
# @INTERNAL
# @DESCRIPTION:
# Copy RO firmware from firmware specified in <RO firmware path> and RW firmware
# from <RW firmware path> into a new file. Returns the filename
# of the new file.
cros-ec-merge-ro_do_merge() {
	local ec_ro="$1"
	local ec_rw="$2"

	einfo "Merging RO firmware"

	# Print RO and RW versions.
	local ro_version_string
	local rw_version_string

	ro_version_string="$(cros-ec-utils-get_firmware_ro_version "${ec_ro}" || die)"
	rw_version_string="$(cros-ec-utils-get_firmware_rw_version "${ec_rw}" || die)"

	einfo "Using firmware RO version: ${ro_version_string}"
	einfo "Using firmware RW version: ${rw_version_string}"

	# Use RW firmware version as file name.
	local new_file="${rw_version_string}.bin"
	# fmap_rw_section[0]="EC_RW"
	# fmap_rw_section[1]=offset
	# fmap_rw_section[2]=size (decimal)
	local fmap_rw_section
	IFS=" " read -r -a fmap_rw_section <<< "$(dump_fmap -p "${ec_ro}" EC_RW \
		|| die)"

	# Inject RW into the existing RO file.
	einfo "Merging files..."
	cp "${ec_ro}" "${new_file}" || die
	dd if="${ec_rw}" of="${new_file}" \
		bs=1 skip="${fmap_rw_section[1]}" seek="${fmap_rw_section[1]}" \
		count="${fmap_rw_section[2]}" conv=notrunc status=none || die

	echo "${new_file}"
}

# @FUNCTION: cros-ec-merge-ro_src_install
# @DESCRIPTION:
# Copy pre-built RO firmware into RW firmware that was built.
cros-ec-merge-ro_src_install() {
	debug-print-function "${FUNCNAME[0]}" "$@"

	# Use our specified board.
	local target="${FIRMWARE_EC_BOARD}"

	local firmware_bin_dir="$(readlink -f \
		"${S}/private/fingerprint/fpc/firmware-bin")"

	if [[ ! -d "${firmware_bin_dir}" ]]; then
		einfo "No RO firmware found. This is expected in a public build."
		return 0
	fi

	# If cros_config provides RO firmware version, then use it. The RO firmware
	# version does not have to be specified, in which case cros_config_host will
	# exit with success and not print any firmware version.
	# In that case, we want to use the "default" RO firmware, so validate
	# that there is exactly one RO binary.
	local fw_target="${target%%_fp}"
	local ro_version
	ro_version="$(cros_config_host \
		get-fpmcu-firmware-ro-version "${fw_target}" || die)"

	local ro_fw
	if [[ -n ${ro_version} ]]; then
		einfo "RO version specified: ${ro_version}."
		ro_fw="$(ls "${firmware_bin_dir}/${fw_target}/RO/${ro_version}.bin" || die)"
	else
		einfo "No RO version specified; using default."
		local ro_fw_count=0
		ro_bin_files=("${firmware_bin_dir}/${fw_target}/RO/"*.bin)
		ro_fw_count=${#ro_bin_files[@]}
		if [[ ${ro_fw_count} -ne 1 ]]; then
			eerror "Incorrect number of RO firmware files found: ${ro_fw_count}"
			die
		fi

		ro_fw="${ro_bin_files[0]}"
	fi

	local rw_fw="${WORKDIR}/build_${target}/${target}/ec.bin"
	local merged_fw="$(cros-ec-merge-ro_do_merge "${ro_fw}" "${rw_fw}")"
	cp "${merged_fw}" "${rw_fw}" || die
}

EXPORT_FUNCTIONS src_install

fi  # _ECLASS_CROS_EC_MERGE_RO
