NVidia-Treiber 6111

Aus Gentoo Linux Wiki

Wechseln zu: Navigation, Suche

Die in diesem Howto-Artikel erwähnten Ebuilds media-video/nvidia-glx und media-video/nvidia-kernel gelten als veraltet. Stattdessen sollten die Ebuilds x11-drivers/nvidia-drivers bzw. x11-drivers/nvidia-legacy-drivers für ältere Grafikkarten verwendet werden (siehe Gentoo Linux nVidia Guide).

Inhaltsverzeichnis

[Bearbeiten] Einleitung

Ältere Grafikkarten werden durch die neuen Treiber (>6629) nicht mehr unterstüzt. Außerdem funktionierte bei mir der 6629 (TNT2 M64) nicht, es gab massive Darstellungsprobleme. Der NVidia-Treiber 6111 musste in diesem Fall installiert werden. Das funktioniert aber nicht ganz so problemlos, wie es im "Gentoo Linux nVidia Guide" (s. Link unten) den Anschein hat. Eine große Hilfe waren mir die englischsprachigen Informationen aus dem Gentoo-Forum.

Bitte bevor ihr Euch verzweifelt ans Werk macht: Schaut in der Diskussion nach, ob es für Eure Karte vielleicht schon eine andere (einfachere) Lösung gibt.

[Bearbeiten] Neuere Versionen maskieren

Als erstes müssen die neueren Versionen maskiert werden:

nano /etc/portage/package.mask

Datei: package.mask
>=media-video/nvidia-kernel-1.0.6629-r4
>=media-video/nvidia-glx-1.0.6629-r6
>=media-video/nvidia-settings-1.0.6629


und zunächst einen Test machen, ob auch wirklich die richtigen Versionen erkannt werden:

emerge -p nvidia-glx

Wenn "nvidia-kernel-1.0.6111-r3" ausgegeben wird ist alles OK.

[Bearbeiten] Erster emerge-Versuch

emerge nvidia-glx

Ich bekam bei diesem Versuch zunächst einen Compilierfehler (PM_SAVE_STATE-Fehler in Modul nv.c), obwohl der Patch "power-suspend-2.6.9-changes.patch" bereits standardmäßig ausgeführt wurde und das Ergebnis im Code zu finden war. Wenn bei Euch ein anderer Fehler auftritt, dann schaut mal unter "Zweiter emerge-Versuch" nach. Wenn es jetzt schon läuft, dann freut Euch. Andernfalls öffnet die Datei "/var/tmp/portage/nvidia-kernel-1.0.6111-r3/work/NVIDIA-Linux-x86-1.0-6111-pkg1/usr/src/nv/nv.c" und sucht nach folgenden Zeilen (diese wurden durch den beschriebenen Patch eingefügt):


Datei: nv.c
// Fix up problems with PM_SAVE_STATE being removed from 2.6.9
#ifdef PM_SAVE_STATE
  #define PM_TMP PM_SAVE_STATE
#else
  #define PM_TMP PM_SUSPEND
#endif


Die dritte Zeile folgendermaßen abändern und Datei speichern:

Datei: nv.c
// Fix up problems with PM_SAVE_STATE being removed from 2.6.9
#ifdef PM_SAVE_STATE
  #define PM_TMP PM_SUSPEND
#else
  #define PM_TMP PM_SUSPEND
#endif


Danach das Script "/var/tmp/portage/nvidia-kernel-1.0.6111-r3/work/NVIDIA-Linux-x86-1.0-6111-pkg1/nvidia-installer" ausführen. Das ist eigentlich der zweite Installationsversuch, der aber bei mir ebenfalls schief ging. Interessanterweise läuft ab jetzt auch die emerge-Routine ohne an diesem Fehler hängen zu bleiben, obwohl dadurch ja jedesmal die nv.c neu angelegt und gepached wird. Eine Erklärung habe ich dafür nicht.

[Bearbeiten] Zweiter emerge-Versuch

emerge nvidia-glx

Hier spuckte der Compiler in etwa folgende Fehlermeldung aus:

/var/tmp/portage/nvidia-kernel-1.0.6111-r3/work/NVIDIA-Linux-x86-1.0-6111-pkg1/usr/src/nv/os-agp.c:48: error: syntax error before '*' token

Das ist der sogenannte "drm_agp_t"-Fehler. Es existiert dazu ein Patch:

Code: moocha_agp_backend_h_fix.patch
diff -Naur NVIDIA-Linux-x86-1.0-6111-pkg1-orig/usr/src/nv/agp_backend.h NVIDIA-Linux-x86-1.0-6111-pkg1/usr/src/nv/agp_backend.h
--- NVIDIA-Linux-x86-1.0-6111-pkg1-orig/usr/src/nv/agp_backend.h	1970-01-01 02:00:00.000000000 +0200
+++ NVIDIA-Linux-x86-1.0-6111-pkg1/usr/src/nv/agp_backend.h	2005-04-04 19:07:23.060251352 +0300
@@ -0,0 +1,118 @@
+/*
+ * AGPGART backend specific includes. Not for userspace consumption.
+ *
+ * Copyright (C) 2002-2003 Dave Jones
+ * Copyright (C) 1999 Jeff Hartmann
+ * Copyright (C) 1999 Precision Insight, Inc.
+ * Copyright (C) 1999 Xi Graphics, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * JEFF HARTMANN, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM, 
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE 
+ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef _AGP_BACKEND_H
+#define _AGP_BACKEND_H 1
+
+#ifdef __KERNEL__
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+enum chipset_type {
+	NOT_SUPPORTED,
+	SUPPORTED,
+};
+
+struct agp_version {
+	u16 major;
+	u16 minor;
+};
+
+struct agp_kern_info {
+	struct agp_version version;
+	struct pci_dev *device;
+	enum chipset_type chipset;
+	unsigned long mode;
+	off_t aper_base;
+	size_t aper_size;
+	int max_memory;		/* In pages */
+	int current_memory;
+	int cant_use_aperture;
+	unsigned long page_mask;
+	struct vm_operations_struct *vm_ops;
+};
+
+/* 
+ * The agp_memory structure has information about the block of agp memory
+ * allocated.  A caller may manipulate the next and prev pointers to link
+ * each allocated item into a list.  These pointers are ignored by the backend.
+ * Everything else should never be written to, but the caller may read any of
+ * the items to detrimine the status of this block of agp memory. 
+ */
+
+struct agp_memory {
+	int key;
+	struct agp_memory *next;
+	struct agp_memory *prev;
+	size_t page_count;
+	int num_scratch_pages;
+	unsigned long *memory;
+	off_t pg_start;
+	u32 type;
+	u32 physical;
+	u8 is_bound;
+	u8 is_flushed;
+};
+
+#define AGP_NORMAL_MEMORY 0
+
+extern void agp_free_memory(struct agp_memory *);
+extern struct agp_memory *agp_allocate_memory(size_t, u32);
+extern int agp_copy_info(struct agp_kern_info *);
+extern int agp_bind_memory(struct agp_memory *, off_t);
+extern int agp_unbind_memory(struct agp_memory *);
+extern void agp_enable(u32);
+extern int agp_backend_acquire(void);
+extern void agp_backend_release(void);
+
+/*
+ * Interface between drm and agp code.  When agp initializes, it makes
+ * the below structure available via inter_module_register(), drm might
+ * use it.  Keith Owens <kaos@ocs.com.au> 28 Oct 2000.
+ */
+typedef struct {
+	void			(* free_memory) (struct agp_memory *);
+	struct agp_memory *	(* allocate_memory) (size_t, u32);
+	int			(* bind_memory) (struct agp_memory *, off_t);
+	int			(* unbind_memory) (struct agp_memory *);
+	void			(* enable) (u32);
+	int			(* acquire) (void);
+	void			(* release) (void);
+	int			(* copy_info) (struct agp_kern_info *);
+} drm_agp_t;
+
+extern const drm_agp_t *drm_agp_p;
+
+#endif				/* __KERNEL__ */
+#endif				/* _AGP_BACKEND_H */
diff -Naur NVIDIA-Linux-x86-1.0-6111-pkg1-orig/usr/src/nv/nv-linux.h NVIDIA-Linux-x86-1.0-6111-pkg1/usr/src/nv/nv-linux.h
--- NVIDIA-Linux-x86-1.0-6111-pkg1-orig/usr/src/nv/nv-linux.h	2005-04-04 19:04:44.017429536 +0300
+++ NVIDIA-Linux-x86-1.0-6111-pkg1/usr/src/nv/nv-linux.h	2005-04-04 19:07:44.656968152 +0300
@@ -123,7 +123,7 @@
 #if defined (CONFIG_AGP) || defined (CONFIG_AGP_MODULE)
 #ifndef NOAGPGART
 #  define AGPGART
-#  include <linux/agp_backend.h>
+#  include "agp_backend.h"
 #  include <linux/agpgart.h>
 #endif
 #endif


Wenn das bei Euch nicht so ist, dann bekommt Ihr vielleicht den im nächsten Punkt beschriebenen Fehler. Andernfalls müsst Ihr nun den Patch manuell erstellen und am Besten über "portage overlay" anwenden und einmergen.

[Bearbeiten] Portage Overlay

Als erstes müsst Ihr ein passendes Verzeichnis anlegen:

mkdir -p /usr/local/portage

Dann wird die make.conf modifiziert.

vim /etc/make.conf

Fügt folgende Zeile ein:

Datei: make.conf
PORTDIR_OVERLAY="/usr/local/portage"


Jetzt kopiert die Dateien aus dem Standard-Portage-Verzeichnis in Euren Portage-Overlay und löscht unnötige ebuild-Dateien:

Code: portage overlay erzeugen Teil1
cd /usr/portage/media-video/
cp -R nvidia-kernel /usr/local/portage/
cd /usr/local/portage/nvidia-kernel/
rm nvidia-kernel-1.0.7*
rm nvidia-kernel-1.0.8*
rm nvidia-kernel-1.0.66*


Jetzt kann man auch die unnötigen Dateien weiter tiefer löschen:

Code: portage overlay erzeugen Teil2
cd files
rm digest-nvidia-kernel-1.0.7*
rm digest-nvidia-kernel-1.0.8*
rm digest-nvidia-kernel-1.0.66*
rm -r 1.0.7*
rm -r 1.0.8*
rm -r 1.0.66*


Nun vergleichen wir noch den Stand der patch-Dateien:

Code: patchs vergleichen-Aufruf
cd 1.0.6111
ls -la


folgende Patchs sollten enthalten sein:

Code: patchs vergleichen-Ergebnis
-rw-r--r--   1 root root 1082  7. Nov 2004  conftest_koutput_includes.patch
-rw-r--r--   1 root root 3640 30. Aug 2004  nv_enable_pci.patch
-rw-r--r--   1 root root 2903  4. Okt 2004  nv-pci_find_class.patch
-rw-r--r--   1 root root 5715  4. Okt 2004  nv-remap-range.patch
-rw-r--r--   1 root root  856  6. Nov 2004  power-suspend-2.6.9-changes.patch
-rw-r--r--   1 root root  542  4. Okt 2004  vmalloc-reserve.patch


[Bearbeiten] Neuen Patch anlegen und anwenden

Kopiert den Patch von obigem Link zu den vorhandenen in Euer overlay-Verzeichnis. Danach muss er noch in der ebuild-Datei zugetragen werden, damit er beim Installationsvorgang angewandt wird. Fügt ihn am Besten hinter dem letzten patch ein (bei mir ca. Zeile 109).

vim ../../nvidia-kernel-1.0.6111-r3.ebuild

Datei: nvidia-kernel-1.0.6111-r3.ebuild
# Fix the drm_agp_t issue (Moocha's patch)
epatch ${FILESDIR}/${PV}/moocha_agp_backend_h_fix.patch


Dann die Datei mit ":x" speichern und die ebuild-Umgebung mit:

ebuild nvidia-kernel-1.0.6111-r3.ebuild digest

neu aufbauen.

Jetzt ist die Zeit für den nächsten Bauversuch:

[Bearbeiten] Dritter emerge-Versuch

emerge nvidia-glx

Hier spuckte der Compiler in etwa folgende Fehlermeldung aus:

Error: 'Unknown symbol inter_module_get'

Dass ist der sogenannte "inter_module_get"-Fehler. Es existiert dazu ein Patch (inter_module_fix.patch). Dazu sind ein paar erweiterte Bemerkungen nötig. Dieser Patch (Leider habe ich momentan keinen Link zum holen des Patchs, daher hier der Inhalt in der Box unten) lässt sich wahrscheinlich eher als WorkArround bezeichen: Der Bereich, welcher den Fehler auslöst, wird einfach entfernt. Das hat aber auch negative Auswirkungen. Der entfernte Bereich ist nach meinem Verständnis für die Überprüfung des kompilierten Kernel-Bereichs "AGPGART" zuständig. Ihr müsst daher selbst sicherstellen, dass der AGPGART-Bereich aus dem Kernel entfernt wurde (s. ziemlich weit unten), bevor Ihr das nvidia-Kernel-Modul in die X...-config einbindet! Was im anderen Falle passiert? Probiert es aus und schreibt es hier rein (z.B. "die Karte geht sofort in Flammen auf" o.ä. ;o}).

Code: inter_module_fix.patch
--- nv/nv.c   2005-03-15 12:47:32.629129544 +0100
+++ nv.n/nv.c   2005-03-15 12:45:33.418252352 +0100
@@ -3342,10 +3342,10 @@
     if ( (!NV_AGP_ENABLED(nv)) && (config & NVOS_AGP_CONFIG_NVAGP) )
     {
         /* make sure the user does not have agpgart loaded */
-        if (inter_module_get("drm_agp")) {
+        /*if (inter_module_get("drm_agp")) {
             inter_module_put("drm_agp");
             nv_printf(NV_DBG_WARNINGS, "NVRM: not using NVAGP, AGPGART is loaded!!\n");
-        } else {
+        } else {*/
 #if defined(CONFIG_X86_64) && defined(CONFIG_GART_IOMMU)
             nv_printf(NV_DBG_WARNINGS,
                 "NVRM: not using NVAGP, kernel was compiled with GART_IOMMU support!!\n");
@@ -3357,7 +3357,7 @@
                 nv->agp_status = NV_AGP_STATUS_ENABLED;
             }
 #endif
-        }
+        //}
     }
 
     if (NV_AGP_ENABLED(nv))


So nutzt Ihr den patch: Wenn Ihr das bisher nicht getan habt, dann öffnet im X eine Konsole, wechselt ins Overlay-Verzeichnis und öffnet das Programm zum editieren:

Code: inter_module_fix.patch anlegen
cd /usr/local/portage/nvidia-kernel/1.0.6111 
vim inter_module_fix.patch


Fügt durch Kopieren von oben den Inhalt in die geöffnete Datei ein und schließt den Editor nun wieder mit ":x". Im nächsten Schritt muss dieser Patch wieder in der ebuild-Datei zugetragen werden.

[Bearbeiten] Zweiten neuen Patch anlegen und anwenden

Jetzt wieder die ebuild-Datei öffnen und den patch an letzter Stelle (ca. Zeile 111) zutragen.

vim ../nvidia-kernel-1.0.6111-r3.ebuild

Datei: nvidia-kernel-1.0.6111-r3.ebuild
# Fix inter_module_get problem
epatch ${FILESDIR}/${PV}/inter_module_fix.patch


Editor mit :x schließen und mit

ebuild nvidia-kernel-1.0.6111-r3.ebuild digest

die ebuild-Umgebung neu aufbauen. Im nächsten Versuch sollte es nun laufen. Andernfalls müsst Ihr hier in der Wiki noch ein paar Zeilen dazuschreiben.

[Bearbeiten] Kernel konfigurieren

ACHTUNG!! Das muss nur getan werden, wenn der inter_module_fix-Patch angewandt wird! Ganz nützlich ist dabei folgende Seite: [Kernel anpassen]

Sucht bitte auf dieser Seite nach "Character devices --->" Der Eintrag für /dev/agpgart muss deaktiviert werden!

 < > /dev/agpgart (AGP Support) 

Jetzt könnt Ihr den Kernel neu kompilieren usw.

Nach dem Neustart müsst Ihr dann nur noch Eure /etc/X11/xorg.conf modifizieren. Was da genau zu tun ist findet Ihr auf der nvidia-guide Seite.

[Bearbeiten] Zusätzliche Hinweise, Problemlösungen

Läuft trotz sauber installiertem Treiber das X nicht hoch, dann kann es an den fehlenden /dev/-Links liegen. Feststellen kann man das durch ein:

ls -la /dev/nvidia0

Existiert dieser node nicht, dann führt zum Anlegen der "nodes" als root das script "NVmakedevices.sh" aus.

[Bearbeiten] Links

'Persönliche Werkzeuge