Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 7 
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

....Ура! Заработало!!! (с) кот Матроскин.

Что, и вы "осчастливили" себя hi-end'ом от ATI? Поздравляю!
И небось уже не раз произнесли монолог "ох_блин_и_нафига_я_ЭТО_купил_Nvidia_фарева!" глядя на 60hz развертку и отсутствие OpenGL-я? :-)
Как оказалось, ничего страшного.
Хоть ATI и не любит линуксоидов (взаимно кстати), заставить работать дорогостоящее приобретение можно.

Итак, что имеем:
OS: Mandriva 10.2
Железяка: HIS X850 IceQ-II PCI-E
CPU - Intel
Ядро - 2.6.11 (установить сорцы ядра!)
Xorg - 6.8.2
Драйвер от ATI - fglrx_6_8_0-8.12.10-1.i386.rpm
Модуль agpgart должен быть загружен и в /etc/fstab должно быть прописано: /dev/tmpfs /dev/shm tmpfs defaults 0 0
Ну,поехали...

Ставим атишный драйвер.
#rpm -i fglrx_6_8_0-8.12.10-1.i386.rpm
Моментально идем в /lib/modules/fglrx/build_mod и швыряем туда прилагаемые ниже патчи.
#patch -p0< ./p1.patch
#patch -p0< ./p2.patch
Далее #sh ./make.sh ; cd .. ; sh ./make_install.sh
В /lib/modules/2.6.11/kernel/drivers/char/drm/ должен появиться модуль fglrx.ko
Появился? Ну почти полдела сделано :-)
#depmod -a должно сработать без ругани.

Далее натравим на этот модуль hexedit. Зачем? А очень просто, ati не включили поддержку ChipID карт серии X850
(и некоторых из X800) в этот драйвер,поэтому приходится драйвер нахально обдурить :-)
Ищете в hexedit-ом в драйвере заветную строчку 48550000 - это ChipID карты RADEON X800 (R423 5548).
И вбиваете туда ChipID вашей карты. (младший,старший байты)
(В моем случае: 525d )
#lspci | grep VGA
05:00.0 VGA compatible controller: ATI Technologies Inc: Unknown device 5d52

С дрожью в коленях: #modprobe fglrx
Что? Молча съело?! Урааа!!! 90% работы сделано :-)
Проверяем: # lsmod | grep fglrx
Есть? Ну и чудненько.
Теперь: #echo "fglrx" >>/etc/modprobe.preload
Иначе при перезагрузке получите xorg-овый 2D драйвер :-)

Далее: #fglrxconfig и конфигурим xorg.conf
(sic!) agpgart указывать внешний!!! (нутряной я не проверял)

Думаете все? АВОТФИГ :-) xorg тоже не знает карты X850, а посему будем дурить и его. А именно - подсунем известный ему ChipID.
Открываем /etc/X11/xorg.conf и в Section "Device" для Identifier "ATI Graphics Adapter"
после # === Misc Options === добавляем волшебную строчку"
ChipID 0x554A

#startx

Вуаля :-)
Список ChipID можно посмотреть в /var/log/Xorg.0.log после запуска X-ов. Неважно,удачного или нет.

Немножко бенчмарок: 1280x1024x24 full screen
# fgl_glxgears
3734 frames in 5.0 seconds = 746.800 FPS
3738 frames in 5.0 seconds = 747.600 FPS
3739 frames in 5.0 seconds = 747.800 FPS

#glxgears
4122 frames in 5.0 seconds = 824.400 FPS
4121 frames in 5.0 seconds = 824.200 FPS
4122 frames in 5.0 seconds = 824.400 FPS

Unreal 2004, все на максимум, 16 ботов, карта DM-DE-Grendelkeep-RE ~82 fps

Понятно что это далеко не максимум, но с паршивой овцы хоть шерсти клок :-) Ждем следующих драйверов.

Патчи:
=============== p1.patch cut here ========================


2005-03-02 22:32 diff -lu or.c agpgart_be.c Page 1


--- or.c 2005-01-31 19:50:00.000000000 +0200
+++ agpgart_be.c 2005-03-02 22:19:25.000000000 +0200
@@ -261,6 +261,12 @@
#define firegl_pci_find_class(class,from) pci_find_class(class,from)
#endif

+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,11)
+#define firegl_pci_find_class(class,from) pci_get_class(class,from)
+#else
+#define firegl_pci_find_class(class,from) pci_find_class(class,from)
+#endif
+
int agp_backend_acquire(void)
{
if (agp_bridge.type == NOT_SUPPORTED) {
@@ -4075,6 +4081,13 @@
}
}
}
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,11)
+ // the reference count has been increased in agp_backend_initialize.
+ if (device)
+ pci_dev_put(device);
+#endif
+
/*
* PASS3: Figure out the 8X/4X setting and enable the
* target (our motherboard chipset).
@@ -5283,6 +5296,12 @@
pci_dev_put(device);
#endif

+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,11)
+ // the reference count has been increased in agp_backend_initialize.
+ if (device)
+ pci_dev_put(device);
+#endif
+
return(0); /* success */
}

@@ -7428,6 +7447,11 @@
return rc;
}

+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,11)
+ // decrease the reference count.
+ pci_dev_put(agp_bridge.dev);
+#endif
+
if (agp_bridge.needs_scratch_page == TRUE) {
agp_bridge.scratch_page = agp_bridge.agp_alloc_page();

=============== end cut ======================

=============== p2.patch cut here ========================

--- 2.c 2005-02-10 04:15:00.000000000 +0200
+++ firegl_public.c 2005-03-02 22:21:42.000000000 +0200
@@ -1664,13 +1664,22 @@
{
unsigned long pte_linear;
pgd_t* pgd_p;
+#if LINUX_VERSION_CODE > 0x02060a /* KERNEL_VERSION(2,6,11) */
+ pud_t* pud_p;
+#endif
pmd_t* pmd_p;
pte_t* pte_p;
pte_t pte;

pte_linear = VMALLOC_VMADDR(virtual_addr); // convert to pte linear address (x86 => nop)
pgd_p = pgd_offset(mm, pte_linear);
+#if LINUX_VERSION_CODE > 0x02060a /* KERNEL_VERSION(2,6,11) */
+ pud_p = pud_offset(pgd_p, pte_linear);
+ pmd_p = pmd_offset(pud_p, pte_linear);
+#else
pmd_p = pmd_offset(pgd_p, pte_linear);
+#endif
+
#ifndef FGL_ATOMIC_PTE
#if LINUX_VERSION_CODE > 0x020500
pte_p = pte_offset_kernel(pmd_p, pte_linear);
@@ -2100,6 +2109,9 @@
unsigned long address)
{
pgd_t* pgd_p;
+#if LINUX_VERSION_CODE > 0x02060a /* KERNEL_VERSION(2,6,11) */
+ pud_t* pud_p;
+#endif
pmd_t* pmd_p;
pte_t* pte_p;
pte_t pte;
@@ -2200,7 +2212,12 @@
/* alternatively we could generate a NOPAGE_OOM "out of memory" */
}
/* locate medium level page table (x86 => nop) */
+#if LINUX_VERSION_CODE > 0x02060a /* KERNEL_VERSION(2,6,11) */
+ pud_p = pud_offset(pgd_p, pte_linear);
+ pmd_p = pmd_offset(pud_p, pte_linear);
+#else
pmd_p = pmd_offset(pgd_p, pte_linear);
+#endif
if (!pmd_present(*pmd_p))
{
__KE_ERROR("FATAL ERROR: User queue buffer not present! (pmd)\n");
@@ -2564,13 +2581,21 @@
{
unsigned long pte_linear;
pgd_t* pgd_p;
+#if LINUX_VERSION_CODE > 0x02060a /* KERNEL_VERSION(2,6,11) */
+ pud_t* pud_p;
+#endif
pmd_t* pmd_p;
pte_t* pte_p;
pte_t pte;

pte_linear = VMALLOC_VMADDR(virtual_addr); // convert to pte linear address (x86 => nop)
pgd_p = pgd_offset(vma->vm_mm, pte_linear);
+#if LINUX_VERSION_CODE > 0x02060a /* KERNEL_VERSION(2,6,11) */
+ pud_p = pud_offset(pgd_p, pte_linear);
+ pmd_p = pmd_offset(pud_p, pte_linear);
+#else
pmd_p = pmd_offset(pgd_p, pte_linear);
+#endif
#ifndef FGL_ATOMIC_PTE
#if LINUX_VERSION_CODE > 0x020500
pte_p = pte_offset_kernel(pmd_p, pte_linear);
@@ -2719,13 +2744,13 @@
#endif /* __ia64__ */
vma->vm_flags |= VM_IO; /* not in core dump */
}
- if (remap_page_range(FGL_VMA_API_PASS
+ if (remap_pfn_range(FGL_VMA_API_PASS
vma->vm_start,
- __ke_vm_offset(vma),
+ __ke_vm_offset(vma) >> PAGE_SHIFT,
vma->vm_end - vma->vm_start,
vma->vm_page_prot))
{
- __KE_DEBUG("remap_page_range failed\n");
+ __KE_DEBUG("remap_pfn_range failed\n");
return -EAGAIN;
}
vma->vm_flags |= VM_SHM | VM_RESERVED; /* Don't swap */
@@ -2786,13 +2811,13 @@
{
if (__ke_vm_offset(vma) >= __pa(high_memory))
vma->vm_flags |= VM_IO; /* not in core dump */
- if (remap_page_range(FGL_VMA_API_PASS
+ if (remap_pfn_range(FGL_VMA_API_PASS
vma->vm_start,
- __ke_vm_offset(vma),
+ __ke_vm_offset(vma) >> PAGE_SHIFT,
vma->vm_end - vma->vm_start,
vma->vm_page_prot))
{
- __KE_DEBUG("remap_page_range failed\n");
+ __KE_DEBUG("remap_pfn_range failed\n");
return -EAGAIN;
}
#ifdef __x86_64__
@@ -2823,13 +2848,13 @@
{
if (__ke_vm_offset(vma) >= __pa(high_memory))
vma->vm_flags |= VM_IO; /* not in core dump */
- if (remap_page_range(FGL_VMA_API_PASS
+ if (remap_pfn_range(FGL_VMA_API_PASS
vma->vm_start,
- __ke_vm_offset(vma),
+ __ke_vm_offset(vma) >> PAGE_SHIFT,
vma->vm_end - vma->vm_start,
vma->vm_page_prot))
{
- __KE_DEBUG("remap_page_range failed\n");
+ __KE_DEBUG("remap_pfn_range failed\n");
return -EAGAIN;
}
#ifdef __x86_64__
@@ -2873,6 +2898,37 @@

#if LINUX_VERSION_CODE >= 0x020400

+#if LINUX_VERSION_CODE >= 0x02060b
+
+typedef struct {
+ void (*free_memory)(struct agp_memory *);
+ struct agp_memory * (*allocate_memory)(size_t, u32);
+ int (*bind_memory)(struct agp_memory *, off_t);
+ int (*unbind_memory)(struct agp_memory *);
+ void (*enable)(u32);
+ int (*acquire)(void);
+ void (*release)(void);
+ int (*copy_info)(struct agp_kern_info *);
+} drm_agp_t;
+
+static const drm_agp_t drm_agp = {
+ &agp_free_memory,
+ &agp_allocate_memory,
+ &agp_bind_memory,
+ &agp_unbind_memory,
+ &agp_enable,
+ &agp_backend_acquire,
+ &agp_backend_release,
+ &agp_copy_info
+};
+#undef DRM_AGP_MODULE_GET
+#undef DRM_AGP_MODULE_PUT
+
+#define DRM_AGP_MODULE_GET &drm_agp
+#define DRM_AGP_MODULE_PUT
+
+#endif
+
static const drm_agp_t *drm_agp_module_stub = NULL;

#define AGP_FUNCTIONS 8

=============== end cut ======================



Партнер
 

Member
Статус: Не в сети
Регистрация: 06.04.2005
blashka писал(а):
....Ура! Заработало!!! (с) кот Матроскин.
<...>

Вот, то, чего не хватало от сообщества оверов -- нормального описания success-story, как принято говорить :) уважаю.


 

Member
Статус: Не в сети
Регистрация: 12.09.2003
Откуда: Одесса
Что-то ты не так делаешь - у людей на #linux, а, точнее, у devil'a были fps около 4000. А у меня самого на Radeon 9000 было около 1000 на glxgears. Впрочем, раз у тебя все игры бегают как надо, значит, большего и не надо)))..

_________________
Труъэнфростбиттен!


 

$Vanger$ писал(а):
Что-то ты не так делаешь - у людей на #linux, а, точнее, у devil'a были fps около 4000. А у меня самого на Radeon 9000 было около 1000 на glxgears. Впрочем, раз у тебя все игры бегают как надо, значит, большего и не надо)))..


Конечно не так :-)
Я цепляю на X850 драйвера которые этот самый X850 в принципе не поддерживают :-) Как и xorg.

Что ж поделать, жить-то хочется. Не менять же ATI на Nvidia :-)))


 

Member
Статус: Не в сети
Регистрация: 12.09.2003
Откуда: Одесса
Воистину правильно ;) .
А ты drm под radeon подрубил?

_________________
Труъэнфростбиттен!


 

$Vanger$ писал(а):
Воистину правильно ;) .
А ты drm под radeon подрубил?


Мнэ...
grep drm ./Xorg.0.log
(II) Loading sub module "drm"
(II) LoadModule: "drm"
(II) Loading /usr/X11R6/lib/modules/linux/libdrm.a
(II) Module drm: vendor="X.Org Foundation"
(II) Loading sub module "fglrxdrm"
(II) LoadModule: "fglrxdrm"
(II) Loading /usr/X11R6/lib/modules/linux/libfglrxdrm.a
(II) Module fglrxdrm: vendor="FireGL - ATI Technologies Inc."
drmOpenDevice: node name is /dev/dri/card0
drmOpenDevice: open result is 7, (OK)
drmOpenDevice: node name is /dev/dri/card0
drmOpenDevice: open result is 7, (OK)
drmOpenByBusid: Searching for BusID PCI:5:0:0
drmOpenDevice: node name is /dev/dri/card0
drmOpenDevice: open result is 7, (OK)
...
(II) fglrx(0): [drm] DRM interface version 1.0
(II) fglrx(0): [drm] created "fglrx" driver at busid "PCI:5:0:0"
(II) fglrx(0): [drm] added 8192 byte SAREA at 0xf8e87000
(II) fglrx(0): [drm] mapped SAREA 0xf8e87000 to 0xb7d03000
(II) fglrx(0): [drm] framebuffer handle = 0xd0000000
(II) fglrx(0): [drm] added 1 reserved context for kernel
(II) fglrx(0): [drm] register handle = 0xcffe0000
(II) fglrx(0): [drm] ATIGART Table handle = 0xdfff0000
(II) fglrx(0): [drm] ringbuffer size = 0x00100000 bytes
(II) fglrx(0): [drm] DRM buffer queue setup: nbufs = 100 bufsize = 65536
(II) fglrx(0): [drm] texture shared area handle = 0xf99c8000

Оно? :-)


 

Member
Статус: Не в сети
Регистрация: 12.09.2003
Откуда: Одесса
Оно, оно.. Тогда /me совсем ничего не понимает. Впрочем, это обычное состояние ;)

_________________
Труъэнфростбиттен!


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 7 
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan