Utilizzo del driver beta nvidia 302.xx con RandR abilitato in 12.04 con un kernel in tempo reale

7

Come posso usare la versione beta recente della versione 302 del driver nvidia (che finalmente supporta l'estensione RandR!) con un kernel realtime in Precise?

Questa domanda contiene informazioni sull'abilitazione dell'attuale versione 295 per il kernel 3.4 con la patch RT. Ma sto cercando una risposta che installa il driver nvidia utilizzando il gestore pacchetti piuttosto che il programma di installazione di nvidia (le cui installazioni si interrompono ogni tanto a causa del sovrascrittura dei file del sistema di gestione dei pacchetti).

    
posta pablomme 03.05.2012 - 19:27

1 risposta

4

Attenzione

La patch in questa domanda è per il kernel 3.4, e così è quello sotto; è richiesto un kernel 3.4 con patch in tempo reale.

Il nuovo driver nvidia 302 richiede il video ABI fornito da xorg-server 1.12 e sfortunatamente Precise viene fornito con xorg-server 1.11. Le seguenti istruzioni implicano l'aggiunta del PPA xorg-edgers come fonte software per fornire xorg-server 1.12, e questo pone un certo rischio di rottura. Le istruzioni di disinstallazione sono in fondo, ma leggile per eventuali singhiozzi lì.

Istruzioni

Modifica del driver nvidia packaged

  • Crea una directory temporanea e inseriscila con:

    mkdir -p ~/tmp/nvidia_302_fixrt && cd ~/tmp/nvidia_302_fixrt
    
  • Scarica nvidia-current_302 * .deb dal PPA di xorg-edgers sfogliando i pacchetti per Precise in nvidia-graphics-driver_302 * qui . Al momento della stesura di questo articolo, è possibile eseguire un download diretto con:

    wget https://launchpad.net/~xorg-edgers/+archive/ppa/+files/nvidia-current_302.17-0ubuntu1~xedgers~precise1_amd64.deb
    
  • Estrai il .deb con:

    dpkg-deb -x nvidia-current_*.deb deb_contents && dpkg-deb --control nvidia-current_*.deb deb_contents/DEBIAN
    
  • Aggiungi la patch alla directory deb_contents/usr/src/nvidia-current*/patches incollando quanto segue in un terminale:

    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
    
  • Aggiungi la patch a dkms.conf incollandola in un terminale:

    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
    
  • Modifica il numero di versione in deb_contents / DEBIAN / control emettendo:

    
sed -i 's/^\(Version: .*\)$/+rtfix/' deb_contents/DEBIAN/control
    
  • Riorganizza il driver con:

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

Installazione del PPA e del driver modificato

  • Aggiungi il PPA xorg-edgers:

    
sudo add-apt-repository ppa:xorg-edgers/ppa && sudo apt-get update && sudo apt-get dist-upgrade
    
  • Installa il file .deb modificato localmente con:

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

Tieni aggiornato

Il PPA di xorg-edgers si aggiornerà con le versioni più recenti del driver nvidia man mano che escono; dovrai ripetere le istruzioni di re-imballaggio sopra con ogni nuova versione.

disinstallazione

dovresti essere in grado di ripristinare il driver nouveau con quanto segue:

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

Nel mio caso, questo processo comportava la disinstallazione di wine insieme ad alcuni pacchetti i386 (che invece avrebbero dovuto essere declassati). Diffidare di ppa-purge se si è su amd64 poiché non va d'accordo con il multiarch (come indicato negli avvisi PPA); nel mio caso il risultato è stato un non-problema (ho semplicemente reinstallato wine ), ma altre persone potrebbero finire con dipendenze gravemente danneggiate a seconda di ciò che hanno installato.

    
risposta data pablomme 03.05.2012 - 20:08

Leggi altre domande sui tag