Техника безопасности при работе с BIOS
В этом материале мы продолжим изучение внутренней структуры BIOS для видеокарт ATI (напомню ссылку на первую часть статьи: BIOS для ATI R3x0. Часть 1, ознакомительная.). Ниже будут даны описания различных параметров и способов их изменения, поэтому для начала - банальная информация о том, как перешить BIOS, чтобы потом не было мучительно больно.
Вкратце о том, что необходимо сделать перед прошивкой любого BIOS.
С помощью программы rambios необходимо новоиспечённый BIOS проверить на работоспособность. Для этого необходимо загрузиться под DOS и в командной строке набрать следующее: rambios.ехе, файл биоса. Команду можно сделать следующей: r 1.rom. Результатом будет нормально читаемый отчёт, артефакты, или монитор так и не инициализируется. Прошедшие проверку BIOSы рекомендуются к использованию :), но не гарантируют безгрешную работу в винде.
Примечание: для rambios версии 1.5 имеется одно ограничение: Device_ID тестируемого биос должен быть идентичным текущему.
Для проверки таймингов из-под Windows можно использовать ATI Tray Tool (последнюю версию), тайминги доступны на вкладке Overclocking. Несколько большие возможности по выбору таймингов предоставляет RaBit. Тайминги с версии 1.4 можно протестировать в режиме реального времени. Доступны на вкладке MC Timings.
Что необходимо всегда иметь под рукой.
1. Пару загрузочных дискет, на которых должен находиться прошивальщик. Благоразумнее в качестве прошивальщика использовать flashrom2.37. Вместе с ним на дискету идёт flashrom.rom и ваш сохранённый/рабочий BIOS. В файле autoexec.bat прописываем следующее: flashrom.exe -f -p 0 <ваш биос>. Спасительная дискета готова - она позволит перешить BIOS, если на монитор ничего не выводится.
2. PCI-видеокарту. Остаётся заблаговременно в BIOSе материнской платы выставить инициализацию с PCI-видеокарты. Чтобы отшиться, нам потребуется вставить её в свободный PCI-слот, загрузиться в DOS и, используя всё тот же синтаксис flashrom, указать путь к программе и файлу прошивки (надеюсь, они заблаговременно перенесены вами поближе к "корню").
Перешивки winflash-ем я не рассматриваю, так как после нескольких попыток его использования убедился, что программа почему-то не хочет работать стабильно (хотя некоторые используют именно её). Зато я использую весьма удобную её функцию - она позволяет "выдернуть" биос из-под Windows с сохранением его в файл.
Насилие над аппаратной частью
Для изменения и отслеживания всех нижеописанных значений, включая частоты ядра/памяти, наилучшим выбором будет программа RaBit, принадлежащая "перу" Евгения Азарова aka JAZ.
Проект RadEdit обладает куда меньшей функциональностью, к тому же развитие проекта прекращено. Однако, программа может пригодиться для корректировки контрольной суммы, если вы решились править BIOS "вручную" в hex-редакторах.
ASIC (Application Specific Integrated Circuits) - контроллер ввода-вывода и управления. Конфигурируется младшим (вторым) полубайтом по адресу 0х74, являясь как бы дополнительным Device ID. Ориентировочное значение для Device ID в семействе (точнее для младшего полубайта второго байта). Изменение старшего полубайта не повлияло ни на работоспособность видеокарты, ни на изменение ни одного из нижеперечисленных пунктов (по крайней мере, R350/360 прекрасно работают как при значении 0х00, так и 0хF0).
90 - Значения, характерные для 9500/9500Pro/9600/9600Pro/9700/9700Pro/9800Pro/9800SЕ
91 - 9800/9600SЕ (блокирует разгон драйвером)
92 - 9800ХТ/9600ХТ
93 - Значения, характерные для FireGL Z1/X1/X2....
... далее последовательность (4 бита) соответствует вышеизложенной.
В RaBit изменяется удобно и прозрачно для пользователя со сменой Device ID на первой вкладке в совокупности с самим Device ID и количеством конвейеров.
0х75 Значение управляет количеством конвейеров, следует, естественно за ASIC. Конфигурируется младшим (вторым) полубайтом. Для моделей с 8 конвейерами принимает значение 08, для 4-х конвейерных - 0С. Значения, отличные от перечисленных, количество конвейеров не изменяют. Изменение старшего полубайта чревато боком (ПК даже не стартанёт), придется отшиваться с PCI. Если по значению ASIC по адресу 0х74 выставляется младший полубайт второго байта Device ID, то по значению 0х75 младший полубайт первого (1 на Е).
Так же прозрачно изменяем со сменой Device ID и количеством конвейеров на первой вкладке в RaBit.
Device ID (в RaBit, изменяя Device ID на первой вкладке, соответственно меняем значения ASIC и количество конвееров). Часть значений (бит 3) разруливается аппаратно - резисторами на корпусе чипа, три бита посредством битовой маски, которая накладывается на Device ID ( 0x74, из 1:0), остальные "зашиты" в кристалле. Значения идентификатора устройства расположены в биосе в двух местах. Первое место - на строку ниже Description. Перед ним стоят значения Subvendor & Subsystem ID (по два байта на значение). И второе, на 3-4 строки ниже предыдущего значения. Зона начинается с текстового значения: PCIR. Включает значения вендора 02 10 (1002 ATI), Device ID и значения 0х18 - адреса указателя на данную зону.
Наиболее полный список Device ID вы найдете здесь.
Позволяет модифицировать себя в пределах: для R300 диапазон 4х44 - 4х47, для RV350/360 4х50 - 4х54 (5,6 и 7 встречать не приходилось). R350/360 используют значения 4х48-4х4В.
Разрядность шины памяти (количество активных каналов памяти). Задаётся регистром MC_CNTL. Примерное расположение управляющего регистра: 0х1С0 - 0х200 (примечание: в логе RaBit адрес управляющего регистра скрыт). Значение в hex-редакторе может иметь вид 22 00 00 00 (это соответствует 256 бит при 128 Mb локальной видеопамяти на R300/350). Для изменения разрядности требуется модифицировать второй полубайт в значении 22. Значения, которые приходилось встречать:
0 – 64 бит встречается у 128 Mb (9550/9600SЕ/X300SЕ)
1 – 128 бит встречается у 256 Mb (9550/9600XT/X600Pro) и 128Mb у 9600/X300LE
2 – 256 бит встречается у 128 Mb (9500/9700/9800/9800Pro/9800SЕ)
3 – reserved
4 – 64 бит (пока не встречалось)
5 – 128 бит встречается у 128 Mb 9800SЕ
6 – 256 бит (пока не встречалось)
7 – reserved
8 – 64 бит (пока не встречалось)
9 – 128 бит встречается у 128 Mb (9600Pro/9600XT/X600XT)
А – 256 бит встречается только у 256 Mb 350/360
В – reserved
С – 64 бит (пока не встречалось)
D – 128 бит встречается у 128 Mb (9500Pro и 9500 на дизайне от Pro)
E – 256 бит (пока не встречалось)
F – reserved
Дополнительно контролируем по двум местам (см. лог RaBit). По Memory config (пример: 0x2240), первый байт должен соответствовать значению данного регистра (второй байт равен MC_SIZE/2). И, непосредственно, по MC_CNTL (в логе расположен ниже, там же указан адрес). Естественно, все три значения должны совпадать. Если же в вашем новоприобретённом биосе эти значения не совпадают, следовательно это уже остатки от чьей-то трапезы :).
Обьём локальной видеопамяти задаётся регистром MC_SIZE. Длина до двух байт. Следует сразу за MC_CNTL. Принимает значения:
01 - 1 Mb, цвет 8 бит
02 - 2 Mb, цвет 8-16 бит
03 - 3 Mb, цвет 8-32 бит
04 - 4 Mb
05 - 5 Mb
06 - 6 Mb, 1280х1024, 32 бит
07 - 7 Mb
08 - 8 Mb
09 - 9 Mb
10 - 16 Mb
Далее последовательность, я думаю, ясна.
19 - 25 Mb
20 - 32 Mb
40 - 64 Mb
80 - 128 Mb
00 01 - 256 Mb
00 02 - 512 Mb
Дополнительно контролируем по Memory config (пример для 128 Mb: 0x2240), второй байт равен MC_SIZE/2.
Тайминги видеопамяти задаются регистром MC_TIMING_CNTL. Для отслеживания см. лог RaBit. Сам регистр берет начало в строках 0х3А0 - 0х400. У 9800XT начало строк на 10 ниже.
Разберем на примере ASUS A9800XT.
Write Latency (tWL) - 0х4А4. Второй полубайт. Принимает значения: 0-7.5 (0 - F) 16 значений (впереди 00, сзади 30100904).
CAS Latency (tCL) - 0х4А4. Первый полубайт. Принимает значения: reserved - 7 (0 - 7 и 8 - F) 8 значений х2.
"Полный" CAS составляет tCL + tRBS (только для >=R300).
Command Latency (tCMD) - 0х4А4. Первый полубайт. Принимает значения: 0 clock - 1/2clock При tCMD = 0, tCL берется из первых восьми значений при 1/2clock - из вторых (8 - F).
Strobe Latency (tSTB) - следующий за tWL байт 0х4А5. Второй полубайт. Принимает значения: 0 - 1 (= tWL - tWL+1/2clock) 2 значения х8.
RAS-to CAS Read Delay (tRcdRD) - 0х48C. Второй полубайт. Принимает значения: 3 - 10 (0 - 7 и 8 - F) 8 значений х2 (впереди 01, сзади A2291A8801).
RAS-to CAS Write Delay (tRcdWR) - 0х48C. Первый полубайт. Принимает значения: 1 - 8 (0 - 7 и 8 - F) 8 значений х2
Row Precharge Time (tRP) - следующий за RAS-to CAS байт 0х48D. Второй полубайт. Принимает значения: 3 - 10 (0 - 7 и 8 - F) 8 значений х2
RAS Latency (tRAS) - 0х48D. Первый полубайт. Принимает значения: 6 - 21 (8 - F в первом полубайте) 16 значений. Рассчитывается хитро. Четные значения "разруливает" первый полубайт, в образовании нечетных значений принимает участие второй полубайт tRP из 8 - F.
Row activate to Row active command time (tRRD) - рассчитывается из 0х48D, первого полубайта и 0х48E, второго полубайта. Принимает значения: 1 - 8. За четные 2,4,6,8 (8 - В) отвечает 0х48E второго полубайта. Нечетные значения формируются из четных бит 0х48E второго полубайта и 0х48D соответствует первым 8 битам. Значение 3 формируется только из tRAS (22), т.к. 0х48E второго полубайта (9) занят tR2W значением CL+3.
Read to Write Turnaround Time (tR2W) - 0х48E. Второй полубайт. Принимает значения: CL+1/2/3/4 им соответствуют 1,5,9,D (через 4 бита).
Write Recovery Time (tWR) - 0х48E. Первый полубайт. Принимает значения: 1- 8 (0 - 7) 8 значений.
Write to Read Turnaround Time (tW2R) - 0х48F. Второй полубайт. Принимает значения: 0 -7 (8 - F) 8 значений.
Read to Read Turnaround Time (tR2R) - 0х48F. Первый полубайт. Принимает значения: 1 - 4 (0 - 3 и 4 - 7) 4 значения х2
Write to Read Turnaround Time for same Bank (tW2Rsb) - 0х48F. Принимает значения: use tW2R - use tR2R rule. При use tW2R значения соответствуют tW2R, а при use tR2R rule - tR2R.
Shift the pos of RBS signal for READ data (tRBS) - 0х301 0х303 0x30D 0x30F. Второй полубайт. Принимает значения: 1 - 4.5 (8 - F) 8 значений.
Shift the pos of ERST signal for READ data (tERST) - 0х301 0х303 0x30D 0x30F. Первый полубайт. Принимает значения: -2 +1.5 - reset when IDle or refresh (8 - F) 8 значений.
Shift of QSREQ signal (tQSREQ) - следует за tERST: 0х302 0х302 0x30Е 0x310. Второй полубайт. Принимает значения: -2 -always enabled (8 - F) 8 значений.
Memory Refresh Rate (MemRR) - 0х2FВ. Байт. Принимает значения: 00 - FF. 256 (16х16) значений. Стоит перед tRFC.
Refresh Row Cycle Time (tRFC) - 0х2FC. Первый полубайт. Принимает значения: 13 - 28 (0 - F) 16 значений (сзади 00007C01).
Ну, это всё, как говорится, лирика :). А вот с точки зрения повышения производительности успешно модифицируемыми (в сторону уменьшения) оказываются: tRcdRD, tRcdWR, tRAS, tW2R, tRFC. Параметр tRAS всё же лучше не трогать, т.к. при уменьшении его разгон по памяти падает резко. При повышении может увеличиться. Параметр MemRR лучше поставить на максимум. При этом количество FPS и "плавность" в играх возрастает. Про tCL - отдельный разговор. У карт на чипе RV350/360 этот тайминг может устанавливаться в 2.
Естественно, это лишь краткое руководство. С какими таймингами заработает ваша видеокарта, решать вам.
На этом, конечно, количество параметров в биосе, оказывающих влияние на производительность, не исчерпывается. По некоторым данным они насчитывают порядка двух сотен и более.
Post Divider: один из частотных множителей. Задаётся регистром MCLK_CNTL (это для памяти, а для ядра SCLK_CNTL ). Типичное значение 2. У карт 64 бит на чипе RV350 может быть 3. Не приносит особой пользы, скорее является источником головной боли авторов пишущих под ATI, т.к. вносит путаницу в определение частот, отображая реальную частоту памяти как эффективную (удваивая её), а эффективную вдвое выше (при этом карта как ни в чём не бывало работает на номинальных частотах). Бытовало мнение, даже находившее подтверждения, что изменение PD в 1 увеличивает разгонный потенциал. Примерное расположение: 0х560 - 0х610. Изменяются два вторых полубайта. Значения имеют вид 12 12 12 (при 2), 12 11 11 (при 1), ну и 3 при pd 3. Практического значения для увеличения производительности не имеет, для частоты - вопрос спорный.
TV-out. TV zone расположена почти в самом конце файла BIOS. Определяется по значению $TV. Расположено сразу за значением 4Е. Принимает вид 00 - none, 01 - NTSC, 02 - PAL, other - unsupported standards (т.е. второй полубайт).
DVI можно найти по текстовому значению $ATI. Вид искомой последовательности: 11 12 00 23 01 32. Биосы aiw (комбайнов All-In-Wonder) не имеют поддержки DVI, эта строка у них принимает вид: 11 11 00 23 00 00. Как говорится, найди 5 различий.
VIVO. Указатель на зону VIVO возможностей (multimedia table) стоит перед текстовым значением $TVS, которое расположено в строках 0х120 - 0х190, т.е. в начале BIOSа. Имеет вид (для примера) С2 06 (9800XT). Читается 0х6С2. Размер multimedia table, начинающейся в соответствующей строке - 12 байт. Равнодушно относится к переносу за пределы 52 Kb. Главное - правильно прописать новый адрес в зоне указателя.
При модификациях 9800-to-9800XT из BIOSов ХТ с VIVO наблюдается следующий глюк. Монитор по загрузке windows может не инициализироваться секунд 5-6. Лечится просто - обнулением указателя на зону VIVO возможностей. Пишем туда 00 00. Вуаля... :).
При написании статьи использована информация с сайтов Radeon2.ru, Overclockers.ru.
Отдельное спасибо автору программы RaBit, Евгению Азарову aka JAZ, за содействие при написании статьи.