Это просто копия моей-же статьи с linuxforum.ru.
Хочу поделиться с сообществом своим опытом в настройке проприетарных драйверов от ATI. Все дело в том, что на момент начала моей "борьбы" с этими драйверами более-менее современного описания найдено не было, а те рецепты которые были найдены, в частности, на этом форуме не дали полного и вразумительного ответа. Поэтому и родилась мысль поделиться опытом. Как оказалось - все более чем просто! Надо лишь знать в какую сторону копать.
Итак, поехали...
Карточка у меня оказалась достаточно древняя (это рабочий десктоп, как ни как):
Предчувствие меня не обмануло и, как и ожидалось, простой запуск на исполнение послал меня, выдав ошибку при компиляции. С этого момента начались мытарства в поисках нужного ответа, часть которого была найдена тут mczim-debian.blogspot.com и, да простит меня русскоязычная часть форумчан, тут www.debian-administration.org.ua. Скажу сразу, что хоть и в первом, и во втором случае эти рецепты ранее были признаны рабочими, но в моём случае они к успеху не привели. Но тем не менее - это очень правильные рецепты.
Теперь по-порядку, к чему свелись мои действия из этих двух рецептов:
Получим список поддерживаемых платформ для сборки драйверов:
Мне повезло, так как Debian/lenny в этом списке присутствовал. Ура. Следующий шаг тоже особых усилий не требует:
Ждем. После завершения у нас появляются пакеты:
Отлично! Устанавливаем их при помощи dpkg -i один за другим, начиная с fglrx-driver_8.542-1_i386.deb. Внимание! Если в процессе установки fglrx-driver произошла ошибка - ничего страшного, все фиксится очень просто:
и повторяем попытку установки.
А вот теперь самое интересное. При попытке собрать пакет с драйвером fglrx под свою платформу мы получаем "отбой", так как во время компиляции возникает ошибка. Усиленные поиски в Сети привели к находке патча для файла firegl_public.c, правда для его наложения на текущую версию драйверов пришлось поработать напильником, так как по смещениям нужные строки не совпадали... ну как обычно... По-порядку. Diff'ничек с правильными смещениями для вышеуказанных дров:
После установки пакета fglrx-kernel-src_8.542-1_i386.deb в /usr/src появляется файл fglrx.tar.bz2, вот его куда-нибудь в /tmp распаковываем, накладываем выше приведённый патч, пакуем назад с таким же именем и кладем назад в /usr/src.
Конечно-же подразумевается, что ранее ядро мы собирали вручную.
Очень кратко о сборке ядра:
Вот. Тут бы и сказочке конец, тут бы и собрать дровишки и установить их. Но... Конечно же драйвера соберутся и установка пройдёт гладко, вплоть до перезагрузки, так как на момент загрузки fglrx будет выдана ошибка, которую можно будет лицезреть по dmesg. Поэтому ещё немного терпения.
Это хорошо, что ядро у нас собрано установлено и работает. Придётся его... собирать опять, перед этим слегка пропатчив init_task.c в пути исходников ядра arch/x86/kernel.
Вот, отлично, теперь пересобираем и устанавливаем ядро. Перезагружаемся.
Используя
Ну и напоследок:
Собственно всё! Перезагружаемся и наслаждаемся!
Проверка:
Ps:
Отдельное спасибо хочется сказать Вадику Пилипенко aka Pil$on, который
"заставил" меня совершить подвиг по установке ATI'шных дров вместо
покупки nVidia и который поделился идеей патча ядра, на предмет замены
EXPORT_UNUSED_SYMBOL на EXPORT_SYMBOL (уж не знаю, где он нашёл это
решение и чем это чревато, но... - работает)
Хочу поделиться с сообществом своим опытом в настройке проприетарных драйверов от 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
После установки пакета 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 (уж не знаю, где он нашёл это
решение и чем это чревато, но... - работает)