トップ «前の日記(2011年09月19日) 最新 次の日記(2011年09月26日)» 編集

Masa's blog

検索キーワード:

2011年09月22日 ARMedslack(linux-2.6.36.4) for zaurus SL-C860 でオーバークロック [長年日記]

_ ARMedslack(linux-2.6.36.4) for zaurus SL-C860 でオーバークロック

してみた。

方針

/usr/src/linux/arch/arm/mach-pxa/cpufreq-pxa2xx.cの、以下のあたりにそれらしいパラメータをつっこんでみる。

 83 /*
 84  * PXA255 definitions
 85  */
 86 /* Use the run mode frequencies for the CPUFREQ_POLICY_PERFORMANCE policy */
 87 #define CCLKCFG                 CCLKCFG_TURBO | CCLKCFG_FCS
 88
 89 static pxa_freqs_t pxa255_run_freqs[] =
 90 {
 91         /* CPU   MEMBUS  CCCR  DIV2 CCLKCFG                run  turbo PXbus SDRAM */
 92         { 99500,  99500, 0x121, 1,  CCLKCFG, -1, -1},   /*  99,   99,   50,   50  */
 93         {132700, 132700, 0x123, 1,  CCLKCFG, -1, -1},   /* 133,  133,   66,   66  */
 94         {199100,  99500, 0x141, 0,  CCLKCFG, -1, -1},   /* 199,  199,   99,   99  */
 95         {265400, 132700, 0x143, 1,  CCLKCFG, -1, -1},   /* 265,  265,  133,   66  */
 96         {331800, 165900, 0x145, 1,  CCLKCFG, -1, -1},   /* 331,  331,  166,   83  */
 97         {398100,  99500, 0x161, 0,  CCLKCFG, -1, -1},   /* 398,  398,  196,   99  */
 98 };

パラメータの意味

  • CPU : クロック周波数(KHz)
  • MEMBUS : メモリーバスクロック周波数(KHz)
  • CCCR : Core Clock Configuration Register
  • DIV2 : 実際のMEMBUSを2分の1にするかどうかのフラグ(`1' : 2分の1にする)
  • run(コメント) : run モード時のクロック周波数(MHz)
  • turbo(コメント) : turbo モード時のクロック周波数(MHz)
  • PXbus(コメント) : PXbusクロック周波数(MHZ)
  • SDRAM(コメント) : メモリーバスクロック周波数(MHz)

CCCR

9,8,7 bit [パラメータ N]
  • [0,1,0] = 1倍
  • [0,1,1] = 1.5倍
  • [1,0,0] = 2倍
  • [1,1,0] = 3倍
6,5 bit [パラメータ M]
  • [0,1] = 1倍
  • [1,0] = 2倍
  • [1,1] = 4倍
4,3,2,1,0 bit [パラメータ L]
  • [0,0,0,0,1] = 27倍
  • [0,0,0,1,0] = 32倍(PXA255のドキュメントでは「予約」とされているが実際には設定可能であるらしい)
  • [0,0,0,1,1] = 36倍
  • [0,0,1,0,1] = 45倍

で、ようはこのCCCRに適切な値を放りこめば良いようだ...。

基本クロック(Crystal Frequency)

基本クロック(Crystal Frequency)は、3.6864MHz

MEMBUS

MEMBUS = 基本クロック x [パラメータ L]で定めた倍数(MHz)

DIV2

MEMBUSが99.5MHzを越えた場合、1とする。その場合MEMBUSの値は2分の1となる。ただし、実際にはMEMBUSの値は118MHzを越えるまでは2分の1にする必要はなさそう。

run

run = MEMBUS x [パラメータ M]で定めた倍数(MHz)

turbo(=CPU)

turbo = run x [パラメータ N]で定めた倍数(MHz)

CCCR = 0x161 (sharp romのデフォルト設定値)

CCCR = 0x161 = 0,1,0|1,1|0,0,0,0,1

  • パラメータ N = 1倍
  • パラメータ M = 4倍
  • パラメータ L = 27倍

上記のパラメータより

  • MEMBUS = 3.6864MHz * 27 = 99.5MHz
  • run = 99.5MHz * 4 = 398MHz
  • turbo = 398MHz * 1 = 398MHz
  • PXbus = 398MHz / 2 = 199MHz

pxa255_run_freqs上での定義は

/* CPU   MEMBUS  CCCR  DIV2 CCLKCFG                run  turbo PXbus SDRAM */
{398100,  99500, 0x161, 0,  CCLKCFG, -1, -1},   /* 398,  398,  196,   99  */

xengineの値は 1290〜1300rpm程度。

オーバークロック時にこの値をどれぐらい上回ることができるのかが勝負どころとなる。

CPU(turbo)が高くても、MEMBUSやPXbusが低いとトータルとしての性能は低くなることが有るので、そのあたりはcut&tryで探る。

CCCR = 0x162

スペシャルカーネル(linux-2.4.x)で、SL-C760やSL-C860のオーバークロック時に採用されている設定。十分に先人達が吟味した値なので、やはりパフォーマンス的には最も高いようだ。

CCCR = 0x162 = 0,1,0|1,1|0,0,0,1,0

  • パラメータ N = 1倍
  • パラメータ M = 4倍
  • パラメータ L = 32倍

上記のパラメータより

  • MEMBUS = 3.6864MHz * 32 = 118MHz
  • run = 99.5MHz * 4 = 472MHz
  • turbo = 472MHz * 1 = 472MHz
  • PXbus = 472MHz / 2 = 236MHz

pxa255_run_freqs上での定義は

/* CPU   MEMBUS  CCCR  DIV2 CCLKCFG                run  turbo PXbus SDRAM */
{471900, 118000, 0x162, 0,  CCLKCFG, -1, -1},   /* 472,  472,  236,  118  */

さすがにCPU(turbo)、MEMBUS、PXbusともにバランス良く高い値となっている。

MEMBUS=118MHzは、マニュアル的にいえばDIV2=1として2分の1にするべきなのだが、実際やってみるとDIV2=0で、MEMBUS=118MHzで動くようだ。ただし、マウスポインターがかなり派手にブレまくってかなり使いずらい。

xengineの値は 1380-1390rpm程度。

CCCR = 0x1C5

今回、私が採用した値。マウスポインターのブルブルも許容出来る範囲で、パフォーマンスもそこそこ高いと思う。

CCCR = 0x1C5 = 0,1,1|1,0|0,0,1,0,1

  • パラメータ N = 1.5倍
  • パラメータ M = 2倍
  • パラメータ L = 45倍

上記のパラメータより

  • MEMBUS = 3.6864MHz * 45 / 2 = 83MHz
  • run = (83MHz * 2) * 2 = 332MHz
  • turbo = 332MHz * 1.5 = 498MHz
  • PXbus = 332MHz / 2 = 166MHz

pxa255_run_freqs上での定義は

/* CPU   MEMBUS  CCCR  DIV2 CCLKCFG                run  turbo PXbus SDRAM */
{497700, 165900, 0x1c5, 1,  CCLKCFG, -1, -1},   /* 332,  498,  166,   83  */

xengineの値は 1370-1380rpm程度。

2011/09/29 追記:よくよく使ってみると、やはりマウスポインターのブルブルがかなりのもので、許容できる範囲ではなかった...。

一応

/* CPU   MEMBUS  CCCR  DIV2 CCLKCFG                run  turbo PXbus SDRAM */
{597200,  99500, 0x1e1, 0,  CCLKCFG, -1, -1},   /* 398,  597,  199,   99  */
{707800, 118000, 0x1e2, 0,  CCLKCFG, -1, -1},   /* 472,  708,  236,  118  */

でも起動できた。ただしxengineの値は CCCR=0x162 がピークで、それを越えることは無かった。

build kernel

  • make menuconf
  • make; make modules_install
  • cp /boot/zImage-2.6.36.4 /boot/zImage-2.6.36.4.old
  • cp arch/arm/boot/zImage /boot/zImage-2.6.36.4
  • cd /boot
  • ln -s zImage-2.6.36.4 zImage

/etc/apmd_proxy

オーバークロックしている状態だと、ほぼ確実にレジュームに失敗するので、サスペンド前にpowersaveモードに遷移させ、レジューム時に元に戻すように設定した。

#! /bin/sh
case $1 in
suspend )
        /usr/bin/cp /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor /tmp/scaling_governor.state
        /usr/bin/cp /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed /tmp/scaling_setspeed.state
        /bin/echo powersave >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
        ;;
resume )
        /usr/bin/cp /tmp/scaling_governor.state /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
        /usr/bin/cp /tmp/scaling_setspeed.state /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
        /usr/bin/rm /tmp/scaling_governor.state
        /usr/bin/rm /tmp/scaling_setspeed.state
        ;;
* )
        ;;
esac

今後の目標

  • w100関係のシステムクロックを上げて、描画のパフォーマンスを上げる。
  • ads7846関係の同期タイミングを調整してマウスカーソルのブルブルを軽減する。
  • runモード、turboモードをいまいち理解していない。zaurusでは常にturboモードなのか?。ちゃんと理解したい。

おまけ

$ cat showclock.rb
#! /usr/bin/ruby
crystal = 3.6864
#
np = ["1", "1 8 +", "2", "3"];
nv = [1, 1.5, 2, 3];
#
mp = ["2", "4", "6"];
mv = [1, 2, 4];
#
lp = ["1", "2", "3", "5"];
lv = [27, 32, 36, 45];
#
li = 0;
while (li < 4)
        mi = 0;
        while (mi < 3)
                ni = 0;
                while (ni < 4)
                        printf("turbo %d run %d membus %d (DIV2=0) %d (DIV2=1) pxbus %d cccr %s %s %s\n",
                              crystal * lv[li] * mv[mi] * nv[ni],
                              crystal * lv[li] * mv[mi],
                              crystal * lv[li], crystal * lv[li] / 2,
                              crystal * lv[li] * mv[mi] / 2,
                              np[ni], mp[mi], lp[li]);
                        ni += 1;
                end
                mi += 1;
        end
        li += 1;
end
$ ./showclock.rb |sort -t ' ' -n +1 -2
turbo 99 run 99 membus 99 (DIV2=0) 49 (DIV2=1) pxbus 49 cccr 1 2 1
turbo 117 run 117 membus 117 (DIV2=0) 58 (DIV2=1) pxbus 58 cccr 1 2 2
turbo 132 run 132 membus 132 (DIV2=0) 66 (DIV2=1) pxbus 66 cccr 1 2 3
turbo 149 run 99 membus 99 (DIV2=0) 49 (DIV2=1) pxbus 49 cccr 1 8 + 2 1
turbo 165 run 165 membus 165 (DIV2=0) 82 (DIV2=1) pxbus 82 cccr 1 2 5
turbo 176 run 117 membus 117 (DIV2=0) 58 (DIV2=1) pxbus 58 cccr 1 8 + 2 2
turbo 199 run 132 membus 132 (DIV2=0) 66 (DIV2=1) pxbus 66 cccr 1 8 + 2 3
turbo 199 run 199 membus 99 (DIV2=0) 49 (DIV2=1) pxbus 99 cccr 1 4 1
turbo 199 run 99 membus 99 (DIV2=0) 49 (DIV2=1) pxbus 49 cccr 2 2 1
turbo 235 run 117 membus 117 (DIV2=0) 58 (DIV2=1) pxbus 58 cccr 2 2 2
turbo 235 run 235 membus 117 (DIV2=0) 58 (DIV2=1) pxbus 117 cccr 1 4 2
turbo 248 run 165 membus 165 (DIV2=0) 82 (DIV2=1) pxbus 82 cccr 1 8 + 2 5
turbo 265 run 132 membus 132 (DIV2=0) 66 (DIV2=1) pxbus 66 cccr 2 2 3
turbo 265 run 265 membus 132 (DIV2=0) 66 (DIV2=1) pxbus 132 cccr 1 4 3
turbo 298 run 199 membus 99 (DIV2=0) 49 (DIV2=1) pxbus 99 cccr 1 8 + 4 1
turbo 298 run 99 membus 99 (DIV2=0) 49 (DIV2=1) pxbus 49 cccr 3 2 1
turbo 331 run 165 membus 165 (DIV2=0) 82 (DIV2=1) pxbus 82 cccr 2 2 5
turbo 331 run 331 membus 165 (DIV2=0) 82 (DIV2=1) pxbus 165 cccr 1 4 5
turbo 353 run 117 membus 117 (DIV2=0) 58 (DIV2=1) pxbus 58 cccr 3 2 2
turbo 353 run 235 membus 117 (DIV2=0) 58 (DIV2=1) pxbus 117 cccr 1 8 + 4 2
turbo 398 run 132 membus 132 (DIV2=0) 66 (DIV2=1) pxbus 66 cccr 3 2 3
turbo 398 run 199 membus 99 (DIV2=0) 49 (DIV2=1) pxbus 99 cccr 2 4 1
turbo 398 run 265 membus 132 (DIV2=0) 66 (DIV2=1) pxbus 132 cccr 1 8 + 4 3
turbo 398 run 398 membus 99 (DIV2=0) 49 (DIV2=1) pxbus 199 cccr 1 6 1
turbo 471 run 235 membus 117 (DIV2=0) 58 (DIV2=1) pxbus 117 cccr 2 4 2
turbo 471 run 471 membus 117 (DIV2=0) 58 (DIV2=1) pxbus 235 cccr 1 6 2
turbo 497 run 165 membus 165 (DIV2=0) 82 (DIV2=1) pxbus 82 cccr 3 2 5
turbo 497 run 331 membus 165 (DIV2=0) 82 (DIV2=1) pxbus 165 cccr 1 8 + 4 5
turbo 530 run 265 membus 132 (DIV2=0) 66 (DIV2=1) pxbus 132 cccr 2 4 3
turbo 530 run 530 membus 132 (DIV2=0) 66 (DIV2=1) pxbus 265 cccr 1 6 3
turbo 597 run 199 membus 99 (DIV2=0) 49 (DIV2=1) pxbus 99 cccr 3 4 1
turbo 597 run 398 membus 99 (DIV2=0) 49 (DIV2=1) pxbus 199 cccr 1 8 + 6 1
turbo 663 run 331 membus 165 (DIV2=0) 82 (DIV2=1) pxbus 165 cccr 2 4 5
turbo 663 run 663 membus 165 (DIV2=0) 82 (DIV2=1) pxbus 331 cccr 1 6 5
turbo 707 run 235 membus 117 (DIV2=0) 58 (DIV2=1) pxbus 117 cccr 3 4 2
turbo 707 run 471 membus 117 (DIV2=0) 58 (DIV2=1) pxbus 235 cccr 1 8 + 6 2
turbo 796 run 265 membus 132 (DIV2=0) 66 (DIV2=1) pxbus 132 cccr 3 4 3
turbo 796 run 398 membus 99 (DIV2=0) 49 (DIV2=1) pxbus 199 cccr 2 6 1
turbo 796 run 530 membus 132 (DIV2=0) 66 (DIV2=1) pxbus 265 cccr 1 8 + 6 3
turbo 943 run 471 membus 117 (DIV2=0) 58 (DIV2=1) pxbus 235 cccr 2 6 2
turbo 995 run 331 membus 165 (DIV2=0) 82 (DIV2=1) pxbus 165 cccr 3 4 5
turbo 995 run 663 membus 165 (DIV2=0) 82 (DIV2=1) pxbus 331 cccr 1 8 + 6 5
turbo 1061 run 530 membus 132 (DIV2=0) 66 (DIV2=1) pxbus 265 cccr 2 6 3
turbo 1194 run 398 membus 99 (DIV2=0) 49 (DIV2=1) pxbus 199 cccr 3 6 1
turbo 1327 run 663 membus 165 (DIV2=0) 82 (DIV2=1) pxbus 331 cccr 2 6 5
turbo 1415 run 471 membus 117 (DIV2=0) 58 (DIV2=1) pxbus 235 cccr 3 6 2
turbo 1592 run 530 membus 132 (DIV2=0) 66 (DIV2=1) pxbus 265 cccr 3 6 3
turbo 1990 run 663 membus 165 (DIV2=0) 82 (DIV2=1) pxbus 331 cccr 3 6 5
$