diff options
| author | Hilton Chain <hako@ultrarare.space> | 2026-03-11 13:51:13 +0800 |
|---|---|---|
| committer | Hilton Chain <hako@ultrarare.space> | 2026-03-12 00:50:07 +0800 |
| commit | 44f9f4db741f2a9abea8382deaa31f996732da65 (patch) | |
| tree | 43e43a15a6522a4557fa418690c612812db6effa /nongnu/services | |
| parent | 824d143acdb5ef50c6edf8dd0dfb3379655d363a (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.scm | 83 |
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."))) |
