Шукати в цьому блозі

Показ дописів із міткою driver. Показати всі дописи
Показ дописів із міткою driver. Показати всі дописи

пʼятниця, 23 жовтня 2009 р.

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

Это просто копия моей-же статьи с linuxforum.ru.


Хочу поделиться с сообществом своим опытом в настройке проприетарных драйверов от 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 (уж не знаю, где он нашёл это
решение и чем это чревато, но... - работает)