カスタム検索

Linux-phc

提供: HelloKitty68

ksysguardで見た感じ

 CPUの電圧設定をできるカーネルモジュール。

目次

概要

 acpi-cpufreq.ko/powernow-k8.ko(のソース)にパッチを当てて電圧を変更できるようにする物。

acpi-cpufreq.ko/powernow-k8.k

 これらはkernel/arch/x86/kernel/cpu/cpufreq下にある。どちらかというと,CPUの情報取得とその類の設定を行うモジュールであって,負荷に応じてCPUの状態を変更するはkernel/drivers/cpufreq下にある。それぞれの関係はシステム<>cpufreq<>CPUドライバ(powernow-k8.koとか)<>CPUという事になる。

手元で動作する事が確認できた物

Athlon64 X2 4800+ K8系
Pentium M 740 DothanThinkPad T43
Dual-Core Celron E1200 CoreMA

インストール

intel系(openSUSE11.1の場合)

 上記のリポジトリを追加しacpi-cpufreq-kmp(-*:環境に合う物)をインストールし再起動する。

AMD K8系

 上記のサイトからphc-k8_v0.4.0.tar.gz(とかk8っぽいもの)をダウンロードしコンパイルする。大概の場合make/make install。インストールが成功してる場合modprobe -lは次のようになる。

例:
# modprobe -l | grep phc
/lib/modules/2.6.27.21-0.1-default/updates/kernel/arch/x86/kernel/cpu/cpufreq/phc-k8.ko

 また/etc/modprobe.d/にpowernow_k8を置き換える?phc-k8ファイルができる。

 rebootしdmesgを見るとpowernow_k8を置き換える形でphc-k8のログが出る。

# dmesg | grep phc
phc-k8: Found 1 AMD Athlon(tm) 64 X2 Dual Core Processor 4800+ processors (2 cpu cores) (version 2.20.00)
phc-k8:    0 : fid 0x11 (2500 MHz), vid 0xa
phc-k8:    1 : fid 0x10 (2400 MHz), vid 0xb
phc-k8:    2 : fid 0xe (2200 MHz), vid 0xd
phc-k8:    3 : fid 0xc (2000 MHz), vid 0xf
phc-k8:    4 : fid 0xa (1800 MHz), vid 0x11
phc-k8:    5 : fid 0x2 (1000 MHz), vid 0x12

# lsmod | grep phc
phc_k8                 19824  1
processor              49104  2 phc_k8,thermal

AMD K10系

 現状ではK10系では使えない。これは,powernow-K8のK10対応への実装方法が,P-State値をCPUに与えK10上のハードウェアを利用してFID/VIDを書き換える方式(HW-Pstate)の機能を利用して為。CPUのMSRのPstateテーブルを書き換える(ツール)などを使えば変更はできる。

vid値の注意

 参照・設定する上で注意すべき事はIntelとAMDとでは値の大小の意味が異なる。具体的には

という具合に値と電圧増減の方向は全く逆になっている。

 また同じメーカーでもアーキテクチャ毎にvid0(zero)の絶対電圧値や1step毎の増減が異なる。

パラメータの参照

 /sys/devices/system/cpu/cpu0/cpufreq/(1CPUの場合)下からphc_*で参照できる。例はAthlonX2 4800+。値は10進数で左からPステート0〜の順に列挙される。

パラメータ名内容
phc_available_fids 17 16 14 12 10 2fid群
phc_controls 17:13 16:13 14:15 12:17 10:19 2:21fid:vidというフォーマットで全てのPステートを列挙する。
phc_default_controls 17:10 16:11 14:13 12:15 10:17 2:18phc_controlsのデフォルト値
phc_default_fids 17 16 14 12 10 2phc_fidsのデフォルト値
phc_default_vids 10 11 13 15 17 18phc_vidsのデフォルト値
phc_fids 17 16 14 12 10 2設定されている?fids
phc_version 0.4.0phcモジュールのバージョン
phc_vids 13 13 15 17 19 21vid群。電圧はここで設定できる。
 

vidの設定

 前述のphc_vidsにechoなりで投機すると変わる。

投機例:
# echo '13 13 15 17 19 21' > /sys/devices/system/cpu/cpu0/cpufreq/phc_vids

 与える値群は必ずシングルクオーテーション(')なりダブルクォーテーション(")で囲む事。

1 ソケット - 1 ダイ - 2 CPUでの設定

AMD K8系

 K8系,つまり一般的にAthlonX2の場合,1ソケット=1ダイ=2CPU(コア)という事になっている。電圧・周波数の設定・変動はダイ単位でありコア毎に設定はできない。CPU1から設定した場合はそもそもcpufreqのディレクトリがCPU0のcpufreqにリンクが貼られている状態になっている。

/sys/devices/system/cpu/cpu1
lrwxrwxrwx 1 root root    0 2009-06-04 13:52 cpufreq -> ../cpu0/cpufreq/

Intel系(CoreMA)

 基本的にCoreMA系での説明。

 CoreMAで1ソケット=1ダイ=2CPU(コア)の場合,電圧・周波数はコア毎に設定はできるが,実際は

という仕組みになっているっぽいのでcpu0/cpufreq上だけを低電圧設定しcpu1がデフォルトのままの場合,cpu1に高負荷のプロセスが割当たった時にcpu0よりも高い電圧を要求してくる事になるので,cpu1もcpu0と同等の適切な設定をしなければならない。

vidの値と電圧範囲例

min Vmax Vstep Vvid→mVmV→vid

Celeron M

Pentium M 700(Dothan)

0.700(vid=0)1.708(vid=63)0.016mV=vid*16+700vid=(mV-700)/16
Intel Atom N270 / Z500 0.30001.20000.0125
Intel Atom 200/300 0.70001.20000.0125

Celron M 400/500

Celeron Dual Core T1x-00

Core Solo / Duo

Core 2 Solo / Mobile

0.00001.50000.0125

CoreMA 65nm

Celeron 400 / Dual Core E1000

Pentium Dual Core E2000

Core 2 Duo/Quad

0.8500(vid=2)1.6000(vid=62)*10.0125mV=vid*12.5+850vid=(mV-850)/12.5

CoreMA 45nm

Pentium Dual Core E5000/6000

Core 2 Duo/Quad

0.50001.60000.0125
AMD Desktop K8 0.800(vid=30)*21.550(vid=0)0.025mV=1550-vid*25vid=(1550-mV)/25
AMD Desktop K10 0.0000 1.55000.0125

 仕様上割り当てられているからといってそのまま設定できるとは限らない。

リンク

vidの参考資料

案内
ツールボックス