198 lines
7.8 KiB
Bash
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")"
|