Sterowniki kart graficznych ATI fglrx i najnowsza wersja jądra
: 04 listopada 2008, 13:08
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:
Następnie uruchamiamy instalatora:
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:
Zapisujemy go przykładowo jako fglrx.patch.
Pozostało nam jeszcze dokonanie nałożenia łaty:
Następnie uruchamiamy skrypt make.sh znajdujący się w /lib/modules/fglrx/build_mod:
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:
Ewentualnie będąc jako root w katalogu /usr/src/linux użyć polecenia make menuconfig.
Pozostaje jeszcze tylko załadować moduł poleceniem: oraz zresetować system. Aby sprawdzić, czy mamy wspomaganie sprzętowe wpisujemy w środowisku graficznym jako użytkownik w konsoli:
Możemy także zerknąć, że moduł jest ładnie załadowany w naszym systemie poleceniem:
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
Kod: Zaznacz cały
laptop:/usr/src# ./ati-driver-installer-8-10-x86.x86_64.run
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);
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).
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.
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
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
Kod: Zaznacz cały
manius@laptop:~$ lsmod
Module Size Used by
fglrx 1795208 39