web-dev-qa-db-fra.com

Utilisation du pilote bêta nvidia 302.xx compatible RandR dans 12.04 avec un noyau temps réel

Comment utiliser la version bêta récente de la version 302 du pilote nvidia (qui prend enfin en charge l'extension RandR!) Avec un noyau temps réel dans Precise?

Cette question contient des informations sur l'activation de la version 295 actuelle du noyau 3.4 avec le correctif RT. Mais je cherche une réponse qui installe le pilote nvidia à l'aide du gestionnaire de paquets plutôt que du programme d'installation de nvidia (dont les installations s'arrêtent de temps en temps à cause du remplacement du système de gestion des paquets).

7
pablomme

Attention

Le correctif dans cette question est destiné au noyau 3.4, de même que celui ci-dessous; un noyau 3.4 en temps réel corrigé est requis.

Le nouveau pilote nvidia 302 nécessite l’ABI vidéo fournie par xorg-server 1.12. Malheureusement, Precise est livré avec xorg-server 1.11. Les instructions suivantes impliquent l'ajout de xorg-edgers PPA en tant que source logicielle pour fournir xorg-server 1.12, ce qui présente un certain risque de défaillance. Les instructions de désinstallation sont en bas, mais lisez-les à la recherche d'éventuels hoquets.

Instructions

Modification du pilote nvidia fourni

  • Créez un répertoire temporaire et changez-le avec:

    mkdir -p ~/tmp/nvidia_302_fixrt && cd ~/tmp/nvidia_302_fixrt
    
  • Téléchargez le fichier nvidia-current_302 * .deb depuis le PPA de xorg-edgers en parcourant les packages de Precise sous nvidia-graphics-driver_302 * ici . Au moment d'écrire ces lignes, un téléchargement direct peut être effectué avec:

    wget https://launchpad.net/~xorg-edgers/+archive/ppa/+files/nvidia-current_302.17-0ubuntu1~xedgers~precise1_AMD64.deb
    
  • Extrayez le .deb avec:

    dpkg-deb -x nvidia-current_*.deb deb_contents && dpkg-deb --control nvidia-current_*.deb deb_contents/DEBIAN
    
  • Ajoutez le patch dans le répertoire deb_contents/usr/src/nvidia-current*/patches en collant les éléments suivants dans un terminal:

    d=$(echo deb_contents/usr/src/nvidia-current*/patches) ; cat > $d/buildfix_kernel_rt_3.4.patch <<'EOF'
    diff -u a/conftest.sh b/conftest.sh
    --- a/conftest.sh       2012-05-03 09:49:19.582854050 +0100
    +++ b/conftest.sh       2012-05-03 09:52:58.524101586 +0100
    @@ -95,7 +95,7 @@
             fi
         fi
    
    -    CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS $AUTOCONF_CFLAGS"
    +    CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS -I$OUTPUT/Arch/x86/include/generated $AUTOCONF_CFLAGS"
    
         test_xen
    
    @@ -965,11 +965,12 @@
                 #
                 echo "$CONFTEST_PREAMBLE
                 #include <linux/acpi.h>
    +            #include <acpi/acpixf.h>
                 void conftest_acpi_walk_namespace(void) {
                     acpi_walk_namespace();
                 }" > conftest$$.c
    
    -            $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
    +            #CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
                 rm -f conftest$$.c
    
                 if [ -f conftest$$.o ]; then
    @@ -980,6 +981,7 @@
    
                 echo "$CONFTEST_PREAMBLE
                 #include <linux/acpi.h>
    +            #include <acpi/acpixf.h>
                 void conftest_acpi_walk_namespace(void) {
                     acpi_walk_namespace(0, NULL, 0, NULL, NULL, NULL, NULL);
                 }" > conftest$$.c
    @@ -1604,6 +1606,9 @@
                 fi
             fi
    
    +        RET=0
    +        SELECTED_MAKEFILE=Makefile.kbuild
    +
             if [ "$RET" = "0" ]; then
                 ln -s $SELECTED_MAKEFILE Makefile
                 exit 0
    diff -u a/nv-linux.h b/nv-linux.h
    --- a/nv-linux.h        2012-05-03 09:49:19.622853547 +0100
    +++ b/nv-linux.h        2012-05-03 09:56:12.045668690 +0100
    @@ -291,7 +291,18 @@
     #endif
     #endif
    
    -#if defined(CONFIG_PREEMPT_RT)
    +#if defined(CONFIG_PREEMPT_RT_FULL)
    +typedef raw_spinlock_t            nv_spinlock_t;
    +#define NV_SPIN_LOCK_INIT(lock)   raw_spin_lock_init(lock)
    +#define NV_SPIN_LOCK_IRQ(lock)    raw_spin_lock_irq(lock)
    +#define NV_SPIN_UNLOCK_IRQ(lock)  raw_spin_unlock_irq(lock)
    +#define NV_SPIN_LOCK_IRQSAVE(lock,flags) raw_spin_lock_irqsave(lock,flags)
    +#define NV_SPIN_UNLOCK_IRQRESTORE(lock,flags) \
    +   raw_spin_unlock_irqrestore(lock,flags)
    +#define NV_SPIN_LOCK(lock)        raw_spin_lock(lock)
    +#define NV_SPIN_UNLOCK(lock)      raw_spin_unlock(lock)
    +#define NV_SPIN_UNLOCK_WAIT(lock) raw_spin_unlock_wait(lock)
    +#Elif defined(CONFIG_PREEMPT_RT)
     typedef atomic_spinlock_t         nv_spinlock_t;
     #define NV_SPIN_LOCK_INIT(lock)   atomic_spin_lock_init(lock)
     #define NV_SPIN_LOCK_IRQ(lock)    atomic_spin_lock_irq(lock)
    @@ -954,7 +965,9 @@
         return ret;
     }
    
    -#if defined(CONFIG_PREEMPT_RT)
    +#if defined(CONFIG_PREEMPT_RT_FULL)
    +#define NV_INIT_MUTEX(mutex) sema_init(mutex,1)
    +#Elif defined(CONFIG_PREEMPT_RT)
     #define NV_INIT_MUTEX(mutex) semaphore_init(mutex)
     #else
     #if !defined(__SEMAPHORE_INITIALIZER) && defined(__COMPAT_SEMAPHORE_INITIALIZER)
    EOF
    
  • Ajoutez le patch à dkms.conf en le collant dans un terminal:

    d=$(echo deb_contents/usr/src/nvidia-current*) ; cat >> $d/dkms.conf <<'EOF'
    PATCH_MATCH[1]="^3\.4.*(rt|realtime)"
    PATCH[1]="buildfix_kernel_rt_3.4.patch"
    EOF
    
  • Modifiez le numéro de version dans deb_contents/DEBIAN/control en indiquant:

    
sed -i 's/^\(Version: .*\)$/\1+rtfix/' deb_contents/DEBIAN/control
    
  • Reconditionnez le pilote avec:

    
dpkg -b deb_contents nvidia-current_$(sed -n 's/^\(Version: *\)//p' deb_contents/DEBIAN/control)_AMD64.deb
    

Installation du PPA et du pilote modifié

  • Ajoutez le PPA xorg-edgers:

    
Sudo add-apt-repository ppa:xorg-edgers/ppa && Sudo apt-get update && Sudo apt-get dist-upgrade
    
  • Installez le .deb modifié localement avec:

    Sudo dpkg -i nvidia-current_*+rtfix_*.deb
    

Rester à jour

Le PPA de xorg-edgers mettra à jour les versions les plus récentes du pilote nvidia au fur et à mesure de leur sortie; vous devrez répéter les instructions de réemballage ci-dessus à chaque nouvelle version.

Désinstaller

Vous devriez pouvoir revenir au pilote nouveau avec les éléments suivants:

    Sudo apt-get remove nvidia-current
    Sudo apt-get install ppa-purge
    Sudo ppa-purge ppa:xorg-edgers/ppa

Dans mon cas, ce processus impliquait de désinstaller wine ainsi que des packages i386 (qui auraient dû être rétrogradés à la place). Méfiez-vous de ppa-purge si vous êtes sur AMD64 car il ne s'entend pas bien avec multiarch (comme indiqué dans les avertissements PPA); dans mon cas, le résultat n'était pas un problème (j'ai simplement réinstallé wine), mais d'autres personnes pourraient se retrouver avec des dépendances gravement endommagées, en fonction de ce qu'elles ont installé.

4
pablomme