bc10-router

Suspend/Resume

OMAP3530 は Suspend/Resume に対応しています。
無通信時など動作の必要のないときスリープ状態にはいることで
消費電力の抑制・低減を期待できます。

Suspend に入るには、以下のように操作します。

# echo mem > /sys/power/state

以下のようなメッセージをシリアルコンソールに出力してスリープ状態にはいります。

[  132.186309] PM: Syncing filesystems ... done.
[  132.400665] Freezing user space processes ... (elapsed 0.01 seconds) done.
[  132.424591] Freezing remaining freezable tasks ... (elapsed 0.02 seconds) done.
[  132.455871] Suspending console(s) (use no_console_suspend to debug)

シリアルコンソールからのキー入力、あるいは
その他の設定しておいた wakeup sources (キーパッドやタッチスクリーンなど)
からの入力で Resume します。

[  132.464385] phy0 -> rt2x00lib_suspend: Notice - Going to sleep.
[  132.648376] PM: suspend of devices complete after 185.180 msecs
[  132.649017] PM: late suspend of devices complete after 0.610 msecs
[  132.649902] PM: noirq suspend of devices complete after 0.854 msecs
[  132.650177] Successfully put all powerdomains to target state
[  132.651367] PM: noirq resume of devices complete after 0.915 msecs
[  132.651916] PM: early resume of devices complete after 0.396 msecs
[  133.305328] PM: resume of devices complete after 653.289 msecs
[  133.357299] Restarting tasks ... [  133.361206] usb 1-2: USB disconnect, device number 2
[  133.366424] usb 1-2.2: USB disconnect, device number 3
done.
[  133.386016] usb 1-2.3: USB disconnect, device number 4
[  133.391784] asix 1-2.3:1.0 eth0: unregister 'asix' usb-ehci-omap.0-2.3, ASIX AX88772 USB 2.0 Ethernet

Resume 後に表示されるメッセージですが、"Successfully put.." の5行目までは
Suspend にはいる際の情報で、
"resume" という語の含まれる6行目以降が Resume 時のメッセージです。

USB接続 Wi-Fi モジュールの driver rt2x00 も正常にスリープしているのですが、
bc10 では Resume の再通電時に USB が切断状態になってしまうため、
Resume 後 USB 接続の機器は使用できなくなってしまいます。

no_console_suspend

上記の設定で Suspend にはいる際のメッセージに

Suspending console(s) (use no_console_suspend to debug)

とあるように、Suspend/Resume 自体のデバッグをしたい場合には
kernel の起動オプションとして no_console_suspend を渡すことで
コンソールがスリープ状態に入らないよう設定することができます。

ここでは以下のような uEnv.txt を
起動用SDカードのFATパーティションに置いて起動することで設定しています。

console=ttyO2,115200n8
mpurate=auto
buddy=none
vram=12M
dvimode=640x480MR-16@60
defaultdisplay=dvi
loadaddr=0x80200000
mmcroot=/dev/mmcblk0p2 rw
mmcrootfstype=ext3 rootwait
mmcargs=setenv bootargs console=${console} ${optargs} mpurate=${mpurate} buddy=${buddy} camera=${camera} vram=${vram} omapfb.mode=dvi:${dvimode} omapdss.def_disp=${defaultdisplay} root=${mmcroot} rootfstype=${mmcrootfstype} no_console_suspend
mmcboot=echo Booting from mmc (uEnv.txt configuration) ...; run mmcargs; bootm ${loadaddr}
loaduimagefat=fatload mmc ${mmcdev} ${loadaddr} uImage
uenvcmd=run loaduimagefat; run mmcboot

mmcargs の最後に no_console_suspend を追加しています。
この状態で起動した環境でスリープ状態に入ると、

# echo mem > /sys/power/state
[  119.239715] PM: Syncing filesystems ... done.
[  119.283752] Freezing user space processes ... (elapsed 0.02 seconds) done.
[  119.314239] Freezing remaining freezable tasks ... (elapsed 0.02 seconds) done.
[  119.347229] phy0 -> rt2x00lib_suspend: Notice - Going to sleep.
[  119.537750] PM: suspend of devices complete after 191.711 msecs
[  119.544555] PM: late suspend of devices complete after 0.610 msecs
[  119.552093] PM: noirq suspend of devices complete after 0.854 msecs

コンソールはスリープしないため、no_console_suspend を設定していなかったときは
復帰後に表示されていたスリープ状態への移行時のメッセージが
復帰後でなく状態移行時にリアルタイムに表示されています。
コンソールからのキー入力で Resume させると以下のメッセージを表示します。

[  119.559051] Powerdomain (per_pwrdm) didn't enter target state 1
[  119.559051] Powerdomain (core_pwrdm) didn't enter target state 1
[  119.559051] Could not enter target state in pm_suspend
[  119.560211] PM: noirq resume of devices complete after 0.854 msecs
[  119.567443] PM: early resume of devices complete after 0.427 msecs

[  120.226074] PM: resume of devices complete after 651.977 msecs
[  120.233032] Restarting tasks ... [  120.236968] usb 1-2: USB disconnect, device number 2
[  120.242340] usb 1-2.2: USB disconnect, device number 3
done.
[  120.271697] usb 1-2.3: USB disconnect, device number 4
[  120.277496] asix 1-2.3:1.0 eth0: unregister 'asix' usb-ehci-omap.0-2.3, ASIX AX88772 USB 2.0 Ethernet

no_console_suspend が設定されていると per_pwrdm、core_pwrdm はスリープ状態にははいらず、
kernel からの debug 出力などはシリアルコンソールに出力され続けます。

debugfs

OMAP3530 のパワーマネージメントに関する情報は debugfs から得られます。
まず debugfs を mount します。
以下の例では予め作成しておいた /debug ディレクトリに mount しています。

# mount -t debugfs debugfs /debug

パワーマネージメントに関係する情報は pm_debug/ 以下に表示されます。

# cat /debug/pm_debug/
/debug/pm_debug/cam_pwrdm/       /debug/pm_debug/mpu_pwrdm/
/debug/pm_debug/core_pwrdm/      /debug/pm_debug/neon_pwrdm/
/debug/pm_debug/count            /debug/pm_debug/per_pwrdm/
/debug/pm_debug/dss_pwrdm/       /debug/pm_debug/sgx_pwrdm/
/debug/pm_debug/emu_pwrdm/       /debug/pm_debug/time
/debug/pm_debug/enable_off_mode  /debug/pm_debug/usbhost_pwrdm/
/debug/pm_debug/iva2_pwrdm/      /debug/pm_debug/wkup_pwrdm/

末尾が _pwrdm になっているディレクトリはパワードメインごとの設定・情報です。
OMAP3530 は SoC の機能ごとに電源管理ができるよう複数のパワードメインに分割されており、
必要のない機能の電源だけを OFF にすることができるようになっています。

count はパワードメイン毎のモードの遷移回数を表示します。
()内が現在のモードです。

# cat /debug/pm_debug/count
usbhost_pwrdm (ON),OFF:0,RET:0,INA:0,ON:1,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
sgx_pwrdm (OFF),OFF:1,RET:0,INA:0,ON:1,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
core_pwrdm (ON),OFF:0,RET:0,INA:0,ON:1,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0,RET-MEMBANK2-OFF:0
per_pwrdm (ON),OFF:0,RET:0,INA:0,ON:1,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
dss_pwrdm (ON),OFF:0,RET:130993,INA:0,ON:130994,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
cam_pwrdm (RET),OFF:0,RET:1,INA:0,ON:1,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
neon_pwrdm (ON),OFF:0,RET:149943,INA:3926,ON:153870,RET-LOGIC-OFF:0
mpu_pwrdm (ON),OFF:0,RET:149943,INA:3926,ON:153870,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
iva2_pwrdm (RET),OFF:0,RET:1,INA:0,ON:1,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0,RET-MEMBANK2-OFF:0,RET-MEMBANK3-OFF:0,RET-MEMBANK4-OFF:0
usbhost_clkdm->usbhost_pwrdm (3)
sgx_clkdm->sgx_pwrdm (0)
per_clkdm->per_pwrdm (20)
cam_clkdm->cam_pwrdm (0)
dss_clkdm->dss_pwrdm (1)
core_l4_clkdm->core_pwrdm (25)
core_l3_clkdm->core_pwrdm (5)
d2d_clkdm->core_pwrdm (0)
iva2_clkdm->iva2_pwrdm (0)
neon_clkdm->neon_pwrdm (0)
mpu_clkdm->mpu_pwrdm (0)
prm_clkdm->wkup_pwrdm (0)
cm_clkdm->core_pwrdm (0)

time はパワードメインのモード毎の滞在時間を表示します。

# cat /debug/pm_debug/time
usbhost_pwrdm (ON),OFF:0,RET:0,INA:0,ON:3059305603026
sgx_pwrdm (OFF),OFF:3055783935546,RET:0,INA:0,ON:3521697998
core_pwrdm (ON),OFF:0,RET:0,INA:0,ON:3059305633544
per_pwrdm (ON),OFF:0,RET:0,INA:0,ON:3059305541992
dss_pwrdm (ON),OFF:0,RET:2148355531323,INA:0,ON:910950041186
cam_pwrdm (RET),OFF:0,RET:3055757873534,INA:0,ON:3547698975
neon_pwrdm (ON),OFF:0,RET:3033790375457,INA:481475839,ON:25033721213
mpu_pwrdm (ON),OFF:0,RET:3033876709697,INA:482116696,ON:24946746116
iva2_pwrdm (RET),OFF:0,RET:3055783935546,INA:0,ON:3521606445

enable_off_mode は OFF モードの設定です。
デフォルトでは 0 になっており、Suspend 時スリープ状態を保持しようとします。

# echo 1 > enable_off_mode

で OFF モードを有効にすると Suspend 時にはより深いスリープ状態になり、より電力消費を抑えます。
この違いは Resume 後の /debug/pm_debug/count で確認できます。

  • enable_off_mode 0 の時
    起動時から使用していないビデオ機能のSGXパワードメイン以外は一度も OFF にならず RET に移行しただけです。
    # cat /debug/pm_debug/count
    usbhost_pwrdm (ON),OFF:0,RET:1,INA:0,ON:2,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
    sgx_pwrdm (OFF),OFF:1,RET:0,INA:0,ON:1,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
    core_pwrdm (ON),OFF:0,RET:1,INA:0,ON:2,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0,RET-MEMBANK2-OFF:0
    per_pwrdm (ON),OFF:0,RET:1,INA:0,ON:2,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
    dss_pwrdm (ON),OFF:0,RET:5,INA:0,ON:6,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
    cam_pwrdm (RET),OFF:0,RET:1,INA:0,ON:1,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
    neon_pwrdm (ON),OFF:0,RET:8263,INA:538,ON:8802,RET-LOGIC-OFF:0
    mpu_pwrdm (ON),OFF:0,RET:8263,INA:538,ON:8802,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
    iva2_pwrdm (RET),OFF:0,RET:1,INA:0,ON:1,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0,RET-MEMBANK2-OFF:0,RET-MEMBANK3-OFF:0,RET-MEMBANK4-OFF:0
    usbhost_clkdm->usbhost_pwrdm (3)
    sgx_clkdm->sgx_pwrdm (0)
    per_clkdm->per_pwrdm (17)
    cam_clkdm->cam_pwrdm (0)
    dss_clkdm->dss_pwrdm (2)
    d2d_clkdm->core_pwrdm (0)
    iva2_clkdm->iva2_pwrdm (0)
    mpu_clkdm->mpu_pwrdm (0)
    core_l4_clkdm->core_pwrdm (25)
    core_l3_clkdm->core_pwrdm (4)
    neon_clkdm->neon_pwrdm (0)
  • enable_off_mode 1 の時
    Suspend 時には OFF に移行したことがわかります。
    # cat /debug/pm_debug/count
    usbhost_pwrdm (ON),OFF:1,RET:0,INA:0,ON:2,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
    sgx_pwrdm (OFF),OFF:1,RET:0,INA:0,ON:1,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
    core_pwrdm (ON),OFF:1,RET:0,INA:0,ON:2,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0,RET-MEMBANK2-OFF:0
    per_pwrdm (ON),OFF:1,RET:0,INA:0,ON:2,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
    dss_pwrdm (ON),OFF:497,RET:157983,INA:0,ON:158481,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
    cam_pwrdm (OFF),OFF:1,RET:1,INA:0,ON:2,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
    neon_pwrdm (ON),OFF:527,RET:178339,INA:2174,ON:181041,RET-LOGIC-OFF:0
    mpu_pwrdm (ON),OFF:527,RET:178339,INA:2174,ON:181041,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
    iva2_pwrdm (OFF),OFF:1,RET:1,INA:0,ON:2,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0,RET-MEMBANK2-OFF:0,RET-MEMBANK3-OFF:0,RET-MEMBANK4-OFF:0
    usbhost_clkdm->usbhost_pwrdm (3)
    sgx_clkdm->sgx_pwrdm (0)
    per_clkdm->per_pwrdm (17)
    cam_clkdm->cam_pwrdm (0)
    dss_clkdm->dss_pwrdm (2)
    d2d_clkdm->core_pwrdm (0)
    iva2_clkdm->iva2_pwrdm (0)
    mpu_clkdm->mpu_pwrdm (0)
    core_l4_clkdm->core_pwrdm (25)
    core_l3_clkdm->core_pwrdm (4)
    neon_clkdm->neon_pwrdm (0)

wakeup_timer

linux-omap ブランチ 2.6系のパワーマネージメントには、
スリープ状態に入り設定した時間が経過したら元の状態に復帰する wakeup_timer の機能がありました。

sysfs インタフェース経由で以下のように wakeup time を設定したあと Suspend させると

# echo 5 > /sys/kernel/debug/pm_debug/wakeup_timer_seconds
# echo -n “mem” > /sys/power/state

指定した時間(上記例では 5秒)後に Resume するというものです。

この機能はパワーマネージメントのコードの debug のため一時的に削除され、
timer 関連コードの整理後同様の機能が再度追加される予定でしたが
現在も追加されないままになっています。

omap2+: Remove gptimer_wakeup for now
https://patchwork.kernel.org/patch/896572/

Bringing back gptimer_wakeup
http://www.spinics.net/lists/linux-omap/msg72142.html
からの一連のスレッド


BC::labsへの質問は、bc9-dev @ googlegroups.com までお願い致します。
トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2013-01-31 (木) 19:47:26 (4102d)