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

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

# @ECLASS-VARIABLE: UNIBOARD_DTB_INSTALL_PATH
# @DESCRIPTION:
#  This is the filename of the master configuration for use with doins.
UNIBOARD_DTB_INSTALL_PATH="/usr/share/chromeos-config/config.dtb"

# @ECLASS-VARIABLE: UNIBOARD_DTS_DIR
# @DESCRIPTION:
#  This is the installation directory of the device-tree source files.
UNIBOARD_DTS_DIR="/usr/share/chromeos-config/dts"

# @FUNCTION: install_model_file
# @USAGE:
# @DESCRIPTION:
# Installs the .dtsi file for the current board. This is called from the
# chromeos-config-<board> public ebuild. It is named "model.dtsi".
install_model_file() {
	[[ $# -eq 0 ]] || die "${FUNCNAME}: takes no arguments"

	local dest="model.dtsi"

	einfo "Installing ${dest} to ${UNIBOARD_DTS_DIR}"

	# Avoid polluting callers with our insinto.
	(
		insinto "${UNIBOARD_DTS_DIR}"
		newins ${FILESDIR}/model.dtsi "${dest}"
	)
}

# @FUNCTION: install_private_model_file
# @USAGE:
# @DESCRIPTION:
# Installs the .dtsi file for the current board. This is intended to be called
# from the chromeos-config-<board> private ebuild. The file is named
# "private-model.dtsi".
install_private_model_file() {
	[[ $# -eq 0 ]] || die "${FUNCNAME}: takes no arguments"

	local dest="private-model.dtsi"

	einfo "Installing ${dest} to ${UNIBOARD_DTS_DIR}"

	# Avoid polluting callers with our insinto.
	(
		insinto "${UNIBOARD_DTS_DIR}"
		newins ${FILESDIR}/model.dtsi "${dest}"
	)
}

# @FUNCTION: get_model_conf_value
# @USAGE: <model> <path> <prop>
# @RETURN: value of the property, or empty if not found, in which
# case the return code indicates failure.
# @DESCRIPTION:
# Obtain a configuration value for a given model.
# @CODE
# model: name of model to lookup.
# path: path to config string, e.g. "/". Starts with "/".
# prop: name of property to read (e.g. "wallpaper").
# @CODE
get_model_conf_value() {
	[[ $# -eq 3 ]] || die "${FUNCNAME}: takes 3 arguments"

	local model="$1"
	local path="$2"
	local prop="$3"
	local r
	r=$(fdtget "${SYSROOT}${UNIBOARD_DTB_INSTALL_PATH}" \
		"/chromeos/models/${model}${path}" "${prop}" 2>/dev/null)
	local ret=$?

	if [[ ${ret} -ne 0 && "${path}" =~ ^/firmware ]]; then
		# The value is missing; is it available at a firmware shares
		# phandle?
		local share
		share=$(fdtget "${SYSROOT}${UNIBOARD_DTB_INSTALL_PATH}" -f \
			"/chromeos/models/${model}/firmware" shares 2>/dev/null)

		if [[ $? -eq 0 ]]; then
			fdtget "${SYSROOT}${UNIBOARD_DTB_INSTALL_PATH}" \
			"${share}${path#/firmware}" "${prop}" 2>/dev/null
			return $?
		fi
	fi

	echo "${r}"
	return ${ret}
}

# @FUNCTION: get_model_list
# @USAGE:
# @DESCRIPTION:
# Obtain a list of all of the models known to the build root DTB
# @RETURN:
# A newline-separated string representing the list of known models; may be empty
get_model_list() {
	[[ $# -eq 0 ]] || die "${FUNCNAME}: takes no arguments"

	fdtget "${SYSROOT}${UNIBOARD_DTB_INSTALL_PATH}" \
		-l /chromeos/models 2>/dev/null
}

# @FUNCTION: get_model_list_noroot
# @USAGE:
# @DESCRIPTION:
# Obtain a list of all of the models known to the build DTB in files/
# @RETURN:
# A newline-separated string representing the list of known models; may be empty
get_model_list_noroot() {
	[[ $# -eq 0 ]] || die "${FUNCNAME}: takes no arguments"

	# This function is called before FILESDIR is set so figure it out from
	# the ebuild filename.
	local filesdir="$(dirname "${EBUILD}")/files"

	# We are not allowed to access the ROOT directory here, so compile the
	# model fragment on the fly and pull out the value we want.
	echo "/dts-v1/; / { chromeos { family: family { }; " \
		"models: models { }; }; };" |
		cat - "${filesdir}/model.dtsi" |
		dtc -O dtb |
		fdtget - -l "/chromeos/models" 2>/dev/null
}

# @FUNCTION: get_each_model_conf_value_set
# @USAGE: <path> <prop>
# @RETURN:
# IFS separated string representing unique value of the property
# across all models or empty if not found.
# @DESCRIPTION:
# Obtain a set of configuration values across all models. As a set,
# contains only unique values.
# @CODE
# path: path to config string, e.g. "/". Starts with "/".
# prop: name of property to read (e.g. "wallpaper").
# @CODE
get_each_model_conf_value_set() {
	[[ $# -eq 2 ]] || die "${FUNCNAME}: takes 2 arguments"

	local path="$1"
	local prop="$2"
	local models=( $(get_model_list) )
	local model
	local values=()

	for model in "${models[@]}"; do
		values+=(
			$(get_model_conf_value "${model}" "${path}" "${prop}" \
			2>/dev/null)
		)
	done

	printf '%s\n' "${values[@]}" | sort -u
}

# @FUNCTION: get_each_model_conf_value_set_noroot
# @USAGE: <path> <prop>
# @RETURN:
# IFS separated string representing unique value of the property
# across all models in the files/ directory or empty if not found.
# @DESCRIPTION:
# Obtain a set of configuration values across all models. As a set,
# contains only unique values.
# @CODE
# path: path to config string, e.g. "/". Starts with "/".
# prop: name of property to read (e.g. "wallpaper").
# @CODE
get_each_model_conf_value_set_noroot() {
	[[ $# -eq 2 ]] || die "${FUNCNAME}: takes 2 arguments"
	local path="$1"
	local prop="$2"
	local models=( $(get_model_list_noroot) )
	local model
	local values=()

	for model in "${models[@]}"; do
		values+=(
			$(get_model_conf_value_noroot "${model}" "${path}" \
			"${prop}" 2>/dev/null)
		)
	done

	printf '%s\n' "${values[@]}" | sort -u
}

# @FUNCTION: get_model_conf_value_noroot
# @USAGE: <model> <path> <prop>
# @DESCRIPTION:
# Obtain a configuration value for a given model. This works without needing
# access to the root directory, so it is suitable for getting information for
# use # in SRC_URI, for example.
# It requires a symlink in the calling ebuild from ${FILESDIR}/model.dtsi to
# the board's configuration file. It also requires a subslot dependency.
# @RETURN: value of the property, or empty if not found, in which
# case the return code indicates failure.
# @CODE
# model: name of model to lookup.
# path: path to config string, e.g. "/". Starts with "/".
# prop: name of property to read (e.g. "wallpaper").
# @CODE
get_model_conf_value_noroot() {
	[[ $# -eq 3 ]] || die "${FUNCNAME}: takes 3 arguments"

	local model="$1"
	local path="$2"
	local prop="$3"

	# This function is called before FILESDIR is set so figure it out from
	# the ebuild filename.
	local filesdir="$(dirname "${EBUILD}")/files"

	# We are not allowed to access the ROOT directory here, so compile the
	# model fragment on the fly and pull out the value we want.
	local r
	r=$(
		echo "/dts-v1/; / { chromeos { family: family { }; " \
		"models: models { }; }; };" |
		cat - "${filesdir}/model.dtsi" |
		dtc -O dtb |
		fdtget - "/chromeos/models/${model}${path}" "${prop}" \
		2>/dev/null
	)
	local ret=$?

	if [[ ${ret} -ne 0 && "${path}" =~ ^/firmware ]]; then
		# The value is missing; is it available at a firmware shares
		# phandle?
		local share
		share=$(
			echo "/dts-v1/; / { chromeos { family: family { }; " \
			"models: models { }; }; };" |
			cat - "${filesdir}/model.dtsi" |
			dtc -O dtb |
			fdtget - -f \
			"/chromeos/models/${model}/firmware" shares 2>/dev/null
		)

		if [[ $? -eq 0 ]]; then
			echo "/dts-v1/; / { chromeos { family: family { }; " \
			"models: models { }; }; };" |
			cat - "${filesdir}/model.dtsi" |
			dtc -O dtb | fdtget - \
			"${share}${path#/firmware}" "${prop}" 2>/dev/null
			return $?
		fi
	fi

	echo "${r}"
	return ${ret}
}
