LINUX-BG   Адрес : http://www.linux-bg.org
Как да инсталираме драйверите на ATI
От: Атанас Мавров
Публикувана на: 22-01-2004
Адрес на статията: http://www.linux-bg.org/cgi-bin/y/index.pl?page=article&id=advices&key=358260248

Кратко ръководство за пестене на време и нерви :-)

Не знам колко от вас са се сблъсквали с подобни подобни проблеми но тук ще изложа как успях да накарам Х -са и драйвера на ATI да работят нормално. Системата е Slackware-current ядрото 2.6.1.

  1. След като сложих 2.6.* ядро се появи странен проблем: Х-са тръгваше нормално, но след като го спра, системата замръзваше. Решението на този въпрос бе на доста неочаквано място за мен - след като спрях поддръжката на apm от ядрото (оставих ACPI) нещата се оправиха. Е, след дългото търсене реших да отпразнувам намирането на решение, като инсталирам драйверите на ATI.

  2. Е, празника беше кратък. Инсталирах драйвера, и се опитах да компилирам модула за ядрото, намиращ се в /lib/modules/fglrx. Е да де, но и тук срещнах поредната трудност. Излизаха странни съобщения за грешка поради липсата на дефиниция на VMALLOC_VMADDR. След ровене и консултации намерих начин да поправя този проблем. Ето едно от възможните решения - във файла /usr/src/linux/include/asm-i386/pgtable.h добавяме следния ред:

     #define VMALLOC_VMADDR(x) ((unsigned long)(x)) 
     
  3. Задължително условие при компилиране на ядрото е да има поддръжка на AGP и да няма никаква поддръжка на DRI!! Ако сте забравили DRI поддръжката в ядрото, вероятно ще видите съобщение от рода на:

     fglrx(0): DRIScreenInit failed! 
     

    Решението, както се досещате, е просто - конфигурирайте ядрото без поддръжка на DRI, прекомпилирайте и нещата надявам се ще се оправят.

  4. За ползващите AMD процесори - имайте предвид, че има проблем при инициализацията на DRI! Ако Х-са не се стартира и в dmesg откриете следните редове:

     Unable to handle kernel NULL 
     pointer dereference at virtual address 00000001 printing 
     eip:d09a8320*pde = 0b0e6067*pte = 00000000 
     Oops: 0002 [#2] 
     ............................ 
     

    То проблемът най-вероятно е такъв. Решението е да се промени файла lib/modules/fglrx/build_mod/firegl_public.c. Ето това е кодът:

     -- Attached file included as plaintext by Ecartis -- 
     -- File: fglrx-patch.amd 
      
     --- firegl_public.c     2003-09-21 19:43:30.000000000 -0700 
     +++ firegl_public.c.new 2003-10-10 13:03:46.751838800 -0700 
     @@ -1508,7 +1508,7 @@ 
          pte_t* pte_p; 
          pte_t  pte; 
      
     -    pte_linear = VMALLOC_VMADDR(virtual_addr);  // convert to 
     pte linear 
     address (x86 => nop) 
     +    pte_linear = ((unsigned long)(virtual_addr));  // convert 
     to pte linear 
     address (x86 => nop) 
          pgd_p = pgd_offset(mm, pte_linear); 
          pmd_p = pmd_offset(pgd_p, pte_linear); 
      #ifndef FGL_ATOMIC_PTE 
     @@ -1981,7 +1981,7 @@ 
      
              Convert to pte linear address (x86 => nop) 
           */ 
     -    pte_linear = VMALLOC_VMADDR(linear); 
     +    pte_linear = ((unsigned long)(linear)); 
      
          /* 
              Locate responsible kernel PTE for this linear address 
     @@ -2187,7 +2187,7 @@ 
          pte_t* pte_p; 
          pte_t  pte; 
      
     -    pte_linear = VMALLOC_VMADDR(virtual_addr);  // convert to 
     pte linear 
     address (x86 => nop) 
     +    pte_linear = ((unsigned long)(virtual_addr));  // convert 
     to pte linear 
     address (x86 => nop) 
          pgd_p = pgd_offset(vma->vm_mm, pte_linear); 
          pmd_p = pmd_offset(pgd_p, pte_linear); 
      #ifndef FGL_ATOMIC_PTE 
     @@ -3106,7 +3106,7 @@ 
      
      int __ke_amd_adv_spec_cache_feature(void) 
      { 
     -#if ( (PAGE_ATTR_FIX == 1) || (LINUX_VERSION_CODE == 
     KERNEL_VERSION(2,4,19)) ) 
     +#if ( (PAGE_ATTR_FIX == 1) || (LINUX_VERSION_CODE >= 
     KERNEL_VERSION(2,4,19)) ) 
      /* the kernel already does provide a fix for the AMD Athlon 
         big page attribute / cache flush data consistency system 
     bug on its own. 
         (AMD claimed that CPU cache behaviour for such pages is 
     not specified.) 
     --- agpgart_be.c        2003-09-21 19:43:30.000000000 -0700 
     +++ agpgart_be.c.new    2003-10-10 13:06:43.227010496 -0700 
     @@ -6070,7 +6070,7 @@ 
              VIA_APOLLO_KT400, 
              "Via", 
              "Apollo KT400", 
     -        via_generic_setup }, // AGP v2 
     +        via_kt400_setup }, // AGP v2 
          { PCI_DEVICE_ID_VIA_8754, // == PCI_DEVICE_ID_VIA_P4X333, 
              PCI_VENDOR_ID_VIA, 
              VIA_APOLLO_P4X400, 
     

    Ако не ви се занимава, може да изтеглите готовия файл от http://free.top.bg/bugar/ati/firegl_public.c.

    И така, прекомпилирайте наново драйвера, инсталирайте модула и се надявам всичко да работи нормално. Това може да проверите, като изпълните следната команда:

     $ glxinfo 
     $ glxgears 
     

П.П. Специални благодарности на Виктор Василев. Без неговата помощ горните редове нямаше да ги има :-)


<< Използване на distcc и ccache | BIND9: Опционално заключване на демона >>

Авторите на сайта, както и техните сътрудници запазват авторските права върху собствените си материали публикувани тук, но те са copyleft т.е. могат свободно да бъдат копирани и разпространявани с изискването изрично да се упоменава името на автора, както и да се публикува на видно място, че те са взети от оригиналния им URL-адрес на този сървър (http://www.linux-bg.org). Авторските права на преводните материали принадлежат на техните автори. Ако с публикуването тук на някакъв материал неволно са нарушени нечии права - след констатирането на този факт материалът ще бъде свален.

All trademarks, logos and copyrights mentioned on this site are the property of their respective owners.
Linux is copyright by Linus Torvalds.
© Линукс за българи ЕООД 2007
© Slavei Karadjov 1999 - 2006

All rights reserved.

Изпълнението отне: 0 wallclock secs ( 0.18 usr + 0.01 sys = 0.19 CPU)