#!/usr/bin/env bash # SPDX-License-Identifier: (GPL-2.0-only OR MIT) # Copyright (C) 2026 Amlogic, Inc. All rights reserved ################################################################################ # Amlbian Gpu Compilation Module # # Purpose: Gpu compilation with Hook support and aml-comp integration # Provides: Gpu compilation, post-kernel driver preparation ################################################################################ set -e # Get script directory And Set env SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" AMLBIAN_DIR="$(dirname "$(dirname "${SCRIPT_DIR}")")" BASE_DIR="$(dirname "$(dirname "${AMLBIAN_DIR}")")" MODULE_BUILD_DIR="${SRC}/output/.tmp" GPU_MODE="${GPU_MODE:-vale}" GPU_ARCH="${GPU_ARCH:-valhall}" # ============================================================================== # Shared Helper Functions # ============================================================================== # ------------------------------------------------------------------------------ # Step 1: Version and Package Information Definition # ------------------------------------------------------------------------------ # Initialize common package metadata for Mali GPU (libgles) function _gpu_libgles_init_package_info() { PKG_MAINTAINER="Armbian Build " PKG_DESCRIPTION="OpenGL ES driver for Amlogic GPU with Wayland DRM support" PKG_NAME="aml-libgles-eabihf-${GPU_MODE}-wayland-drm" PKG_VERSION="1.0-r54p1" PKG_ARCH="arm64" LIB_DIR="aarch64-linux-gnu" MALI_ARCH="arm64" FILES_DIR="${SCRIPT_DIR}/files" VENDOR_DIR="${BASE_DIR}/aml-comp/vendor/amlogic/meson_mali" # 本包用软链把下列路径指向 libMali.so,其中多数同时属于 mesa/libglvnd # (libgbm1/libgbm-dev/libegl1/libgles1/libgles2)。必须用 dpkg-divert 把 # mesa 的实体让开,否则 mesa 一升级 dpkg 就报 trying to overwrite。 MESA_DIVERT_FILES="libgbm.so libgbm.so.1 libgbm.so.1.0.0 \ libEGL.so libEGL.so.1 libEGL.so.1.4.0 \ libGLESv2.so libGLESv2.so.2 libGLESv2.so.2.1.0 \ libGLESv1_CM.so libGLESv1_CM.so.1 libGLESv1_CM.so.1.1.0" # 必须在 ldconfig 搜索路径之外。若把 mesa 的 libgbm.so.1.0.0 留在 # /usr/lib/${LIB_DIR} 下(哪怕改名),ldconfig 会按 SONAME 把 libgbm.so.1 # 抢回去指向 mesa —— libMali.so 的 SONAME 是 libMali.so,ldconfig 不认它 # 是 libgbm.so.1 的提供者。/usr/lib 的子目录不会被 ldconfig 递归扫描。 MESA_DIVERT_DIR="/usr/lib/mesa-gbm-diverted" } # Initialize common package metadata for kernel module function _gpu_kernel_init_package_info() { PKG_MAINTAINER="Armbian Build " PKG_DESCRIPTION="GPU kernel modules for Amlogic SoCs" PKG_NAME="aml-gpu-${GPU_ARCH}-kernel" DIR_VERSION="r54p1" PKG_VERSION="1.0-r54p1" GPU_LOW_MEM="${GPU_LOW_MEM:-0}" PKG_ARCH="arm64" LIB_DIR="aarch64-linux-gnu" MALI_ARCH="arm64" } # ------------------------------------------------------------------------------ # Step 2: Build Directory Structure Setup # ------------------------------------------------------------------------------ # Create layered build directory structure # Parameters: # $1 - base name (e.g. "${PKG_NAME}_${PKG_VERSION}_${PKG_ARCH}") # Sets: MODULE_BUILD_DIR, BASE_BUILD_DIR, SOURCE_DIR, BUILD_DIR, INSTALL_DIR, PATCH_DIR, # DEB_PACKAGE_DIR, DEBIAN_DIR function _gpu_create_build_dirs() { local base_name="$1" mkdir -p "${MODULE_BUILD_DIR}" # 基础构建目录 BASE_BUILD_DIR="${MODULE_BUILD_DIR}/${base_name}" rm -rf ${BASE_BUILD_DIR} # 分层目录 SOURCE_DIR="${BASE_BUILD_DIR}/source" # 源码目录 BUILD_DIR="${BASE_BUILD_DIR}/build" # 编译目录 INSTALL_DIR="${BASE_BUILD_DIR}/install" # 安装目录 PATCH_DIR="${BASE_BUILD_DIR}/patch" # 补丁目录 # 创建所有目录 mkdir -p "${SOURCE_DIR}" mkdir -p "${BUILD_DIR}" mkdir -p "${INSTALL_DIR}" mkdir -p "${PATCH_DIR}" # 在BUILD_DIR下创建deb/包名目录 DEB_PACKAGE_DIR="${BUILD_DIR}/deb/${base_name}" mkdir -p "${DEB_PACKAGE_DIR}" # 安装目录的子目录 DEBIAN_DIR="${INSTALL_DIR}/DEBIAN" mkdir -p "${DEBIAN_DIR}" } # Create standard install subdirectories for Mali GPU libraries function _gpu_libgles_create_install_dirs() { mkdir -p "${INSTALL_DIR}/usr/include" mkdir -p "${INSTALL_DIR}/usr/lib/${LIB_DIR}" mkdir -p "${INSTALL_DIR}/usr/lib/pkgconfig" mkdir -p "${INSTALL_DIR}/usr/share/vulkan/icd.d" mkdir -p "${INSTALL_DIR}/usr/share/vulkan/implicit_layer.d" mkdir -p "${INSTALL_DIR}/lib/firmware" mkdir -p "${INSTALL_DIR}/etc" } # ------------------------------------------------------------------------------ # Step 3: Debian Packaging Scripts Creation # ------------------------------------------------------------------------------ # Create Debian control file # Parameters: # $1 - package name # $2 - package version # $3 - package architecture # $4 - maintainer # $5 - description # $6 - dependencies (optional) # $7 - conflicts (optional) # $8 - provides (optional) # $9 - section (optional, default "libs") function _gpu_create_control_file() { local pkg_name="$1" local pkg_version="$2" local pkg_arch="$3" local maintainer="$4" local description="$5" local depends="${6:-}" local conflicts="${7:-}" local provides="${8:-}" local section="${9:-libs}" local replaces="${10:-}" aml_log info "COMPILE-GPU Creating control file DEBIAN/control" cat > "${DEBIAN_DIR}/control" <> "${DEBIAN_DIR}/control" fi cat >> "${DEBIAN_DIR}/control" < "${DEBIAN_DIR}/preinst" << EOF #!/bin/sh set -e LIBDIR=/usr/lib/${LIB_DIR} STASH=${MESA_DIVERT_DIR} PKG=${PKG_NAME} FILES="${MESA_DIVERT_FILES}" if [ "\$1" = "install" ] || [ "\$1" = "upgrade" ]; then mkdir -p "\$STASH" for f in \$FILES; do # 已经有同样的 diversion 就跳过(升级场景) if dpkg-divert --list "\$LIBDIR/\$f" 2>/dev/null | grep -q "to \$STASH/\$f by"; then continue fi # 真实路径上如果是 mesa 的实体,--rename 把它挪进 STASH 腾出位置; # 如果已经是指向 libMali.so 的软链(本包旧版本留下的),就不要搬。 if [ -e "\$LIBDIR/\$f" ] && [ "\$(readlink -f "\$LIBDIR/\$f")" != "\$LIBDIR/libMali.so" ]; then dpkg-divert --package "\$PKG" --divert "\$STASH/\$f" --rename --add "\$LIBDIR/\$f" else dpkg-divert --package "\$PKG" --divert "\$STASH/\$f" --no-rename --add "\$LIBDIR/\$f" fi done fi exit 0 EOF chmod 755 "${DEBIAN_DIR}/preinst" } # Create postrm script for Mali GPU libraries # 卸载时撤销 diversion,把 mesa 的实体搬回原位 function _gpu_libgles_create_postrm() { aml_log info "COMPILE-GPU Creating post-removal script DEBIAN/postrm" cat > "${DEBIAN_DIR}/postrm" << EOF #!/bin/sh set -e LIBDIR=/usr/lib/${LIB_DIR} STASH=${MESA_DIVERT_DIR} FILES="${MESA_DIVERT_FILES}" if [ "\$1" = "remove" ] || [ "\$1" = "purge" ]; then for f in \$FILES; do if dpkg-divert --list "\$LIBDIR/\$f" 2>/dev/null | grep -q "to \$STASH/\$f by"; then # 真实路径必须先空出来,--rename 才能把 mesa 的文件搬回 rm -f "\$LIBDIR/\$f" dpkg-divert --rename --remove "\$LIBDIR/\$f" fi done rmdir "\$STASH" 2>/dev/null || true ldconfig fi exit 0 EOF chmod 755 "${DEBIAN_DIR}/postrm" } # Create postinst script for Mali GPU libraries function _gpu_libgles_create_postinst() { aml_log info "COMPILE-GPU Creating post-installation script DEBIAN/postinst" cat > "${DEBIAN_DIR}/postinst" << EOF #!/bin/sh set -e if [ "\$1" = "configure" ]; then # Update ldconfig cache ldconfig # Set up Vulkan ICD if [ -d /usr/share/vulkan/icd.d ]; then echo "Vulkan ICD files installed" fi # Check firmware if [ ! -f /lib/firmware/mali_csffw.bin ]; then echo "Warning: Mali firmware not found at /lib/firmware/mali_csffw.bin" >&2 fi if [ -f /usr/lib/${LIB_DIR}/libEGL.so.1.1.0 ]; then rm /usr/lib/${LIB_DIR}/libEGL.so.1.1.0 echo "remove libEGL.so.1.1.0" >&2 fi # Create symlinks if they don't exist if [ -f /usr/lib/${LIB_DIR}/libMali.so ]; then cd /usr/lib/${LIB_DIR} # Remove existing symlinks if they're broken for lib in libEGL.so libGLESv1_CM.so libGLESv2.so libgbm.so; do if [ -L "\${lib}" ] && [ ! -e "\${lib}" ]; then rm -f "\${lib}" echo "rm lib \${lib}" fi done # Create symlinks ln -sf libMali.so libEGL.so.1.4.0 2>/dev/null || true ln -sf libEGL.so.1.4.0 libEGL.so.1 2>/dev/null || true ln -sf libEGL.so.1 libEGL.so 2>/dev/null || true ln -sf libMali.so libGLESv1_CM.so.1.1.0 2>/dev/null || true ln -sf libGLESv1_CM.so.1.1.0 libGLESv1_CM.so.1 2>/dev/null || true ln -sf libGLESv1_CM.so.1 libGLESv1_CM.so 2>/dev/null || true ln -sf libMali.so libGLESv2.so.2.1.0 2>/dev/null || true ln -sf libGLESv2.so.2.1.0 libGLESv2.so.2 2>/dev/null || true ln -f -s libGLESv2.so.2 libGLESv2.so 2>/dev/null || true ln -sf libMali.so libgbm.so.1.0.0 2>/dev/null || true ln -sf libgbm.so.1.0.0 libgbm.so.1 2>/dev/null || true ln -sf libgbm.so.1 libgbm.so 2>/dev/null || true # Update ldconfig again ldconfig ls libEGL.so* -all fi fi exit 0 EOF chmod 755 "${DEBIAN_DIR}/postinst" } # Create prerm script for Mali GPU libraries function _gpu_libgles_create_prerm() { aml_log info "COMPILE-GPU Creating pre-removal script DEBIAN/prerm" cat > "${DEBIAN_DIR}/prerm" << EOF #!/bin/sh set -e if [ "\$1" = "remove" ] || [ "\$1" = "deconfigure" ]; then # Clean up symlinks for lib in libEGL.so libGLESv1_CM.so libGLESv2.so libgbm.so; do if [ -L /usr/lib/${LIB_DIR}/\${lib} ]; then # Only remove if it points to libMali.so if [ "$(readlink -f /usr/lib/${LIB_DIR}/\${lib})" = "/usr/lib/${LIB_DIR}/libMali.so" ]; then rm -f /usr/lib/${LIB_DIR}/\${lib} fi fi done # Update ldconfig ldconfig fi exit 0 EOF chmod 755 "${DEBIAN_DIR}/prerm" } # Create postinst script for kernel modules function _gpu_kernel_create_postinst() { local kernel_version="$1" aml_log debug "COMPILE-GPU-DRIVER Creating post-installation script DEBIAN/postinst" cat > "${DEBIAN_DIR}/postinst" << EOF #!/bin/sh set -e if [ "\$1" = "configure" ]; then # Update module dependencies if [ -d "/lib/modules/${kernel_version}" ]; then depmod -a "${kernel_version}" else echo "Warning: /lib/modules/${kernel_version} not found, skipping depmod" fi # Check if module can be loaded if modprobe -n mali 2>/dev/null; then echo "GPU module can be loaded with 'modprobe mali'" fi fi exit 0 EOF chmod 755 "${DEBIAN_DIR}/postinst" } # Create prerm script for kernel modules function _gpu_kernel_create_prerm() { aml_log debug "COMPILE-GPU-DRIVER Creating pre-removal script DEBIAN/prerm" cat > "${DEBIAN_DIR}/prerm" << EOF #!/bin/sh set -e if [ "\$1" = "remove" ] || [ "\$1" = "deconfigure" ]; then # Unload module if loaded if lsmod | grep -q "mali"; then modprobe -r mali 2>/dev/null || true fi fi exit 0 EOF chmod 755 "${DEBIAN_DIR}/prerm" } # ------------------------------------------------------------------------------ # Step 4: Source/Vendor File Copying # ------------------------------------------------------------------------------ # Copy Mali GPU vendor binaries to install directory function _gpu_libgles_copy_vendor_files() { aml_log debug "COMPILE-GPU Copying files from vendor binaries ${VENDOR_DIR}" # Copy headers if [[ -d "${VENDOR_DIR}/include" ]]; then cp -r "${VENDOR_DIR}/include/"* "${INSTALL_DIR}/usr/include/" aml_log debug "COMPILE-GPU Copied headers EGL, GLES, GLES2, GLES3, KHR" else aml_log error "COMPILE-GPU Headers not found ${VENDOR_DIR}/include" fi # Select main library file based on GPU_MODEL (GPU_MODE) and machine arch # 对应 OE recipe: GPU_MODEL=gondul 时按 MACHINE_ARCH 选择, # mesong12b* 用 libMali_dmaheap.so, 其余机器用 libMali_r1p0_dmaheap.so # amlbian 中 MACHINE_ARCH 等价物为 BOARDFAMILY (如 meson-t6x) local mali_lib_name="" case "${GPU_MODE}" in gondul) case "${MACHINE_ARCH:-${BOARDFAMILY}}" in mesong12b*) mali_lib_name="libMali_dmaheap.so" ;; *) mali_lib_name="libMali_r1p0_dmaheap.so" ;; esac ;; *) mali_lib_name="libMali_dmaheap.so" ;; esac aml_log debug "COMPILE-GPU GPU_MODE ${GPU_MODE} MACHINE_ARCH ${MACHINE_ARCH:-${BOARDFAMILY}} uses main library ${mali_lib_name}" # Copy library if [[ -f "${VENDOR_DIR}/lib/${MALI_ARCH}/${GPU_MODE}/r54p1/wayland/drm/${mali_lib_name}" ]]; then cp "${VENDOR_DIR}/lib/${MALI_ARCH}/${GPU_MODE}/r54p1/wayland/drm/${mali_lib_name}" \ "${INSTALL_DIR}/usr/lib/${LIB_DIR}/libMali.so" aml_log debug "COMPILE-GPU Copied main library libMali.so" else # Try alternative path if [[ -f "${VENDOR_DIR}/lib/${MALI_ARCH}/${GPU_MODE}/r54p1/wayland/drm/libMali.so" ]]; then cp "${VENDOR_DIR}/lib/${MALI_ARCH}/${GPU_MODE}/r54p1/wayland/drm/libMali.so" "${INSTALL_DIR}/usr/lib/${LIB_DIR}/" aml_log debug "COMPILE-GPU Copied main library (alternative path) libMali.so" else aml_log error "COMPILE-GPU Main library not found libMali.so" exit 1 fi fi # Copy pkgconfig files if [[ -d "${VENDOR_DIR}/lib/pkgconfig" ]]; then cp -r "${VENDOR_DIR}/lib/pkgconfig/"* "${INSTALL_DIR}/usr/lib/pkgconfig/" aml_log info "COMPILE-GPU Copied pkgconfig files *.pc" fi # Copy Vulkan files if [[ -d "${VENDOR_DIR}/lib/${MALI_ARCH}/vulkan/r54p1/icd.d" ]]; then cp -r "${VENDOR_DIR}/lib/${MALI_ARCH}/vulkan/r54p1/icd.d/"* "${INSTALL_DIR}/usr/share/vulkan/icd.d" aml_log info "COMPILE-GPU Copied Vulkan files ICD" fi if [[ -d "${VENDOR_DIR}/lib/${MALI_ARCH}/vulkan/r54p1/implicit_layer.d" ]]; then cp -r "${VENDOR_DIR}/lib/${MALI_ARCH}/vulkan/r54p1/implicit_layer.d/"* "${INSTALL_DIR}/usr/share/vulkan/implicit_layer.d" aml_log info "COMPILE-GPU Copied Vulkan files implicit layers" fi if [[ "${GPU_MODE}" != "gondul" ]]; then # Copy firmware if [[ -f "${VENDOR_DIR}/lib/firmware/${GPU_MODE}/r54p1/mali_csffw.bin" ]]; then cp "${VENDOR_DIR}/lib/firmware/${GPU_MODE}/r54p1/mali_csffw.bin" "${INSTALL_DIR}/lib/firmware/" aml_log info "COMPILE-GPU Copied firmware mali_csffw.bin" else aml_log error "COMPILE-GPU Firmware not found mali_csffw.bin" fi # Copy configuration file if [[ -f "${VENDOR_DIR}/etc/aml_afrc_allowlist.config" ]]; then cp "${VENDOR_DIR}/etc/aml_afrc_allowlist.config" "${INSTALL_DIR}/etc/" aml_log info "COMPILE-GPU Copied configuration file aml_afrc_allowlist.config" elif [[ -f "${FILES_DIR}/aml_afrc_allowlist.config" ]]; then cp "${FILES_DIR}/aml_afrc_allowlist.config" "${INSTALL_DIR}/etc/" aml_log info "COMPILE-GPU Copied configuration file from extension aml_afrc_allowlist.config" fi fi # Copy mali_platform.config if [ "${RT_LINUX}" = "yes" ]; then if [[ -f "${VENDOR_DIR}/etc/mali_platform.config" ]]; then cp "${VENDOR_DIR}/etc/mali_platform.config" "${INSTALL_DIR}/etc/" display_alert "COMPILE-GPU Copied configuration file mali_platform.config" "info" elif [[ -f "${FILES_DIR}/mali_platform.config" ]]; then cp "${FILES_DIR}/mali_platform.config" "${INSTALL_DIR}/etc/" display_alert "COMPILE-GPU Copied configuration file from extension mali_platform.config" "info" fi fi } # ------------------------------------------------------------------------------ # Step 5: Symlink Creation (Mali GPU libraries only) # ------------------------------------------------------------------------------ # Create Mali GPU library symlinks in the install directory function _gpu_libgles_create_symlinks() { aml_log debug "COMPILE-GPU Creating symlinks in package libMali.so -> libEGL.so, etc." cd "${INSTALL_DIR}/usr/lib/${LIB_DIR}" ln -sf libMali.so libEGL.so.1.4.0 ln -sf libEGL.so.1.4.0 libEGL.so.1 ln -sf libEGL.so.1 libEGL.so ln -sf libMali.so libGLESv1_CM.so.1.1.0 ln -sf libGLESv1_CM.so.1.1.0 libGLESv1_CM.so.1 ln -sf libGLESv1_CM.so.1 libGLESv1_CM.so ln -sf libMali.so libGLESv2.so.2.1.0 ln -sf libGLESv2.so.2.1.0 libGLESv2.so.2 ln -sf libGLESv2.so.2 libGLESv2.so ln -sf libMali.so libgbm.so.1.0.0 ln -sf libgbm.so.1.0.0 libgbm.so.1 ln -sf libgbm.so.1 libgbm.so cd - > /dev/null } # ------------------------------------------------------------------------------ # Step 6: Debian Package Building # ------------------------------------------------------------------------------ # Build Debian package from install directory # Parameters: # $1 - log prefix (e.g. "COMPILE-GPU" or "COMPILE-GPU-DRIVER") # $2 - output deb filename (without path) # Sets: OUTPUT_DEB function _gpu_build_deb_package() { local log_prefix="$1" local output_deb_name="$2" # 将install目录内容拷贝到deb目录 aml_log debug "Copying install directory to deb package directory ${log_prefix}" cp -r "${INSTALL_DIR}/"* "${DEB_PACKAGE_DIR}/" 2>&1 # 基于deb目录打包 aml_log info "Building Debian package from deb directory ${log_prefix}" dpkg-deb --build "${DEB_PACKAGE_DIR}" 2>&1 # Move to output directory OUTPUT_DEB="${SRC}/output/${output_deb_name}" mkdir -p "$(dirname "${OUTPUT_DEB}")" mv "${DEB_PACKAGE_DIR}.deb" "${OUTPUT_DEB}" aml_log info "${log_prefix} Package built successfully ${output_deb_name}" aml_log debug "${log_prefix} Build directory preserved ${BASE_BUILD_DIR}" } # Display build directory info # Parameters: # $1 - log prefix function _gpu_display_build_info() { local log_prefix="$1" aml_log info "${log_prefix} Source dir: ${SOURCE_DIR}" aml_log info "${log_prefix} Build dir: ${BUILD_DIR}" aml_log info "${log_prefix} Install dir: ${INSTALL_DIR}" aml_log info "${log_prefix} Patch dir: ${PATCH_DIR}" aml_log info "${log_prefix} Deb package dir: ${DEB_PACKAGE_DIR}" } # ============================================================================== # Main Build Functions (Entry Points - DO NOT RENAME) # ============================================================================== # ------------------------------------------------------------------------------ # Mali GPU Library Build (libgles) # Entry point: amlbian_build_libgles # ------------------------------------------------------------------------------ function amlbian_build_libgles() { # ---- Step 1: Version and Package Information ---- _gpu_libgles_init_package_info # amlbian_checkout_toolchain # ---- Step 2: Build Directory Setup ---- _gpu_create_build_dirs "${PKG_NAME}_${PKG_VERSION}_${PKG_ARCH}" _gpu_libgles_create_install_dirs # Display info aml_log info "COMPILE-GPU Building GLES driver package version ${PKG_VERSION} for ${PKG_ARCH}" _gpu_display_build_info "COMPILE-GPU" # ---- Step 3: Debian Packaging Scripts ---- _gpu_create_control_file \ "${PKG_NAME}" "${PKG_VERSION}" "${PKG_ARCH}" "${PKG_MAINTAINER}" \ "${PKG_DESCRIPTION}" \ "libdrm2, libwayland-client0, libwayland-server0, libwayland-egl1" \ "libmali-valhall-g610-g6p0, libmali-bifrost-g31-g13p0" \ "libegl1, libgles1, libgles2, libgbm1" \ "libs" \ "libgbm1, libgbm-dev, libegl1, libegl-dev, libgles1, libgles2, libgles-dev" _gpu_libgles_create_preinst _gpu_libgles_create_postinst _gpu_libgles_create_prerm _gpu_libgles_create_postrm # ---- Step 4: Copy Source/Vendor Files ---- _gpu_libgles_copy_vendor_files # ---- Step 5: Create Symlinks ---- _gpu_libgles_create_symlinks # Remove wayland-egl files (as per original recipe) aml_log info "COMPILE-GPU Removing wayland-egl files as per original recipe" rm -f "${INSTALL_DIR}/usr/lib/${LIB_DIR}/libwayland-egl"* 2>/dev/null || true find "${INSTALL_DIR}/usr/lib/pkgconfig" -name "wayland-egl.pc" -delete 2>/dev/null || true # ---- Step 6: Build Debian Package ---- _gpu_build_deb_package "COMPILE-GPU" "${PKG_NAME}_${PKG_VERSION}_${PKG_ARCH}.deb" return 0 } # ------------------------------------------------------------------------------ # GPU Kernel Module Build # ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------ # Shared helper: Build kernel modules in a temp directory # Parameters: # $1 - kernel build directory # $2 - driver source path # $3 - include path # $4 - build output directory # $5 - extra cflags # Outputs: sets MALI_KO_SRC, PMA_KO_SRC # ------------------------------------------------------------------------------ function _gpu_build_kernel_modules() { local kernel_build_dir="$1" local drv_src="$2" local inc_dir="$3" local build_out_dir="$4" local extra_cflags="$5" local module_build_dir="${build_out_dir}/module_build" mkdir -p "${module_build_dir}" aml_log info "COMPILE-GPU-DRIVER Copying source files to build directory to avoid pollution" cp -r "${drv_src}" "${module_build_dir}/" cp -r "${inc_dir}" "${module_build_dir}/" local build_drv_src="${module_build_dir}/drivers" local build_inc_dir="${module_build_dir}/include" aml_log info "COMPILE-GPU-DRIVER Building GPU kernel modules in build directory kernel_build_dir ${kernel_build_dir} build_drv_src ${build_drv_src} extra_cflags ${extra_cflags} build_inc_dir ${build_inc_dir}" # bifrost(gondul): M 指向 gpu/arm/midgard, 只编 mali_kbase, 无 CSF/PMA # valhall(vale): 保持原有逻辑, M 指向 drivers 根目录, 编 mali_kbase + protected_memory_allocator if [[ "${GPU_MODE}" == "gondul" ]]; then make -C "${kernel_build_dir}" M="${build_drv_src}/gpu/arm/midgard" \ EXTRA_CFLAGS="${extra_cflags} -I${build_inc_dir}" \ CONFIG_MALI_MIDGARD=m \ CONFIG_MALI_MIDGARD_DVFS=y \ ARCH=arm64 \ CROSS_COMPILE=${CROSS_COMPILE:-aarch64-linux-gnu-} \ CONFIG_MALI_GATOR_SUPPORT=y \ CONFIG_MALI_REAL_HW=y \ CONFIG_MALI_PLATFORM_NAME="devicetree" \ modules else make -C "${kernel_build_dir}" M="${build_drv_src}" \ EXTRA_CFLAGS="${extra_cflags} -I${build_inc_dir}" \ CONFIG_MALI_MIDGARD=m \ CONFIG_MALI_DEVFREQ=y \ ARCH=arm64 \ CROSS_COMPILE=${CROSS_COMPILE:-aarch64-linux-gnu-} \ CONFIG_MALI_GATOR_SUPPORT=y \ CONFIG_MALI_REAL_HW=y \ CONFIG_MALI_CSF_SUPPORT=y \ CONFIG_MALI_PROTECTED_MEMORY_ALLOCATOR=y \ CONFIG_MALI_PLATFORM_NAME="devicetree" \ modules fi MALI_KO_SRC="${build_drv_src}/gpu/arm/midgard/mali_kbase.ko" PMA_KO_SRC="${build_drv_src}/base/arm/protected_memory_allocator/protected_memory_allocator.ko" if [[ "${GPU_MODE}" == "gondul" ]]; then PMA_KO_SRC="" fi if [[ ! -f "${MALI_KO_SRC}" ]]; then aml_log error "COMPILE-GPU-DRIVER Module build failed. Missing mali_kbase.ko" exit 1 fi if [[ -n "${PMA_KO_SRC}" && ! -f "${PMA_KO_SRC}" ]]; then aml_log error "COMPILE-GPU-DRIVER Module build failed. Missing .ko files" exit 1 fi aml_log info "COMPILE-GPU-DRIVER" "Modules build successfully" # Return the module build dir for cleanup echo "${module_build_dir}" } # ------------------------------------------------------------------------------ # Shared helper: Install kernel modules to install directory # Parameters: # $1 - module directory under INSTALL_DIR # $2 - mali.ko source path # $3 - protected_memory_allocator.ko source path # ------------------------------------------------------------------------------ function _gpu_install_kernel_modules() { local module_dir="$1" local mali_ko_src="$2" local pma_ko_src="$3" aml_log debug "COMPILE-GPU-DRIVER Installing modules to ${module_dir}" install -m 0644 "${mali_ko_src}" "${module_dir}/mali.ko" # bifrost(gondul) 无 protected_memory_allocator 模块, pma_ko_src 为空时跳过 if [[ -n "${pma_ko_src}" ]]; then install -m 0644 "${pma_ko_src}" "${module_dir}/protected_memory_allocator.ko" fi } # ------------------------------------------------------------------------------ # GPU Kernel Module Build # Entry point: amlbian_build_gpu_driver # ------------------------------------------------------------------------------ function amlbian_build_gpu_driver() { set -e # ---- Step 1: Version and Package Information ---- _gpu_kernel_init_package_info # amlbian_checkout_toolchain # Source directories local gpu_src_dir="${BASE_DIR}/aml-comp/hardware/arm/gpu/${GPU_ARCH}/${DIR_VERSION}/kernel" local gpu_drv_src="${gpu_src_dir}/drivers" local gpu_inc_dir="${gpu_src_dir}/include" if [[ ! -d "${gpu_drv_src}" || ! -d "${gpu_inc_dir}" ]]; then aml_log error "COMPILE-GPU-DRIVER GPU source code not found. Expected at: ${gpu_src_dir}" exit 1 fi local kernel_version kernel_version=$(make -s -C "${BASE_DIR}/aml-comp/kernel/aml-6.12/build" kernelrelease 2>/dev/null || true) kernel_version="${kernel_version:-unknown-$(date +%Y%m%d)}" aml_log info "COMPILE-GPU-DRIVER Building GPU kernel modules version ${PKG_VERSION} for ${PKG_ARCH}" aml_log info "COMPILE-GPU-DRIVER Building for kernel version ${kernel_version}" # ---- Step 2: Build Directory Setup ---- _gpu_create_build_dirs "${PKG_NAME}_${PKG_VERSION}_${PKG_ARCH}" local module_dir="${INSTALL_DIR}/lib/modules/${kernel_version}/kernel/drivers/arm/gpu" mkdir -p "${module_dir}" _gpu_display_build_info "COMPILE-GPU-DRIVER" # Copy source to source directory aml_log debug "COMPILE-GPU-DRIVER Copying source files to source directory" cp -r "${gpu_drv_src}" "${SOURCE_DIR}/drivers" cp -r "${gpu_inc_dir}" "${SOURCE_DIR}/include" local kernel_build_dir="${BASE_DIR}/aml-comp/kernel/aml-6.12/build" aml_log debug "COMPILE-GPU-DRIVER kernel_build_dir ${kernel_build_dir}" # ---- Step 3: Debian Packaging Scripts ---- _gpu_create_control_file \ "${PKG_NAME}" "${PKG_VERSION}" "${PKG_ARCH}" "${PKG_MAINTAINER}" \ "${PKG_DESCRIPTION}" "" "" "" "kernel" _gpu_kernel_create_postinst "${kernel_version}" _gpu_kernel_create_prerm # ---- Step 4: Build Kernel Modules ---- # bifrost(gondul): MIDGARD_DVFS; valhall(vale): 保持原有 DEVFREQ + CSF if [[ "${GPU_MODE}" == "gondul" ]]; then local extra_cflags="-DCONFIG_MALI_MIDGARD_DVFS -DCONFIG_MALI_GATOR_SUPPORT=y -DCONFIG_MALI_REAL_HW" else local extra_cflags="-DCONFIG_MALI_DEVFREQ -DCONFIG_MALI_GATOR_SUPPORT -DCONFIG_MALI_CSF_SUPPORT -DCONFIG_MALI_REAL_HW" fi extra_cflags="${extra_cflags} -I${gpu_inc_dir} -DCONFIG_MALI_LOW_MEM=${GPU_LOW_MEM}" local module_build_dir module_build_dir=$(_gpu_build_kernel_modules \ "${kernel_build_dir}" "${gpu_drv_src}" "${gpu_inc_dir}" \ "${BUILD_DIR}" "${extra_cflags}") MALI_KO_SRC="${BUILD_DIR}/module_build/drivers/gpu/arm/midgard/mali_kbase.ko" PMA_KO_SRC="${BUILD_DIR}/module_build/drivers/base/arm/protected_memory_allocator/protected_memory_allocator.ko" if [[ "${GPU_MODE}" == "gondul" ]]; then PMA_KO_SRC="" fi aml_log debug "COMPILE-GPU-DRIVER MALI_KO_SRC ${MALI_KO_SRC} PMA_KO_SRC ${PMA_KO_SRC}" _gpu_install_kernel_modules "${module_dir}" "${MALI_KO_SRC}" "${PMA_KO_SRC}" # Clean up temporary build directory rm -rf "${BUILD_DIR}/module_build" # ---- Step 5: Build Debian Package ---- _gpu_build_deb_package "COMPILE-GPU-DRIVER" "${PKG_NAME}_${PKG_VERSION}_${kernel_version}_${PKG_ARCH}.deb" aml_log info "COMPILE-GPU-DRIVER GPU modules build completed. Successfully built for ${PKG_ARCH} with kernel ${kernel_version}" return 0 } function amlbian_build_gpu() { if ! is_unit_enabled "gpu"; then aml_log info "[SKIP] >> Gpu disable in BUILD_UNITS" return fi amlbian_build_libgles amlbian_build_gpu_driver } aml_log info "AMLbian gpu Build Script" "Version: ${KERNEL_VERSION} GPU_MODE : ${GPU_MODE}, GPU_ARCH: ${GPU_ARCH}, Board: ${BOARD}" amlbian_build_gpu aml_log info "AMLOGIC: gpu build completed" "${OUTPUT_DIR}"