diff --git a/config/sources/families/genio.conf b/config/sources/families/genio.conf index 7ad1fca1b5..42e6514f35 100644 --- a/config/sources/families/genio.conf +++ b/config/sources/families/genio.conf @@ -5,9 +5,29 @@ declare -g GOVERNOR=performance declare -g INSTALL_ARMBIAN_FIRMWARE=yes # U-Boot bootscript configuration -declare -g BOOTCONFIG="none" # Skip U-Boot compilation +declare -g BOOTCONFIG="${BOOTCONFIG:-"none"}" # Skip U-Boot compilation, unless specified by the board declare -g BOOTSCRIPT="boot-genio.cmd:boot.cmd" # Use custom boot script for Genio (compatible with U-Boot without itest/setexpr/bootz) -declare -g BOOTENV_FILE="genio.txt" # Boot environment template for armbianEnv.txt +declare -g BOOTENV_FILE="genio.txt" # Boot environment template for armbianEnv.txt + +# U-Boot (Vendor, 2022.10 + heavily patched) +declare -g BOOTSOURCE="https://gitlab.com/mediatek/aiot/bsp/u-boot.git" +declare -g BOOTBRANCH="commit:40c563b0d2ba7e150085e195f23f4ed4adc81646" + +declare -g BOOTPATCHDIR="u-boot-genio" # U-Boot patches from Collabora +declare -g BOOTDIR="u-boot-${BOARD}-${BRANCH}" # do not share u-boot directory +declare -g UBOOT_TARGET_MAP="all;;fip.img lk.bin" # fip.img is produced by postprocess _after_ TF-A builds; see hooks; lk.bin is from mtkbin for convenience + +# Don't build ATF as regularly (before u-boot), it will be done in uboot postprocess; see hooks below +declare -g ATFSOURCE="none" + +# Board-overridable params for OPTEE/ATF build; here default to 1200-compatible stuff and BOOT_SOC (that is already hashed in uboot version) +declare -g MEDIATEK_GENIO_SOC_PLATFORM="${MEDIATEK_GENIO_SOC_PLATFORM:-"${BOOT_SOC:-"mt8195"}"}" +declare -g MEDIATEK_GENIO_TFA_PLAT="${MEDIATEK_GENIO_TFA_PLAT:-"${MEDIATEK_GENIO_SOC_PLATFORM}"}" +declare -g MEDIATEK_GENIO_OPTEE_PLAT="${MEDIATEK_GENIO_OPTEE_PLAT:-"mediatek-${MEDIATEK_GENIO_SOC_PLATFORM}"}" +declare -g MEDIATEK_GENIO_OPTEE_DRAM_SIZE=${MEDIATEK_GENIO_OPTEE_DRAM_SIZE:-"0x200000000"} # default for genio-1200 +declare -g MEDIATEK_GENIO_TFA_SOC_SRAM_ADDR="0x201000" # default for genio-1200 +declare -g MEDIATEK_GENIO_TFA_STORAGE="ufs" # or "emmc" +declare -g MEDIATEK_GENIO_LK_BIN="${MEDIATEK_GENIO_LK_BIN:-"${BOARD}/lk/lk.bin"}" # default lk.bin name from mtkbin # Kernel configuration case $BRANCH in @@ -32,8 +52,8 @@ case $BRANCH in declare -g INSTALL_HEADERS="no" #Leads to build error bc custom ubuntu folder for oem drivers family_tweaks() { - echo "blacklist snd-mixer-oss" > $SDCARD/etc/modprobe.d/blacklist-genio.conf - echo "blacklist snd-pcm-oss" >> $SDCARD/etc/modprobe.d/blacklist-genio.conf + echo "blacklist snd-mixer-oss" > "${SDCARD}/etc/modprobe.d/blacklist-genio.conf" + echo "blacklist snd-pcm-oss" >> "${SDCARD}/etc/modprobe.d/blacklist-genio.conf" } ;; @@ -42,3 +62,207 @@ esac # Version string control declare -g KERNEL_SKIP_MAKEFILE_VERSION="yes" declare -g LOCALVERSION="-${BRANCH}-${LINUXFAMILY}" + +# U-Boot build for genio +# Based on Collabora's work at https://gitlab.collabora.com/mediatek/aiot/boot at 2a1ab81bb4094ef6b205ec835893af113ecad108 +# - uses 2 prebuilts: libbase-prebuilt and libdram-prebuilt straight from git +# - builds u-boot _first_ (ATFSOURCE=none in global scope) +# - in u-boot postprocess: +# - in a subshell (since it's in u-boot build context): +# - builts optee from source +# - builts ATF twice (bl2.bin/fip.bin), pointing it to libdram, libbase, optee, and u-boot +# - mashes ATF outputs into fip.img, which is the actual output of the "u-boot" build + +# This runs after regular fetch_sources_tools (500_) so boards have a chance to influence it. +function fetch_sources_tools__700_genio_fetch_mediatek_prebuilts() { + # Fetch optee sources + # + display_alert "Fetching optee-os" "for ${BOARD} ATF compile" "info" + fetch_from_repo "https://gitlab.com/mediatek/aiot/bsp/optee-os.git" "mediatek-optee/optee-os" "commit:ab5d0acf9447cb6b8ffc49917867c61265589ac1" + + # Fetch armbian/mtkbin for libdram, libbase, and lk.bin + # Important: use a specific commit here (NOT branch), so when changes are made to this hook, the u-boot version hash changes too + fetch_from_repo "${MTKBIN_GIT_URL:-"${GITHUB_SOURCE}/armbian/mtkbin"}" "mtkbin" "commit:${MTKBIN_GIT_SHA1:-"ac66548f1c619813aa561d56d998206d3caaffba"}" +} + +function post_uboot_custom_postprocess__genio_optee_atf_fip_build() { + display_alert "Genio u-boot postprocess" "Building OPTEE, 2xATF, and producing FIP" "info" + + # + function mediatek_genio_build_optee() { + display_alert "Building OPTEE" "for ${BOARD} ATF compile" "info" + + declare optee_dir="${SRC}/cache/sources/mediatek-optee/optee-os" + + ( + cd "${optee_dir}" || exit 1 + git clean -xfd # always pristine clean build + export CROSS_COMPILE="aarch64-linux-gnu-" # in a subshell, so, it's fine + run_host_command_logged ARCH=arm make "-j$(nproc --all)" \ + "PLATFORM=${MEDIATEK_GENIO_OPTEE_PLAT}" \ + "SOC_PLATFORM=${MEDIATEK_GENIO_SOC_PLATFORM}" \ + ta-targets=ta_arm64 \ + CFG_ARM64_core=y \ + "CFG_DRAM_SIZE=${MEDIATEK_GENIO_OPTEE_DRAM_SIZE}" \ + all + ) + + display_alert "OPTEE build complete" "for ${BOARD} ATF compile, locating built files" "info" + mediatek_genio_built_bl32_full_path="$(find "${optee_dir}" -type f -name tee.bin)" # outer scope/output var + run_host_command_logged ls -la "${mediatek_genio_built_bl32_full_path}" + + } + + function mediatek_genio_build_atf() { + display_alert "Building ATF" "for ${BOARD} ATF compile" "info" + + # ATF will be called from uboot postprocess, not from it's normal location (which is before u-boot) + declare -g ATFSOURCE="https://gitlab.com/mediatek/aiot/bsp/trusted-firmware-a.git" + declare -g ATFBRANCH="commit:decacb88cfe882cb09ddd613ecaf1323d3fe6c22" + declare -g ATFSOURCEDIR="${ATFDIR}/$(branch2dir "${ATFBRANCH}")" # we're doing stuff out of the normal order, sorry. + declare -g ATFPATCHDIR="atf-genio" + declare -g ATF_SKIP_LDFLAGS_WL="yes" # this TF-A build passes TF_LDFLAGS directly to the linker, not to gcc + + declare libbase_prebuilt_bin="${SRC}/cache/sources/mtkbin/${BOARD}/libbase/libbase.a" + declare libdram_prebuilt_bin="${SRC}/cache/sources/mtkbin/${BOARD}/libdram/libdram.a" + + if [[ ! -f "${libdram_prebuilt_bin}" ]]; then + display_alert "ERROR: missing libdram prebuilt" "for ${BOARD} ATF compile: expected at ${libdram_prebuilt_bin}" "error" + return 1 + fi + + if [[ ! -f "${libbase_prebuilt_bin}" ]]; then + display_alert "ERROR: missing libbase prebuilt" "for ${BOARD} ATF compile: expected at ${libbase_prebuilt_bin}" "error" + return 1 + fi + + declare -a common_tfa_args=( + "E=0" + "PLAT=${MEDIATEK_GENIO_TFA_PLAT}" + "SPD=opteed" + "NEED_BL32=yes" + "BL32=${mediatek_genio_built_bl32_full_path}" + "NEED_BL33=yes" + "BL33=${mediatek_genio_built_bl33_full_path}" + "LIBBASE=${libbase_prebuilt_bin}" + "LIBDRAM=${libdram_prebuilt_bin}" + "PLAT_HW_CRYPTO=1" + ) + + if [[ "${MEDIATEK_GENIO_TFA_STORAGE}" == "ufs" ]]; then + # unrelated to ufs extension, as this is always needed per-board even for SD builds + # (genio always loads uboot from emmc/UFS and not SD) + display_alert "Adding UFS support to ATF build" "for ${BOARD} ATF compile: STORAGE_UFS=1" "info" + common_tfa_args+=("STORAGE_UFS=1") + fi + + common_tfa_args+=( + STORAGE_APPEND_FIP=1 + "STORAGE_FIP_OFFSET=0x100000" + "STORAGE_BOOT_LENGTH=0x300000" + "CFLAGS='-fdiagnostics-color=always ${mediatek_vendor_cflags_modern_gcc[*]}'" + "KCFLAGS='-fdiagnostics-color=always ${mediatek_vendor_cflags_modern_gcc[*]}'" + ) + + # Do it twice instead of trying to make idiotic _TARGET_MAP work; single target for bl2+fip doesn't work either + declare atftempdir="undetermined_atftempdir" # scope for compile_atf + # bl2.bin build + declare -g ATF_TARGET_MAP="${common_tfa_args[*]} bl2;;build/${MEDIATEK_GENIO_TFA_PLAT}/release/bl2.bin" + display_alert "ATF_TARGET_MAP: for ${BOARD} ATF compile" "${ATF_TARGET_MAP}" "info" + CLEAN_LEVEL="make-atf" compile_atf # core function; force make distclean for first build + run_host_command_logged cp -v "${atftempdir}/bl2.bin" "${uboot_build_dir}/bl2.bin" # collect from atftempdir to u-boot dir + + # fip.bin build + declare -g ATF_TARGET_MAP="${common_tfa_args[*]} fip;;build/${MEDIATEK_GENIO_TFA_PLAT}/release/fip.bin" + display_alert "ATF_TARGET_MAP: for ${BOARD} ATF compile" "${ATF_TARGET_MAP}" "info" + compile_atf # core function + run_host_command_logged cp -v "${atftempdir}/fip.bin" "${uboot_build_dir}/fip.bin" # collect from atftempdir to u-boot dir + + } + + function mediatek_genio_produce_fip() { + display_alert "Producing final FIP image" "for ${BOARD}" "info" + display_alert "Producing final FIP image" "for ${BOARD} uboot_build_dir:${uboot_build_dir}" "info" + + declare bl2_bin="${uboot_build_dir}/bl2.bin" + declare bl2_img="${uboot_build_dir}/bl2.img" + declare fip_bin="${uboot_build_dir}/fip.bin" + declare fip_img="${uboot_build_dir}/fip.img" + + declare -a mkimage_args=( + -T mtk_image + -a "${MEDIATEK_GENIO_TFA_SOC_SRAM_ADDR}" + -e "${MEDIATEK_GENIO_TFA_SOC_SRAM_ADDR}" + -n "media=${MEDIATEK_GENIO_TFA_STORAGE};arm64=1" + -d "${bl2_bin}" "${bl2_img}" + ) + run_host_command_logged "${uboot_build_dir}/tools/mkimage" "${mkimage_args[*]@Q}" + + truncate --size=1M "${bl2_img}" + + cat "${bl2_img}" "${fip_bin}" > "${fip_img}" + + # lk.bin (Little Kernel) is included in u-boot for convenience; it is not used in regular booting, + # but will be needed by users flashing the board. To support EXT=mtkflash too, as it extracts both + # fip.img and lk.bin from the image's uboot directory. + declare lk_bin="${SRC}/cache/sources/mtkbin/${MEDIATEK_GENIO_LK_BIN}" + if [[ ! -f "${lk_bin}" ]]; then + display_alert "ERROR: missing lk.bin" "for ${BOARD} Little Kernel" "error" + return 1 + fi + run_host_command_logged cp -v "${lk_bin}" "${uboot_build_dir}/lk.bin" + + # Lets also output stuff needed for flashing to ${SRC}/output/ for easier access for developers + run_host_command_logged cp -v "${fip_img}" "${SRC}/output/${BOARD}-${HOSTRELEASE}-fip.img" + run_host_command_logged cp -v "${lk_bin}" "${SRC}/output/${BOARD}-lk.bin" + + return 0 + } + # + + # control variable scope across function calls + declare uboot_build_dir="undetermined_uboot_build_dir" + declare mediatek_genio_built_bl32_full_path="undetermined_bl32" + declare mediatek_genio_built_bl33_full_path="undetermined_bl33" + + # Find the u-boot.bin produced by the u-boot build; it's needed for the ATF build + display_alert "Locating built U-Boot binary" "for ${BOARD} ATF compile" "info" + uboot_build_dir="$(pwd)" + mediatek_genio_built_bl33_full_path="${uboot_build_dir}/u-boot.bin" + run_host_command_logged ls -la "${mediatek_genio_built_bl33_full_path}" + + # Done in a subshell, as we're in u-boot build context/cwd here and would like to remain so after those builds + ( + mediatek_genio_build_optee # sets mediatek_genio_built_bl32_full_path + mediatek_genio_build_atf # uses mediatek_genio_built_bl32_full_path and mediatek_genio_built_bl33_full_path + mediatek_genio_produce_fip # uses ATF outputs in atftempdir set by compile_atf() and puts fip.img in uboot_build_dir + ) +} + +function post_config_uboot_target__downgrade_gcc_errors_to_warnings() { + declare -i gcc_major_version=0 + gcc_major_version=$(gcc -dumpversion | cut -d. -f1) + display_alert "$BOARD" "GCC major version: ${gcc_major_version}" "debug" + + if [[ ${gcc_major_version} -ge 13 ]]; then + display_alert "$BOARD" "Adding extra CFLAGS to fix vendor U-Boot building with GCC 13+" "info" + # Curb the compiler's warnings so it builds on trixie+ (original source is for bookworm) + declare -g -a mediatek_vendor_cflags_modern_gcc=(# Used for both ATF and u-boot builds, via global var + "-Wno-error=enum-int-mismatch" + "-Wno-error=int-conversion" + "-Wno-error=implicit-function-declaration" + "-Wno-error=incompatible-pointer-types" + ) + uboot_cflags_array+=("${mediatek_vendor_cflags_modern_gcc[@]}") + fi + return 0 +} + +function add_host_dependencies__genio_python3_deps_for_optee_build() { + display_alert "Preparing Genio OPTEE host-side dependencies" "for ATF/OPTEE build" "info" + declare -g EXTRA_BUILD_DEPS="${EXTRA_BUILD_DEPS} python3-cryptography python3-pyelftools" +} + +function write_uboot_platform() { + : # noop; this means `armbian-install` can't be used to flash u-boot; users must use mtkflash or similar +}