[Nouveau] Tester wanted: Timing management
Трое ребят работают над созданием свободного драйвера для nVidia карточек, а именно – над таймингами чипов. Так как спецификации закрыты, они решили обратиться за помощью к сетевому сообществу. Им нужна помощь в reverse engineering’е vBIOSов nVidia видеокарт, для получения данных об их таймингах.
Если у тебя nVidia карточка, ты можешь помочь им, предоставив некоторую инфу о начинке своей видяхи.
Краткое пояснение основных понятий, которые помогут понять суть процесса, можно найти тут. Лицензию nVidia можно найти тут
2.1.3 Limitations.
No Reverse Engineering. Customer may not reverse engineer, decompile, or disassemble the SOFTWARE, nor attempt in any other manner to obtain the source code.
No Separation of Components. The SOFTWARE is licensed as a single product. Its component parts may not be separated for use on more than one computer, nor otherwise used separately from the other parts.
No Rental. Customer may not rent or lease the SOFTWARE to someone else.
Если вкратце, то этот единственный пункт, где говориться о Reverse Engineering, нас не касается, т.к. все что описанно в этой статье, относится только к HARDWARE.
Let’s go! Get source code
Итак, с чего начнем? Во-первых нам нужна программа vbtracetool:
> git clone git://anongit.freedesktop.org/~stuart/vbtracetool
Для сборки просто делаем
> make
Если не собирается, анализируем вывод make, заглядываем в исходник… У меня например компилятор не нашел pci/pci.h. Поэтому я доустановил pciutils-devel:
> sudo zypper in pciutils-devel
После повторной сборки все ок:
-rwxr-xr-x 1 alex users 237872 2010-10-15 23:52 vbtracetool*
Теперь нам нужна peek. Исходники тут:
> git clone git://0x04.net/pgtest
В openSUSE 11.1 make у меня не сработал (хотя gcc -std=gnu99 должен сработать), собрал ручками:
> gcc libio.c -o libio.o -c > gcc libpg.c -o libpg.o -c > gcc peek.c libpg.o libio.o -o peek -g -Wall -lpciaccess
В итоге получаем бинарник. Запускаем:
> ./peek 0x0 00000000: 04b300b1
Аха, нам нужны второй и третий символ с лева. В моем случае это 4b.
Dump the VBIOS
Теперь возвращаемся к vbtracetool:
> ./vbtracetool -w 2> nvXX_vbios.rom Using card 10de:0393 on 0400 Nvidia card -- using PROM/PRAMIN BIOS Using card memory region at 0xfd000000 Attempting to locate BIOS image in PROM... appears to be valid
Вывод перенаправляем в nvXX_vbios.rom. Файл бинарный:
> file nvXX_vbios.rom nvXX_vbios.rom: BIOS (ia32) ROM Ext. IBM comp. Video (120*512)
Get your card’s strap
Теперь снова идем к peek и проверяем что у нас в ячейке 0x00101000:
> ./peek 0x00101000 > nvXX_strap_peek > file nvXX_strap_peek nvXX_strap_peek: ASCII text > cat nvXX_strap_peek 00101000: a340fe87
Get the currently selected timings
Так, вспоминаем какая у нас карточка. Если ее серия попадает в диапазон адресов от NV40 до NVC0, то считываем 32 байта начиная с адреса 0x100220. У меня это NV4B, так что:
> ./peek 0x100220 0x20 > nvXX_timing_peek > file nvXX_timing_peek nvXX_timing_peek: ASCII text > cat nvXX_timing_peek 00100220: 06101e16 0d010805 24230606 5312f405 00100230: 00000c1f 01e6a677 001e0311 00000031
Если же адреса старше чем NVC0 (AKA Fermi), то читаем 32 байта, но уже начиная с 0x10f220.
Так, и на последок давайте получим таблицу таймингов нашего vBIOS. Для этого нам нужна программа nvbios. Найти ее можно здесь:
> git clone git://github.com/pathscale/envytools
Собираем:
> make
Теперь копируем наш .rom-файл, полученный раньше, в папку с бинарником nvbios и запускаем его:
> pwd /home/alex/hack/vbtracetool > l *rom -rw-r--r-- 1 root root 61440 2010-10-16 00:45 nvXX_vbios.rom > .. > cp vbtracetool/nvXX_vbios.rom envytools/ > ./nvbios nvXX_vbios.rom > nvXX_vbios_parsed > l nvXX_vbios_parsed -rw-r--r-- 1 root root 98222 2010-10-16 00:46 nvXX_vbios_parsed > file nvXX_vbios_parsed nvXX_vbios_parsed: ASCII text
Это текстовый файл, в конце которого должна быть тайминг-таблица.
Thanks a lot 🙂
Итак, в итоге мы получили 4 файла: nvXX_vbios_parsed, nvXX_vbios.rom, nvXX_strap_peek и nvXX_timing_peek. Выслав их на martin.peres at ensi-bourges dot fr ты удовлетворишь интерес Мартина по поводу начинки vBIOS’а твоей видяхи nVidia. Так же будет здорово, если ты приложишь вывод lspci -vnn
peek не компилится.
gcc libio.c -o libio.o -c вроде нормально отрабатывает,
а после
gcc peek.c libpg.o libio.o -o peek -g -Wall -lpciaccess
gcc: libpg.o: Нет такого файла или каталога
peek.c: In function ‘main’:
peek.c:17:4: warning: suggest parentheses around assignment used as truth value
peek.c:16:6: warning: suggest explicit braces to avoid ambiguous ‘else’
Make тоже не компилит.
Да, у меня тоже 2 warning было.
После gcc libio.c -o libio.o -c, если нет ошибок, какой-нить новый файл появляется?
Какой дистрибутив?
opensuse11.3
Появляется только libio.o
А libpg.o нету и вылазит ошибка:
gcc: libpg.o: Нет такого файла или каталога
Хм, похоже на неправильную сборку. Странно, что ошибок не показывает.
Давай сюда, я помогу тебе:
http://forums.opensuse.org/other-languages/p-russian/1046-1077-1083-1077-1079-1086/437102-dh-n-dh-dh-dh-dhun-nouveau-3.html#post2238580