Intel Enhanced SpeedStep with EFI
Okujiさんのblogで、Speedstep with EFIに言及されている。
Linuxは、SpeedStepを利用する場合、 IST BIOSがいくらか情報をくれることを前提としています。一応パラメータで陽に指定するという方法もあるんですが、ちっとも優しくない手段なので、デバッグ以外ではあんまり使いたくないですよね。それで、EFIでは一体どうするんだろうか、と。
LinuxのSpeedStep実装は3種類合って、EFIの時代のチップセット・CPUでは、EFIに依存しない制御ができるとおもう。具体的は、3種類の実装というのは以下のようになる。
Centrino以前(IST)のドライバ
- IST BIOS(SMI/SMM BIOS)による制御に依存したドライバ speedstep-smi
- ICH チップセットのGPIOラインにつながっている制御線をたたくリバースエンジニアリングベースのドライバ speedstep-ich
Centrino以降(Enhanced IST)のドライバ
- CPUのMSRによる制御をおこなうドライバ speedstep-centrino
EFI搭載の装置のIntel CPUであれば、3番目のMSRによる制御が可能なCPUとチップセットが搭載されているはずだとおもう。3番目の方法でも、ACPIが情報をくれればaviable frequency tableの取得につかうようになっている。
ドライバが使っているMSRはERF_CTL
,MSR_IA32_PERF_STATUS
,MSR_IA32_MISC_ENABLE
である。これはBIOSに情報をもらえなくても、CPUモデルをチェックしてサポートしているかどうかを見れば、制御できる。MSR_IA32_PERF_CTL
を使えば、利用可能な周波数をretrieveする方法がある。MSR_IA32_MISC_ENABLE
でESTを有効にできる。
ISTの実装であるが、初代と2代目では、電圧とクロック倍率を変更するチップを制御するのに、チップセットのGPIOを使っている。CPUにも専用のポートがなく、SMI/SMMによってIO命令から擬似的にGPIOを制御するというかたちで、SMI BIOSを使って制御している。Enhanced IST, Centrinoでは、MSR書き込みをトリガーにしてCPUからチップセットを制御し、チップセットが電圧と倍率を変える。これで、Deep sleepと同列程度に容易にソフトウエアから制御できるわけである。
ICHドライバでは、このGPIOポートの場所をリバースエンジニアリングする。具体的には、AC power off/on時のそれぞれで起動時にBIOSがセットするチップセットのレジスタ状態を比較して検出するものだ。SMIドライバは、WindowsのIST appletが制御に利用しているIST BIOSのエントリを利用するもの。どちらのドライバも、440MX/BXチップセット以前の古い機種のサポート用であり、845/915のような新しいチップセットと新しいCPUの組み合わせでは、Centrinoドライバが利用できる。
ところで、boot loaderが ISTやEISTを見る必要があるのか?というのは私の疑問。もしやるとしたら、speedstep-centrinoから次のようなコード部分を引っ張ってくればいいとおもう。悪寒どおり、CPUIDみて決めうちコードになりますが。
/* Check to see if Enhanced SpeedStep is enabled, and try to enable it if not. */
rdmsr(MSR_IA32_MISC_ENABLE, l, h);
if (!(l & (1<<16))) {
l |= (1<<16);
dprintk("trying to enable Enhanced SpeedStep (%x)\n", l);
wrmsr(MSR_IA32_MISC_ENABLE, l, h);
/* check to see if it stuck */
rdmsr(MSR_IA32_MISC_ENABLE, l, h);
if (!(l & (1<<16))) {
printk(KERN_INFO PFX "couldn't enable Enhanced SpeedStep\n");
return -ENODEV;
}
}
これでEISTを有効にできる。
これに加え、必ず最高速で起動したい!というような制御となると、Linuxのドライバを埋め込むのとほぼ一緒になる。
一番省電力で走らせるならば、現状では、その値は必ず0になるので簡単だが、速いほうはCPUIDによって変わってくるので、speedstep-centrinoドライバのようにtableを持たないと決定できないとおもう。
この記事へのトラックバック アドレス
トラックバック URL (右をクリックし、ショートカット/リンクをコピーして下さい)
モデレーション待ちのフィードバック
この投稿にはモデレーション待ちのフィードバックが 19 件あります....