3 votes

Mon Nvidia dGPU n'est pas détecté après la mise à jour vers 19.10

Comme on peut le deviner d'après le sujet, j'ai un ordinateur portable Optimus. Tant que j'étais sous 19.04, j'ai pu passer au dGPU Nvidia et vice-versa, en utilisant Prime (via l'option prime-select {intel|nvidia} ). Les choses ont cependant changé après la mise à jour vers la version 19.10 : le jour suivant la mise à jour, le système s'est figé, le noyau se plaignant du blocage de certaines tâches, telles qu'une commande rmmod un. J'ai réussi à récupérer mon système en lançant prime-select nvidia dans un environnement de connexion à la racine (chroot).

Je n'entrerai pas trop dans les détails secondaires tels que la suppression des pilotes iGPU/dGPU de l'initramfs (qu'ont-ils à faire dans l'initramfs de toute façon ?), mais maintenant il démarre au moins, avec ou sans le dGPU prime-activé.

Et c'est là que le bât blesse : si mon système démarre avec le profil intel activé, le passage au profil nvidia ne fonctionne pas, puisque le dGPU n'est pas détecté dans le matériel. Et en effet, elle est absente d'une liste lspci. Je dois redémarrer pour que le dGPU soit à nouveau détecté. Donc, quand j'éteins mon système, il faut toujours que je pense à activer le profil nvidia avant, sinon il faudra que je redémarre pour pouvoir l'utiliser la fois suivante.

C'est mon principal problème. Un autre, moins ennuyeux, est que je dois toujours redémarrer le service gdm lorsque je passe de nvidia à intel. Je peux vivre avec ça, mais c'est un problème que je n'avais pas dans la version 19.04.

Les conseils sur ce problème sont les bienvenus ! Soit empêcher le dGPU de disparaître de la liste du matériel, soit une méthode pour qu'il soit à nouveau détecté par le système, sans redémarrer.

Pour info, mon iGPU est un Intel HD Graphics 4600, et mon dGPU est un Nvidia GTX 880M.

EDIT : @Syfer Polski, merci pour votre réponse instructive !

J'ai remarqué qu'il y avait un profil à la demande, mais je l'ai écarté comme étant probablement une tentative inutile, car j'avais lu il n'y a pas si longtemps qu'une implémentation d'Optimus vraiment fonctionnelle n'arriverait pas de sitôt... J'aurais dû lire ce readme !

J'ai donc immédiatement essayé ce profil à la demande. Au début, cela n'a pas fonctionné car j'avais le pilote 430 qui ne le prend pas en charge. Il aurait dû y avoir une vérification du pilote refusant d'activer le profil pour les personnes qui n'utilisent pas une version compatible, et je soupçonne que c'est la raison pour laquelle mon système a planté, parce que ce profil à la demande a été automatiquement activé pendant la mise à niveau (je ne fais que supposer, je n'ai pas vérifié à l'époque).

Quoi qu'il en soit, j'ai installé le pilote 435 et le profil à la demande fonctionne. Cependant, je ne trouve pas cela assez satisfaisant, puisque mon GPU n'est pas éteint lorsqu'il n'est pas utilisé, et qu'essayer de l'éteindre moi-même ne fonctionne pas. J'ai essayé de l'éteindre via un appel ACPI direct, et en effet il s'est éteint mais :

NVRM: GPU at PCI:0000:01:00: GPU-9b8a3387-4913-0c33-619e-da118e532a5f
NVRM: Xid (PCI:0000:01:00): 79, pid=29013, GPU has fallen off the bus.
NVRM: GPU 0000:01:00.0: GPU has fallen off the bus.
NVRM: A GPU crash dump has been created. If possible, please run
NVRM: nvidia-bug-report.sh as root to collect this data before
NVRM: the NVIDIA kernel module is unloaded.

Donc, malheureusement pour moi, tant que les pilotes propriétaires seront incapables d'éteindre mon dGPU lorsqu'il n'est pas utilisé, je pense que je resterai avec le système classique des profils intel/nvidia.

Ce qui me ramène à ma question initiale quand je démarre avec le mode intel activé : comment récupérer mon dGPU sans redémarrer ?

Un rescan ( echo 1 >/sys/bus/pci/rescan ) le montre dans les journaux :

pci 0000:01:00.0: [10de:1198] type 00 class 0x030000
pci 0000:01:00.0: reg 0x10: [mem 0xf6000000-0xf6ffffff]
pci 0000:01:00.0: reg 0x14: [mem 0xe0000000-0xefffffff 64bit pref]
pci 0000:01:00.0: reg 0x1c: [mem 0xf0000000-0xf1ffffff 64bit pref]
pci 0000:01:00.0: reg 0x24: [io  0xe000-0xe07f]
pci 0000:01:00.0: reg 0x30: [mem 0xf7000000-0xf707ffff pref]
pci 0000:01:00.0: 32.000 Gb/s available PCIe bandwidth, limited by 2.5 GT/s x16 link at 0000:00:01.0 (capable of 126.016 Gb/s with 8 GT/s x16 link)
pci 0000:01:00.0: vgaarb: VGA device added: decodes=io+mem,owns=none,locks=none

Mais l'ISPC reste silencieuse. Je peux allumer/éteindre le périphérique à volonté par des appels ACPI, le noyau l'affiche lors du rescan, mais il n'est pas détecté par les pilotes qui, par conséquent, ne se chargent pas. Il doit y avoir quelque chose à faire, mais quoi ?

4voto

Syfer Polski Points 310

nvidia-prime a encore changé entre Ubuntu 19.04 et 19.10.

Entre Ubuntu 16.04 et Ubuntu 18.04, Ubuntu a utilisé bbswitch un module de noyau construit par la communauté, pour désactiver le GPU Nvidia dans les ordinateurs portables Optimus. Cependant, le module a cessé d'être maintenu, et donc dans Ubuntu 18.10 (depuis rétroporté dans Ubuntu 18.04), le passage d'un GPU à l'autre a été géré en chargeant le module open-source nouveau conducteurs. Cependant, cela n'a pas complètement éteint le GPU (il consommait encore ~2W).

Simultanément, Nvidia travaillait enfin à la coexistence avec d'autres pilotes de GPU. GLVND (Graphics Library Vendor Neutral Display) est apparu dans Xorg 1.20 et a permis à plusieurs pilotes de GPU d'être chargés et d'alimenter un serveur d'affichage. Cela permet un contrôle granulaire - chaque application peut utiliser des pilotes distincts. En pratique, il s'agit presque toujours de GPU Intel et Nvidia dans les ordinateurs portables Optimus. Il existe désormais trois modes prime-select vous permet de faire votre choix :

  • intel
  • à la demande
  • nvidia

intel éteint physiquement le GPU Nvidia, ce qui permet d'économiser de l'énergie, mais nécessite un redémarrage pour l'activer, et pas seulement une déconnexion. nvidia est l'inverse.

Pour les personnes qui changent fréquemment de mode, le mode à la demande est recommandé - en on-demand Le GPU utilisé pour dessiner un programme est déterminé par des variables d'environnement. Il existe différentes variables d'environnement pour les applications OpenGL et Vulkan, et si elles ne sont pas définies, le GPU intégré (Intel) est utilisé. Voir README de Nvidia pour une explication complète des variables d'environnement concernées ( __NV_PRIME_RENDER_OFFLOAD , __GLX_VENDOR_LIBRARY_NAME y __VK_LAYER_NV_optimus )

Selon la série de pilotes qui prend en charge votre GPU, le profil à la demande peut ne pas fonctionner pour vous - le plus ancien pilote pris en charge semble être la série 435.

1voto

NovHak Points 449

Solution trouvée ! Je n'ai pas fait certaines choses dans commande . La procédure pour récupérer le dGPU est donc la suivante :

  1. Définir le profil comme suit nvidia ou on-demand (si votre pilote le permet) : prime-select {nvidia|on-demand}

  2. Allumez le dGPU. Le BIOS l'active généralement au démarrage, il ne devrait donc pas y avoir de problème. Si vous l'avez éteint entre-temps, je suppose que vous savez comment le rallumer. S'il reste éteint pour une autre raison, vous pouvez tenter votre chance avec apt install acpi-call-dkms . Vous trouverez des exemples utiles dans /usr/share/doc/acpi-call-dkms/examples . A manipuler avec précaution, car il peut faire planter votre système ! Dans mon cas, l'appel ACPI suivant active mon dGPU : \_SB_.PCI0.PEG0.PEGP._ON . Je donne le mien en exemple, le vôtre peut très bien ne pas être le même. N'oubliez pas d'échapper à la barre oblique inverse si vous en avez une.

  3. Rescanner votre bus PCI : echo 1 >/sys/bus/pci/rescan . Il peut cependant suffire de ne rescanner qu'une partie du bus.

  4. (peut être optionnel) Charger le module nvidia : modprobe nvidia

AVERTISSEMENT : N'éteignez pas votre GPU avec un appel ACPI direct à moins d'être certain qu'il n'est lié à aucun pilote (plus simplement, le module nvidia doit être déchargé), ou le pilote se plantera (exemple de plantage donné dans la question).

Tant qu'il est chargé, c'est le conducteur qui conduit le GPU, et prendre le volant par surprise ne sert généralement pas à grand-chose.

Cependant, le pilote Nvidia dispose d'une fonction de gestion de l'énergie qui est désactivée par défaut, mais qui peut être activée en passant le paramètre suivant à la fonction nvidia module : NVreg_DynamicPowerManagement=0x01 . Malheureusement, il ne fonctionne que pour les GPU Turing et plus récents (c'est-à-dire pas mon Kepler)... Tiré de /usr/src/nvidia-435.21/nvidia/nv-reg.h  :

/*
 * Option: DynamicPowerManagement
 *
 * This option controls how aggressively the NVIDIA kernel module will manage
 * GPU power through kernel interfaces.
 *
 * Possible Values:
 *
 *  0: Never allow the GPU to be powered down (default).
 *  1: Power down the GPU when it is not initialized.

 *  2: Power down the GPU after it has been inactive for some time.

 */

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X