Blog in development hell.
Ближайшее изменение – новый пост.

воскресенье, 31 октября 2010 г.

Ubuntu 10.10 Maverick, Ati Old Driver (9.8) Installation.

Внимание! Мануал на данный момент не работает!
А так все красиво начиналось...
Качаем собственно сам драйвер отсюда http://support.amd.com/us/gpudownload/linux/legacy/Pages/radeon_linux.aspx?type=2.4.2&product=&lang=us&rev=9.3&ostype=Linux%20x86. Для меня это 9.3 (10.2 как оказалось не работает, 9.8 впрочем тоже) - это последняя версия драйвера поддерживающая Ati Mobility Radeon x1350.
Делаем пакет для Убунты (для Федоры и т.д., наверное, тоже сработает). Пытаемся его установить и получаем несколько ошибок.
./ati-driver-installer-9-3-x86.x86_64.run --buildpkg Ubuntu/9.04
dpkg -i fglrx-kernel-source_8.593-0ubuntu1_i386.deb
Adding Module to DKMS build system
Doing initial module build

Error!  Build of fglrx.ko failed for: 2.6.35-22-generic (i686)
Consult the make.log in the build directory
/var/lib/dkms/fglrx/8.593/build/ for more information.
Traceback (most recent call last):
  File "/usr/share/apport/package-hooks/dkms.py", line 47, in 
    report['SourcePackage'] = apport.packaging.get_source(package)
  File "/usr/lib/python2.6/dist-packages/apport/packaging_impl.py", line 106, in get_source
    if self._apt_pkg(package).installed:
  File "/usr/lib/python2.6/dist-packages/apport/packaging_impl.py", line 66, in _apt_pkg
    raise ValueError, 'package does not exist'
ValueError: package does not exist
Installing initial module

Error! Could not locate fglrx.ko for module fglrx in the DKMS tree.
You must run a dkms build for kernel 2.6.35-22-generic (i686) first.
Done.
cd /usr/src/fglrx-8.593/
./make.sh
AMD kernel module generator version 2.1
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.35-22-generic/build SUBDIRS=/usr/src/fglrx-8.593/2.6.x modules
make[1]: Вход в каталог `/usr/src/linux-headers-2.6.35-22-generic'
  CC [M]  /usr/src/fglrx-8.593/2.6.x/firegl_public.o
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:41: error: #error unknown or undefined architecture configured
In file included from /usr/src/fglrx-8.593/2.6.x/firegl_public.c:169:
/usr/src/fglrx-8.593/2.6.x/firegl_public.h:164: warning: "PM_EVENT_SUSPEND" redefined
include/linux/pm.h:325: note: this is the location of the previous definition
In file included from /usr/src/fglrx-8.593/2.6.x/drmP.h:86,
                 from /usr/src/fglrx-8.593/2.6.x/drm_proc.h:41,
                 from /usr/src/fglrx-8.593/2.6.x/firegl_public.c:431:
/usr/src/fglrx-8.593/2.6.x/drm_os_linux.h:45: error: conflicting types for ‘irqreturn_t’
include/linux/irqreturn.h:16: note: previous declaration of ‘irqreturn_t’ was here
In file included from /usr/src/fglrx-8.593/2.6.x/firegl_public.c:431:
/usr/src/fglrx-8.593/2.6.x/drm_proc.h: In function ‘FGLDRM__vma_info’:
/usr/src/fglrx-8.593/2.6.x/drm_proc.h:497: warning: format ‘%08lx’ expects type ‘long unsigned int’, but argument 5 has type ‘phys_addr_t’
/usr/src/fglrx-8.593/2.6.x/firegl_public.c: In function ‘__ke__cmpxchg’:
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:1363: error: variable or field ‘__ret’ declared void
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:1363: error: variable or field ‘__old’ declared void
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:1363: error: variable or field ‘__new’ declared void
/usr/src/fglrx-8.593/2.6.x/firegl_public.c: In function ‘KCL_GetEffectiveUid’:
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:1405: error: ‘struct task_struct’ has no member named ‘euid’
/usr/src/fglrx-8.593/2.6.x/firegl_public.c: In function ‘KCL_PosixSecurityCapSetIPCLock’:
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:1779: error: ‘struct task_struct’ has no member named ‘cap_effective’
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:1783: error: ‘struct task_struct’ has no member named ‘cap_effective’
/usr/src/fglrx-8.593/2.6.x/firegl_public.c: In function ‘KCL_InstallInterruptHandler’:
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:2661: warning: passing argument 2 of ‘request_irq’ from incompatible pointer type
include/linux/interrupt.h:135: note: expected ‘irq_handler_t’ but argument is of type ‘irqreturn_t (*)(int,  void *)’
/usr/src/fglrx-8.593/2.6.x/firegl_public.c: In function ‘KCL_MEM_VM_GetRegionPhysAddrStr’:
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:3223: warning: return makes pointer from integer without a cast
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:3224: warning: return makes pointer from integer without a cast
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:3225: warning: return makes pointer from integer without a cast
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:3227: warning: return makes pointer from integer without a cast
/usr/src/fglrx-8.593/2.6.x/firegl_public.c: In function ‘KAS_Ih_Execute’:
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:4202: warning: ‘return’ with no value, in function returning non-void
make[2]: *** [/usr/src/fglrx-8.593/2.6.x/firegl_public.o] Ошибка 1
make[1]: *** [_module_/usr/src/fglrx-8.593/2.6.x] Ошибка 2
make[1]: Выход из каталога `/usr/src/linux-headers-2.6.35-22-generic'
make: *** [kmod_build] Ошибка 2
build failed with return value 2
Первая ошибка - изменные функции ядра. Решение отсюда: http://www.mail-archive.com/debian-bugs-closed@lists.debian.org/msg270029.html
cd /usr/src/fglrx-8.593/
cat > patch.for.new.kernel << EOF
--- fglrx-driver-10-2.orig/common/lib/modules/fglrx/build_mod/firegl_public.c 20:34:34.000000000 +0100
+++ fglrx-driver-10-2/common/lib/modules/fglrx/build_mod/firegl_public.c2 21:23:51.580872456 +0100
@@ -1470,7 +1470,16 @@
 #ifndef __HAVE_ARCH_CMPXCHG
     return __fgl_cmpxchg(ptr,old,new,size);
 #else
-    return __cmpxchg(ptr,old,new,size);
+    switch (size) {
+    case 1: { volatile u8 *_ptr = ptr; return cmpxchg(_ptr, old, new); }
+    case 2: { volatile u16 *_ptr = ptr; return cmpxchg(_ptr, old, new); }
+    case 4: { volatile u32 *_ptr = ptr; return cmpxchg(_ptr, old, new); }
+#ifdef __x86_64__
+    case 8: { volatile u64 *_ptr = ptr; return cmpxchg(_ptr, old, new); }
+#endif
+    default:
+        return old;
+    }
 #endif
 }
EOF
patch < patch.for.new.kernel
patching file firegl_public.c
Hunk #1 succeeded at 1360 (offset -110 lines).
cd /usr/src/fglrx-8.593/
./make.sh
AMD kernel module generator version 2.1
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.35-22-generic/build SUBDIRS=/usr/src/fglrx-8.593/2.6.x modules
make[1]: Вход в каталог `/usr/src/linux-headers-2.6.35-22-generic'
  CC [M]  /usr/src/fglrx-8.593/2.6.x/firegl_public.o
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:41: error: #error unknown or undefined architecture configured
In file included from /usr/src/fglrx-8.593/2.6.x/firegl_public.c:169:
/usr/src/fglrx-8.593/2.6.x/firegl_public.h:164: warning: "PM_EVENT_SUSPEND" redefined
include/linux/pm.h:325: note: this is the location of the previous definition
In file included from /usr/src/fglrx-8.593/2.6.x/drmP.h:86,
                 from /usr/src/fglrx-8.593/2.6.x/drm_proc.h:41,
                 from /usr/src/fglrx-8.593/2.6.x/firegl_public.c:431:
/usr/src/fglrx-8.593/2.6.x/drm_os_linux.h:45: error: conflicting types for ‘irqreturn_t’
include/linux/irqreturn.h:16: note: previous declaration of ‘irqreturn_t’ was here
In file included from /usr/src/fglrx-8.593/2.6.x/firegl_public.c:431:
/usr/src/fglrx-8.593/2.6.x/drm_proc.h: In function ‘FGLDRM__vma_info’:
/usr/src/fglrx-8.593/2.6.x/drm_proc.h:497: warning: format ‘%08lx’ expects type ‘long unsigned int’, but argument 5 has type ‘phys_addr_t’
/usr/src/fglrx-8.593/2.6.x/firegl_public.c: In function ‘KCL_GetEffectiveUid’:
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:1414: error: ‘struct task_struct’ has no member named ‘euid’
/usr/src/fglrx-8.593/2.6.x/firegl_public.c: In function ‘KCL_PosixSecurityCapSetIPCLock’:
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:1788: error: ‘struct task_struct’ has no member named ‘cap_effective’
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:1792: error: ‘struct task_struct’ has no member named ‘cap_effective’
/usr/src/fglrx-8.593/2.6.x/firegl_public.c: In function ‘KCL_InstallInterruptHandler’:
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:2670: warning: passing argument 2 of ‘request_irq’ from incompatible pointer type
include/linux/interrupt.h:135: note: expected ‘irq_handler_t’ but argument is of type ‘irqreturn_t (*)(int,  void *)’
/usr/src/fglrx-8.593/2.6.x/firegl_public.c: In function ‘KCL_MEM_VM_GetRegionPhysAddrStr’:
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:3232: warning: return makes pointer from integer without a cast
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:3233: warning: return makes pointer from integer without a cast
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:3234: warning: return makes pointer from integer without a cast
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:3236: warning: return makes pointer from integer without a cast
/usr/src/fglrx-8.593/2.6.x/firegl_public.c: In function ‘KAS_Ih_Execute’:
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:4211: warning: ‘return’ with no value, in function returning non-void
make[2]: *** [/usr/src/fglrx-8.593/2.6.x/firegl_public.o] Ошибка 1
make[1]: *** [_module_/usr/src/fglrx-8.593/2.6.x] Ошибка 2
make[1]: Выход из каталога `/usr/src/linux-headers-2.6.35-22-generic'
make: *** [kmod_build] Ошибка 2
build failed with return value 2
Вторая - проблемы с заданием типов. Решение отсюда https://bbs.archlinux.org/viewtopic.php?id=68905:
cd /usr/src/fglrx-8.593/2.6.x/
cat > patch.for.types << EOF
--- a/linux-core/drm_os_linux.h
+++ b/linux-core/drm_os_linux.h
@@ -51,7 +51,7 @@
 #define DRM_IRQ_ARGS  int irq, void *arg, struct pt_regs *regs
 /** backwards compatibility with old irq return values */
 #ifndef IRQ_HANDLED
-typedef void irqreturn_t;
+#include <linux/irqreturn.h>
 #define IRQ_HANDLED   /* nothing */
 #define IRQ_NONE      /* nothing */
 #endif
EOF
patch < patch.for.types
cat > patch.makefile << EOF
--- Makefile 2010-11-01 03:02:13.142924000 +0300
+++ Makefile.new 2010-11-01 03:02:06.466923999 +0300
@@ -83,6 +83,7 @@
 # default:: kmod_build
 
 kmod_build:: $(fglrx-libs) $(fglrx-cfiles) $(fglrx-hdrs) $(drm-hdrs)
+ patch < patch.for.types
  $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
 
 %.c:
EOF
patch < patch.makefile
patching file drm_os_linux.h
Hunk #1 succeeded at 42 with fuzz 1 (offset -9 lines).
patching file Makefile
cd /usr/src/fglrx-8.593/
./make.sh
AMD kernel module generator version 2.1
doing Makefile based build for kernel 2.6.x and higher
rm -rf *.c *.h *.o *.ko *.GCC* .??* *.symvers
patch < patch.for.types
patching file drm_os_linux.h
Hunk #1 succeeded at 42 with fuzz 1 (offset -9 lines).
make -C /lib/modules/2.6.35-22-generic/build SUBDIRS=/usr/src/fglrx-8.593/2.6.x modules
make[1]: Вход в каталог `/usr/src/linux-headers-2.6.35-22-generic'
  CC [M]  /usr/src/fglrx-8.593/2.6.x/firegl_public.o
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:41: error: #error unknown or undefined architecture configured
In file included from /usr/src/fglrx-8.593/2.6.x/firegl_public.c:169:
/usr/src/fglrx-8.593/2.6.x/firegl_public.h:164: warning: "PM_EVENT_SUSPEND" redefined
include/linux/pm.h:325: note: this is the location of the previous definition
In file included from /usr/src/fglrx-8.593/2.6.x/firegl_public.c:431:
/usr/src/fglrx-8.593/2.6.x/drm_proc.h: In function ‘FGLDRM__vma_info’:
/usr/src/fglrx-8.593/2.6.x/drm_proc.h:497: warning: format ‘%08lx’ expects type ‘long unsigned int’, but argument 5 has type ‘phys_addr_t’
/usr/src/fglrx-8.593/2.6.x/firegl_public.c: In function ‘KCL_GetEffectiveUid’:
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:1414: error: ‘struct task_struct’ has no member named ‘euid’
/usr/src/fglrx-8.593/2.6.x/firegl_public.c: In function ‘KCL_PosixSecurityCapSetIPCLock’:
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:1788: error: ‘struct task_struct’ has no member named ‘cap_effective’
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:1792: error: ‘struct task_struct’ has no member named ‘cap_effective’
/usr/src/fglrx-8.593/2.6.x/firegl_public.c: In function ‘KCL_PUB_InterruptHandlerWrap’:
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:2643: warning: ‘return’ with no value, in function returning non-void
/usr/src/fglrx-8.593/2.6.x/firegl_public.c: In function ‘KCL_MEM_VM_GetRegionPhysAddrStr’:
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:3232: warning: return makes pointer from integer without a cast
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:3233: warning: return makes pointer from integer without a cast
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:3234: warning: return makes pointer from integer without a cast
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:3236: warning: return makes pointer from integer without a cast
/usr/src/fglrx-8.593/2.6.x/firegl_public.c: In function ‘KAS_Ih_Execute’:
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:4211: warning: ‘return’ with no value, in function returning non-void
make[2]: *** [/usr/src/fglrx-8.593/2.6.x/firegl_public.o] Ошибка 1
make[1]: *** [_module_/usr/src/fglrx-8.593/2.6.x] Ошибка 2
make[1]: Выход из каталога `/usr/src/linux-headers-2.6.35-22-generic'
make: *** [kmod_build] Ошибка 2
build failed with return value 2
Третья - новые декларации архитектуры в <linux/autoconf.h>. Решение из головы:
cd /usr/src/fglrx-8.593/
cat > patch.arch << EOF
--- firegl_public.c 2010-11-01 02:36:50.462924001 +0300
+++ firegl_public.c.new 2010-11-01 03:08:57.486924002 +0300
@@ -38,10 +38,12 @@
 #if !defined(CONFIG_X86_BIGSMP)
 #if !defined(CONFIG_X86_VISWS)
 #if !defined(CONFIG_X86_GENERICARCH)
+#if !defined(CONFIG_X86_GENERIC)
 #error unknown or undefined architecture configured
 #endif
 #endif
 #endif
+#endif
 #endif
 #endif
 #endif
EOF
patch < patch.arch
patching file firegl_public.c
cd /usr/src/fglrx-8.593/
./make.sh
AMD kernel module generator version 2.1
doing Makefile based build for kernel 2.6.x and higher
rm -rf *.c *.h *.o *.ko *.GCC* .??* *.symvers
patch < patch.for.types
patching file drm_os_linux.h
Hunk #1 succeeded at 42 with fuzz 1 (offset -9 lines).
make -C /lib/modules/2.6.35-22-generic/build SUBDIRS=/usr/src/fglrx-8.593/2.6.x modules
make[1]: Вход в каталог `/usr/src/linux-headers-2.6.35-22-generic'
  CC [M]  /usr/src/fglrx-8.593/2.6.x/firegl_public.o
In file included from /usr/src/fglrx-8.593/2.6.x/firegl_public.c:171:
/usr/src/fglrx-8.593/2.6.x/firegl_public.h:164: warning: "PM_EVENT_SUSPEND" redefined
include/linux/pm.h:325: note: this is the location of the previous definition
In file included from /usr/src/fglrx-8.593/2.6.x/firegl_public.c:433:
/usr/src/fglrx-8.593/2.6.x/drm_proc.h: In function ‘FGLDRM__vma_info’:
/usr/src/fglrx-8.593/2.6.x/drm_proc.h:497: warning: format ‘%08lx’ expects type ‘long unsigned int’, but argument 5 has type ‘phys_addr_t’
/usr/src/fglrx-8.593/2.6.x/firegl_public.c: In function ‘KCL_GetEffectiveUid’:
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:1416: error: ‘struct task_struct’ has no member named ‘euid’
/usr/src/fglrx-8.593/2.6.x/firegl_public.c: In function ‘KCL_PosixSecurityCapSetIPCLock’:
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:1790: error: ‘struct task_struct’ has no member named ‘cap_effective’
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:1794: error: ‘struct task_struct’ has no member named ‘cap_effective’
/usr/src/fglrx-8.593/2.6.x/firegl_public.c: In function ‘KCL_PUB_InterruptHandlerWrap’:
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:2645: warning: ‘return’ with no value, in function returning non-void
/usr/src/fglrx-8.593/2.6.x/firegl_public.c: In function ‘KCL_MEM_VM_GetRegionPhysAddrStr’:
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:3234: warning: return makes pointer from integer without a cast
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:3235: warning: return makes pointer from integer without a cast
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:3236: warning: return makes pointer from integer without a cast
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:3238: warning: return makes pointer from integer without a cast
/usr/src/fglrx-8.593/2.6.x/firegl_public.c: In function ‘KAS_Ih_Execute’:
/usr/src/fglrx-8.593/2.6.x/firegl_public.c:4213: warning: ‘return’ with no value, in function returning non-void
make[2]: *** [/usr/src/fglrx-8.593/2.6.x/firegl_public.o] Ошибка 1
make[1]: *** [_module_/usr/src/fglrx-8.593/2.6.x] Ошибка 2
make[1]: Выход из каталога `/usr/src/linux-headers-2.6.35-22-generic'
make: *** [kmod_build] Ошибка 2
build failed with return value 2
Также могут встретиться другие ошибки. Отсутствующая символьная ссылка на ядро в папке /usr/src/. Ее вы должны создать сами. Получится что-то наподобии:
cd /usr/src/
ln -s linux linux-2.6...
Отсутствие некоторых файлов в обновленных хидер-пакетах (linux-headers). Решение отсюда: http://ubuntuforums.org/showthread.php?t=1519186
cd /usr/src/linux/include/linux
ln -s ../generated/autoconf.h .
ln -s ../generated/utsrelease.h .
Кажется, на этом все. Пробуем заново забилдить драйвер.
cd /usr/src/fglrx-8.593/
./make.sh
Результатом успешной операции будет fglrx.ko в нашей директории.
root@SF-HP-Compaq-6820s:/usr/src/fglrx-8.593# ls -l | grep fglrx.ko
lrwxrwxrwx 1 root root      14 2010-10-31 00:04 fglrx.ko -> 2.6.x/fglrx.ko
Заканчиваем установку драйвера:
apt-get -f install
За сим, все. P.S. Не забываем про установку всех остальных пакетов. Из папки, с который все начиналось, выполним:
dpkg -i *.pkg

5 комментариев :

  1. Отличный пост! Очень помог :) Сам бы долго искал

    Правда поправьте:

    У вас в патче

    +#include

    а должно быть:

    +#include

    ОтветитьУдалить
  2. Если несложно - можно привести вывод команд:

    fglrxinfo

    glxinfo | grep string

    версия xorg-server-1.9.0 ?

    Хочется узнать - неужто драйвер работает на версии >xorg-server-1.5.3 ?
    Сказывается разное ABI

    Если да - то попробую поэксперементировать в Gentoo

    ОтветитьУдалить
  3. Это было черт знает когда. Системы этой уже нет.
    Также у меня не сработало. А вот апрельский парень, видимо, что-то ухитрился сделать.

    ОтветитьУдалить
  4. Спасибо за ответ.

    Тут проблема именно в xorg-server.
    fglrx-9.3 не работает на xorg-server, начиная с версии 1.6

    Был переход на новый ABI.

    ОтветитьУдалить