summaryrefslogtreecommitdiff
path: root/nongnu/services
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 /nongnu/services
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.
Diffstat (limited to 'nongnu/services')
-rw-r--r--nongnu/services/nvidia.scm83
1 files changed, 53 insertions, 30 deletions
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.")))