Driver nVidia 390 su kernel 6.14 in Arch Linux

In questo post proseguo quanto scritto in quello precedente, dove — ricorderete — non riuscivo a far convivere i driver legacy per la mia vecchia scheda video nVidia GeForce 605 con il nuovo kernel 6.14.4-arch1-2 o meglio, cosa che ho scoperto dopo, gcc versione 15 non riusciva a compilare per il nuovo kernel. Ho monitorato costantemente sia il forum che la pagina dedicata su AUR e ho visto che @bufferunderrun ha pubblicato una patch da applicare al pacchetto nvidia-390-dkms. Ho applicato la patch al pacchetto, fatto gli aggiornamenti e tutto è filato liscio come l’olio. Vi spiego cosa ho fatto, così rimane traccia anche per me e magari può servire a qualcuno.


Quello che faremo è creare una patch aggiuntiva — oltre a quelle già presenti — per il pacchetto nvidia-390-dkms e applicarla, in attesa che questo venga fatto nel pacchetto presente in AUR.

Creazione e applicazione della patch

Creazione del file .patch

Da terminale scarichiamo il pacchetto da AUR senza installarlo:

paru -G nvidia-390xx-dkms

Spostiamoci nella directory appena creata:

cd nvidia-390xx-utils

Creiamo il file per la patch dedicata a gcc 15:

nano gcc-15.patch

Incolliamo questo contenuto, vale a dire la patch che risolve il problema:1

diff --git a/kernel/Kbuild b/kernel/Kbuild
index 85aa267..baa6986 100644
--- a/kernel/Kbuild
+++ b/kernel/Kbuild
@@ -61,6 +61,7 @@ $(foreach _module, $(NV_KERNEL_MODULES), \
 # $(EXTRA_CFLAGS) to ccflags-y for compatibility.
 #

+EXTRA_CFLAGS += -std=gnu17
 EXTRA_CFLAGS += -I$(src)/common/inc
 EXTRA_CFLAGS += -I$(src)
 EXTRA_CFLAGS += -Wall -MD $(DEFINES) $(INCLUDES) -Wsign-compare -Wno-cast-qual -Wno-error
diff --git a/kernel/conftest.sh b/kernel/conftest.sh
index 4da7588..1106ea5 100755
--- a/kernel/conftest.sh
+++ b/kernel/conftest.sh
@@ -151,7 +151,7 @@ test_headers() {
 }

 build_cflags() {
-    BASE_CFLAGS="-O2 -D__KERNEL__ \
+    BASE_CFLAGS="-std=gnu17 -O2 -D__KERNEL__ \
 -DKBUILD_BASENAME=\"#conftest$$\" -DKBUILD_MODNAME=\"#conftest$$\" \
 -nostdinc -isystem $ISYSTEM \
 -Wno-implicit-function-declaration -Wno-strict-prototypes -Wno-incompatible-pointer-types"

Salviamo e chiudiamo.

Modifica di PKGBUILD

Ora dobbiamo modificare il file PKGBUILD per far sì che questo, durante la compilazione, consideri la patch appena creata. Anziché dirvi cosa modificare a mano, creeremo un altro file .patch, così senza sforzo né errori lo modificheremo. Creiamo questo file:

nano PKGBUILD.patch

e incolliamo queste righe:

--- nvidia-390xx-utils/PKGBUILD	2025-05-09 21:57:08.271353078 +0200
+++ PKGBUILD	2025-05-09 18:23:07.990867041 +0200
@@ -31,7 +31,8 @@
         kernel-6.12.patch
         kernel-6.13.patch
         kernel-6.14.patch
-        kernel-4.16+-memory-encryption.patch)
+        kernel-4.16+-memory-encryption.patch
+        gcc-15.patch)
 b2sums=('8e24aea70b139185bd682b080d32aeda673e6e92b45a90e6f6e0d736674180400bc8bd1aa5c66b8d033fc9d5e0cfffed456a87298bd93a3afbbc30b8dc48c4e9'
         'c1da4ce5784e43385465913a95053a3e54f800aac6f1b49f33e2a77504d76da5e6db6ec7074fbe7ba5f52dcef9e1ebaa620942c33ff825a56caba5c9c8b0d1be'
         '67e32932eeddda8fef667d25c34faf7b3a02f01cf9c15a97e5613bd44a0e8dcf7396e25399a52701f55dd18054c689720f237bb07d5bd580394d8dc8c9d05534'
@@ -49,7 +50,8 @@
         'aaa0597ab9d33be3c6e020fab0d54890d32f32c5ce70571e2bc989a788dbe2317e826475966bc1026bf7f7ff6672bd9a2f7f8e48dcebd2f91d33d9181eee1208'
         '8e5502a6668bf3981d1e9cc6cdad428fcfdd221b51850b0fde74d631faa379d965b97a87e845eda2bc0e99a0aa9bf58642444bdea9f976cafcd12edf0e20f5db'
         '21b87918e9b9b0475ab4fb548be6daadd6921566fb03a3f96cffff5296f9fa1bccdabe7c4671aba2a1dc455248b7a96e5a088c48ab922305213bc714e4a39d6c'
-        'a8234f542c2324ad698443e3decf7b6eacf3cb420b7aded787f102a8d32b64c2a8d45ea58e37a5e3b6f2f060f0cccd63d3a182065f57c606006d0ff8c7f6bb05')
+        'a8234f542c2324ad698443e3decf7b6eacf3cb420b7aded787f102a8d32b64c2a8d45ea58e37a5e3b6f2f060f0cccd63d3a182065f57c606006d0ff8c7f6bb05'
+        '488c1381c371efaa18aa68424560d5a5145d25dea79ae44c30fa771bdd097b43125a7b6d553ac823a304d5a681ee5e958291a2334f4be8bba79754fdb5ff80a2')
 
 create_links() {
     # create soname links
@@ -105,6 +107,9 @@
     # From Joan Bruguera (https://gist.github.com/joanbm/d0cb8790ca610fbd2c2e43f30707ce18)
     patch -Np1 -i ../kernel-6.14.patch
 
+    # From bufferunderrun (https://aur.archlinux.org/packages/nvidia-390xx-dkms#comment-1022658)
+    patch -Np1 -i ../gcc-15.patch
+
     cd kernel
 
     sed -i "s/__VERSION_STRING/${pkgver}/" dkms.conf

Salviamo e chiudiamo. Ora applichiamo le modifiche al file PKGBUILD:2

patch PKGBUILD < PKGBUILD.patch

Compilazione e installazione del driver con la patch

Installiamo ora il driver contenente la patch per gcc:

makepkg -si

Il sistema ora compilerà il driver con tutte le patch presenti nel pacchetto, compresa gcc-15.patch che abbiamo creato poco fa.

Una volta che avrà finito — si spera — senza errori, procederemo a installare il nuovo kernel e gcc ultima versione. Se, come avevo fatto io, avevate bloccato gli aggiornamenti del kernel e di gcc, sbloccateli. Quindi aggiorniamo il sistema:

sudo pacman -Syu

Non dovremmo vedere alcun problema segnalato nei messaggi del terminale. A questo punto possiamo riavviare e goderci gli aggiornamenti appena installati.


Ringrazio infinitamente tutti coloro che hanno contribuito a questa risoluzione e che mi consentono di continuare ad usare questa vecchia macchina con Arch Linux.


  1. Come detto, la patch è ripresa interamente da questo commento di bufferunderrun↩︎

  2. Una volta applicata la patch, possiamo anche eliminare il file PKGBUILD.patch, perché non ci serve più. Ad ogni modo questo file non sarà considerato da PKGBUILD stesso durante la compilazione perché non è presente nella lista delle patch da applicare a gcc↩︎