Настройка проприетарных драйверов ATI под Debian (Linux 2.6.27.4, ATI driver installer 8.10, Debian/Lenny)

Полезные советы и программы от пользователей нашего форума.

Модератор: Модераторы разделов

Ответить
Аватара пользователя
Olden Gremlin
Сообщения: 365
Статус: RAP22-RIPE
ОС: Debian GNU/Linux Wheezy
Контактная информация:

Настройка проприетарных драйверов ATI под Debian

Сообщение Olden Gremlin »

Хочу поделиться с сообществом своим опытом в настройке проприетарных драйверов от ATI. Все дело в том, что на момент начала моей "борьбы" с этими драйверами более-менее современного описания найдено не было, а те рецепты которые были найдены, в частности, на этом форуме не дали полного и вразумительного ответа. Поэтому и родилась мысль поделиться опытом. Как оказалось - все более чем просто! Надо лишь знать в какую сторону копать.
Итак, поехали...

Карточка у меня оказалась достаточно древняя (это рабочий десктоп, как ни как):

Код: Выделить всё

$ lspci | grep ATI
01:00.0 VGA compatible controller: ATI Technologies Inc RV370 [Sapphire X550 Silent]
01:00.1 Display controller: ATI Technologies Inc RV370 secondary [Sapphire X550 Silent]

А сайта AMD ATI были взяты последние драйвера для моей карточки ati-driver-installer-8-10-x86.x86_64.run.

Предчувствие меня не обмануло и, как и ожидалось, простой запуск на исполнение послал меня, выдав ошибку при компиляции. С этого момента начались мытарства в поисках нужного ответа, часть которого была найдена тут mczim-debian.blogspot.com и, да простит меня русскоязычная часть форумчан, тут www.debian-administration.org.ua. Скажу сразу, что хоть и в первом, и во втором случае эти рецепты ранее были признаны рабочими, но в моём случае они к успеху не привели. Но тем не менее - это очень правильные рецепты :)

Теперь по-порядку, к чему свелись мои действия из этих двух рецептов:

Код: Выделить всё

$ chmod +x ati-driver-installer-8-10-x86.x86_64.run

Получим список поддерживаемых платформ для сборки драйверов:

Код: Выделить всё

$ ./ati-driver-installer-8-10-x86.x86_64.run --listpkg

Мне повезло, так как Debian/lenny в этом списке присутствовал. Ура. Следующий шаг тоже особых усилий не требует:

Код: Выделить всё

sudo ./ati-driver-installer-8-10-x86.x86_64.run --buildpkg Debian/lenny

Ждем. После завершения у нас появляются пакеты:

Код: Выделить всё

fglrx-amdcccle_8.542-1_i386.deb
fglrx-driver_8.542-1_i386.deb
fglrx-driver-dev_8.542-1_i386.deb
fglrx-kernel-src_8.542-1_i386.deb

Отлично! Устанавливаем их при помощи dpkg -i один за другим, начиная с fglrx-driver_8.542-1_i386.deb. Внимание! Если в процессе установки fglrx-driver произошла ошибка - ничего страшного, все фиксится очень просто:

Код: Выделить всё

sudo aptitude reinstall libgl1-mesa-glx
и повторяем попытку установки :)

А вот теперь самое интересное. При попытке собрать пакет с драйвером fglrx под свою платформу мы получаем "отбой", так как во время компиляции возникает ошибка. Усиленные поиски в Сети привели к находке патча для файла firegl_public.c, правда для его наложения на текущую версию драйверов пришлось поработать напильником, так как по смещениям нужные строки не совпадали... ну как обычно... ;) По-порядку. Diff'ничек с правильными смещениями для вышеуказанных дров:

Код:

--- firegl_public.c.orig 2008-10-31 14:36:11.000000000 +0200 +++ firegl_public.c 2008-10-31 15:18:02.000000000 +0200 @@ -200,6 +200,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 */ @@ -251,7 +257,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 @@ -2348,8 +2354,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 @@ -2766,7 +2772,7 @@ /*****************************************************************************/ -#ifdef __SMP__ +#ifdef CONFIG_SMP static atomic_t cpus_waiting; static void deferred_flush(void* contextp) @@ -2782,13 +2788,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 */ @@ -2802,7 +2808,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__) @@ -2810,7 +2816,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) @@ -4060,7 +4066,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); @@ -4079,7 +4085,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);
После установки пакета fglrx-kernel-src_8.542-1_i386.deb в /usr/src появляется файл fglrx.tar.bz2, вот его куда-нибудь в /tmp распаковываем, накладываем выше приведённый патч, пакуем назад с таким же именем и кладем назад в /usr/src.

Конечно-же подразумевается, что ранее ядро мы собирали вручную. Очень кратко о сборке ядра:

Код: Выделить всё

# make menuconfig
# make-kpkg clean
# fakeroot make-kpkg --initrd --revision=custom.1.0 kernel_image
# fakeroot make-kpkg --initrd --revision=custom.1.0 kernel_headers
# fakeroot make-kpkg --initrd --revision=custom.1.0 kernel_source
# dpkg -i ../linux-image_версия-ядра_ревизия-ядра_i386.deb


Вот. Тут бы и сказочке конец, тут бы и собрать дровишки и установить их. Но... Конечно же драйвера соберутся и установка пройдёт гладко, вплоть до перезагрузки, так как на момент загрузки fglrx будет выдана ошибка, которую можно будет лицезреть по dmesg. Поэтому ещё немного терпения.

Это хорошо, что ядро у нас собрано установлено и работает. Придётся его... собирать опять, перед этим слегка пропатчив init_task.c в пути исходников ядра arch/x86/kernel.

Код:

--- arch/x86/kernel/init_task.c.orig 2008-11-02 09:11:46.000000000 +0200 +++ arch/x86/kernel/init_task.c 2008-11-01 11:16:34.000000000 +0200 @@ -14,7 +14,8 @@ static struct signal_struct init_signals = INIT_SIGNALS(init_signals); static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); struct mm_struct init_mm = INIT_MM(init_mm); -EXPORT_UNUSED_SYMBOL(init_mm); /* will be removed in 2.6.26 */ +//EXPORT_UNUSED_SYMBOL(init_mm); /* will be removed in 2.6.26 */ +EXPORT_SYMBOL(init_mm); /* will be removed in 2.6.26 */ /* * Initial thread structure.

Вот, отлично, теперь пересобираем и устанавливаем ядро. Перезагружаемся.
Используя

Код: Выделить всё

$ sudo m-a
или

Код: Выделить всё

module-assistant prepare,update
module-assistant build,install fglrx
depmod -a
собираем пакет fglrx-kernel-версия-ядра_8.542-1+ревизия-ядра_i386.deb и устанавливаем его.

Ну и напоследок:

Код: Выделить всё

$ sudo aticonfig --initial
$ sudo aticonfig --overlay-type=Xv
$ sudo reboot


Собственно всё! Перезагружаемся и наслаждаемся!

Проверка:

Код:

$ fglrxinfo display: :0.0 screen: 0 OpenGL vendor string: ATI Technologies Inc. OpenGL renderer string: Radeon X300/X550/X1050 Series OpenGL version string: 2.1.8087 Release $ glxinfo | grep render direct rendering: Yes OpenGL renderer string: Radeon X300/X550/X1050 Series $ glxgears -info GL_RENDERER = Radeon X300/X550/X1050 Series GL_VERSION = 2.1.8087 Release GL_VENDOR = ATI Technologies Inc. GL_EXTENSIONS = GL_AMD_performance_monitor GL_ARB_depth_texture GL_ARB_draw_buffers GL_ARB_fragment_program GL_ARB_fragment_shader GL_ARB_half_float_pixel GL_ARB_half_float_vertex GL_ARB_multisample GL_ARB_multitexture GL_ARB_occlusion_query GL_ARB_pixel_buffer_object GL_ARB_point_parameters GL_ARB_point_sprite GL_ARB_shader_objects GL_ARB_shading_language_100 GL_ARB_shadow GL_ARB_shadow_ambient GL_ARB_texture_border_clamp GL_ARB_texture_compression GL_ARB_texture_cube_map GL_ARB_texture_env_add GL_ARB_texture_env_combine GL_ARB_texture_env_crossbar GL_ARB_texture_env_dot3 GL_ARB_texture_float GL_ARB_texture_mirrored_repeat GL_ARB_texture_non_power_of_two GL_ARB_texture_rectangle GL_ARB_transpose_matrix GL_ARB_vertex_buffer_object GL_ARB_vertex_program GL_ARB_vertex_shader GL_ARB_window_pos GL_ATI_draw_buffers GL_ATI_envmap_bumpmap GL_ATI_fragment_shader GL_ATI_meminfo GL_ATI_separate_stencil GL_ATI_texture_env_combine3 GL_ATI_texture_float GL_EXT_abgr GL_EXT_bgra GL_EXT_blend_color GL_EXT_blend_equation_separate GL_EXT_blend_func_separate GL_EXT_blend_minmax GL_EXT_blend_subtract GL_EXT_compiled_vertex_array GL_EXT_copy_texture GL_EXT_draw_range_elements GL_EXT_fog_coord GL_EXT_framebuffer_blit GL_EXT_framebuffer_multisample GL_EXT_framebuffer_object GL_EXT_gpu_program_parameters GL_EXT_multi_draw_arrays GL_EXT_packed_depth_stencil GL_EXT_packed_pixels GL_EXT_point_parameters GL_EXT_rescale_normal GL_EXT_secondary_color GL_EXT_separate_specular_color GL_EXT_shadow_funcs GL_EXT_stencil_wrap GL_EXT_subtexture GL_EXT_texgen_reflection GL_EXT_texture3D GL_EXT_texture_compression_s3tc GL_EXT_texture_cube_map GL_EXT_texture_edge_clamp GL_EXT_texture_env_add GL_EXT_texture_env_combine GL_EXT_texture_env_dot3 GL_EXT_texture_filter_anisotropic GL_EXT_texture_lod_bias GL_EXT_texture_mirror_clamp GL_EXT_texture_object GL_EXT_texture_rectangle GL_EXT_texture_sRGB GL_EXT_vertex_array GL_KTX_buffer_region GL_NV_blend_square GL_NV_texgen_reflection GL_SGIS_generate_mipmap GL_SGIS_texture_edge_clamp GL_SGIS_texture_lod GL_WIN_swap_hint WGL_EXT_swap_control 7295 frames in 5.0 seconds = 1458.984 FPS 7239 frames in 5.0 seconds = 1447.743 FPS 7328 frames in 5.0 seconds = 1465.518 FPS 7364 frames in 5.0 seconds = 1472.800 FPS 7346 frames in 5.0 seconds = 1469.199 FPS $ fgl_glxgears Using GLX_SGIX_pbuffer 1597 frames in 5.0 seconds = 319.400 FPS 2008 frames in 5.0 seconds = 401.600 FPS 1997 frames in 5.0 seconds = 399.400 FPS 2008 frames in 5.0 seconds = 401.600 FPS 2267 frames in 5.0 seconds = 453.400 FPS 2589 frames in 5.0 seconds = 517.800 FPS


Ps: Отдельное спасибо хочется сказать Вадику Пилипенко aka Pil$on, который "заставил" меня совершить подвиг по установке ATI'шных дров вместо покупки nVidia и который поделился идеей патча ядра, на предмет замены EXPORT_UNUSED_SYMBOL на EXPORT_SYMBOL (уж не знаю, где он нашёл это решение и чем это чревато, но... - работает) :)
Вложения
init_task.diff.txt
(573 байт) 157 скачиваний
config_2.6.27.4.txt
(83.38 КБ) 172 скачивания
firegl_public.diff.txt
(2.87 КБ) 198 скачиваний
«Когда у общества нет цветовой дифференциации штанов — то нет цели!»
nic-hdl: RAP22-RIPE
Спасибо сказали:
Mailik
Сообщения: 6
ОС: XP && Ubuntu 7.04

Re: Настройка проприетарных драйверов ATI под Debian

Сообщение Mailik »

Спасибо огромное топикстартеру. Тему предлагаю прикрепить в раздел где обсуждается настройка видео карт. Отличная инструкция, где описываются почти все шаги. Разве что ещё стоит добавить, что нужно в ядре включить модулем /dev/agpgart
Спасибо сказали:
Аватара пользователя
Olden Gremlin
Сообщения: 365
Статус: RAP22-RIPE
ОС: Debian GNU/Linux Wheezy
Контактная информация:

Re: Настройка проприетарных драйверов ATI под Debian

Сообщение Olden Gremlin »

Mailik писал(а):
04.11.2008 01:12
Спасибо огромное топикстартеру. Тему предлагаю прикрепить в раздел где обсуждается настройка видео карт. Отличная инструкция, где описываются почти все шаги. Разве что ещё стоит добавить, что нужно в ядре включить модулем /dev/agpgart

Собственно модуль agpgart грузится автоматически при старте X'ов.
Девайс в Debian'е и так присутствует...
Конфиг, к ядру, для сборки, можно взять тот, который лежит в boot и лишь промониторить его на предмет новых опций... Но сборка ядра - это другая тема :)

Переносить? А зачем? После того как разместил тему тут, спросил у sash-kan'а, не ошибся ли - получил ответ, что нет :)
«Когда у общества нет цветовой дифференциации штанов — то нет цели!»
nic-hdl: RAP22-RIPE
Спасибо сказали:
Mailik
Сообщения: 6
ОС: XP && Ubuntu 7.04

Re: Настройка проприетарных драйверов ATI под Debian

Сообщение Mailik »

Может тебе написать полную инструкцию и с тем как ядро сконфигурировать чтоб дрова нормально встали? :))
Спасибо сказали:
Ответить