This repository has been archived on 2026-08-19. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
ROCm-Research-Archive/scripts/04_build_patched_module.sh
2026-08-20 00:45:43 +02:00

198 lines
7.8 KiB
Bash

#!/bin/bash
# =============================================================================
# Step 4: Download CachyOS Kernel Source, Patch & Build amdgpu Module
# =============================================================================
# CRITICAL: Must use CachyOS kernel source (NOT vanilla kernel.org source).
# Vanilla source has different struct layouts → NULL pointer crash.
#
# This script:
# 1. Detects current kernel version
# 2. Downloads matching CachyOS source PKGBUILD
# 3. Extracts and prepares the source tree
# 4. Applies 3 BC-250 patches (GFXOFF, KIQ bypass, dead-GPU detection)
# 5. Builds ONLY the amdgpu.ko module (not the entire kernel)
# 6. Strips debug symbols and compresses with zstd
#
# Run as: bash 04_build_patched_module.sh [build_dir]
# Default build_dir: ~/kernel-build
#
# Prerequisites:
# - CachyOS with ROCm packages installed
# - base-devel, asp/pkgctl, clang, llvm, lld installed
# =============================================================================
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
GUIDE_DIR="$(dirname "$SCRIPT_DIR")"
PATCHES_DIR="$GUIDE_DIR/patches"
BUILD_DIR="${1:-$HOME/kernel-build}"
KERNEL_VER="$(uname -r)"
echo "============================================"
echo " Building Patched amdgpu Module for BC-250"
echo "============================================"
echo ""
echo " Kernel: $KERNEL_VER"
echo " Build dir: $BUILD_DIR"
echo " Patches: $PATCHES_DIR"
echo ""
# ─────────────────────────────────────────────
# 1. Install Build Dependencies
# ─────────────────────────────────────────────
echo "[1/7] Installing build dependencies..."
sudo pacman -S --needed --noconfirm base-devel asp clang llvm lld bc cpio
# ─────────────────────────────────────────────
# 2. Create Build Directory
# ─────────────────────────────────────────────
echo "[2/7] Creating build directory..."
mkdir -p "$BUILD_DIR"
cd "$BUILD_DIR"
# ─────────────────────────────────────────────
# 3. Get CachyOS Kernel Source
# ─────────────────────────────────────────────
echo "[3/7] Getting CachyOS kernel source..."
# Extract base version from running kernel (e.g., 6.19.6-2-cachyos → 6.19.6)
BASE_VER=$(echo "$KERNEL_VER" | sed 's/-.*//')
echo " Base kernel version: $BASE_VER"
# Try to get the PKGBUILD via asp (Arch Source Package)
if command -v pkgctl &>/dev/null; then
echo " Using pkgctl to fetch source..."
pkgctl repo clone --protocol=https linux-cachyos 2>/dev/null || true
elif command -v asp &>/dev/null; then
echo " Using asp to fetch source..."
asp checkout linux-cachyos 2>/dev/null || true
fi
# If asp/pkgctl didn't work, try direct download
if [[ ! -d linux-cachyos ]]; then
echo " Trying CachyOS GitHub..."
if command -v git &>/dev/null; then
git clone --depth 1 https://github.com/CachyOS/linux-cachyos.git 2>/dev/null || true
fi
fi
if [[ ! -d linux-cachyos ]]; then
echo ""
echo " ERROR: Could not fetch CachyOS kernel source automatically."
echo " Please manually download the CachyOS kernel source matching $KERNEL_VER"
echo " and place it in $BUILD_DIR/linux-cachyos/"
echo ""
echo " Options:"
echo " 1. pkgctl repo clone --protocol=https linux-cachyos"
echo " 2. git clone https://github.com/CachyOS/linux-cachyos.git"
echo " 3. Download from https://github.com/CachyOS/linux-cachyos/releases"
exit 1
fi
cd linux-cachyos
# Run makepkg to download and extract source (don't build yet)
echo " Extracting source (makepkg --nobuild)..."
makepkg --nobuild --skippgpcheck 2>&1 | tail -5
# Find the extracted source directory
SRC_DIR=$(find . -maxdepth 2 -name "drivers" -type d | head -1 | sed 's|/drivers$||')
if [[ -z "$SRC_DIR" ]]; then
SRC_DIR=$(find "$BUILD_DIR" -maxdepth 3 -name "Kconfig" -path "*/linux-*" | head -1 | xargs dirname 2>/dev/null || true)
fi
if [[ -z "$SRC_DIR" || ! -d "$SRC_DIR" ]]; then
echo " ERROR: Could not find extracted kernel source."
echo " Look for a linux-* directory under $BUILD_DIR/linux-cachyos/src/"
exit 1
fi
echo " Source dir: $SRC_DIR"
AMDGPU_DIR="$SRC_DIR/drivers/gpu/drm/amd/amdgpu"
if [[ ! -d "$AMDGPU_DIR" ]]; then
echo " ERROR: amdgpu source not found at $AMDGPU_DIR"
exit 1
fi
# ─────────────────────────────────────────────
# 4. Prepare Build Environment
# ─────────────────────────────────────────────
echo "[4/7] Preparing build environment..."
cd "$SRC_DIR"
# Copy running kernel's config
zcat /proc/config.gz > .config 2>/dev/null || cp /boot/config-"$KERNEL_VER" .config 2>/dev/null || true
if [[ ! -f .config ]]; then
echo " ERROR: Could not find kernel config"
exit 1
fi
# Prepare the build environment
make LLVM=1 olddefconfig
make LLVM=1 modules_prepare
# ─────────────────────────────────────────────
# 5. Apply BC-250 Patches
# ─────────────────────────────────────────────
echo "[5/7] Applying BC-250 patches..."
echo " Applying patch 1: GFXOFF disable (gfx_v10_0.c)..."
python3 "$PATCHES_DIR/patch1_gfxoff.py" "$AMDGPU_DIR"
echo " Applying patch 2: KIQ bypass + dead-GPU (gmc_v10_0.c)..."
python3 "$PATCHES_DIR/patch2_gmc.py" "$AMDGPU_DIR"
echo " Applying patch 3: KIQ bypass + dead-GPU (amdgpu_gmc.c)..."
python3 "$PATCHES_DIR/patch3_amdgpu_gmc.py" "$AMDGPU_DIR"
echo " All patches applied."
# ─────────────────────────────────────────────
# 6. Build the amdgpu Module
# ─────────────────────────────────────────────
echo "[6/7] Building amdgpu module (LLVM=1)..."
echo " This may take several minutes..."
# Get number of CPU cores for parallel build
NPROC=$(nproc)
echo " Using $NPROC parallel jobs"
make LLVM=1 -j"$NPROC" M=drivers/gpu/drm/amd/amdgpu modules 2>&1 | tail -20
# Check build result
MODULE="drivers/gpu/drm/amd/amdgpu/amdgpu.ko"
if [[ ! -f "$MODULE" ]]; then
echo " ERROR: Build failed — amdgpu.ko not found"
echo " Check the build output above for errors."
exit 1
fi
echo " Build successful!"
ls -lh "$MODULE"
# ─────────────────────────────────────────────
# 7. Strip and Compress
# ─────────────────────────────────────────────
echo "[7/7] Stripping debug symbols and compressing..."
strip --strip-debug "$MODULE"
zstd -f --rm "$MODULE" -o "${MODULE}.zst"
FINAL_MODULE="${MODULE}.zst"
echo " Final module: $FINAL_MODULE"
ls -lh "$FINAL_MODULE"
echo ""
echo "============================================"
echo " Module built successfully!"
echo "============================================"
echo ""
echo " Module: $(realpath "$FINAL_MODULE")"
echo " Size: $(du -h "$FINAL_MODULE" | cut -f1)"
echo ""
echo "Next: Run 05_install_module.sh to install and reboot"
echo " bash $SCRIPT_DIR/05_install_module.sh $(realpath "$FINAL_MODULE")"