Files
BPI-CM9-Linux/amlbian/scripts/gpu/build-gpu.sh
T

798 lines
30 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 <build@armbian.com>"
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 <build@armbian.com>"
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" <<EOF
Package: ${pkg_name}
Version: ${pkg_version}
Architecture: ${pkg_arch}
Maintainer: ${maintainer}
Depends: ${depends}
Conflicts: ${conflicts}
Provides: ${provides}
Section: ${section}
Priority: optional
EOF
# Replaces 只在非空时写入。不要加 Conflicts: libgbm1 —— mesa 各包对它是
# 精确版本依赖,Conflicts 会导致 apt 连带卸掉整套 mesa/gnome。
if [[ -n "${replaces}" ]]; then
echo "Replaces: ${replaces}" >> "${DEBIAN_DIR}/control"
fi
cat >> "${DEBIAN_DIR}/control" <<EOF
Description: ${description}
EOF
}
# Create preinst script for Mali GPU libraries
#
# 在解包之前把 mesa 拥有的同名文件 divert 走,本包的软链才能干净地占用真实
# 路径;之后 mesa 再升级,它的文件会落到 ${MESA_DIVERT_DIR},不会覆盖 Mali。
function _gpu_libgles_create_preinst() {
aml_log info "COMPILE-GPU Creating pre-installation script DEBIAN/preinst"
cat > "${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}"