From 0166686b6a2e78aa2c8c33810af7d14ddd2da1c2 Mon Sep 17 00:00:00 2001 From: Rodrigo Arias Mallo Date: Fri, 20 Jun 2025 14:55:43 +0200 Subject: [PATCH] Add AMD uProf package and driver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-by: Aleix Boné --- pkgs/amd-uprof/default.nix | 41 ++++++++++++++++++++++ pkgs/amd-uprof/driver.nix | 33 ++++++++++++++++++ pkgs/amd-uprof/makefile.patch | 66 +++++++++++++++++++++++++++++++++++ pkgs/overlay.nix | 11 ++++++ 4 files changed, 151 insertions(+) create mode 100644 pkgs/amd-uprof/default.nix create mode 100644 pkgs/amd-uprof/driver.nix create mode 100644 pkgs/amd-uprof/makefile.patch diff --git a/pkgs/amd-uprof/default.nix b/pkgs/amd-uprof/default.nix new file mode 100644 index 00000000..08633caa --- /dev/null +++ b/pkgs/amd-uprof/default.nix @@ -0,0 +1,41 @@ +{ stdenv +, lib +, curl +, cacert +, runCommandLocal +}: + +let + version = "5.1.701"; + tarball = "AMDuProf_Linux_x64_${version}.tar.bz2"; + + uprofSrc = runCommandLocal tarball { + nativeBuildInputs = [ curl ]; + outputHash = "sha256-j9gxcBcIg6Zhc5FglUXf/VV9bKSo+PAKeootbN7ggYk="; + SSL_CERT_FILE="${cacert}/etc/ssl/certs/ca-bundle.crt"; + } '' + curl \ + -o $out \ + 'https://download.amd.com/developer/eula/uprof/uprof-5-1/${tarball}' \ + -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:139.0) Gecko/20100101 Firefox/139.0' \ + -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' \ + -H 'Accept-Language: en-US,en;q=0.5' \ + -H 'Accept-Encoding: gzip, deflate, br, zstd' \ + -H 'Referer: https://www.amd.com/' 2>&1 | tr '\r' '\n' + ''; + +in + stdenv.mkDerivation { + pname = "AMD-uProf"; + inherit version; + src = uprofSrc; + dontStrip = true; + phases = [ "installPhase" "fixupPhase" ]; + installPhase = '' + set -x + mkdir -p $out + tar -x -v -C $out --strip-components=1 -f $src + rm $out/bin/AMDPowerProfilerDriverSource.tar.gz + set +x + ''; + } diff --git a/pkgs/amd-uprof/driver.nix b/pkgs/amd-uprof/driver.nix new file mode 100644 index 00000000..7fdc16f8 --- /dev/null +++ b/pkgs/amd-uprof/driver.nix @@ -0,0 +1,33 @@ +{ stdenv +, lib +, amd-uprof +, kernel +, runCommandLocal +}: + +let + version = amd-uprof.version; + tarball = amd-uprof.src; +in stdenv.mkDerivation { + pname = "AMDPowerProfilerDriver"; + inherit version; + src = runCommandLocal "AMDPowerProfilerDriverSource.tar.gz" { } '' + set -x + tar -x -f ${tarball} AMDuProf_Linux_x64_${version}/bin/AMDPowerProfilerDriverSource.tar.gz + mv AMDuProf_Linux_x64_${version}/bin/AMDPowerProfilerDriverSource.tar.gz $out + set +x + ''; + hardeningDisable = [ "pic" "format" ]; + nativeBuildInputs = kernel.moduleBuildDependencies; + patches = [ ./makefile.patch ]; + makeFlags = [ + "KERNEL_VERSION=${kernel.modDirVersion}" + "KERNEL_DIR=${kernel.dev}/lib/modules/${kernel.modDirVersion}/build" + "INSTALL_MOD_PATH=$(out)" + ]; + meta = { + description = "AMD Power Profiler Driver"; + homepage = "https://www.amd.com/es/developer/uprof.html"; + platforms = lib.platforms.linux; + }; +} diff --git a/pkgs/amd-uprof/makefile.patch b/pkgs/amd-uprof/makefile.patch new file mode 100644 index 00000000..d1e5642f --- /dev/null +++ b/pkgs/amd-uprof/makefile.patch @@ -0,0 +1,66 @@ +--- a/Makefile 2025-06-19 20:36:49.346693267 +0200 ++++ b/Makefile 2025-06-19 20:42:29.778088660 +0200 +@@ -27,7 +27,7 @@ MODULE_VERSION=$(shell cat AMDPowerProfi + MODULE_NAME_KO=$(MODULE_NAME).ko + + # check is module inserted +-MODPROBE_OUTPUT=$(shell lsmod | grep $(MODULE_NAME)) ++#MODPROBE_OUTPUT=$(shell lsmod | grep $(MODULE_NAME)) + + # check pcore dkms status + PCORE_DKMS_STATUS=$(shell dkms status | grep $(MODULE_NAME) | grep $(MODULE_VERSION)) +@@ -50,7 +50,7 @@ endif + # “-Wno-missing-attributes” is added for GCC version >= 9.0 and kernel version <= 5.00 + G_VERSION=9 + K_VERSION=5 +-KERNEL_MAJOR_VERSION=$(shell uname -r | cut -f1 -d.) ++KERNEL_MAJOR_VERSION=$(shell echo "$(KERNEL_VERSION)" | cut -f1 -d.) + GCCVERSION = $(shell gcc -dumpversion | cut -f1 -d.) + ifeq ($(G_VERSION),$(firstword $(sort $(GCCVERSION) $(G_VERSION)))) + ifeq ($(K_VERSION),$(lastword $(sort $(KERNEL_MAJOR_VERSION) $(K_VERSION)))) +@@ -66,17 +66,7 @@ ${MODULE_NAME}-objs := src/PmcDataBuffe + + # make + all: +- @chmod a+x ./AMDPPcert.sh +- @./AMDPPcert.sh 0 1; echo $$? > $(PWD)/sign_status; +- @SIGSTATUS1=`cat $(PWD)/sign_status | tr -d '\n'`; \ +- if [ $$SIGSTATUS1 -eq 1 ]; then \ +- exit 1; \ +- fi +- @make -C /lib/modules/$(KERNEL_VERSION)/build M=$(PWD) $(MAKE_OPTS) EXTRA_CFLAGS="$(EXTRA_CFLAGS)" modules +- @SIGSTATUS3=`cat $(PWD)/sign_status | tr -d '\n'`; \ +- if [ $$SIGSTATUS3 -eq 0 ]; then \ +- ./AMDPPcert.sh 1 $(MODULE_NAME_KO); \ +- fi ++ make -C $(KERNEL_DIR) M=$(PWD) $(MAKE_OPTS) EXTRA_CFLAGS="$(EXTRA_CFLAGS)" modules + + # make clean + clean: +@@ -84,23 +74,9 @@ clean: + + # make install + install: +- @mkdir -p /lib/modules/`uname -r`/kernel/drivers/extra +- @rm -f /lib/modules/`uname -r`/kernel/drivers/extra/$(MODULE_NAME_KO) +- @cp $(MODULE_NAME_KO) /lib/modules/`uname -r`/kernel/drivers/extra/ +- @depmod -a +- @if [ ! -z "$(MODPROBE_OUTPUT)" ]; then \ +- echo "Uninstalling AMDPowerProfiler Linux kernel module.";\ +- rmmod $(MODULE_NAME);\ +- fi +- @modprobe $(MODULE_NAME) 2> $(PWD)/sign_status1; \ +- cat $(PWD)/sign_status1 | grep "Key was rejected by service"; \ +- echo $$? > $(PWD)/sign_status; SIGSTATUS1=`cat $(PWD)/sign_status | tr -d '\n'`; \ +- if [ $$SIGSTATUS1 -eq 0 ]; then \ +- echo "ERROR: Secure Boot enabled, correct key is not yet enrolled in BIOS key table"; \ +- exit 1; \ +- else \ +- cat $(PWD)/sign_status1; \ +- fi ++ mkdir -p $(INSTALL_MOD_PATH)/lib/modules/$(KERNEL_VERSION)/kernel/drivers/extra/ ++ cp -a $(MODULE_NAME_KO) $(INSTALL_MOD_PATH)/lib/modules/$(KERNEL_VERSION)/kernel/drivers/extra/ ++ + # make dkms + dkms: + @chmod a+x ./AMDPPcert.sh diff --git a/pkgs/overlay.nix b/pkgs/overlay.nix index 9d3c9601..4198cd30 100644 --- a/pkgs/overlay.nix +++ b/pkgs/overlay.nix @@ -53,4 +53,15 @@ final: prev: meteocat-exporter = prev.callPackage ./meteocat-exporter/default.nix { }; upc-qaire-exporter = prev.callPackage ./upc-qaire-exporter/default.nix { }; cudainfo = prev.callPackage ./cudainfo/default.nix { }; + + amd-uprof = prev.callPackage ./amd-uprof/default.nix { }; + + # FIXME: Extend this to all linuxPackages variants. Open problem, see: + # https://discourse.nixos.org/t/whats-the-right-way-to-make-a-custom-kernel-module-available/4636 + linuxPackages = prev.linuxPackages.extend (_final: _prev: { + amd-uprof-driver = _prev.callPackage ./amd-uprof/driver.nix { }; + }); + linuxPackages_latest = prev.linuxPackages_latest.extend(_final: _prev: { + amd-uprof-driver = _prev.callPackage ./amd-uprof/driver.nix { }; + }); }