Еще раз об управлении напряжением видеокарт AMD HD 7xxx

для раздела Блоги

Данная статья предназначена для тех, кто уже прочитал статьи 1 и 2 test2013 об управлении напряжением питания видеопроцессора, но не понял, как раскодировать VID из BIOS своей видеокарты по второму способу.

Тех, кто все понял и вдобавок разбирается в структуре BIOS и ассемблере, прошу перейти в конец статьи, чтобы помочь мне с оставшимися вопросами.

Нам понадобятся:
  • GPU-Z для сохранения BIOS видеокарты (либо скачать BIOS с techpowerup.com);
  • hex-редактор (я использовал HxD);
  • текстовый редактор;
  • калькулятор Windows;
  • VBE7 для правки контрольной суммы и других манипуляций;
  • ATIFlash для прошивки отредактированного BIOS.

Первые пять шагов процесса доступно описаны в статье 2, трудности начинаются с шага 6. Мне показалось более логичным и понятным поступить по-другому и преобразовать закодированный VID ШИМ-контроллера из шестнадцатеричной системы исчисления в двоичную, предварительно поменяв последовательность байтов, т. к. младший байт располагается по меньшему адресу.
В качестве примера рассмотрим Sapphire HD 7770 1Gb GHz Edition из статьи 2 и Powercolor HD 7850 1GB из комментариев к ней. Вторая видеокарта послужит примером несоответствия указанного в BIOS напряжения VID-коду ШИМ-контроллера и того, как это можно понять из сравнения BIOS и даташита, без вольтметра.
Однако, вольтметр нам все же понадобится для раскодирования VID.

Sapphire HD 7770 1Gb GHz Edition:
  1. Для начала запишем исходную таблицу в том виде, в каком она находится в BIOS (см. статью 2):
    20 80 31 60 32 03
    20 00 31 60 39 03
    20 00 11 60 52 03
    20 00 31 40 6B 03
    20 00 11 40 84 03
    20 00 31 20 9D 03
    20 00 11 20 B6 03
    20 00 31 00 CF 03
    20 00 11 00 E8 03
    20 00 30 60 01 04
    20 00 10 60 1A 04
    20 00 30 40 33 04
    20 00 10 40 4C 04
    20 00 30 20 65 04
    20 00 10 20 7E 04
    20 00 30 00 97 04
    20 00 10 00 B0 04

  2. Теперь расположим элементы каждой строки в обратном порядке (от большего адреса к меньшему):
    03 32 60 31 80 20
    03 39 60 31 00 20
    03 52 60 11 00 20
    03 6B 40 31 00 20
    03 84 40 11 00 20
    03 9D 20 31 00 20
    03 B6 20 11 00 20
    03 CF 00 31 00 20
    03 E8 00 11 00 20
    04 01 60 30 00 20
    04 1A 60 10 00 20
    04 33 40 30 00 20
    04 4C 40 10 00 20
    04 65 20 30 00 20
    04 7E 20 10 00 20
    04 97 00 30 00 20
    04 B0 00 10 00 20

  3. Преобразуем шестнадцатеричные числа из первых двух столбцов в десятичные (значение «напряжения» в мВ, для наглядности), а числа из остальных столбцов — в двоичные, чтобы разобраться с тем, как задается VID ШИМ-контроллера:
    Таблица 1
    | Напряжение |      Таблица из BIOS        |                                         |
    | (мВ)       | Напряжение | Закодированный |         Закодированный VID (bin)        |
    |            | (hex)      | VID (hex)      |                                         |
    |------------|------------|----------------|-----------------------------------------|
    |      1     |      2     |        3       |                    4                    |
    |------------|------------|----------------|-----------------------------------------|
    | 0818       | 03 32      | 60 31 80 20    | 0110 0000 0011 0001 1000 0000 0010 0000 |
    | 0825       | 03 39      | 60 31 00 20    | 0110 0000 0011 0001 0000 0000 0010 0000 |
    | 0850       | 03 52      | 60 11 00 20    | 0110 0000 0001 0001 0000 0000 0010 0000 |
    | 0875       | 03 6B      | 40 31 00 20    | 0100 0000 0011 0001 0000 0000 0010 0000 |
    | 0900       | 03 84      | 40 11 00 20    | 0100 0000 0001 0001 0000 0000 0010 0000 |
    | 0925       | 03 9D      | 20 31 00 20    | 0010 0000 0011 0001 0000 0000 0010 0000 |
    | 0950       | 03 B6      | 20 11 00 20    | 0010 0000 0001 0001 0000 0000 0010 0000 |
    | 0975       | 03 CF      | 00 31 00 20    | 0000 0000 0011 0001 0000 0000 0010 0000 |
    | 1000       | 03 E8      | 00 11 00 20    | 0000 0000 0001 0001 0000 0000 0010 0000 |
    | 1025       | 04 01      | 60 30 00 20    | 0110 0000 0011 0000 0000 0000 0010 0000 |
    | 1050       | 04 1A      | 60 10 00 20    | 0110 0000 0001 0000 0000 0000 0010 0000 |
    | 1075       | 04 33      | 40 30 00 20    | 0100 0000 0011 0000 0000 0000 0010 0000 |
    | 1100       | 04 4C      | 40 10 00 20    | 0100 0000 0001 0000 0000 0000 0010 0000 |
    | 1125       | 04 65      | 20 30 00 20    | 0010 0000 0011 0000 0000 0000 0010 0000 |
    | 1150       | 04 7E      | 20 10 00 20    | 0010 0000 0001 0000 0000 0000 0010 0000 |
    | 1175       | 04 97      | 00 30 00 20    | 0000 0000 0011 0000 0000 0000 0010 0000 |
    | 1200       | 04 B0      | 00 10 00 20    | 0000 0000 0001 0000 0000 0000 0010 0000 |

    Из-за ограниченной поддержки HTML-тэгов Персональными страницами пришлось представить таблицы в таком виде, без выделения столбцов разными цветами, а тэг code выделяет все оранжевым.
    Вместо этого я буду обозначать разряды цифрами. Если таблицы разъезжаются — разверните окно браузера.

  4. Скачаем техдокументацию распаянного на этой видеокарте ШИМ-контроллера NCP5395G, откуда возьмем VID-коды в двоичной системе и запишем их в таблицу еще одним столбцом, в соответствии со значениями напряжения из BIOS видеокарты. Ненужные пока столбцы 2 и 3 удалим. Добавим в конец таблицы напряжения и VID, которые мы хотели бы прошить в BIOS, но пока не знаем для них закодированный VID.
    Таблица 2
    | Напряжение | Закодированный VID (bin)                | VID ШИМ-контроллера (bin) |
    | (мВ)       | из BIOS видеокарты (32 разряда)         | из даташита (8 разрядов)  |
    |------------|-----------------------------------------|---------------------------|
    |      1     |                    4                    |           5               |
    |------------|-----------------------------------------|---------------------------|
    |            | .??. .... ..?? ...? ?... .... ..?. .... | 87 65 43 21               |
    |------------|-----------------------------------------|---------------------------|
    | 0818       | 0110 0000 0011 0001 1000 0000 0010 0000 | 01 11 11 11               |
    | 0825       | 0110 0000 0011 0001 0000 0000 0010 0000 | 01 11 11 10               |
    | 0850       | 0110 0000 0001 0001 0000 0000 0010 0000 | 01 11 10 10               |
    | 0875       | 0100 0000 0011 0001 0000 0000 0010 0000 | 01 11 01 10               |
    | 0900       | 0100 0000 0001 0001 0000 0000 0010 0000 | 01 11 00 10               |
    | 0925       | 0010 0000 0011 0001 0000 0000 0010 0000 | 01 10 11 10               |
    | 0950       | 0010 0000 0001 0001 0000 0000 0010 0000 | 01 10 10 10               |
    | 0975       | 0000 0000 0011 0001 0000 0000 0010 0000 | 01 10 01 10               |
    | 1000       | 0000 0000 0001 0001 0000 0000 0010 0000 | 01 10 00 10               |
    | 1025       | 0110 0000 0011 0000 0000 0000 0010 0000 | 01 01 11 10               |
    | 1050       | 0110 0000 0001 0000 0000 0000 0010 0000 | 01 01 10 10               |
    | 1075       | 0100 0000 0011 0000 0000 0000 0010 0000 | 01 01 01 10               |
    | 1100       | 0100 0000 0001 0000 0000 0000 0010 0000 | 01 01 00 10               |
    | 1125       | 0010 0000 0011 0000 0000 0000 0010 0000 | 01 00 11 10               |
    | 1150       | 0010 0000 0001 0000 0000 0000 0010 0000 | 01 00 10 10               |
    | 1175       | 0000 0000 0011 0000 0000 0000 0010 0000 | 01 00 01 10               |
    | 1200       | 0000 0000 0001 0000 0000 0000 0010 0000 | 01 00 00 10               |
    |            |                                         |                           |
    | 1225       | 0XX0 0000 00XX 000X X000 0000 00X0 0000 | 00 11 11 10               |
    | 1250       | 0XX0 0000 00XX 000X X000 0000 00X0 0000 | 00 11 10 10               |
    | 1275       | 0XX0 0000 00XX 000X X000 0000 00X0 0000 | 00 11 01 10               |

  5. Теперь обратим внимание на столбец 4 и поставим "." над теми столбцами, числа в которых не меняются и равны 0 во всех строчках таблицы.
    Также заметим, что в VID-кодах из даташита старший восьмой разряд для всех интересующих нас напряжений равен 0. Это не страшно, т. к. 1 там появляется только для напряжений ниже 0,8125 В, а они нам не понадобятся.
    Отлично. Теперь мы ясно видим, что 7 бит VID из BIOS кодируют 7 бит VID ШИМ-контроллера. (Наверное, на самом деле 8, только непонятно, как найти тот старший 0, да он нам и не нужен).
  6. Осталось выяснить соответствие между разрядами чисел из столбцов 4 и 5, но теперь это будет легко.
    Пронумеруем разряды VID в столбце 5 числами от 1 до 8. Единственное, с чем возникнет трудность и придется угадывать — 2й и 7й разряды VID-кода ШИМ. Для всех напряжений, зашитых в BIOS, там 1, а для повышения напряжения нам нужен 0 в седьмом разряде.
    Ясно видно, что определенные колонки в столбцах 4 и 5 меняются по одинаковому закону:
    Таблица 3
    | Напряжение | Закодированный VID (bin)                | VID ШИМ-контроллера (bin) |
    | (мВ)       | из BIOS видеокарты (32 разряда)         | из даташита (8 разрядов)  |
    |------------|-----------------------------------------|---------------------------|
    |      1     |                    4                    |           5               |
    |------------|-----------------------------------------|---------------------------|
    |            | .54. .... ..3? ...6 1... .... ..?. .... | 87 65 43 21               |
    |------------|-----------------------------------------|---------------------------|
    | 0818       | 0110 0000 0011 0001 1000 0000 0010 0000 | 01 11 11 11               |
    | 0825       | 0110 0000 0011 0001 0000 0000 0010 0000 | 01 11 11 10               |
    | 0850       | 0110 0000 0001 0001 0000 0000 0010 0000 | 01 11 10 10               |
    | 0875       | 0100 0000 0011 0001 0000 0000 0010 0000 | 01 11 01 10               |
    | 0900       | 0100 0000 0001 0001 0000 0000 0010 0000 | 01 11 00 10               |
    | 0925       | 0010 0000 0011 0001 0000 0000 0010 0000 | 01 10 11 10               |
    | 0950       | 0010 0000 0001 0001 0000 0000 0010 0000 | 01 10 10 10               |
    | 0975       | 0000 0000 0011 0001 0000 0000 0010 0000 | 01 10 01 10               |
    | 1000       | 0000 0000 0001 0001 0000 0000 0010 0000 | 01 10 00 10               |
    | 1025       | 0110 0000 0011 0000 0000 0000 0010 0000 | 01 01 11 10               |
    | 1050       | 0110 0000 0001 0000 0000 0000 0010 0000 | 01 01 10 10               |
    | 1075       | 0100 0000 0011 0000 0000 0000 0010 0000 | 01 01 01 10               |
    | 1100       | 0100 0000 0001 0000 0000 0000 0010 0000 | 01 01 00 10               |
    | 1125       | 0010 0000 0011 0000 0000 0000 0010 0000 | 01 00 11 10               |
    | 1150       | 0010 0000 0001 0000 0000 0000 0010 0000 | 01 00 10 10               |
    | 1175       | 0000 0000 0011 0000 0000 0000 0010 0000 | 01 00 01 10               |
    | 1200       | 0000 0000 0001 0000 0000 0000 0010 0000 | 01 00 00 10               |
    |            |                                         |                           |
    | 1225       | 0XX0 0000 00XX 000X X000 0000 00X0 0000 | 00 11 11 10               |
    | 1250       | 0XX0 0000 00XX 000X X000 0000 00X0 0000 | 00 11 10 10               |
    | 1275       | 0XX0 0000 00XX 000X X000 0000 00X0 0000 | 00 11 01 10               |

    Знаком "?" отмечены те колонки, соответствие между которыми пока не удалось выяснить.
  7. Предположим, что 6й разряд закодированного VID из BIOS соответствует 2му разряду VID ШИМ-контроллера, тогда 21й соответствует 7му.
    В этом случае для напряжения 1250 мВ получим следующий закодированный VID:
    0110 0000 0000 0001 0000 0000 0010 0000

    Преобразуем в шестнадцатеричное число:
    60 01 00 20

    Расположим разряды в обратном порядке, для соответствия записи в BIOS:
    20 00 01 60

    Теперь предположим, что 6й разряд VID в BIOS соответствует 7му разряду VID ШИМ-контроллера, а 21й — 2му.
    Тогда для напряжения 1250 мВ получим следующий закодированный VID:
    0110 0000 0001 0001 0000 0000 0000 0000

    Преобразуем в шестнадцатеричное число:
    60 11 00 00

    Расположим разряды в обратном порядке, для соответствия записи в BIOS:
    00 00 11 60

    Такой код мы уже видели в статье 2, где указывается, что именно он соответствует напряжению 1250 мВ.
    Конечный вид строки в BIOS:
    00 00 11 60 E2 04

  8. Теперь мы выяснили соответствие всех 7 разрядов и получили возможность задавать требуемые напряжения.
    Таблица 4
    | Напряжение | Закодированный VID (bin)                | VID ШИМ-контроллера (bin) |
    | (мВ)       | из BIOS видеокарты (32 разряда)         | из даташита (8 разрядов)  |
    |------------|-----------------------------------------|---------------------------|
    |      1     |                    4                    |           5               |
    |------------|-----------------------------------------|---------------------------|
    |            | .54. .... ..32 ...6 1... .... ..7. .... | 87 65 43 21               |
    |------------|-----------------------------------------|---------------------------|
    | 0818       | 0110 0000 0011 0001 1000 0000 0010 0000 | 01 11 11 11               |
    | 0825       | 0110 0000 0011 0001 0000 0000 0010 0000 | 01 11 11 10               |
    | 0850       | 0110 0000 0001 0001 0000 0000 0010 0000 | 01 11 10 10               |
    | 0875       | 0100 0000 0011 0001 0000 0000 0010 0000 | 01 11 01 10               |
    | 0900       | 0100 0000 0001 0001 0000 0000 0010 0000 | 01 11 00 10               |
    | 0925       | 0010 0000 0011 0001 0000 0000 0010 0000 | 01 10 11 10               |
    | 0950       | 0010 0000 0001 0001 0000 0000 0010 0000 | 01 10 10 10               |
    | 0975       | 0000 0000 0011 0001 0000 0000 0010 0000 | 01 10 01 10               |
    | 1000       | 0000 0000 0001 0001 0000 0000 0010 0000 | 01 10 00 10               |
    | 1025       | 0110 0000 0011 0000 0000 0000 0010 0000 | 01 01 11 10               |
    | 1050       | 0110 0000 0001 0000 0000 0000 0010 0000 | 01 01 10 10               |
    | 1075       | 0100 0000 0011 0000 0000 0000 0010 0000 | 01 01 01 10               |
    | 1100       | 0100 0000 0001 0000 0000 0000 0010 0000 | 01 01 00 10               |
    | 1125       | 0010 0000 0011 0000 0000 0000 0010 0000 | 01 00 11 10               |
    | 1150       | 0010 0000 0001 0000 0000 0000 0010 0000 | 01 00 10 10               |
    | 1175       | 0000 0000 0011 0000 0000 0000 0010 0000 | 01 00 01 10               |
    | 1200       | 0000 0000 0001 0000 0000 0000 0010 0000 | 01 00 00 10               |
    |            |                                         |                           |
    | 1225       | 0110 0000 0011 0001 0000 0000 0000 0000 | 00 11 11 10               |
    | 1250       | 0110 0000 0001 0001 0000 0000 0000 0000 | 00 11 10 10               |
    | 1275       | 0100 0000 0011 0001 0000 0000 0000 0000 | 00 11 01 10               |

    Выходит, что код
    0110 0000 0000 0001 0000 0000 0010 0000
    из первого предположения соответствовал VID
    01 11 10 00,
    или напряжению 0,8625 В, что не привело бы к выходу из строя видеокарты, чего не скажешь об установке напряжений вплоть до 1.6000 В, которые нам теперь (теоретически) стали доступны.
  9. Внесение изменений в BIOS и его прошивка описаны в статьях 1 и 2. Добавлю только, что для исправления контрольной суммы измененный файл BIOS надо открыть с помощью VBE7 и сохранить, не внося никаких изменений.

    Все действия, как обычно, производите на свой страх и риск.

    Перейдем в следующей видеокарте, Powercolor HD 7850 1GB: удастся ли здесь найти закономерность?
  1. Находим таблицу с напряжениями в BIOS (см. статью 2):
    00 F0 10 20 20 03
    00 F0 00 20 39 03
    00 B0 10 20 52 03
    00 B0 00 20 6B 03
    00 E0 10 20 84 03
    00 E0 00 20 9D 03
    00 A0 10 20 B6 03
    00 A0 00 20 CF 03
    00 D0 10 20 E8 03
    00 D0 00 20 01 04
    00 50 00 20 0E 04
    00 90 10 20 1A 04
    00 90 00 20 33 04
    00 C0 10 20 4C 04
    00 C0 00 20 65 04
    00 40 00 20 72 04
    00 80 10 20 7E 04
    00 80 00 20 97 04
    00 F0 10 00 B0 04
    00 70 10 00 BA 04
    00 F0 00 00 C9 04

  2. Располагаем элементы от большего адреса к меньшему:
    03 20	20 10 F0 00
    03 39	20 00 F0 00
    03 52	20 10 B0 00
    03 6B	20 00 B0 00
    03 84	20 10 E0 00
    03 9D	20 00 E0 00
    03 B6	20 10 A0 00
    03 CF	20 00 A0 00
    03 E8	20 10 D0 00
    04 01	20 00 D0 00
    04 0E	20 00 50 00
    04 1A	20 10 90 00
    04 33	20 00 90 00
    04 4C	20 10 C0 00
    04 65	20 00 C0 00
    04 72	20 00 40 00
    04 7E	20 10 80 00
    04 97	20 00 80 00
    04 B0	00 10 F0 00
    04 BA	00 10 70 00
    04 C9	00 00 F0 00

  3. Преобразуем шестнадцатеричные числа из первых двух столбцов в десятичные (значение «напряжения» в мВ, для наглядности), а числа из остальных столбцов — в двоичные, чтобы разобраться с тем, как задается VID ШИМ-контроллера:
    Таблица 5
    | Напряжение |      Таблица из BIOS        |                                         |
    | (мВ)       | Напряжение | Закодированный |         Закодированный VID (bin)        |
    |            | (hex)      | VID (hex)      |                                         |
    |------------|------------|----------------|-----------------------------------------|
    |      1     |      2     |        3       |                    4                    |
    |------------|------------|----------------|-----------------------------------------|
    | 0800       | 03 20      | 20 10 F0 00    | 0010 0000 0001 0000 1111 0000 0000 0000 |
    | 0825       | 03 39      | 20 00 F0 00    | 0010 0000 0000 0000 1111 0000 0000 0000 |
    | 0850       | 03 52      | 20 10 B0 00    | 0010 0000 0001 0000 1011 0000 0000 0000 |
    | 0875       | 03 6B      | 20 00 B0 00    | 0010 0000 0000 0000 1011 0000 0000 0000 |
    | 0900       | 03 84      | 20 10 E0 00    | 0010 0000 0001 0000 1110 0000 0000 0000 |
    | 0925       | 03 9D      | 20 00 E0 00    | 0010 0000 0000 0000 1110 0000 0000 0000 |
    | 0950       | 03 B6      | 20 10 A0 00    | 0010 0000 0001 0000 1010 0000 0000 0000 |
    | 0975       | 03 CF      | 20 00 A0 00    | 0010 0000 0000 0000 1010 0000 0000 0000 |
    | 1000       | 03 E8      | 20 10 D0 00    | 0010 0000 0001 0000 1101 0000 0000 0000 |
    | 1025       | 04 01      | 20 00 D0 00    | 0010 0000 0000 0000 1101 0000 0000 0000 |
    | 1038       | 04 0E      | 20 00 50 00    | 0010 0000 0000 0000 0101 0000 0000 0000 |
    | 1050       | 04 1A      | 20 10 90 00    | 0010 0000 0001 0000 1001 0000 0000 0000 |
    | 1075       | 04 33      | 20 00 90 00    | 0010 0000 0000 0000 1001 0000 0000 0000 |
    | 1100       | 04 4C      | 20 10 C0 00    | 0010 0000 0001 0000 1100 0000 0000 0000 |
    | 1125       | 04 65      | 20 00 C0 00    | 0010 0000 0000 0000 1100 0000 0000 0000 |
    | 1138       | 04 72      | 20 00 40 00    | 0010 0000 0000 0000 0100 0000 0000 0000 |
    | 1150       | 04 7E      | 20 10 80 00    | 0010 0000 0001 0000 1000 0000 0000 0000 |
    | 1175       | 04 97      | 20 00 80 00    | 0010 0000 0000 0000 1000 0000 0000 0000 |
    | 1200       | 04 B0      | 00 10 F0 00    | 0000 0000 0001 0000 1111 0000 0000 0000 |
    | 1210       | 04 BA      | 00 10 70 00    | 0000 0000 0001 0000 0111 0000 0000 0000 |
    | 1225       | 04 C9      | 00 00 F0 00    | 0000 0000 0000 0000 1111 0000 0000 0000 |

  4. Коды ШИМ-контроллера этой видеокарты совпадают с предыдущими. Запишем их в таблицу еще одним столбцом, в соответствии со значениями напряжения из BIOS видеокарты. Ненужные пока столбцы 2 и 3 удалим. Добавим в конец таблицы напряжения и VID, которые мы хотели бы прошить в BIOS, но пока не знаем для них закодированный VID.
    Таблица 6
    | Напряжение | Закодированный VID (bin)                | VID ШИМ-контроллера (bin) |
    | (мВ)       | из BIOS видеокарты (32 разряда)         | из даташита (8 разрядов)  |
    |------------|-----------------------------------------|---------------------------|
    |      1     |                    4                    |           5               |
    |------------|-----------------------------------------|---------------------------|
    |            | ..7. .... ...? .... ???? .... .... .... | 87 65 43 21               |
    |------------|-----------------------------------------|---------------------------|
    | 0800       | 0010 0000 0001 0000 1111 0000 0000 0000 | 10 00 00 10               |
    | 0825       | 0010 0000 0000 0000 1111 0000 0000 0000 | 01 11 11 10               |
    | 0850       | 0010 0000 0001 0000 1011 0000 0000 0000 | 01 11 10 10               |
    | 0875       | 0010 0000 0000 0000 1011 0000 0000 0000 | 01 11 01 10               |
    | 0900       | 0010 0000 0001 0000 1110 0000 0000 0000 | 01 11 00 10               |
    | 0925       | 0010 0000 0000 0000 1110 0000 0000 0000 | 01 10 11 10               |
    | 0950       | 0010 0000 0001 0000 1010 0000 0000 0000 | 01 10 10 10               |
    | 0975       | 0010 0000 0000 0000 1010 0000 0000 0000 | 01 10 01 10               |
    | 1000       | 0010 0000 0001 0000 1101 0000 0000 0000 | 01 10 00 10               |
    | 1025       | 0010 0000 0000 0000 1101 0000 0000 0000 | 01 01 11 10               |
    | 1038       | 0010 0000 0000 0000 0101 0000 0000 0000 | 01 01 11 00               |
    | 1050       | 0010 0000 0001 0000 1001 0000 0000 0000 | 01 01 10 10               |
    | 1075       | 0010 0000 0000 0000 1001 0000 0000 0000 | 01 01 01 10               |
    | 1100       | 0010 0000 0001 0000 1100 0000 0000 0000 | 01 01 00 10               |
    | 1125       | 0010 0000 0000 0000 1100 0000 0000 0000 | 01 00 11 10               |
    | 1138       | 0010 0000 0000 0000 0100 0000 0000 0000 | 01 00 11 00               |
    | 1150       | 0010 0000 0001 0000 1000 0000 0000 0000 | 01 00 10 10               |
    | 1175       | 0010 0000 0000 0000 1000 0000 0000 0000 | 01 00 01 10               |
    | 1200       | 0000 0000 0001 0000 1111 0000 0000 0000 | 01 00 00 10               |
    | 1210       | 0000 0000 0001 0000 0111 0000 0000 0000 | 01 00 00 00               |
    | 1225       | 0000 0000 0000 0000 1111 0000 0000 0000 | 00 11 11 10               |
    |            |                                         |                           |
    | 1250       | 00X0 0000 000X 0000 XXXX 0000 0000 0000 | 00 11 10 10               |
    | 1275       | 00X0 0000 000X 0000 XXXX 0000 0000 0000 | 00 11 01 10               |

  5. Теперь обратим внимание на столбец 4 таблицы и поставим "." над теми столбцами, числа в которых не меняются и равны 0 во всех строчках таблицы.
    Получилось, что 6 изменяющихся бит в BIOS видеокарты каким-то образом кодируют 8 изменяющихся бит VID ШИМ-контроллера. Особенно странно выглядит верхняя строчка таблицы, где старший разряд VID контроллера в столбце 5 равен 1, тогда как во всех остальных случаях он равен 0, причем мы не наблюдаем схожих изменений в столбце 4. В первой и второй строчках столбца 4 различается только 1 бит, а в соответствующих строчках столбца 5 — 6 бит. Подобные различия мы видим и между другими строчками.
    Напрашивается вывод, что значения напряжения из столбца 1 таблицы не соответствуют значениям, закодированным в столбце 4, а значит и VID, которые мы взяли из даташита на контроллер, не соответствуют значениям из столбца 4.
  6. Скопируем из даташита весь кусок от 0.800 В до 1.300 В и начнем искать совпадения. Но сначала отметим в таблице 6 две подозрительно похожие колонки (7й разряд). То, как изменяется 30й разряд в столбце 4 позволяет предположить, что первая строка этого столбца кодирует не 800 мВ, а более высокое значение напряжения.
    Составим новую таблицу 7, в которой будем группировать совпадающие значения в столбцах 4 и 5 и смотреть по столбцу 6, какие на самом деле значения напряжения закодированы в BIOS.
    Код в первой строке столбца 4 очень похож на VID для напряжения 0.81875 В. Вероятно, это и есть минимальное закодированное напряжение (а не 0.800 В, как указано в BIOS). Теперь в столбце 5 изменяются только 7 бит, а 8й старший бит всегда равен нулю.
    Строки 1 и 2 столбца 4 отличаются на 1 бит. Пока предположим, что в этот раз BIOS не обманул, и значение 825 мВ совпадает с действительностью. Отметим еще одну колонку в таблице (1й разряд).
    Теперь легче понять, какое реальное напряжение кодирует третья строчка. В VID для 0.81875 В и 0.85000 В из даташита отличаются 2 бита, а в первой и третьей строках столбца 4 отличается только 1 бит, значит, 850 мВ из BIOS тоже не соответствует действительности. Из ближайших значений это может быть либо 0.83125 В, либо 0.84375 В. Предположим, что это 0.84375 В и выделим еще под одной колонке (3й разряд).
    Ищем соответствие для 875 мВ. Если наши предыдущие предположения верны, то это соответствует реальным 0.85000 В.
    В 1й и 5й строках столбца 4 различается 1 бит из тех, что еще не попал в выделенные колонки. Из ближайших значений это могут быть 0.86875 В и 0.91875 В. Более логично предположить, что это — 0.91875 В. Выделяем еще одну колонку (5й разряд). Тогда нам становятся ясны реальные значения для 925, 950 и 975 мВ.
    Такая же ситуация со значениями для 1000, 1025, 1038, 1050 и 1075 мВ. Выделяем еще по одной колонке (6й разряд). Сопоставление значений столбцов 4 и 5 для 1038 мВ позволяет нам выделить еще по одной колонке (2й разряд).
    Теперь можно разобраться и с группой 1100, 1125, 1138, 1150 и 1175 мВ.
    Таблица 7
    | Напряжение | Напряжение | Закодированный VID (bin)                | VID ШИМ-контроллера (bin) |
    | (мВ)       | (В)        | из BIOS видеокарты (32 разряда)         | из даташита (8 разрядов)  |
    | из BIOS    | из даташита|                                         |                           |
    |------------|------------|-----------------------------------------|---------------------------|
    |            |            |                    4                    |           5               |
    |     1      |     6      |-----------------------------------------|---------------------------|
    |            |            | ..7. .... ...1 .... 2365 .... .... .... | 87 65 43 21               |
    |------------|------------|-----------------------------------------|---------------------------|
    |            | 0.80000    |                                         | 10 00 00 10               |
    |            | 0.80625    |                                         | 10 00 00 01               |
    |            | 0.81250    |                                         | 10 00 00 00               |
    | 0800       | 0.81875    | 0010 0000 0001 0000 1111 0000 0000 0000 | 01 11 11 11               |
    | 0825       | 0.82500    | 0010 0000 0000 0000 1111 0000 0000 0000 | 01 11 11 10               |
    |            | 0.83125    |                                         | 01 11 11 01               |
    |            | 0.83750    |                                         | 01 11 11 00               |
    | 0850       | 0.84375    | 0010 0000 0001 0000 1011 0000 0000 0000 | 01 11 10 11               |
    | 0875       | 0.85000    | 0010 0000 0000 0000 1011 0000 0000 0000 | 01 11 10 10               |
    |            | 0.85625    |                                         | 01 11 10 01               |
    |            | 0.86250    |                                         | 01 11 10 00               |
    |            | 0.86875    |                                         | 01 11 01 11               |
    |            | 0.87500    |                                         | 01 11 01 10               |
    |            | 0.88125    |                                         | 01 11 01 01               |
    |            | 0.88750    |                                         | 01 11 01 00               |
    |            | 0.89375    |                                         | 01 11 00 11               |
    |            | 0.90000    |                                         | 01 11 00 10               |
    |            | 0.90625    |                                         | 01 11 00 01               |
    |            | 0.91250    |                                         | 01 11 00 00               |
    | 0900       | 0.91875    | 0010 0000 0001 0000 1110 0000 0000 0000 | 01 10 11 11               |
    | 0925       | 0.92500    | 0010 0000 0000 0000 1110 0000 0000 0000 | 01 10 11 10               |
    |            | 0.93125    |                                         | 01 10 11 01               |
    |            | 0.93750    |                                         | 01 10 11 00               |
    | 0950       | 0.94375    | 0010 0000 0001 0000 1010 0000 0000 0000 | 01 10 10 11               |
    | 0975       | 0.95000    | 0010 0000 0000 0000 1010 0000 0000 0000 | 01 10 10 10               |
    |            | 0.95625    |                                         | 01 10 10 01               |
    |            | 0.96250    |                                         | 01 10 10 00               |
    |            | 0.96875    |                                         | 01 10 01 11               |
    |            | 0.97500    |                                         | 01 10 01 10               |
    |            | 0.98125    |                                         | 01 10 01 01               |
    |            | 0.98750    |                                         | 01 10 01 00               |
    |            | 0.99375    |                                         | 01 10 00 11               |
    |            | 1.00000    |                                         | 01 10 00 10               |
    |            | 1.00625    |                                         | 01 10 00 01               |
    |            | 1.01250    |                                         | 01 10 00 00               |
    | 1000       | 1.01875    | 0010 0000 0001 0000 1101 0000 0000 0000 | 01 01 11 11               |
    | 1025       | 1.02500    | 0010 0000 0000 0000 1101 0000 0000 0000 | 01 01 11 10               |
    |            | 1.03125    |                                         | 01 01 11 01               |
    | 1038       | 1.03750    | 0010 0000 0000 0000 0101 0000 0000 0000 | 01 01 11 00               |
    | 1050       | 1.04375    | 0010 0000 0001 0000 1001 0000 0000 0000 | 01 01 10 11               |
    | 1075       | 1.05000    | 0010 0000 0000 0000 1001 0000 0000 0000 | 01 01 10 10               |
    |            | 1.05625    |                                         | 01 01 10 01               |
    |            | 1.06250    |                                         | 01 01 10 00               |
    |            | 1.06875    |                                         | 01 01 01 11               |
    |            | 1.07500    |                                         | 01 01 01 10               |
    |            | 1.08125    |                                         | 01 01 01 01               |
    |            | 1.08750    |                                         | 01 01 01 00               |
    |            | 1.09375    |                                         | 01 01 00 11               |
    |            | 1.10000    |                                         | 01 01 00 10               |
    |            | 1.10625    |                                         | 01 01 00 01               |
    |            | 1.11250    |                                         | 01 01 00 00               |
    | 1100       | 1.11875    | 0010 0000 0001 0000 1100 0000 0000 0000 | 01 00 11 11               |
    | 1125       | 1.12500    | 0010 0000 0000 0000 1100 0000 0000 0000 | 01 00 11 10               |
    |            | 1.13125    |                                         | 01 00 11 01               |
    | 1138       | 1.13750    | 0010 0000 0000 0000 0100 0000 0000 0000 | 01 00 11 00               |
    | 1150       | 1.14375    | 0010 0000 0001 0000 1000 0000 0000 0000 | 01 00 10 11               |
    | 1175       | 1.15000    | 0010 0000 0000 0000 1000 0000 0000 0000 | 01 00 10 10               |
    |            | 1.15625    |                                         | 01 00 10 01               |
    |            | 1.16250    |                                         | 01 00 10 00               |
    |            | 1.16875    |                                         | 01 00 01 11               |
    |            | 1.17500    |                                         | 01 00 01 10               |
    |            | 1.18125    |                                         | 01 00 01 01               |
    |            | 1.18750    |                                         | 01 00 01 00               |
    |            | 1.19375    |                                         | 01 00 00 11               |
    |            | 1.20000    |                                         | 01 00 00 10               |
    |            | 1.20625    |                                         | 01 00 00 01               |
    |            | 1.21250    |                                         | 01 00 00 00               |
    | 1200       | 1.21875    | 0000 0000 0001 0000 1111 0000 0000 0000 | 00 11 11 11               |
    | 1225 ?     | 1.22500    | 0000 0000 0000 0000 1111 0000 0000 0000 | 00 11 11 10               |
    | 1210 ?     | 1.23125    | 0000 0000 0001 0000 0111 0000 0000 0000 | 00 11 11 01               |
    |            | 1.23750    |                                         | 00 11 11 00               |
    |            | 1.24375    |                                         | 00 11 10 11               |
    |            | 1.25000    | 000X 0000 000X 0000 XXXX 0000 0000 0000 | 00 11 10 10               |
    |            | 1.25625    | 000X 0000 000X 0000 XXXX 0000 0000 0000 | 00 11 10 01               |
    |            | 1.26250    | 000X 0000 000X 0000 XXXX 0000 0000 0000 | 00 11 10 00               |
    |            | 1.26875    | 000X 0000 000X 0000 XXXX 0000 0000 0000 | 00 11 01 11               |
    |            | 1.27500    | 000X 0000 000X 0000 XXXX 0000 0000 0000 | 00 11 01 10               |
    |            | 1.28125    | 000X 0000 000X 0000 XXXX 0000 0000 0000 | 00 11 01 01               |
    |            | 1.28750    | 000X 0000 000X 0000 XXXX 0000 0000 0000 | 00 11 01 00               |
    |            | 1.29375    | 000X 0000 000X 0000 XXXX 0000 0000 0000 | 00 11 00 11               |
    |            | 1.30000    | 000X 0000 000X 0000 XXXX 0000 0000 0000 | 00 11 00 10               |

    Но со значениями 1200, 1210 и 1225 мВ возникает проблема. Получилось, что 1200 соответствует реальным 1,21875 В, 1210 — 1.23125 В, а 1225 — 1.2250 В. Все бы ничего, но выходит, что большее значение реального напряжения находится между двумя меньшими. Значит, какое-то из предыдущих предположений было ошибочным.
    Посмотрим еще раз в таблицу 7: чтобы восстановить логичный порядок последней группы напряжений, нужно изменить соответствие 1ого и 2го разрядов. Придется пересмотреть все предыдущие напряжения и проверить, нет ли там ошибок.
    Получится таблица 8 (из нее удалены промежуточные неиспользуемые значения):
    Таблица 8
    | Напряжение | Напряжение | Закодированный VID (bin)                | VID ШИМ-контроллера (bin) |
    | (мВ)       | (В)        | из BIOS видеокарты (32 разряда)         | из даташита (8 разрядов)  |
    | из BIOS    | из даташита|                                         |                           |
    |------------|------------|-----------------------------------------|---------------------------|
    |            |            |                    4                    |           5               |
    |     1      |     6      |-----------------------------------------|---------------------------|
    |            |            | ..7. .... ...2 .... 1365 .... .... .... | 87 65 43 21               |
    |------------|------------|-----------------------------------------|---------------------------|
    | 0800       | 0.81875    | 0010 0000 0001 0000 1111 0000 0000 0000 | 01 11 11 11               |
    | 0825       | 0.83125    | 0010 0000 0000 0000 1111 0000 0000 0000 | 01 11 11 01               |
    | 0850       | 0.84375    | 0010 0000 0001 0000 1011 0000 0000 0000 | 01 11 10 11               |
    | 0875       | 0.85625    | 0010 0000 0000 0000 1011 0000 0000 0000 | 01 11 10 01               |
    | 0900       | 0.91875    | 0010 0000 0001 0000 1110 0000 0000 0000 | 01 10 11 11               |
    | 0925       | 0.93125    | 0010 0000 0000 0000 1110 0000 0000 0000 | 01 10 11 01               |
    | 0950       | 0.94375    | 0010 0000 0001 0000 1010 0000 0000 0000 | 01 10 10 11               |
    | 0975       | 0.95625    | 0010 0000 0000 0000 1010 0000 0000 0000 | 01 10 10 01               |
    | 1000       | 1.01875    | 0010 0000 0001 0000 1101 0000 0000 0000 | 01 01 11 11               |
    | 1025       | 1.03125    | 0010 0000 0000 0000 1101 0000 0000 0000 | 01 01 11 01               |
    | 1038       | 1.03750    | 0010 0000 0000 0000 0101 0000 0000 0000 | 01 01 11 00               |
    | 1050       | 1.04375    | 0010 0000 0001 0000 1001 0000 0000 0000 | 01 01 10 11               |
    | 1075       | 1.05625    | 0010 0000 0000 0000 1001 0000 0000 0000 | 01 01 10 01               |
    | 1100       | 1.11875    | 0010 0000 0001 0000 1100 0000 0000 0000 | 01 00 11 11               |
    | 1125       | 1.13125    | 0010 0000 0000 0000 1100 0000 0000 0000 | 01 00 11 01               |
    | 1138       | 1.13750    | 0010 0000 0000 0000 0100 0000 0000 0000 | 01 00 11 00               |
    | 1150       | 1.14375    | 0010 0000 0001 0000 1000 0000 0000 0000 | 01 00 10 11               |
    | 1175       | 1.15625    | 0010 0000 0000 0000 1000 0000 0000 0000 | 01 00 10 01               |
    | 1200       | 1.21875    | 0000 0000 0001 0000 1111 0000 0000 0000 | 00 11 11 11               |
    | 1210       | 1.22500    | 0000 0000 0001 0000 0111 0000 0000 0000 | 00 11 11 10               |
    | 1225       | 1.23125    | 0000 0000 0000 0000 1111 0000 0000 0000 | 00 11 11 01               |
    |            |            |      Эти напряжения можно задать:       |                           |
    |            | 1.23750    | 0000 0000 0000 0000 0111 0000 0000 0000 | 00 11 11 00               |
    |            | 1.24375    | 0000 0000 0001 0000 1011 0000 0000 0000 | 00 11 10 11               |
    |            | 1.25000    | 0000 0000 0001 0000 0011 0000 0000 0000 | 00 11 10 10               |
    |            | 1.25625    | 0000 0000 0000 0000 1011 0000 0000 0000 | 00 11 10 01               |
    |            | 1.26250    | 0000 0000 0000 0000 0011 0000 0000 0000 | 00 11 10 00               |
    |            |            |      Эти напряжения нельзя задать:      |                           |
    |            | 1.26875    | XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX | 00 11 01 11               |
    |            | 1.27500    | XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX | 00 11 01 10               |
    |            | 1.28125    | XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX | 00 11 01 01               |
    |            | 1.28750    | XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX | 00 11 01 00               |
    |            | 1.29375    | XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX | 00 11 00 11               |
    |            | 1.30000    | XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX | 00 11 00 10               |
    |            | 1.30625    | XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX | 00 11 00 01               |
    |            | 1.31250    | XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX | 00 11 00 00               |
    |            |            |      Эти напряжения можно задать:       |                           |
    |            | 1.31875    | 0000 0000 0001 0000 1110 0000 0000 0000 | 00 10 11 11               |
    |            | 1.32500    | 0000 0000 0001 0000 0110 0000 0000 0000 | 00 10 11 10               |
    |            | 1.33125    | 0000 0000 0000 0000 1110 0000 0000 0000 | 00 10 11 01               |
    |            | 1.33750    | 0000 0000 0000 0000 0110 0000 0000 0000 | 00 10 11 00               |
    |            | 1.34375    | 0000 0000 0001 0000 1010 0000 0000 0000 | 00 10 10 11               |
    |            | 1.35000    | 0000 0000 0001 0000 0010 0000 0000 0000 | 00 10 10 10               |
    |            | 1.35625    | 0000 0000 0000 0000 1010 0000 0000 0000 | 00 10 10 01               |
    |            | 1.36250    | 0000 0000 0000 0000 0010 0000 0000 0000 | 00 10 10 00               |

    Теперь логический порядок возрастания напряжений восстановлен, но осталась одна проблема: В колонке 4 мы имеем возможность изменять 6 бит, а в колонке 5 нам требуется изменять 7 бит. Обратим внимание на 4й разряд колонки 5: для всех используемых в этом BIOS напряжений там единица. Получается, что эта единица либо задана соединением соответствующего вывода ШИМ-контроллера с лог. 1, либо программно в другом месте в BIOS. Не имея возможности менять этот разряд, мы не сможем задавать напряжения в диапазоне от 1.26875 В до 1.31250 В, но сможем задавать напряжения до 1.26250 В включительно, а также в диапазоне от 1.31875 В до 1.36250 В (и далее, см. даташит).

    Для примера вычислим, что нужно зашить в BIOS для получения напряжений 1.26250 В и 1.35000 В:
    1.26250     04 EF     0000 0000 0000 0000 0011 0000 0000 0000     00 00 30 00
    1.35000     05 46     0000 0000 0001 0000 0010 0000 0000 0000     00 10 20 00

    Расположим в соответствии с адресацией, в готовом виде:
    00 30 00 00 EF 04
    00 20 10 00 46 05

    Если зашить в BIOS
    00 00 00 00 1B 06,
    то получим 1.563 В, поэтому так делать не следует.
    Почему-то рассчитанные мной напряжения не совпадают с измеренными владельцем карты (см. комментарий). Возможно, я где-то допустил ошибку и не смог ее найти. Если у кого-то есть такая же видеокарта и мультиметр, прошу измерить напряжения по умолчанию, без прошивки, и сообщить.
  7. Также я проанализировал BIOS F72 для видеокарты Gigabyte GV-R797OC-3GD rev. 2.1, которая тоже упоминалась в статье 2. Оказалось, что в этом BIOS зафиксированы два разряда VID: (Предположительно, 1й и 7й, что не позволяет задать напряжения выше 1,206 В описанным способом). Обнаружилось такое соответствие разрядов VID ШИМ-контроллера и BIOS:
    xxxx xxxx xxx3 xxxx 2x64 5xxx xxxx xxxx     87 65 43 21
    0000 0000 0000 0000 0000 0000 0000 0000     01 00 00 01
    Если у кого-то из читателей есть такая видеокарта, отпишитесь в комментариях, т. к. если мое предположение не верно и на самом деле зафиксированы разряды 1 и 2, то прошивкой VID
    00 00 00 00
    можно спалить карту.

Предупреждаю, что ни одной из рассморенных видеокарт у меня нет, а все приведенные рассуждения являются теоретическими, на основе анализа статей 1, 2, комментариев к ним, таблиц из BIOS видеокарт, даташита на ШИМ-контроллер, форумов и других доступных в Интернете материалов.

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


    Не на все интересующие меня вопросы я нашел ответы, поэтому предлагаю читателям подумать над оставшимися:
  • Где и каким образом 8-разрядный шестнадцатеричный (32-разрядный двоичный) VID из BIOS преобразуется в 2-разрядный шестнадцатеричный (8-разрядный двоичный) VID ШИМ-контроллера? Удалось соотнести разряды на трех примерах, но почему они соотносятся именно так — до сих пор не понятно.
  • Как задаются те разряды VID (4й разряд во втором примере), которые не получилось изменить: аппаратно или программно? Владельцы таких частично-заблокированных видеокарт могут посмотреть, с чем соединяются соответсвтующие выводы ШИМ-контроллера.
  • Где и каким образом задается напряжение питания видеопамяти?
  • Как выбирается рабочая частота и напряжение и как добавить/удалить pstate, а не только изменять уже существующие?
Telegram-канал @overclockers_news - это удобный способ следить за новыми материалами на сайте. С картинками, расширенными описаниями и без рекламы.
Оценитe материал
рейтинг: 1.0 из 5
голосов: 2

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

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

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