Изменение 'мобильных' множителей процессоров AMD (немного справочной информации)

для раздела Блоги
[ver.001 alfa, 16-10-2004]

Наверное многие, кто слышал о мобильных процессорах от AMD, задавали себе вопрос: как различным программам (утилиты , драйвера, биос) удается менять "на лету" множитель и напряжение этих замечательных процессоров ?

В этой статейке я постараюсь в общих чертах дать ответ на этот вопрос.

Статья написана меньше чем за сутки. Кроме того, я не являюсь профессиональным программистом. Поэтому прошу строго не судить за ляпы и огрехи, которые наверняка всплывут при прочтении.

Информация, приведенная в статье, касается как процессоров K7 с поддержкой технологии PowerNow! (мобильные), так и процессоров K8 (AMD64) с поддержкой технологии Cool'n'Quiet.



Работа программ и драйверов, изменяющих множитель мобильных процессоров, производится через 64-битные Model Specific Registers (MSR). Их два:

Fid_Vid_Ctl MSR (C001 0041h):

SGTC[19:0] FIDCHGRATIO VIDC FIDC VID[4:0] FID[4:0]
63:52 51:32 31:21 20 19:18 17 16 15:13 12:8 7:54:0


FID - Frequency ID code - код, соответствующий определенному множителю (частоте), на который будет совершен переход (см. таблицу в конце статьи);
VID - Voltage ID code - код, соответствующий определенному напряжению, на которое будет совершен переход (см. таблицу в конце статьи);
FIDC - если установлен этот бит (=1), то будет произведена смена множителя;
VIDC - если установлен этот бит (=1), то будет произведена смена напряжения;
FIDCHGRATIO - согласно даташиту, этот бит должен быть установлен (=1);
SGTC - STOP Grant Timeout Count - число периодов/циклов шины, в течение которых будет произведена смена множителя/напряжения; когда в это поле записывается значение, отличное от нуля, начинается специальный цикл шины, попросту говоря, процесс смены множителя/напяжения.

    Примечание: В ходе его процессор отсоединяется от шины (bus disconnect) и переходит в состояние с низкими затратами энергии -- точь в точь, как и при обычном Stop Grant. Даже регулируется это состояние одним и тем же MSR'ом: CLK_Ctl MSR. В этом состоянии процессор пережидает, пока сменится напряжение/частота, и в момент, когда счетчик SGTC уменьшится до 0, начинается процесс подсоединения к шине.


Fid_Vid_Status MSR (C001 0042h):

mVID sVID cVID mFID sFID cFID
63:53 52:48 47:45 44:40 39:37 36:32 31:21 20:16 15:13 12:8 7:5 4:0


Здесь FID и VID (точнее, FID[4:0] и VID[4:0]) означают то же, что и в описании к Fid_Vid_Ctl MSR.

Приставки (c,s,m) уточняют роль этих кодов:

C - current - текущее значение;
S - sturtup - стартовое;
M - max - максимальное;

Для мобильных процессоров семейства K7 часть этих кодов (стартовые (S) и максимальные (M)) задается с помощью групп мостиков на корпусе:

L3 --> sFID
L11 --> sVID
L6 --> mFID
L8 --> mVID

Каждому целому мостику соответствует 0 в коде FID/VID, а каждому пережженому -> 1.



Примечание 1. Для незаблокированных процов значения sFID, установленные по состоянию L3, перекрываются значениями, выставленными из биоса (если соединены все мостики группы L1).
Для заблокированных состояние группы мостиков L3 и установок биоса безразличны -- sFID задается каким-то альтернативным способом.

Примечание 2. Состояние групп мостиков L6 и L8 в свою очередь зависит от состояния некоторых мостиков группы L5:

L5[1] - close (закрыт) -- состояние L6 игнорируется и mFID устанавливается равным 11111b=1Fh что соответствует коэффициенту x24;
L5[1] - open (открыт) -- mFID устанавливается по L6;

L5[0] - close (закрыт) -- mVID устанавливается по L8;
L5[0] - open (открыт) -- состояние L8 игнорируется и mFID устанавливается равным 00000b=00h что соответствует напряжению 2.0V.

На форуме полгода назад проскакивала информация, что открытие L5[0] кроме уже описанного эффекта позволяет якобы обойтись без соединения мостика L5[2] -- сам я не проверял, поэтому делать выводы по результатам одного эксперимента не берусь.



А теперь вкратце о том, как работать с MSR-регистрами.

Главная особенность работы с MSR -- код программы, обращающейся к ним, должен исполняться в реальном режиме или в защищенном на уровне привилегий CPL=0, в то время, как большинство приложений в операционной Windows работают на уровне CPL=3.

Поэтому, чтобы получить доступ к работе с MSR, необходимо:
  • либо писать программу и запускать ее в чистом DOS'е (real mode)
  • либо писать свой собственный драйвер и непосредственно в нем располагать код, работающий с MSR;
  • либо использовать сторонний драйвер, позволяющий исполнять пользовательский код (CPL=3) на уровне CPL=0. Здесь можно упомянуть драйвер TVicHW32 (от Victor Ishikeev). Вроде бы нечто похожее написал Staragazor для использования вместе со своей программой S2Kctrl (ведь этой программе также необходимо активно общаться с одним из MSR процессоров AMD).

    Кстати, вроде бы именно этот драйвер использовал в своей программе и затем публично выложил без разрешения автора на своем сайте один скандально известный товарищ К счастью для него, он вовремя осознал свою ошибку.
Пока дописывал статью: Как получить привелегию Ring 0 (Автор: The GSG®) - говорят, что применительно только для Win9x.

Для работы с MSR используются следующие инструкции:

ИмяРасшифровкаОпкоды
WRMSRWRite MSR0Fh,30h
RDMSRReaD MSR0Fh,32h


Поскольку некоторые старые компиляторы не знакомы с этими инструкциями, то в них приходится прибегать к военной хитрости и менять мнемонику написания:

  • WRMSR заменять на db 0Fh,30h
  • RDMSR заменять на db 0Fh,32h

    Перед вызовом этих инструкций в регистр ECX заносится номер MSR'а. Многие MSR'ы кроме номеров обладают еще и своими собственными звучными названиями, позволяющими программистам не запутаться в последовательностях цифр. Например: MSR под номером C001_001Bh в документации часто фигурирует как CLK_Ctl MSR.

    Обмен данными с MSR'ами осуществляется через регистры EAX (младшая часть MSR'а) и EDX (старшая). В них перед выполнением WRMSR помещаются данные, отправляемые в MSR. И из них же после выполнения RDMSR данные можно прочесть.

    AMD не рекомендует изменять одновременно и напряжение, и множитель. Переход с одного P-states (перфоманс сэйтс, набор "напряжение-частота(множитель)") необходимо разбить на две транзакции. Их порядок зависит от "направления" перехода:
  • Если необходимо перейти на более энергоемкое состояние (большая частота+большее напряжение), то сначала увеличивается напряжение, и только затем -- множитель (частота).
  • Если необходимо перейти в менее энергоемкое состояние (меньшая частота+меньшее напряжение), то сначала уменьшается множитель (частота), и только затем -- напряжение.

    Вроде бы ничего сложного. Но это только для K7
    Для K8 все гораздо грустнее, потому как сложнее. В этом сможет убедиться каждый, кто прочтет документ под названием "BIOS and Kernel Developer's Guide for AMD Athlon 64 and AMD Opteron Processors". Подозреваю, что и в случае с K8 можно по-старинке скакать с одной частоты на другую, но судя по всему умные головы из AMD считают этот метод ненадежным, и потому предлагают свой. Возможно, они предлагали нечто подобное и для K7, но мы об этом не узнаем, пока не будут рассекречены относящиеся к этому вопросу документы

    Листинг элементарнейшей программы, переводящей мобильный дюрон/атлон на коэффициент умножения (КУ) x6:
    .386
    

    code segment 'code' use16
    assumecs:code,ds:code,es:nothing,ss:nothing
    org100h

    SETmsr proc near

    movecx,0C0010041h;выбираем FidVidCtrl MSR
    movedx,0000FFFFh;
    moveax,00110006h;выбираем КУ=x6 (по таблице)
    db0Fh,30h;то же, что и WRMSR

    movAH,4Ch;выход в ДОС
    movAL,0
    int21h

    SETmsr endp

    code ends
    end SETmsr


    Таблица: Взаимосвязь состояния мостиков (для K7) + кодов FID/VID + соответствующих им значений множителей/напряжений.

    K7
    Bridges
    FID/VID
    Codes
    K7
    Multiplier
    Desktop K7
    Voltage
    Mobile K7
    Voltage
    K8
    Voltage
    K8 Mult
    (VID[6]=0)
    K8 Mult
    (VID[6]=1)
    CCCCC 00 11.0x 1.850 2.000 1.550 4x 20x
    CCCC: 01 11.5x 1.825 1.950 1.525 4.5x 20.5x
    CCC:C 02 12.0x 1.800 1.900 1.500 5x 21x
    CCC:: 03 12.5x 1.775 1.850 1.475 5.5x 21.5x
    CC:CC 04 5.0x 1.750 1.800 1.450 6x 22x
    CC:C: 05 5.5x 1.725 1.750 1.425 6.5x 22.5x
    CC::C 06 6.0x 1.700 1.700 1.400 7x 23x
    CC::: 07 6.5x 1.675 1.650 1.375 7.5x 23.5x
    C:CCC 08 7.0x 1.650 1.600 1.350 8x 24x
    C:CC: 09 7.5x 1.625 1.550 1.325 8.5x 24.5x
    C:C:C 0A 8.0x 1.600 1.500 1.300 9x 25x
    C:C:: 0B 8.5x 1.575 1.450 1.275 9.5x 25.5x
    C::CC 0C 9.0x 1.550 1.400 1.250 10x
    C::C: 0D 9.5x 1.525 1.350 1.225 10.5x
    C:::C 0E 10.0x 1.500 1.300 1.200 11x
    C:::: 0F 10.5x 1.475 - 1.175 11.5x
    :CCCC 10 3.0x 1.450 1.275 1.150 12x
    :CCC: 11 19.0x 1.425 1.250 1.125 12.5x
    :CC:C 12 4.0x 1.400 1.225 1.100 13x
    :CC:: 13 20.0x 1.375 1.200 1.075 13.5x
    :C:CC 14 13.0x 1.350 1.175 1.050 14x
    :C:C: 15 13.5x 1.325 1.150 1.025 14.5x
    :C::C 16 14.0x 1.300 1.125 1.000 15x
    :C::: 17 21.0x 1.275 1.100 0.975 15.5x
    ::CCC 18 15.0x 1.250 1.075 0.950 16x
    ::CC: 19 22.0x 1.225 1.050 0.925 16.5x
    ::C:C 1A 16.0x 1.200 1.025 0.900 17x
    ::C:: 1B 16.5x 1.175 1.000 0.875 17.5x
    :::CC 1C 17.0x 1.150 0.975 0.850 18x
    :::C: 1D 18.0x 1.125 0.950 0.825 18.5x
    ::::C 1E 23.0x 1.100 0.925 0.800 19x
    ::::: 1F 24.0x No CPU No CPU No CPU 19.5x

    Принятые обозначения:

    С - мостик закрыт (close);
    : - мостик перерезан (open);

    Примечание: Эта таблица справедлива также и для мостика, соответствующего стартовому напряжению L11. Но то, какое начальное напряжение будет выставлено процессору (по мобильной или по десктопной колонке) -- целиком и полностью зависит от материнской платы, в которую он будет установлен. Даже если истинно мобильный (изначально мобильный, т.е. не переделанный из десктопного) процессор воткнуть в десктопную плату, то она выставит ему напряжение по десктопной колонке таблицы. Сам я этим не занимался, но почему-то есть у меня такая уверенность На платах, официально поддерживающих оба типа процессора (если такие еще существуют), наверняка стоит соответствующий джампер для правильного выбора.

    Полезные ссылки:

    Первоисточники, обязательные к прочтению :

    Mobile AMD Athlon 4 Processor Model 6 CPGA Data Sheet [24319]
    Mobile AMD Athlon 4 Processor Model 6 Revision Guide [24332]
    Mobile AMD Duron Processor Model 7 Data Sheet [24068]

    За последние полгода ссылки изменились, ищите pdf'ы по их номерам (в гугле, например).

    BIOS and Kernel Developer's Guide for AMD Athlon 64 and AMD Opteron Processors rev.3.08 [26094] -- весьма полезный документ, причем не только для K8, многие вещи справедливы для K7 (еще раз спасибо serj_'у за наводку).

    Альтернативные источники :

    Desktop Athlon XP Multiplier Adjustments on the fly from Windows! -- с этой статьи началась эпопея с замобиливанием десктопных атлонов

    The Bridge configuration of the Athlon XP

    Прочие источники: Некоторые полезные линки по процессорам AMD.


    Вадим Карпов


    Дополнение от [26-10-2004]:

    Как получить привелегию Ring 0 (win9x) ( пример )
    http://forum.sources.ru/index.php?showtopic=69305 (с примером драйвера)
    http://forum.sources.ru/index.php?showtopic=69990

    RM Clock (formerly known as AMD64CLK) utility: v.1.2, v.1.1, v.1.0 (описание1, 2)

    CrystalCPUid + Source Code

    SpeedswitchXP - CPU frequency control for notebooks:
    SpeedswitchXP V1.4 (661 KB) + Source Code


    AMD Utilities, Drivers, & Updates

    До кучи

    Функции управления производительностью и энергопотреблением процессоров Intel Pentium 4 и Intel Xeon — разные названия, единая основа (iXBT)

    ---
    Обсудить эту и другие статьи/записи с моей персональной страницы можно в соответствующей ветке конференции.
  • Telegram-канал @overclockers_news - это удобный способ следить за новыми материалами на сайте. С картинками, расширенными описаниями и без рекламы.

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

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

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