diff options
| -rw-r--r-- | nongnu/packages/nvidia.scm | 97 | ||||
| -rw-r--r-- | nongnu/services/nvidia.scm | 83 | ||||
| -rw-r--r-- | nonguix/transformations.scm | 6 |
3 files changed, 59 insertions, 127 deletions
diff --git a/nongnu/packages/nvidia.scm b/nongnu/packages/nvidia.scm index e075e43..d7fabd6 100644 --- a/nongnu/packages/nvidia.scm +++ b/nongnu/packages/nvidia.scm @@ -6,7 +6,7 @@ ;;; Copyright © 2021 Pierre Langlois <pierre.langlois@gmx.com> ;;; Copyright © 2022, 2023 Petr Hodina <phodina@protonmail.com> ;;; Copyright © 2022 Alexey Abramov <levenson@mmer.org> -;;; Copyright © 2022, 2023, 2024 Hilton Chain <hako@ultrarare.space> +;;; Copyright © 2022-2026 Hilton Chain <hako@ultrarare.space> (define-module (nongnu packages nvidia) #:use-module (guix packages) @@ -139,95 +139,6 @@ its unpacked checkout." ;;; -(define %nvidia-script-create-device-nodes - (program-file - "create-device-nodes.scm" - (with-imported-modules '((guix build utils)) - #~(begin - (use-modules (ice-9 regex) - (rnrs io ports) - (srfi srfi-1) - (guix build utils)) - - (define %nvidia-character-devices - (call-with-input-file "/proc/devices" - (lambda (port) - (filter-map - (lambda (line) - (if (string-contains line "nvidia") - (apply cons (reverse (string-tokenize line))) - #f)) - (string-split (get-string-all port) #\newline))))) - - (define %nvidia-driver-device-minors - (let ((device-minor-regexp (make-regexp "^Device Minor: \t (.*)"))) - (append-map - (lambda (file) - (call-with-input-file file - (lambda (port) - (filter-map - (lambda (line) - (let ((matched (regexp-exec device-minor-regexp line))) - (if matched - (match:substring matched 1) - #f))) - (string-split (get-string-all port) #\newline))))) - (find-files "/proc/driver/nvidia/gpus/" "information$")))) - - (define (create-device-node path name minor) - (let ((major - (or (assoc-ref %nvidia-character-devices name) - (assoc-ref %nvidia-character-devices "nvidia-frontend"))) - (mknod #$(file-append coreutils "/bin/mknod"))) - (system* mknod "-Zm0666" path "c" major minor))) - - (define (main args) - (case (string->symbol (first args)) - ((nvidia_modeset) - (create-device-node "/dev/nvidia-modeset" "nvidia-modeset" "254")) - ((nvidia_uvm) - (begin - (create-device-node "/dev/nvidia-uvm" "nvidia-uvm" "0") - (create-device-node "/dev/nvidia-uvm-tools" "nvidia-uvm" "1"))) - ((nvidia) - (begin - (create-device-node "/dev/nvidiactl" "nvidiactl" "255") - (for-each - (lambda (minor) - (create-device-node - (string-append "/dev/nvidia" minor) "nvidia" minor)) - %nvidia-driver-device-minors))))) - - (main (cdr (command-line))))))) - -;; Adapted from <https://github.com/Frogging-Family/nvidia-all/blob/master/60-nvidia.rules> -(define %nvidia-udev-rules - (mixed-text-file - "90-nvidia.rules" "\ -# Make sure device nodes are present even when the DDX is not started for the Wayland/EGLStream case -KERNEL==\"nvidia\", RUN+=\"" %nvidia-script-create-device-nodes " nvidia\" -KERNEL==\"nvidia_modeset\", RUN+=\"" %nvidia-script-create-device-nodes " nvidia_modeset\" -KERNEL==\"nvidia_uvm\", RUN+=\"" %nvidia-script-create-device-nodes " nvidia_uvm\" - -# Enable runtime PM for NVIDIA VGA/3D controller devices -ACTION==\"bind\", SUBSYSTEM==\"pci\", ATTR{vendor}==\"0x10de\", ATTR{class}==\"0x03[0-9]*\", TEST==\"power/control\", ATTR{power/control}=\"auto\" -# Enable runtime PM for NVIDIA Audio devices -ACTION==\"bind\", SUBSYSTEM==\"pci\", ATTR{vendor}==\"0x10de\", ATTR{class}==\"0x040300\", TEST==\"power/control\", ATTR{power/control}=\"auto\" -# Enable runtime PM for NVIDIA USB xHCI Host Controller devices -ACTION==\"bind\", SUBSYSTEM==\"pci\", ATTR{vendor}==\"0x10de\", ATTR{class}==\"0x0c0330\", TEST==\"power/control\", ATTR{power/control}=\"auto\" -# Enable runtime PM for NVIDIA USB Type-C UCSI devices -ACTION==\"bind\", SUBSYSTEM==\"pci\", ATTR{vendor}==\"0x10de\", ATTR{class}==\"0x0c8000\", TEST==\"power/control\", ATTR{power/control}=\"auto\" - -# Disable runtime PM for NVIDIA VGA/3D controller devices -ACTION==\"unbind\", SUBSYSTEM==\"pci\", ATTR{vendor}==\"0x10de\", ATTR{class}==\"0x03[0-9]*\", TEST==\"power/control\", ATTR{power/control}=\"on\" -# Disable runtime PM for NVIDIA Audio devices -ACTION==\"unbind\", SUBSYSTEM==\"pci\", ATTR{vendor}==\"0x10de\", ATTR{class}==\"0x040300\", TEST==\"power/control\", ATTR{power/control}=\"on\" -# Disable runtime PM for NVIDIA USB xHCI Host Controller devices -ACTION==\"unbind\", SUBSYSTEM==\"pci\", ATTR{vendor}==\"0x10de\", ATTR{class}==\"0x0c0330\", TEST==\"power/control\", ATTR{power/control}=\"on\" -# Disable runtime PM for NVIDIA USB Type-C UCSI devices -ACTION==\"unbind\", SUBSYSTEM==\"pci\", ATTR{vendor}==\"0x10de\", ATTR{class}==\"0x0c8000\", TEST==\"power/control\", ATTR{power/control}=\"on\" -")) - (define-public nvidia-driver (package (name "nvidia-driver") @@ -252,7 +163,6 @@ ACTION==\"unbind\", SUBSYSTEM==\"pci\", ATTR{vendor}==\"0x10de\", ATTR{class}==\ ("." "share/nvidia/" #:include-regexp ("nvidia-application-profiles|nvoptix.bin")) ("." "share/egl/egl_external_platform.d/" #:include-regexp ("(gbm|wayland|xcb|xlib)\\.json")) ("10_nvidia.json" "share/glvnd/egl_vendor.d/") - ("90-nvidia.rules" "lib/udev/rules.d/") ("nvidia-drm-outputclass.conf" "share/X11/xorg.conf.d/") ("nvidia-dbus.conf" "share/dbus-1/system.d/") ("nvidia.icd" "etc/OpenCL/vendors/") @@ -297,10 +207,7 @@ ACTION==\"unbind\", SUBSYSTEM==\"pci\", ATTR{vendor}==\"0x10de\", ATTR{class}==\ ;; VulkanSC ICD configuration (substitute* "nvidia_icd_vksc.json" (("libnvidia-vksc-core\\.so\\.." all) - (string-append #$output "/lib/" all))) - - ;; Add udev rules - (symlink #$%nvidia-udev-rules "90-nvidia.rules"))) + (string-append #$output "/lib/" all))))) (add-after 'install 'add-architecture-to-filename (lambda _ (for-each diff --git a/nongnu/services/nvidia.scm b/nongnu/services/nvidia.scm index 91d4a27..e73e126 100644 --- a/nongnu/services/nvidia.scm +++ b/nongnu/services/nvidia.scm @@ -1,9 +1,10 @@ ;;; SPDX-License-Identifier: GPL-3.0-or-later -;;; Copyright © 2022, 2024 Hilton Chain <hako@ultrarare.space> +;;; Copyright © 2022, 2024, 2026 Hilton Chain <hako@ultrarare.space> (define-module (nongnu services nvidia) #:use-module (guix gexp) #:use-module (guix records) + #:use-module (gnu system privilege) #:use-module (gnu packages) #:use-module (gnu packages linux) #:use-module (gnu services) @@ -24,45 +25,67 @@ (firmware nvidia-configuration-firmware (default nvidia-firmware)) ; file-like (module nvidia-configuration-module - (default nvidia-module))) ; file-like + (default nvidia-module)) ; file-like + (modprobe nvidia-configuration-modprobe + (default nvidia-modprobe))) ; file-like -(define (nvidia-shepherd-service config) - (let* ((nvidia-driver (nvidia-configuration-driver config)) - (nvidia-smi (file-append nvidia-driver "/bin/nvidia-smi"))) - (list (shepherd-service - (documentation "Prepare system environment for NVIDIA driver.") - (provision '(nvidia)) - (requirement '(udev)) - (modules '(((guix build utils) #:select (invoke/quiet)) - ((rnrs io ports) #:select (get-line)))) - (start - #~(lambda _ - (when (file-exists? "/proc/driver/nvidia") - (let ((modprobe (call-with-input-file - "/proc/sys/kernel/modprobe" get-line))) - (false-if-exception - (begin - (invoke/quiet modprobe "--" "nvidia_uvm") - (invoke/quiet #$nvidia-smi))))))) - (stop #~(const #f)))))) +(define (nvidia-privileged-program config) + (match-record config <nvidia-configuration> + (modprobe) + (list (file-like->setuid-program + (file-append modprobe "/bin/nvidia-modprobe"))))) + +;; Create paths hard-coded in NVIDIA libraries. +(define (nvidia-special-files config) + `(("/usr/bin/nvidia-modprobe" "/run/privileged/bin/nvidia-modprobe"))) + +;; https://github.com/Frogging-Family/nvidia-all/blob/master/system/60-nvidia.rules +(define (nvidia-udev-rule config) + (list (udev-rule "90-nvidia.rules" "\ +# Device nodes are created by nvidia-modprobe, which is called by the nvidia DDX. +# In case the DDX is not started, the device nodes are never created, so call +# nvidia-modprobe in the udev rules to cover the Wayland/EGLStream and compute +# case without a started display. In the case where vfio-pci is used +# nvidia-modprobe should not be invoked. +ACTION==\"add|bind\", ATTR{vendor}==\"0x10de\", ATTR{class}==\"0x03[0-9]*\", \\ + DRIVER==\"nvidia\", TEST!=\"/dev/nvidia-uvm\", \\ + RUN+=\"/usr/bin/nvidia-modprobe\", \\ + RUN+=\"/usr/bin/nvidia-modprobe -c0 -u\" + +# Enable runtime PM for NVIDIA VGA/3D controller devices +ACTION==\"bind\", SUBSYSTEM==\"pci\", ATTR{vendor}==\"0x10de\", ATTR{class}==\"0x03[0-9]*\", TEST==\"power/control\", ATTR{power/control}=\"auto\" +# Enable runtime PM for NVIDIA Audio devices +ACTION==\"bind\", SUBSYSTEM==\"pci\", ATTR{vendor}==\"0x10de\", ATTR{class}==\"0x040300\", TEST==\"power/control\", ATTR{power/control}=\"auto\" +# Enable runtime PM for NVIDIA USB xHCI Host Controller devices +ACTION==\"bind\", SUBSYSTEM==\"pci\", ATTR{vendor}==\"0x10de\", ATTR{class}==\"0x0c0330\", TEST==\"power/control\", ATTR{power/control}=\"auto\" +# Enable runtime PM for NVIDIA USB Type-C UCSI devices +ACTION==\"bind\", SUBSYSTEM==\"pci\", ATTR{vendor}==\"0x10de\", ATTR{class}==\"0x0c8000\", TEST==\"power/control\", ATTR{power/control}=\"auto\" + +# Disable runtime PM for NVIDIA VGA/3D controller devices +ACTION==\"unbind\", SUBSYSTEM==\"pci\", ATTR{vendor}==\"0x10de\", ATTR{class}==\"0x03[0-9]*\", TEST==\"power/control\", ATTR{power/control}=\"on\" +# Disable runtime PM for NVIDIA Audio devices +ACTION==\"unbind\", SUBSYSTEM==\"pci\", ATTR{vendor}==\"0x10de\", ATTR{class}==\"0x040300\", TEST==\"power/control\", ATTR{power/control}=\"on\" +# Disable runtime PM for NVIDIA USB xHCI Host Controller devices +ACTION==\"unbind\", SUBSYSTEM==\"pci\", ATTR{vendor}==\"0x10de\", ATTR{class}==\"0x0c0330\", TEST==\"power/control\", ATTR{power/control}=\"on\" +# Disable runtime PM for NVIDIA USB Type-C UCSI devices +ACTION==\"unbind\", SUBSYSTEM==\"pci\", ATTR{vendor}==\"0x10de\", ATTR{class}==\"0x0c8000\", TEST==\"power/control\", ATTR{power/control}=\"on\" +"))) (define nvidia-service-type (service-type (name 'nvidia) (extensions - (list (service-extension shepherd-root-service-type - nvidia-shepherd-service) - (service-extension profile-service-type + (list (service-extension profile-service-type (compose list nvidia-configuration-driver)) + (service-extension privileged-program-service-type + nvidia-privileged-program) + (service-extension special-files-service-type + nvidia-special-files) (service-extension udev-service-type - (compose list nvidia-configuration-driver)) + nvidia-udev-rule) (service-extension firmware-service-type (compose list nvidia-configuration-firmware)) (service-extension linux-loadable-module-service-type - (compose list nvidia-configuration-module)) - ;; Start before other user processes, necessary for some display - ;; managers. - (service-extension user-processes-service-type - (const '(nvidia))))) + (compose list nvidia-configuration-module)))) (default-value (nvidia-configuration)) (description "Prepare system environment for NVIDIA driver."))) diff --git a/nonguix/transformations.scm b/nonguix/transformations.scm index ec4733f..05b66b6 100644 --- a/nonguix/transformations.scm +++ b/nonguix/transformations.scm @@ -129,7 +129,8 @@ declaration." (module (if open-source-kernel-module? nvidia-module-open - nvidia-module))))) + nvidia-module)) + (modprobe nvidia-modprobe)))) (,nvdb . ,(service nvidia-service-type (nvidia-configuration (driver nvdb) @@ -137,7 +138,8 @@ declaration." (module (if open-source-kernel-module? nvidia-module-open-beta - nvidia-module-beta))))))) + nvidia-module-beta)) + (modprobe nvidia-modprobe-beta)))))) (lambda (os) (operating-system (inherit os) |
