Heute wollte ich einmal die neuen Kernelsourcen an den Start bringen und einmal bisschen rumtesten. Meine Neugierde weckten vorallem die Fastboot Patches, welche nun schön Langsam Einzug in den Hauptzweig des neuen Kernels wandern (Stargazer hat's entdeckt)

Nachdem im Kernel einige gröbere Änderungen vor sich gingen, sind natürlich die einzelnen Treibermodule nun dran, nachzuziehen - oder man bastelt einen entsprechenden Hack. Um nicht auf Nvidia warten zu müssen, hier eine Lösung zu den aktuellen x11-drivers/nvidia-drivers.

Aktuell verwendete Kernelsources: /usr/src/linux-2.6.28-rc3 mit Symlink nach /usr/src/linux

Das klassische Emergen der nvidia-drivers wird uns auf den ersten Blick einen Fehler präsentieren, der so aussieht, als hätten wir die Kernel-Sourcen nicht vollständig am System - Doch dem ist nicht so. Die Ursache des Fehlers liegt vielmehr in ein paar kleinen Änderungen der Verzeichnisstruktur im Kernel, welche man aber speziell für Nvidia mit ein paar Handgriffen wieder zurechtbiegen kann:

cd /usr/src/linux/include mv asm-x86/asm-offsets.h ../arch/x86/include/asm rmdir asm-x86 ln -s ../arch/x86/include/asm asm-x86

Doch damit ist es leider noch nicht ganz getan. Ein erneutes Emerge lässt zwar die Kernel-Sourcen wieder korrekt erscheinen, doch ein paar Änderungen an internen Funktionsaufrufen lassen die Sache scheitern. Die Lösung sieht meiner Meinung nach wie folgt aus (patch):

diff -uNr NVIDIA-Linux-x86_64-177.80-pkg2/usr/src/nv/nvacpi.c NVIDIA-Linux-x86_64-177.80-pkg2-patched/usr/src/nv/nvacpi.c
--- NVIDIA-Linux-x86_64-177.80-pkg2/usr/src/nv/nvacpi.c 2008-10-01 23:16:41.000000000 +0100
+++ NVIDIA-Linux-x86_64-177.80-pkg2-patched/usr/src/nv/nvacpi.c 2008-10-25 20:44:22.000000000 +0100
@@ -136,7 +136,7 @@
     struct acpi_object_list control_argument_list = { 0, NULL };
     nv_stack_t *sp = NULL;
     struct list_head *node, *next;
-    unsigned long device_id = 0;
+    unsigned long long device_id = 0;

     NV_KMEM_CACHE_ALLOC_STACK(sp);
     if (sp == NULL)
@@ -158,7 +158,11 @@
     os_mem_set((void *)pNvAcpiObject, 0, sizeof(nv_acpi_t));

     // assign driver data structure ptr to this device
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)
+    device->driver_data = pNvAcpiObject;
+#else
     acpi_driver_data(device) = pNvAcpiObject;
+#endif

     // store a device reference in our object
     pNvAcpiObject->device = device;
@@ -305,7 +309,7 @@
      */
     nv_acpi_t *pNvAcpiObject = data;
     u32 event_val = 0;
-    unsigned long state;
+    unsigned long long state;
     int status = 0;

Um das Ganze noch zum Abschluss zu bringen erweitere ich das bestehende Ebuild der x11-drivers/nvidia-drivers ein bisschen in der Funktion src_unpack() erweitert:

# 2.6.28 needs a small patch to make things working again if kernel_is 2 6 28; then epatch "${FILESDIR}"/nvidia-drivers-177.80_kernel_2_6_28.patch fi

Der nvidia-drivers-177.80_kernel_2_6_28.patch ist dabei der oben gezeigte Patch. Das Ergebnis, ein funktionierendes X11 unter Verwendung der nvidia-drivers.

Vorheriger Beitrag Nächster Beitrag