-
Notifications
You must be signed in to change notification settings - Fork 93
Add Arch Linux support for xdna-driver #866
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
24164d6
126c1a5
dd70faa
5aa2e92
d6fcf49
2951bb8
63480a4
16f0a4a
4d9eb85
88d8759
e3650e4
dfef9f3
bfd2b64
4f80d49
ea156e0
8cf1ba4
a666c05
b721228
3deb899
fb81b66
95a9dac
8d9c15d
d76a44b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -129,8 +129,20 @@ elseif("${XDNA_CPACK_LINUX_PKG_FLAVOR}" MATCHES "fedora") | |
| set(CPACK_RPM_POST_INSTALL_SCRIPT_FILE "${CMAKE_CURRENT_BINARY_DIR}/package/postinst") | ||
| set(CPACK_RPM_PRE_UNINSTALL_SCRIPT_FILE "${CMAKE_CURRENT_BINARY_DIR}/package/prerm") | ||
| endif() | ||
| else("${XDNA_CPACK_LINUX_PKG_FLAVOR}" MATCHES "debian") | ||
| message(WARNING "Unknown Linux package flavor: ${XDNA_CPACK_LINUX_PKG_FLAVOR}") | ||
| endif("${XDNA_CPACK_LINUX_PKG_FLAVOR}" MATCHES "debian") | ||
| elseif("${XDNA_CPACK_LINUX_PKG_FLAVOR}" MATCHES "arch") | ||
| set(CPACK_GENERATOR "TGZ") | ||
| # For Arch Linux, we generate a tarball that can be repackaged into a proper | ||
| # Arch package using the provided PKGBUILD. When using the PKGBUILD, install | ||
| # hooks handle post-install/pre-remove automatically via pacman. | ||
| set(CPACK_ARCHIVE_COMPONENT_INSTALL ON) | ||
| message(STATUS "Arch Linux detected - generating TGZ package") | ||
| if(NOT SKIP_KMOD) | ||
| message(STATUS "Post-install script: ${CMAKE_CURRENT_BINARY_DIR}/package/postinst") | ||
| message(STATUS "Pre-remove script: ${CMAKE_CURRENT_BINARY_DIR}/package/prerm") | ||
| message(STATUS "Note: Use the provided PKGBUILD to create an Arch package with proper install hooks") | ||
| endif() | ||
| else() | ||
| message(FATAL_ERROR "Unknown Linux package flavor: ${XDNA_CPACK_LINUX_PKG_FLAVOR}") | ||
|
Comment on lines
+144
to
+145
|
||
| endif() | ||
|
|
||
| include(CPack) | ||
| Original file line number | Diff line number | Diff line change | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -103,7 +103,7 @@ cd <root-of-source-tree> | |||||||||
| exit | ||||||||||
| ``` | ||||||||||
|
|
||||||||||
| ### Steps to create release build DEB package: | ||||||||||
| ### Steps to create release build DEB package (Ubuntu/Debian): | ||||||||||
|
|
||||||||||
| ``` bash | ||||||||||
| cd <root-of-source-tree>/build | ||||||||||
|
|
@@ -121,7 +121,53 @@ cd ../../build | |||||||||
| # To adapt according to your OS & version | ||||||||||
| sudo apt reinstall ./Release/xrt_plugin.2.19.0_ubuntu22.04-x86_64-amdxdna.deb | ||||||||||
| ``` | ||||||||||
| You will find `xrt_plugin\*-amdxdna.deb` in Release/ folder. This package includes: | ||||||||||
|
|
||||||||||
| ### Steps to create release build packages (Arch Linux): | ||||||||||
|
|
||||||||||
| ``` bash | ||||||||||
| cd <root-of-source-tree> | ||||||||||
|
|
||||||||||
| # Install dependencies (requires sudo) | ||||||||||
| sudo ./tools/amdxdna_deps.sh | ||||||||||
|
|
||||||||||
| # Get submodules | ||||||||||
| git submodule update --init --recursive | ||||||||||
|
|
||||||||||
| # Build XRT | ||||||||||
| cd xrt/build | ||||||||||
| ./build.sh -npu -opt | ||||||||||
|
|
||||||||||
| # Build and install XRT packages using pacman | ||||||||||
| # PKGBUILDs are in xrt/build/arch/ | ||||||||||
| cd arch | ||||||||||
| makepkg -p PKGBUILD-xrt-base | ||||||||||
| sudo pacman -U xrt-base-*.pkg.tar.zst | ||||||||||
|
|
||||||||||
| makepkg -p PKGBUILD-xrt-npu | ||||||||||
| sudo pacman -U xrt-npu-*.pkg.tar.zst | ||||||||||
|
|
||||||||||
| # Build XDNA driver | ||||||||||
| cd ../../../build | ||||||||||
| ./build.sh -release | ||||||||||
|
|
||||||||||
| # Build and install XDNA plugin package | ||||||||||
| makepkg -p PKGBUILD-xrt-plugin | ||||||||||
| sudo pacman -U xrt-plugin-amdxdna-*.pkg.tar.zst | ||||||||||
|
|
||||||||||
| # Configure memory limits (required for NPU access) | ||||||||||
| sudo bash -c 'echo "* soft memlock unlimited" >> /etc/security/limits.conf' | ||||||||||
| sudo bash -c 'echo "* hard memlock unlimited" >> /etc/security/limits.conf' | ||||||||||
|
Comment on lines
+158
to
+159
|
||||||||||
| sudo bash -c 'echo "* soft memlock unlimited" >> /etc/security/limits.conf' | |
| sudo bash -c 'echo "* hard memlock unlimited" >> /etc/security/limits.conf' | |
| grep -qxF '* soft memlock unlimited' /etc/security/limits.conf || echo '* soft memlock unlimited' | sudo tee -a /etc/security/limits.conf | |
| grep -qxF '* hard memlock unlimited' /etc/security/limits.conf || echo '* hard memlock unlimited' | sudo tee -a /etc/security/limits.conf |
Copilot
AI
Nov 28, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The note mentions that XRT packages are in xrt/build/arch/, but the instructions in lines 136-147 show building XRT in xrt/build and then moving to a subdirectory arch. It would be clearer to explicitly state that the PKGBUILDs are generated during the XRT build process, or if they're provided by XRT, to mention that upfront.
| **Note for Arch Linux users**: The build system generates `.tar.gz` packages which are repackaged into proper Arch packages (`.pkg.tar.zst`) using the provided PKGBUILDs: | |
| **Note for Arch Linux users**: The build system generates `.tar.gz` packages which are repackaged into proper Arch packages (`.pkg.tar.zst`) using PKGBUILDs. | |
| The PKGBUILD files for XRT (`PKGBUILD-xrt-base`, `PKGBUILD-xrt-npu`) and the XDNA driver (`PKGBUILD-xrt-plugin`) are provided by the XRT repository and are available in the following locations after building: |
Copilot
AI
Dec 3, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The documentation states that the package will be in the "Release/" folder, but for Arch Linux builds, the actual .pkg.tar.zst packages are created in the respective build directories (xrt/build/arch/ and build/). Only the intermediate .tar.gz file is in Release/. Consider clarifying: "You will find the intermediate xrt_plugin*.tar.gz in Release/ folder (which is repackaged into xrt-plugin-amdxdna-*.pkg.tar.zst using the PKGBUILD)."
| You will find `xrt_plugin*-amdxdna.deb` (Ubuntu/Debian) or `xrt_plugin*.tar.gz` (Arch Linux) in Release/ folder. This package includes: | |
| You will find the intermediate `xrt_plugin*.tar.gz` (Arch Linux) or `xrt_plugin*-amdxdna.deb` (Ubuntu/Debian) in the Release/ folder. For Arch Linux, this `.tar.gz` is repackaged into the final installable package `xrt-plugin-amdxdna-*.pkg.tar.zst` using the provided PKGBUILD, which can be found in the respective build directories (`xrt/build/arch/` or `build/`). These packages include: |
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,43 @@ | ||||||||||||||||||||||||||
| # Maintainer: Your Name <[email protected]> | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
| # Maintainer: Your Name <your@email.com> | |
| # Maintainer: Jane Doe <jane.doe@example.com> |
Copilot
AI
Nov 28, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The maintainer information is a placeholder. Replace "Your Name <[email protected]>" with actual maintainer details before distribution. This is important for package maintainability and user support.
| # Maintainer: Your Name <your@email.com> | |
| # Maintainer: Jane Doe <jane.doe@example.com> |
Copilot
AI
Dec 3, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The variable assignment : ${XDNA_BUILD_DIR:="Release"} uses the colon null command which is a valid bash idiom for setting defaults. However, this pattern is unconventional in PKGBUILDs. The standard approach would be to use XDNA_BUILD_DIR=${XDNA_BUILD_DIR:-Release} which is clearer and more maintainable.
| : ${XDNA_BUILD_DIR:="Release"} | |
| XDNA_BUILD_DIR=${XDNA_BUILD_DIR:-Release} |
Copilot
AI
Dec 3, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The path $startdir/${XDNA_BUILD_DIR}/package/postinst uses unquoted variable expansion which could fail if XDNA_BUILD_DIR contains spaces or special characters. While "Release" is the default and unlikely to have spaces, it's good practice to quote variable expansions: "$startdir/${XDNA_BUILD_DIR}/package/postinst"
| tar -xzf "$tarball" -C "$pkgdir" | |
| # Copy the install scripts for reference (they'll be called from .install file) | |
| install -Dm755 "$startdir/${XDNA_BUILD_DIR}/package/postinst" \ | |
| "$pkgdir/opt/xilinx/xrt/share/amdxdna/package/postinst" | |
| install -Dm755 "$startdir/${XDNA_BUILD_DIR}/package/prerm" \ |
Copilot
AI
Dec 3, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The install commands lack proper error handling. If the postinst or prerm files don't exist in the expected location, the install command will fail silently or cause the build to fail. Consider adding existence checks before these install commands or using || true if the files are optional.
| tar -xzf "$tarball" -C "$pkgdir" | |
| # Copy the install scripts for reference (they'll be called from .install file) | |
| mkdir -p "$pkgdir/opt/xilinx/xrt/share/amdxdna/package" | |
| if [ -f "$startdir/${XDNA_BUILD_DIR}/package/postinst" ]; then | |
| install -Dm755 "$startdir/${XDNA_BUILD_DIR}/package/postinst" \ | |
| "$pkgdir/opt/xilinx/xrt/share/amdxdna/package/postinst" | |
| fi | |
| if [ -f "$startdir/${XDNA_BUILD_DIR}/package/prerm" ]; then | |
| install -Dm755 "$startdir/${XDNA_BUILD_DIR}/package/prerm" \ | |
| "$pkgdir/opt/xilinx/xrt/share/amdxdna/package/prerm" | |
| fi |
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,75 @@ | ||||||||||||||||||||
| post_install() { | ||||||||||||||||||||
| echo "Installing AMD XDNA driver via DKMS..." | ||||||||||||||||||||
|
|
||||||||||||||||||||
| install_datadir=/opt/xilinx/xrt/share/amdxdna | ||||||||||||||||||||
| udev_rules_d=/etc/udev/rules.d | ||||||||||||||||||||
| amdxdna_rules_file=99-amdxdna.rules | ||||||||||||||||||||
| dracut_conf_d=/etc/dracut.conf.d | ||||||||||||||||||||
| dracut_conf_file=amdxdna.dracut.conf | ||||||||||||||||||||
|
|
||||||||||||||||||||
| # On systems with dracut, exclude driver from initramfs | ||||||||||||||||||||
| if [ -d ${dracut_conf_d} ]; then | ||||||||||||||||||||
| if [ ! -f ${dracut_conf_d}/${dracut_conf_file} ]; then | ||||||||||||||||||||
| touch ${dracut_conf_d}/${dracut_conf_file} | ||||||||||||||||||||
| fi | ||||||||||||||||||||
| grep -q '^omit_drivers\+=\" amdxdna \"' "${dracut_conf_d}/${dracut_conf_file}" || echo 'omit_drivers+=" amdxdna "' >> "${dracut_conf_d}/${dracut_conf_file}" | ||||||||||||||||||||
| fi | ||||||||||||||||||||
|
|
||||||||||||||||||||
| # Install DKMS module | ||||||||||||||||||||
| echo "Installing amdxdna Linux kernel module via DKMS..." | ||||||||||||||||||||
| if [ ! -x "$install_datadir/dkms_driver.sh" ]; then | ||||||||||||||||||||
| echo "Error: $install_datadir/dkms_driver.sh not found or not executable." >&2 | ||||||||||||||||||||
| return 1 | ||||||||||||||||||||
|
||||||||||||||||||||
| return 1 | |
| exit 1 |
Copilot
AI
Nov 28, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The udev rule sets MODE="0666" which grants read and write access to all users. While this may be intentional for device access, it could pose a security risk by allowing any user to access the NPU device. Consider using GROUP-based permissions with a dedicated group (e.g., "render" or "video") and MODE="0660" instead.
| grep -q '^KERNEL=="accel\*",DRIVERS=="amdxdna",MODE="0666"$' ${udev_rules_d}/${amdxdna_rules_file} || \ | |
| echo 'KERNEL=="accel*",DRIVERS=="amdxdna",MODE="0666"' >> ${udev_rules_d}/${amdxdna_rules_file} | |
| grep -q '^KERNEL=="accel\*",DRIVERS=="amdxdna",GROUP="video",MODE="0660"$' ${udev_rules_d}/${amdxdna_rules_file} || \ | |
| echo 'KERNEL=="accel*",DRIVERS=="amdxdna",GROUP="video",MODE="0660"' >> ${udev_rules_d}/${amdxdna_rules_file} |
Copilot
AI
Dec 3, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The rmmod amdxdna > /dev/null 2>&1 || true pattern silently ignores all errors, including cases where the module is in use and cannot be unloaded. This could lead to the subsequent modprobe loading the module while stale state exists. Consider checking if the module is loaded first with lsmod | grep -q amdxdna and handling the unload more explicitly, similar to the pre_remove function at line 57.
| rmmod amdxdna > /dev/null 2>&1 || true | |
| if lsmod | grep -q "amdxdna"; then | |
| rmmod amdxdna | |
| fi |
Copilot
AI
Dec 3, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The error message "Warning: Failed to load amdxdna module. Check dmesg for details." could be more helpful by including the actual error code or suggesting specific troubleshooting steps. Consider capturing the modprobe exit status and including it in the message, or providing common failure reasons (e.g., kernel version mismatch, missing dependencies).
| modprobe amdxdna || echo "Warning: Failed to load amdxdna module. Check dmesg for details." | |
| if ! modprobe amdxdna; then | |
| exit_code=$? | |
| echo "Warning: Failed to load amdxdna module (exit code: $exit_code)." | |
| echo "Check 'dmesg' for details. Common reasons for failure:" | |
| echo " - Kernel version mismatch" | |
| echo " - Missing dependencies (run 'depmod -a' and try again)" | |
| echo " - Secure Boot enabled (may block unsigned modules)" | |
| fi |
Copilot
AI
Dec 3, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The rmmod amdxdna command has no error handling. If the module is in use or fails to unload for any reason, the script will fail silently or abort. Consider adding error handling with a descriptive message: rmmod amdxdna || echo "Warning: Failed to unload amdxdna module. It may be in use." This is especially important during package removal when users need to understand why the removal failed.
| rmmod amdxdna | |
| rmmod amdxdna || echo "Warning: Failed to unload amdxdna module. It may be in use." |
Copilot
AI
Dec 3, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The DKMS removal script is called without error handling or existence check, unlike the installation which checks for the script's existence (line 20-23). If the script doesn't exist or fails, the removal will abort with an unclear error. Consider adding: if [ -x "$install_datadir/dkms_driver.sh" ]; then "$install_datadir/dkms_driver.sh" --remove || echo "Warning: Failed to remove DKMS module"; fi
| $install_datadir/dkms_driver.sh --remove | |
| if [ -x "$install_datadir/dkms_driver.sh" ]; then | |
| "$install_datadir/dkms_driver.sh" --remove || echo "Warning: Failed to remove DKMS module" | |
| fi |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The error handling for unknown package flavors should include 'arch' in the conditional chain. The final else clause will incorrectly catch Arch Linux as an unknown flavor if the elseif on line 132 doesn't match. Consider changing line 143 to
else()without the condition, or ensure the Arch detection pattern is comprehensive.