Управляем напряжением видеокарт AMD HD 7 серии через редактирование BIOS 2

16 апреля 2013, вторник 19:45
для раздела Блоги

Если ваша видеокарта основана на дизайне сильно отличающемся от референсного, то первый простой способ с заменой всего одного байта вам не подходит. Для таких случаев подойдёт второй куда более сложный способ.
СПОСОБ №2
Способ разработан и опробован мной на  собственной Sapphire HD 7770 1Gb GHz Edition (11201-17) поэтому её BIOS и возьмём для примера.


  1. Для начала потребуется осмотреть карту и найти на ней микросхему VRM (Voltage regulator module) именно она отвечает за выставление на ядре нужного напряжения. Как правило, это самая большая после ядра и чипов памяти микросхема. Узнав её маркировку нужно найти её datasheet. Для того чтобы из него узнать таблицу  VRM11 VID CODES. Эта таблица потребуется, чтобы узнать соответствие между VID в bios   и VRM VID CODES (далее «сигналом»)в VRM. В моём случае VRM это NCP5395G и я без проблем нашёл на него datasheet.


  2. Открываем в редакторе BIOS и ищем строчку  01 11 36 00 00 07 (для карт отличных от 7770/7750 строчки будут другими, см. в конце способа)


  3. От найденной строчки начинаем двигаться к началу файла с шагом в 6 байт. Каждый шаг это как бы строчка в таблице которую требуется изучить, а после изменить.





Строчек может быть достаточно много. Вы поймете, что таблица кончилась когда «нарушится логика»  следующей строчки, т.е. когда 2 последних байта перестанут постепенно уменьшаться.



  1.  Получилась следующая таблица:




Зелёным выделен VID в милливольтах,  а остальные 4 байта в строчке кодируют управляющий «сигнал» VRM.
Эта таблица помогает BIOS выставить реальное напряжение на ядре в зависимости от желаемого VID. Т.е. каждому VID соответствует свой «сигнал» для VRM.
 VID для удобства переводим в десятичный вид также как и в первом способе: 32 03   читать как 332h  => 818мВ



  1. Вот тут нам понадобиться таблица  VRM VID CODES которую мы берём из найденного datasheet. Вот она для моего случая:


         В каждой её строчке указан напряжение, которое может выдать VRM и что самое важное соответствующий ему «сигнал» как в шестнадцатеричном, так и бинарном виде.  Пример: 900мВ «сигнал»= 72h или 0 1 1 1 0 0 1 0


  1. Теперь начинаем совмещать эти две таблицы. Берём VID из таблицы BIOS и ищем это напряжение в таблице VRM. Затем для этого VID выписываем в 1 строчку 4 байта из таблицы BIOS и соответствующий ему же «сигнал» в бинарном виде. Например, берём первую строку из таблицы BIOS, VID = 818мВ(32 03) => 2 0 8 0 3 1 6 0 = 0 1 1 1 1 1 1 1. Для второй строчки VID=825мВ(39 03)=> 2 0 0 0 3 1 6 0 = 0 1 1 1 1 1 1 0.  И делаем так для всех VID из таблицы BIOS. Весь смысл в том, что 4 байта мы будем рассматривать как 8 отдельных знаков, и получается 8 знаков слева, 8 знаков справа. Остаётся расшифровать, как эти 8 знаков (4 байта) задают нужный «сигнал» VRM, т.е. раскрыть этот алгоритм.



2 0 8 0 3 1 6 0 = 0 1 1 1 1 1 1 1 0.81875
2 0 0 0 3 1 6 0 = 0 1 1 1 1 1 1 0 0.82500
2 0 0 0 1 1 6 0 = 0 1 1 1 1 0 1 0 0.85000
2 0 0 0 3 1 4 0 = 0 1 1 1 0 1 1 0 0.87500
2 0 0 0 1 1 4 0 = 0 1 1 1 0 0 1 0 0.90000
2 0 0 0 3 1 2 0 = 0 1 1 0 1 1 1 0 0.92500
2 0 0 0 1 1 2 0 = 0 1 1 0 1 0 1 0 0.95000
2 0 0 0 3 1 0 0 = 0 1 1 0 0 1 1 0 0.97500
2 0 0 0 1 1 0 0 = 0 1 1 0 0 0 1 0 1.00000
2 0 0 0 3 0 6 0 = 0 1 0 1 1 1 1 0 1.02500
2 0 0 0 1 0 6 0 = 0 1 0 1 1 0 1 0 1.05000
2 0 0 0 3 0 4 0 = 0 1 0 1 0 1 1 0 1.07500
2 0 0 0 1 0 4 0 = 0 1 0 1 0 0 1 0 1.10000
2 0 0 0 3 0 2 0 = 0 1 0 0 1 1 1 0 1.12500
2 0 0 0 1 0 2 0 = 0 1 0 0 1 0 1 0 1.15000
2 0 0 0 3 0 0 0 = 0 1 0 0 0 1 1 0 1.17500
2 0 0 0 1 0 0 0 = 0 1 0 0 0 0 1 0 1.20000


Составляя эти пары можно заметить, что и слева и справа меняются не все 8, а значительно меньше знаков, поэтому для упрощения расшифровки составим сокращённую таблицу, где будут только те знаки, которые меняются от строки к строке.


(825) 316 1111
(850) 116 1110
(875) 314 1101
(900) 114 1100
(925) 312 1011
(950) 112 1010
(975) 310 1001
(1000) 110 1000
(1025) 306 0111
(1050) 106 0110
(1075) 304 0101
(1100) 104 0100
(1125) 302 0011
(1150) 102 0010
(1175) 300 0001
(1200) 100 0000


Получается, что 3 знака из таблицы BIOS кодируют 4 знака в таблице «сигналов» VRM. В моём случае алгоритм достаточно легко расшифровывается.


3 в 1 знаке из левой части даёт 1 в 4 знаке правой части.
1 в 1 = 0 в 4
1 в 2 = 1 в 1
0 в 2 = 0 в 1
6 в 3 = 11 в 2 и 3
4 в 3 = 10 в 2 и 3
2 в 3 = 01 в 2 и 3
0 в 3 = 00 в 2 и 3


А если вернуться обратно в полное представление то:


3 в 5 знаке из левой части даёт 1 в 6 знаке правой части.
1 в 5 = 0 в 6
1 в 6 = 1 в 3
0 в 6 = 0 в 3
6 в 7 = 11 в 4 и 5
4 в 7 = 10 в 4 и 5
2 в 7 = 01 в 4 и 5
0 в 7 = 00 в 4 и 5


А их строки VID=818мВ (которая отсутствовала в сокращённой таблице) получаем:


8 в 3 знаке из левой части даёт 1 в 8 знаке правой части
0 в 3 = 0 в 8

Таким образом, алгоритм управления VRM частично выяснен. Осталось невыяснено лишь способ задания 1, 2 и 7  регистры  VRM и назначения 1, 2,  4 и 8 знаков из таблицы BIOS. Пока не будем придавать этому внимания.


  1.  Теперь собственно зачем мы это всё разбирали. Мне не хватает 1.2В. для разгона до 1200МГц. Поэтому я хочу поднять напряжение до 1.25В. Для этого я собираюсь добавить в таблицу BIOS две строки  с VID= 1250 и VID=1225. Находим «сигналы» для них в таблице VRM VID CODES



Это:  0 0 1 1 1 0 1 0  = 1.25000 и  0 0 1 1 1 1 1 0 = 1.22500, теперь их надо перевести  в вид для строки BIOS. Чтобы было проще сравним их с теми, что уже есть в bios, замечаем, что они отличаются лишь одним знаком от: (VID850) = 0 1 1 1 1 0 1 0 = 20 00 11 60 и (VID825) = 0 1 1 1 1 1 1 0 = 20 00 31 60   т.е. нам надо как то превратить единицу во втором знаке «сигнала» в ноль, согласно выясненному алгоритму это никак не узнать, поэтому тут придётся действовать по принципу «пальцем в небо» и чисто наугад заменим 2 в первом знаке строки bios на 0.


Получается что: (VID1250) =0 0 1 1 1 0 1 0 = 00 00 11 60, а (VID1225) = 0 0 1 1 1 1 1 0 = 00 00 31 60



  1. Начинаем править таблицу BIOS. Меняя таблицу надо помнить следующие правила:



а) нельзя менять её размер (количество строк)


б) VID должны идти строго по возрастанию и не должны повторяться


в) подаваемое напряжение к счастью не зависит от места в таблице, а именно от указанных значений


г) желательно оставлять в таблице стандартные значения, и менять те которые не используются


Поэтому я удаляю две строчки с VID=1025 и VID=1050, а в конец таблицы вставляю свои, для VID=1225 и VID=1250.


 



  1. ВСЁ можно прошивать. После добавления новых строк в программе Sapphire Trixx стало доступно повышение напряжения до 1.25В.  В моём случае поначалу у меня даже не было под рукой вольтметра. И все изменения делал вслепую, ориентируясь только на разгон и температуру. Но позже достав вольтметр, я убедился, что напряжения выставляются правильно и получается «пальцем в небо» попал с первого раза.



P.S. Способ разработан на основе HD7770. Для других карт всё то же самое, но надо искать другие строчки. Для HD7970/7950 и HD7870/7850  строка одинаковая  04 00 24 00 00 04. Надо только помнить, что VID в bios не всегда соответствует задаваемому «сигналу» (пример карты Gigabyte)  и для начала следует измерять вольтметром реальное напряжение искать его «сигнал» и лишь потом сопоставлять со строчками в bios.


P.P.S. В способе упор был сделан на повышение напряжения. Если же наоборот хочется его понизить и(или) хочется уйти от использования программ для выставления напряжения, то можно отредактировать "ASIC таблицу", суть в том что менять не "сигнал", а сам VID  (применимо только к нереференсам) Подробней..
 


© D e N
 


Небольшое "факультативное" дополнение (обновлено).
Как я уже предупреждал, бывает что в bios таблица соответствия VID и "сигналов" содержит неверные данные (по моему мнению это не случайность), рассмотрим такой случай на примере видеокарты gigabyte gv-r797oc-3gd (rev 2.1)
СПОСОБ №2+
Т.к. эта карта (как и почти все на упрощённом дизайне) не содержит микросхемы мониторинга напряжения на ядре, нам понадобится достаточно точный вольтметр, чтобы его измерить.
Действуем следующим образом:


1)   запускаем GPU-Z и смотрим, что показывает сенсор VDDC – это текущий VID (и он не имеет ничего общего с реальным напряжением!)  убеждаемся, что карта в состоянии покоя,  т.е. в режиме 2D и записываем показания вольтметра и текущий VID.


2)  Запускаем встроенный тест в gpu-z и снова записываем показания вольтметра и текущий VID.


3)  Выключаем тест, запускаем видео файл с простым содержимым (DiVX) - записываем показания вольтметра и текущий VID


4)  Запускаем видео файл с HD содержимым (h264) - записываем показания вольтметра и текущий VID
 
Должно получиться не менее трёх разных пар VID и показаний вольтметра.
У меня вышло:
(2D) вольтметр=1.042;VID=0.850
(3D) вольтметр=1.169;VID=1.170
 (DiVX) вольтметр=0.941;VID=0.950
(h264) вольтметр=1.169;VID=1.170 (но частоты другие чем в 3D)
Как видите, в двух из четырёх случаев VID врёт, реальное напряжение отличается больше погрешности измерений.
Открываем bios.

Составляем соответствие строк bios и «сигналов»
Только в таблице VRM VID Codes(vrm того же производителя так что "сигналы" одинаковые) ищем не те VID что в bios а то что намеряли вольтметром.


00 98 00 00 = 0 1 0 1 1 0 1 1 (850 оно же 1042)
00 A8 00 00 = 0 1 1 0 1 0 1 1 (950 оно же 941)
00 80 10 00 = 0 1 0 0 0 1 1 1 (1170)

Поскрипев мозгами я пришёл к выводу, что в первой строчке вместо
9 надо поставить B и тогда в 2D режиме будут более близкие к требуемым 850, реальные 844мВ.

А если в третьей строчке вместо 1 поставив  0 можно «задать» 1193 реальных мВ
Вместо метода с видеофайлами, иногда проще несколько лишних раз перепрошить BIOS.  В строке с VID режима простоя (2D) последовательно меняем "сигнал" на значения из других строчек, и продолжаем мерять вольтметром, так больше шансов правильно разгадать алгоритм. 
Именно таким перебором всех подряд значений выяснил, что:

00 Bx x0 00 = 01 11 xx 11
00 Ax x0 00 = 01 10 xx 11
00 9x x0 00 = 01 01 xx 11
00 8x x0 00 = 01 00 xx 11
00 7x x0 00 = 01 11 xx 01
00 6x x0 00 = 01 10 xx 01
00 5x x0 00 = 01 01 xx 01
00 4x x0 00 = 01 00 xx 01
00 x8 x0 00 = 01 xx 1x xx
00 x0 x0 00 = 01 xx 0x xx
00 xx 1x 00 = 01 xx x1 xx
00 xx 0x 00 = 01 xx x0 xx
т.е. абсолютный максимум, который может выдать VRM на ядро это 1206мВ – это ограничение алгоритма в bios, а именно невозможность управлять вторым знаком  в «сигнале на VRM»

Суть написанного в двух вещах:


1)  И в BIOS могут быть «косяки» (возможно специально допущенные)


2)  Не надо бояться экспериментировать с BIOS. Всего около пятидесяти раз перешивал его при переборе и карта жива

Оценитe материал

Возможно вас заинтересует

Популярные новости

Сейчас обсуждают