summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHilton Chain <hako@ultrarare.space>2026-03-11 13:51:13 +0800
committerHilton Chain <hako@ultrarare.space>2026-03-12 00:50:07 +0800
commit44f9f4db741f2a9abea8382deaa31f996732da65 (patch)
tree43e43a15a6522a4557fa418690c612812db6effa
parent824d143acdb5ef50c6edf8dd0dfb3379655d363a (diff)
services: nvidia: Use nvidia-modprobe.
* nongnu/services/nvidia.scm (nvidia-configuration) [modprobe]: New field. (nvidia-privileged-program, nvidia-special-files, nvidia-udev-rule): New procedures. (nvidia-shepherd-service): Delete procedure. (nvidia-service-type) [extensions]: Update accordingly. * nongnu/packages/nvidia.scm (%nvidia-script-create-device-nodes) (%nvidia-udev-rules): Delete in favor of nvidia-udev-rule. (nvidia-driver): Remove udev rule from the package. * nonguix/transformations.scm (nonguix-transformation-nvidia): Use the new modprobe field for nvidia-configuration.
-rw-r--r--nongnu/packages/nvidia.scm97
-rw-r--r--nongnu/services/nvidia.scm83
-rw-r--r--nonguix/transformations.scm6
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)