2011年6月8日水曜日

Geode LX の周波数変更

今さらだが、fit-pc slim は Geode LX 800 (500MHz) を搭載したミニサーバである。欠点も多いが、小さい、省電力、ファンレスといったメリットもあり、愛好者も多い (かもしれない)。

この手のサーバに入れる OS となれば、やはり pc-unix だろうが、残念ながら linux kernel の geode lx 対応は半端で、周波数変更も出来ないようだ。折角の省電力が泣くよな。
もっとも、まったく不可能というわけでもなく、OLPC では上手くやっているらしい。

Windows 系では、Geode LXの倍率変更 にあるように有志の手でフリーソフトに統合されているぐらいである。また、同掲示板にはどこをいぢればいいかまで書いてあることだし、Linux でもいけるんじゃないの?と考えた。

CPU の周波数をいぢるには、MSR (Model Specific Register) をいぢる必要がある。Linux の場合だと、 msr-tools/ を使う。また、カーネルモジュールの msr、cpuid あたりをロードしておく必要がある。

速度設定が入っているアドレスは 0x4c000014 だ。msr-tools のうち rdmsr を使って
rdmsr 0x4c000014
とやると 0x49c07de0000 みたいな出力が戻ってくる。最初の3桁が FSB と CPU の周波数依存の部分で、残りは固定だ。

FSB/CPU 速度と MSR との関係は以下の通り。縦が FSB、横が CPU だ。
mem\cpu200 233 266 300 333 366 400 433 466 500 533
200 28a 28c 28e 290 292 294 296 298 29a 29c 29e
233 30a 30c 30e 310 312 314 316 318 31a 31c 31e
266 38a 38c 38e 390 392 394 396 398 39a 39c 39e
300 40a 40c 40e 410 412 414 416 418 41a 41c 41e
333 48a 48c 48e 490 492 494 496 498 49a 49c 49e
366 50a 50c 50e 510 512 514 516 518 51a 51c 51e
400 58a 58c 58e 590 592 594 596 598 59a 59c 59e
0x49c ならば CPU 500MHz、FSB 333MHz である。デフォルトはこの数値のはずだ。

Geode LX の CPU 周波数を変更したいのであれば、任意の数字を同じアドレスに書き込めばいい。例えば、CPU を 333 Mhz に変更したければ
wrmsr 0x4c000014 0x$49207de0000
とする。

但し、いくつが注意点がある。
  • FSB を変更すると、高確率でリセットする。自由度を持たせたいのであれば、予め低い FSB を選んでおくのが良い。ベンチマーク結果によれば、その場合でもFSBの低下による速度の低下は僅少。
  • CPU の速度を変えても、カーネルは認識しない。そのためシステムクロックに tsc を使っていると、時間がおかしくなる。クロックソースは acpi_pm 等に変更すること。
    (echo acpi_pm > /sys/devices/system/clocksource/clocksource0/current_clocksource)
  • 周波数変更用のスクリプト : cpufreq_glx
  • 参考 : 33234d_lx_ds.pdf : Geode LX Databook