Изменение 'мобильных' множителей процессоров AMD (немного справочной информации)
реклама
Наверное многие, кто слышал о мобильных процессорах от 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:5 | 4: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).
Кстати, вроде бы именно этот драйвер использовал в своей программе и затем публично выложил без разрешения автора на своем сайте один скандально известный товарищ К счастью для него, он вовремя осознал свою ошибку.
Для работы с MSR используются следующие инструкции:
Имя | Расшифровка | Опкоды |
---|---|---|
WRMSR | WRite MSR | 0Fh,30h |
RDMSR | ReaD MSR | 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, но мы об этом не узнаем, пока не будут рассекречены относящиеся к этому вопросу документы
.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)
---
Обсудить эту и другие статьи/записи с моей персональной страницы можно в соответствующей ветке конференции.
реклама
Лента материалов
Соблюдение Правил конференции строго обязательно!
Флуд, флейм и оффтоп преследуются по всей строгости закона!
Комментарии, содержащие оскорбления, нецензурные выражения (в т.ч. замаскированный мат), экстремистские высказывания, рекламу и спам, удаляются независимо от содержимого, а к их авторам могут применяться меры вплоть до запрета написания комментариев и, в случае написания комментария через социальные сети, жалобы в администрацию данной сети.
Сейчас обсуждают