Sterowniki kart graficznych ATI fglrx i najnowsza wersja j

Archiwalne, stare wpisy FAQ i HowTo Użytkowników
M
Posty: 36
Rejestracja: 07 listopada 2007, 13:50
Lokalizacja: Czêstochowa

Sterowniki kart graficznych ATI fglrx i najnowsza wersja jądra

Post autor: M »

Witam.
Po długich wojażach i czytaniu rozmaitych for internetowych rozwiązałem w końcu problem z instalacją sterowników fglrx od ATI instalowanych na kompilowanym jądrze.
Sterowniki które instalowałem były w wersji 8.54.3, natomiast jądro skompilowałem w wersji 2.6.27.4. Cała instalacja sprowadza się do kilku prostych kroków. Należy najpierw pobrać plik sterowników ze strony ATi. Następnie po pobraniu, uruchamiamy konsolę, logujemy się na konto roota i nadajemy plikowi atrybut wykonywania +x:

Kod: Zaznacz cały

laptop:/usr/src# chmod +x ati-driver-installer-8-10-x86.x86_64.run
Następnie uruchamiamy instalatora:

Kod: Zaznacz cały

laptop:/usr/src# ./ati-driver-installer-8-10-x86.x86_64.run
Potwierdzamy standardowo wszystkie domyślne wybory. Po instalacji powinien wyskoczyć błąd. Jeśli nie, sterowniki zainstalowały się prawidłowo. Jeśli błąd jednak się pojawił, działamy dalej. Możemy także zerknąć sobie na ów błąd w pliku /usr/share/ati/fglrx-install.log.

Następnym krokiem po zainstalowaniu sterowników z błędem, musimy dokonać nałożenia łatki modułu. W tym celu udajemy się do /lib/modules/fglrx/build_mod.

Następnie tworzymy plik (wersja dla jądra 2.6.27.x) łatka o zawartości:

Kod: Zaznacz cały

--- firegl_public.c.orig        2008-09-19 10:57:09.000000000 +0200
+++ firegl_public.c     2008-09-19 10:55:57.000000000 +0200
@@ -199,6 +199,12 @@
 #define preempt_enable()
 #endif

+/* Since 2.6.27 smp_call_function doesn't have a nonatomic/retry argument */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
+#define SMP_CALL_FUNCTION(func, info, retry, wait) smp_call_function(func, info, wait)
+#else
+#define SMP_CALL_FUNCTION(func, info, retry, wait) smp_call_function(func, info, retry, wait)
+#endif
 // ============================================================
 /* globals */

@@ -250,7 +256,7 @@
 const char BUILD_KERNEL_HAS_MODVERSIONS_CLEARED;
 #endif

-#ifdef __SMP__
+#ifdef CONFIG_SMP
 const unsigned long __ke_SMP_State = 1;
 const char BUILD_KERNEL_HAS_SMP_SET;
 #else
@@ -2516,8 +2522,8 @@
 {
 /*Some kernel developer removed the export of symbol "flush_tlb_page" on 2.6.25 x86_64 SMP kernel.
   Define a simple version here.*/
-#if defined(__x86_64__) && defined(__SMP__) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25))
-    on_each_cpu(KCL_flush_tlb_one, &va, 1, 1);
+#if defined(__x86_64__) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25))
+    on_each_cpu(KCL_flush_tlb_one, &va, 1);
 #else
     flush_tlb_page(vma, va);
 #endif
@@ -2902,7 +2908,7 @@
 /*****************************************************************************/

-#ifdef __SMP__
+#ifdef CONFIG_SMP
 static atomic_t cpus_waiting;

 static void deferred_flush(void* contextp)
@@ -2918,13 +2924,13 @@
        while (atomic_read(&cpus_waiting) > 0)
                barrier();
 }
-#endif /* __SMP__ */
+#endif /* CONFIG_SMP */

 int ATI_API_CALL __ke_flush_cache(void)
 {
-#ifdef __SMP__
+#ifdef CONFIG_SMP
     /* write back invalidate all other CPUs (exported by kernel) */
-       if (smp_call_function(deferred_flush, NULL, 1, 0) != 0)
+       if (SMP_CALL_FUNCTION(deferred_flush, NULL, 1, 0) != 0)
                panic("timed out waiting for the other CPUs!\n");

     /* invalidate this CPU */
@@ -2938,7 +2944,7 @@

        while (atomic_read(&cpus_waiting) > 0)
                barrier();
-#else /* !__SMP__ */
+#else /* !CONFIG_SMP */
 #if defined(__i386__) || defined(__x86_64__)
        asm volatile ("wbinvd":::"memory");
 #elif defined(__alpha__) || defined(__sparc__)
@@ -2946,7 +2952,7 @@
 #else
 #error "Please define flush_cache for your architecture."
 #endif
-#endif /* !__SMP__ */
+#endif /* !CONFIG_SMP */

     //for kernel 2.6.25, tlb_flush has been included when calling set_pages_*.
     #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
@@ -4654,7 +4660,7 @@
    }

 #ifdef CONFIG_SMP
-   if (smp_call_function(KCL_setup_pat, NULL, 0, 1) != 0)
+   if (SMP_CALL_FUNCTION(KCL_setup_pat, NULL, 0, 1) != 0)
        return 0;
 #endif
    KCL_setup_pat(NULL);
@@ -4673,7 +4679,7 @@
     }

 #ifdef CONFIG_SMP
-    if (smp_call_function(KCL_restore_pat, NULL, 0, 1) != 0)
+    if (SMP_CALL_FUNCTION(KCL_restore_pat, NULL, 0, 1) != 0)
        return;
 #endif
     KCL_restore_pat(NULL);
Zapisujemy go przykładowo jako fglrx.patch.
Pozostało nam jeszcze dokonanie nałożenia łaty:

Kod: Zaznacz cały

laptop:/lib/modules/fglrx/build_mod# patch -p1 < fglrx.patch
missing header for unified diff at line 3 of patch
can't find file to patch at input line 3
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|--- firegl_public.c.orig       2008-09-19 10:57:09.000000000 +0200
|+++ firegl_public.c    2008-09-19 10:55:57.000000000 +0200
--------------------------
File to patch: firegl_public.c
patching file firegl_public.c
Hunk #1 succeeded at 200 (offset 1 line).
Hunk #2 succeeded at 257 (offset 1 line).
Hunk #3 succeeded at 2354 (offset -168 lines).
Hunk #4 succeeded at 2772 (offset -136 lines).
Hunk #5 succeeded at 2788 (offset -136 lines).
Hunk #6 succeeded at 2808 (offset -136 lines).
Hunk #7 succeeded at 2816 (offset -136 lines).
Hunk #8 succeeded at 4066 (offset -594 lines).
Hunk #9 succeeded at 4085 (offset -594 lines).
Następnie uruchamiamy skrypt make.sh znajdujący się w /lib/modules/fglrx/build_mod:

Kod: Zaznacz cały

laptop:/lib/modules/fglrx/build_mod# sh make.sh
ATI module generator V 2.0
==========================
initializing...
doing Makefile based build for kernel 2.6.x and higher
rm -rf *.c *.h *.o *.ko *.GCC* .??* *.symvers
make -C /lib/modules/2.6.27.4/build SUBDIRS=/lib/modules/fglrx/build_mod/2.6.x modules
make[1]: WejÅie do katalogu `/usr/src/linux-2.6.27.4'
  CC [M]  /lib/modules/fglrx/build_mod/2.6.x/firegl_public.o
  /lib/modules/fglrx/build_mod/2.6.x/firegl_public.c: In function â__ke_vm_phys_addr_strâ:
  /lib/modules/fglrx/build_mod/2.6.x/firegl_public.c:3528: warning: return makes pointer from integer without a cast
  /lib/modules/fglrx/build_mod/2.6.x/firegl_public.c:3529: warning: return makes pointer from integer without a cast
  /lib/modules/fglrx/build_mod/2.6.x/firegl_public.c:3530: warning: return makes pointer from integer without a cast
  /lib/modules/fglrx/build_mod/2.6.x/firegl_public.c:3532: warning: return makes pointer from integer without a cast
  /lib/modules/fglrx/build_mod/2.6.x/firegl_public.c: At top level:
  /lib/modules/fglrx/build_mod/2.6.x/firegl_public.c:5780: warning: initialization from incompatible pointer type
  /lib/modules/fglrx/build_mod/2.6.x/firegl_public.c:5806: warning: initialization from incompatible pointer type
   CC [M]  /lib/modules/fglrx/build_mod/2.6.x/kcl_io.o
        CC [M]  /lib/modules/fglrx/build_mod/2.6.x/kcl_pci.o
        CC [M]  /lib/modules/fglrx/build_mod/2.6.x/kcl_agp.o
        LD [M]  /lib/modules/fglrx/build_mod/2.6.x/fglrx.o
        Building modules, stage 2.
        MODPOST 1 modules
        WARNING: modpost: module fglrx.ko uses symbol 'init_mm' marked UNUSED
        CC      /lib/modules/fglrx/build_mod/2.6.x/fglrx.mod.o
        LD [M]  /lib/modules/fglrx/build_mod/2.6.x/fglrx.ko
make[1]: Opuszczenie katalogu `/usr/src/linux-2.6.27.4'
build succeeded with return value 0
duplicating results into driver repository...
done.
You must change your working directory to /lib/modules/fglrx
and then call ./make_install.sh in order to install the built module.
Na koniec wykonujemy podane powyżej polecenia, czyli przechodzimy poziom niżej do /lib/modules/fglrx i uruchamiamy plik make_install.sh.

UWAGA!
Aby moduł został zbudowany i załadowany prawidłowo, należy usunąć z konfiguracji jądra wszelkie wpisy dotyczące DRM. Można to sprawdzić w następujący sposób:

Kod: Zaznacz cały

laptop:~# cat /usr/src/linux/.config | grep DRM
# CONFIG_DRM is not set

Ewentualnie będąc jako root w katalogu /usr/src/linux użyć polecenia make menuconfig.

Pozostaje jeszcze tylko załadować moduł poleceniem:

Kod: Zaznacz cały

modprobe fglrx
oraz zresetować system. Aby sprawdzić, czy mamy wspomaganie sprzętowe wpisujemy w środowisku graficznym jako użytkownik w konsoli:

Kod: Zaznacz cały

manius@laptop:~$ fglrxinfo
display: :0.0  screen: 0
OpenGL vendor string: ATI Technologies Inc.
OpenGL renderer string: ATI Mobility Radeon X1600
OpenGL version string: 2.1.8087 Release
Możemy także zerknąć, że moduł jest ładnie załadowany w naszym systemie poleceniem:

Kod: Zaznacz cały

manius@laptop:~$ lsmod
Module                  Size  Used by
fglrx                1795208  39
Zablokowany