重村法克です。

On Sat, 07 Mar 2009 15:36:51 +0900
"G .Otsuji" <anno...@gmail.com> wrote:
> そしてだめもとでリブートしました。
> そうするとacpi_throttle0が認識されるではないですか!

        一応, 公式には cpufreq(4) は起動時しか認識し/組み込めません:-)。

> ふたつのcpufreqが認識されてます。
> これらが混ざった結果、
>  % sysctl dev.cpu.0.freq_levels       
>  dev.cpu.0.freq_levels: 2500/96000 1875/72000 1250/29000 937/21750 625/14500 
> 312/7250
> こうなりました。

        基本的にそういう動きで問題ありません。複数のメカニズムがある時は, 複数
        のメカニズムで連動して動きます。

> (2)フリーズするかどうか。
> そこで、だめもとで,freq=312としてみます。
>  # sysctl dev.cpu.0.freq=312
>  dev.cpu.0.freq: 2500
>  sysctl: dev.cpu.0.freq: Invalid argument
>  # sysctl dev.cpu.0.freq
>  dev.cpu.0.freq: 312
> Invalid argumentがなぜ返るのかわかりませんが、
> 本来なら矢印がついて
> dev.cpu.0.freq: 2500 -> 312
> となるはずです。しかしその後dev.cpu.freq: 312となってるので
> 実際に変わってはいるようです。

        powerd だと一挙にフリーズしてしまうので, 1 個 1 個パラメータチェック
        してみると 900MHz と 500MHz, 400MHz, 300MHz, 200MHz, 100MHz
        でフリーズすることがわかりました。debug.cpufreq.lowest=800 だと
        900MHz 設定を救えない。。

        みてると Invalid argument が出て cpu 1 個分しか P-state が変わ
        らない時だけ(残りはより上位の state), フリーズするようです。

        cpufreq(4)的には全体としてでしか(1 パラメータしかない)周波数を変更
        できないため, 個々のサブシステムで CPU 周波数が変わった場合の取り扱い
        がどうなるかはわかりませんが, このあたりに原因がありそうな気がします。

        組み合わせ確認で頭が痛くなったので, Invalid argument の正体まで調
        べてません。orz

> (3)acpi_throttle
> acpi_throttleはSTPCLK#信号でクロックを下げるようです。
> acpi_throttleは、AMDのBKDGではどうなってるのだろうと思ったら
> AMD BKDG(bios kernel developer guide)の
> Table 57: ACPI Power State Control Register SMAF Settingsの所に
> >  Occurs based upon SMC hardware-initiated throttling. AMD recommends
> > using PROCHOT_L for thermal throttling and not implementing
> > stop clock based throttling.
> ということでstop clockを使ったスロットリングはあまりおすすめではないようです。
> [結論など]
> 1) acpi_throttleを無理やり認識させても動く場合があるけど多分例外です。
> 2) acpi_throttleの高周波音が結構気になりました。
> 3) acpi_throttleはあまりおすすめではないようです。
> 4) フリーズが再現できず困りました。
> 5) acpi_throttleと組み合わせてうまくいくマザボもあるのかもと思われます。

        acpi_throttleのコード(/usr/src/sys/dev/acpica/acpi_throttle.c)
        を見てみましたが, p4tcc(4) でも同じみたいですね。これに追加してしま
        うのが正解と思われます。

        /*
         * On i386 platforms at least, ACPI throttling is accomplished by
         * the chipset modulating the STPCLK# pin based on the duty cycle.
         * Since p4tcc uses the same mechanism (but internal to the CPU),
         * we disable acpi_throttle when p4tcc is also present.
         */
        if (device_find_child(device_get_parent(dev), "p4tcc", -1) &&
            !resource_disabled("p4tcc", 0))
                return (ENXIO);

        以上よろしくお願いいたします。

メールによる返信