SlideShare a Scribd company logo
1 of 20
20分でわかった事にする
  Power Management
      cpuidle編
@magoroku15 最底辺活動家
Androidzaurusのつぶやき


                     使用未許諾
• われらの恐竜先生、販売日にTegra 3のタブ
  レットをご購入
• 買った、直後の勉強会にてustream送出マ
  シンとして華麗にデビュー
• 独自の視点での解析 -お約束ですね-
Android Zairusの日記




                    使用未許諾
GovernorはInteractive

What dose this mean?

     Governor?
Power management ちょー入門
• 家庭のパワーマネジメント
 – 照明はコマメに消す
 – 冷房は設定温度を高めに
 →住人が決める・操作する
• CPUのパワーマネジメント
 – 不要なものは止める
 – 処理速度と落とす
 →どうやって決めるのか?操作するの
  か?
UNIX/BSD/Mac/Linux


   App

System call



                     動かすプロセスが無いとidleを呼ぶ

                    KERNEL
                               idle

              HDD
BSD 4.3
GENERIC/locore.c
1498      .globl Idle
1499 Idle: idle:
1500      mtpr $0,$IPL     # must allow interrupts here
1501      tstl _whichqs    # look for non-empty queue
1502      bneq sw1
1503      brb idle
Tegraのidle
Kernel_V9_4_2_7/arch/arm/mach-tegra
static int tegra_cpuidle_register_device(unsigned int cpu)     // cpuidleへの登録
{
   :
   state->enter = tegra_idle_enter_lp2;
   :
}
static inline void tegra_idle_lp2(struct cpuidle_device *dev,
                        struct cpuidle_state *state)
{
#ifdef CONFIG_ARCH_TEGRA_2x_SOC                       // tegra2の場合
        tegra2_idle_lp2(dev, state);
#endif
#ifdef CONFIG_ARCH_TEGRA_3x_SOC                       // tegra3の場合
        tegra3_idle_lp2(dev, state);
#endif
}
Tegra3のidle
Kernel_V9_4_2_7/arch/arm/mach-tegra/sleep.S
void tegra3_idle_lp2(struct cpuidle_device *dev,
                           struct cpuidle_state *state)
{
        s64 request = ktime_to_us(tick_nohz_get_sleep_length());
        bool last_cpu = tegra_set_cpu_in_lp2(dev->cpu);

       cpu_pm_enter();

       if (last_cpu && (dev->cpu == 0))              // CPU0だけ別扱い
               tegra3_idle_enter_lp2_cpu_0(dev, state, request);
       else
               tegra3_idle_enter_lp2_cpu_n(dev, state, request);

       cpu_pm_exit();
       tegra_clear_cpu_in_lp2(dev->cpu);
}
Tegra3のidle
Kernel_V9_4_2_7/arch/arm/mach-tegra/sleep.S
ENTRY(tegra_cpu_wfi)
        cpu_id r0
        cpu_to_halt_reg r1, r0
        cpu_to_csr_reg r2, r0
        mov32 r0, TEGRA_FLOW_CTRL_VIRT
        mov     r3, #FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG
        str     r3, [r0, r2]            @ clear event & interrupt status
        mov     r3, #FLOW_CTRL_WAIT_FOR_INTERRUPT | FLOW_CTRL_JTAG_RESUME
        str     r3, [r0, r1]            @ put flow controller in wait irq mode
        dsb
        wfi
        mov     r3, #0
        str     r3, [r0, r1]            @ clear flow controller halt status
        mov     r3, #FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG
        str     r3, [r0, r2]            @ clear event & interrupt status
        dsb
        mov     pc, lr
ENDPROC(tegra_cpu_wfi)
WFI Wait For Interrupt
• ARMの命令
• 割り込が発生するまで、CPUを低電力モード
  で命令の実行を止める
• 眠りの深さ/寝起きの良さ
 – 深く眠ると
  • 電力低減効果大/寝起きは悪い
  • もっさり
 – 浅く眠ると
  • 電力低減効果小/寝起きは良い
  • さくさく
• WFIを呼ぶ前に眠りの深さを指定する
おっと
• この時点でTegraのStateを理解していない
  事に気づく
• Flow controllerって何?
Omap3のidle
int __init omap3_idle_init(void)
{
     :
     state->enter = (state->flags & CPUIDLE_FLAG_CHECK_BM) ?
              omap3_enter_idle_bm : omap3_enter_idle;
     :
}

static int omap3_enter_idle(struct cpuidle_device *dev,
              struct cpuidle_state *state)
{
     :
}
omap3のC-ステート
#define OMAP3_STATE_C1 0      /* C1 - MPU WFI + Core active */

                           IDLE
昼寝
#define OMAP3_STATE_C2 1      /* C2 - MPU WFI + Core inactive */
#define OMAP3_STATE_C3 2      /* C3 - MPU CSWR + Core inactive */
#define OMAP3_STATE_C4 3      /* C4 - MPU OFF + Core iactive */
#define OMAP3_STATE_C5 4      /* C5 - MPU RET + Core RET */
#define OMAP3_STATE_C6 5      /* C6 - MPU OFF + Core RET */
#define OMAP3_STATE_C7 6      /* C7 - MPU OFF + Core OFF */

爆睡
ステートの指定はどうするの?
• CPUIdle Framework
  – CPU依存のCステート
  – Governor(統治者)によるポリシーベースの管理
  – /sys/power/cpuidle_deepest_state
  – /sys/proc/pm_prepwstst
• Governor
  – “ladder”,”menu”
  – drivers/cpuidle/governors
cpuidleの構成

    /sys/devices/syste/cpu/cpuidle                     ユーザレベル
                                                       インターフェース




 menu           ladder                                 Governor

                                                       Cpuidle アーキ無依存
                    Generic cpuidle


omap3-cpuidle       tegra2-cpuidle    tegra3-cpuidle   Cpuidle アーキ依存
cpuidle
• 実行可能なプロセスがない状態を管理
 – 昔は単純な停止orループ
 – ARMでは命令を追加して明にidleを通知 WFI
 – WFIを呼ぶ前に、寝る深さC-Stateを指定
• 標準でLadderとmenuのGovernor
 – ユーザプログラムで統計情報から指定も可
• 他の省電力機能もcpuidleを起点に動作
他のフレームワーク
• cpufreq
  – 動作周波数を変更
  – 電源電圧も合わせて変更
• runtime_pm
  – SoC内部コアを機能単位ごとに停止するヒントを
    管理
  – SoC内の機能毎にusecountを用意し、idleのタイミ
    ング未使用の機能を止める
  – Beagle のpm_branchで実機評価可能
• cpuhotplug
  – cpuidleのC-state変更をCPU単位に拡張
上級者向けの話題
• Runtime_PM
  – http://elinux.org/OMAP_Power_Management
  – http://git.kernel.org/?p=linux/kernel/git/khilman/l
    inux-omap-pm.git
• BeagleboardでSleep時の電流を8mWにした
  話
  – http://groups.google.com/group/beagleboard/bro
    wse_thread/thread/197a8ef6b46cc828
  – 回路を改造して、ボード上のコントローラの
    電源供給を止める
おわり

More Related Content

What's hot

Inside vacuum - 第一回PostgreSQLプレ勉強会
Inside vacuum - 第一回PostgreSQLプレ勉強会Inside vacuum - 第一回PostgreSQLプレ勉強会
Inside vacuum - 第一回PostgreSQLプレ勉強会
Masahiko Sawada
 
NginxとLuaを用いた動的なリバースプロキシでデプロイを 100 倍速くした
NginxとLuaを用いた動的なリバースプロキシでデプロイを 100 倍速くしたNginxとLuaを用いた動的なリバースプロキシでデプロイを 100 倍速くした
NginxとLuaを用いた動的なリバースプロキシでデプロイを 100 倍速くした
toshi_pp
 

What's hot (20)

2016/12/15 SQLチューニングと対戦格闘ゲームの類似性について語る。 JPOUG Advent Calendar 2016 Day 15
2016/12/15 SQLチューニングと対戦格闘ゲームの類似性について語る。 JPOUG Advent Calendar 2016 Day 152016/12/15 SQLチューニングと対戦格闘ゲームの類似性について語る。 JPOUG Advent Calendar 2016 Day 15
2016/12/15 SQLチューニングと対戦格闘ゲームの類似性について語る。 JPOUG Advent Calendar 2016 Day 15
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
 
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
 
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールこんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツール
 
さいきんの InnoDB Adaptive Flushing (仮)
さいきんの InnoDB Adaptive Flushing (仮)さいきんの InnoDB Adaptive Flushing (仮)
さいきんの InnoDB Adaptive Flushing (仮)
 
Ingress on Azure Kubernetes Service
Ingress on Azure Kubernetes ServiceIngress on Azure Kubernetes Service
Ingress on Azure Kubernetes Service
 
なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?
 
20分でわかるgVisor入門
20分でわかるgVisor入門20分でわかるgVisor入門
20分でわかるgVisor入門
 
サーバ構築を自動化する 〜Ansible〜
サーバ構築を自動化する 〜Ansible〜サーバ構築を自動化する 〜Ansible〜
サーバ構築を自動化する 〜Ansible〜
 
initramfsについて
initramfsについてinitramfsについて
initramfsについて
 
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
 
Dockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルDockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクル
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
 
Inside vacuum - 第一回PostgreSQLプレ勉強会
Inside vacuum - 第一回PostgreSQLプレ勉強会Inside vacuum - 第一回PostgreSQLプレ勉強会
Inside vacuum - 第一回PostgreSQLプレ勉強会
 
NginxとLuaを用いた動的なリバースプロキシでデプロイを 100 倍速くした
NginxとLuaを用いた動的なリバースプロキシでデプロイを 100 倍速くしたNginxとLuaを用いた動的なリバースプロキシでデプロイを 100 倍速くした
NginxとLuaを用いた動的なリバースプロキシでデプロイを 100 倍速くした
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門
 
今話題のいろいろなコンテナランタイムを比較してみた
今話題のいろいろなコンテナランタイムを比較してみた今話題のいろいろなコンテナランタイムを比較してみた
今話題のいろいろなコンテナランタイムを比較してみた
 
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
 
MySQLレプリケーションあれやこれや
MySQLレプリケーションあれやこれやMySQLレプリケーションあれやこれや
MySQLレプリケーションあれやこれや
 
SQLアンチパターン - ナイーブツリー
SQLアンチパターン - ナイーブツリーSQLアンチパターン - ナイーブツリー
SQLアンチパターン - ナイーブツリー
 

Viewers also liked

仮想記憶入門 BSD-4.3を例題に
仮想記憶入門 BSD-4.3を例題に仮想記憶入門 BSD-4.3を例題に
仮想記憶入門 BSD-4.3を例題に
magoroku Yamamoto
 
自動並列化コンパイラをAndroidに適用してみた
自動並列化コンパイラをAndroidに適用してみた自動並列化コンパイラをAndroidに適用してみた
自動並列化コンパイラをAndroidに適用してみた
magoroku Yamamoto
 

Viewers also liked (20)

Poormans sdk
Poormans sdkPoormans sdk
Poormans sdk
 
仮想記憶入門 BSD-4.3を例題に
仮想記憶入門 BSD-4.3を例題に仮想記憶入門 BSD-4.3を例題に
仮想記憶入門 BSD-4.3を例題に
 
ぐだ生って何
ぐだ生って何ぐだ生って何
ぐだ生って何
 
Oscar compiler for power reduction
Oscar compiler for power reduction Oscar compiler for power reduction
Oscar compiler for power reduction
 
Unix v6 セミナー vol. 5
Unix v6 セミナー vol. 5Unix v6 セミナー vol. 5
Unix v6 セミナー vol. 5
 
V6 unix vol.2 in okinawa
V6 unix vol.2 in okinawaV6 unix vol.2 in okinawa
V6 unix vol.2 in okinawa
 
波形で見るBig.little
波形で見るBig.little波形で見るBig.little
波形で見るBig.little
 
V6read#4
V6read#4V6read#4
V6read#4
 
Adk2012
Adk2012Adk2012
Adk2012
 
Ngk2011 b
Ngk2011 bNgk2011 b
Ngk2011 b
 
オレオレ家電
オレオレ家電オレオレ家電
オレオレ家電
 
自動並列化コンパイラをAndroidに適用してみた
自動並列化コンパイラをAndroidに適用してみた自動並列化コンパイラをAndroidに適用してみた
自動並列化コンパイラをAndroidに適用してみた
 
Android binder-ipc
Android binder-ipcAndroid binder-ipc
Android binder-ipc
 
Bluemixを使ったTwitter分析
Bluemixを使ったTwitter分析Bluemixを使ったTwitter分析
Bluemixを使ったTwitter分析
 
Deep learning入門
Deep learning入門Deep learning入門
Deep learning入門
 
PythonでDeepLearningを始めるよ
PythonでDeepLearningを始めるよPythonでDeepLearningを始めるよ
PythonでDeepLearningを始めるよ
 
Chainer v1.6からv1.7の新機能
Chainer v1.6からv1.7の新機能Chainer v1.6からv1.7の新機能
Chainer v1.6からv1.7の新機能
 
Deep Learningを用いたロボット制御
Deep Learningを用いたロボット制御Deep Learningを用いたロボット制御
Deep Learningを用いたロボット制御
 
Deep learning実装の基礎と実践
Deep learning実装の基礎と実践Deep learning実装の基礎と実践
Deep learning実装の基礎と実践
 
Chainerを使って細胞を数えてみた
Chainerを使って細胞を数えてみたChainerを使って細胞を数えてみた
Chainerを使って細胞を数えてみた
 

Similar to 20分でわかった事にするパワーマネジメント

HandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLHandlerSocket plugin for MySQL
HandlerSocket plugin for MySQL
akirahiguchi
 
Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Hiraku Toyooka
 

Similar to 20分でわかった事にするパワーマネジメント (20)

Gingerbread
GingerbreadGingerbread
Gingerbread
 
【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門 【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門
 
【学習メモ#7th】12ステップで作る組込みOS自作入門
【学習メモ#7th】12ステップで作る組込みOS自作入門 【学習メモ#7th】12ステップで作る組込みOS自作入門
【学習メモ#7th】12ステップで作る組込みOS自作入門
 
HandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLHandlerSocket plugin for MySQL
HandlerSocket plugin for MySQL
 
Android デバッグ小ネタ
Android デバッグ小ネタAndroid デバッグ小ネタ
Android デバッグ小ネタ
 
Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
 
Task Spooler を試した
Task Spooler を試したTask Spooler を試した
Task Spooler を試した
 
Read daemon on 20121110 by shinaisan
Read daemon on 20121110 by shinaisanRead daemon on 20121110 by shinaisan
Read daemon on 20121110 by shinaisan
 
リアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズリアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズ
 
マイコンロボット実習
マイコンロボット実習マイコンロボット実習
マイコンロボット実習
 
発表資料 Fortranを用いた高位合成技術FortRockの開発
発表資料 Fortranを用いた高位合成技術FortRockの開発発表資料 Fortranを用いた高位合成技術FortRockの開発
発表資料 Fortranを用いた高位合成技術FortRockの開発
 
Linux Performance Analysis in 15 minutes
Linux Performance Analysis in 15 minutesLinux Performance Analysis in 15 minutes
Linux Performance Analysis in 15 minutes
 
4章 Linuxカーネル - 割り込み・例外 2
4章 Linuxカーネル - 割り込み・例外 24章 Linuxカーネル - 割り込み・例外 2
4章 Linuxカーネル - 割り込み・例外 2
 
Interrupts on xv6
Interrupts on xv6Interrupts on xv6
Interrupts on xv6
 
20200709 fjt7tdmi-blog-appendix
20200709 fjt7tdmi-blog-appendix20200709 fjt7tdmi-blog-appendix
20200709 fjt7tdmi-blog-appendix
 
システムパフォーマンス勉強会#5
システムパフォーマンス勉強会#5システムパフォーマンス勉強会#5
システムパフォーマンス勉強会#5
 
Tremaで試すFirewall
Tremaで試すFirewallTremaで試すFirewall
Tremaで試すFirewall
 
as-6. スーパーバイザモード,特権命令,割り込み
as-6. スーパーバイザモード,特権命令,割り込みas-6. スーパーバイザモード,特権命令,割り込み
as-6. スーパーバイザモード,特権命令,割り込み
 
Open VZ
Open VZOpen VZ
Open VZ
 

More from magoroku Yamamoto (16)

V6 unix in okinawa
V6 unix in okinawaV6 unix in okinawa
V6 unix in okinawa
 
ぐだ生システム#2
ぐだ生システム#2ぐだ生システム#2
ぐだ生システム#2
 
Android builders summit slide tour
Android builders summit slide tourAndroid builders summit slide tour
Android builders summit slide tour
 
第4回名古屋Android勉強会資料
第4回名古屋Android勉強会資料第4回名古屋Android勉強会資料
第4回名古屋Android勉強会資料
 
Poorman’s adk トレーナ
Poorman’s adk トレーナPoorman’s adk トレーナ
Poorman’s adk トレーナ
 
V6read#3
V6read#3V6read#3
V6read#3
 
Unixファイルシステムの歴史
Unixファイルシステムの歴史Unixファイルシステムの歴史
Unixファイルシステムの歴史
 
Pdp11 on-fpga
Pdp11 on-fpgaPdp11 on-fpga
Pdp11 on-fpga
 
V6read#2
V6read#2V6read#2
V6read#2
 
Androidの入力システム
Androidの入力システムAndroidの入力システム
Androidの入力システム
 
ぐだ生システム再構成4
ぐだ生システム再構成4ぐだ生システム再構成4
ぐだ生システム再構成4
 
20分で理解する仮想記憶
20分で理解する仮想記憶20分で理解する仮想記憶
20分で理解する仮想記憶
 
Android のusb support
Android のusb supportAndroid のusb support
Android のusb support
 
Os真髄
Os真髄Os真髄
Os真髄
 
Ustream入門
Ustream入門Ustream入門
Ustream入門
 
仮想記憶の構築法
仮想記憶の構築法仮想記憶の構築法
仮想記憶の構築法
 

20分でわかった事にするパワーマネジメント

  • 1. 20分でわかった事にする Power Management cpuidle編 @magoroku15 最底辺活動家
  • 2. Androidzaurusのつぶやき 使用未許諾 • われらの恐竜先生、販売日にTegra 3のタブ レットをご購入 • 買った、直後の勉強会にてustream送出マ シンとして華麗にデビュー • 独自の視点での解析 -お約束ですね-
  • 3. Android Zairusの日記 使用未許諾
  • 5. Power management ちょー入門 • 家庭のパワーマネジメント – 照明はコマメに消す – 冷房は設定温度を高めに →住人が決める・操作する • CPUのパワーマネジメント – 不要なものは止める – 処理速度と落とす →どうやって決めるのか?操作するの か?
  • 6. UNIX/BSD/Mac/Linux App System call 動かすプロセスが無いとidleを呼ぶ KERNEL idle HDD
  • 7. BSD 4.3 GENERIC/locore.c 1498 .globl Idle 1499 Idle: idle: 1500 mtpr $0,$IPL # must allow interrupts here 1501 tstl _whichqs # look for non-empty queue 1502 bneq sw1 1503 brb idle
  • 8. Tegraのidle Kernel_V9_4_2_7/arch/arm/mach-tegra static int tegra_cpuidle_register_device(unsigned int cpu) // cpuidleへの登録 { : state->enter = tegra_idle_enter_lp2; : } static inline void tegra_idle_lp2(struct cpuidle_device *dev, struct cpuidle_state *state) { #ifdef CONFIG_ARCH_TEGRA_2x_SOC // tegra2の場合 tegra2_idle_lp2(dev, state); #endif #ifdef CONFIG_ARCH_TEGRA_3x_SOC // tegra3の場合 tegra3_idle_lp2(dev, state); #endif }
  • 9. Tegra3のidle Kernel_V9_4_2_7/arch/arm/mach-tegra/sleep.S void tegra3_idle_lp2(struct cpuidle_device *dev, struct cpuidle_state *state) { s64 request = ktime_to_us(tick_nohz_get_sleep_length()); bool last_cpu = tegra_set_cpu_in_lp2(dev->cpu); cpu_pm_enter(); if (last_cpu && (dev->cpu == 0)) // CPU0だけ別扱い tegra3_idle_enter_lp2_cpu_0(dev, state, request); else tegra3_idle_enter_lp2_cpu_n(dev, state, request); cpu_pm_exit(); tegra_clear_cpu_in_lp2(dev->cpu); }
  • 10. Tegra3のidle Kernel_V9_4_2_7/arch/arm/mach-tegra/sleep.S ENTRY(tegra_cpu_wfi) cpu_id r0 cpu_to_halt_reg r1, r0 cpu_to_csr_reg r2, r0 mov32 r0, TEGRA_FLOW_CTRL_VIRT mov r3, #FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG str r3, [r0, r2] @ clear event & interrupt status mov r3, #FLOW_CTRL_WAIT_FOR_INTERRUPT | FLOW_CTRL_JTAG_RESUME str r3, [r0, r1] @ put flow controller in wait irq mode dsb wfi mov r3, #0 str r3, [r0, r1] @ clear flow controller halt status mov r3, #FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG str r3, [r0, r2] @ clear event & interrupt status dsb mov pc, lr ENDPROC(tegra_cpu_wfi)
  • 11. WFI Wait For Interrupt • ARMの命令 • 割り込が発生するまで、CPUを低電力モード で命令の実行を止める • 眠りの深さ/寝起きの良さ – 深く眠ると • 電力低減効果大/寝起きは悪い • もっさり – 浅く眠ると • 電力低減効果小/寝起きは良い • さくさく • WFIを呼ぶ前に眠りの深さを指定する
  • 12. おっと • この時点でTegraのStateを理解していない 事に気づく • Flow controllerって何?
  • 13. Omap3のidle int __init omap3_idle_init(void) { : state->enter = (state->flags & CPUIDLE_FLAG_CHECK_BM) ? omap3_enter_idle_bm : omap3_enter_idle; : } static int omap3_enter_idle(struct cpuidle_device *dev, struct cpuidle_state *state) { : }
  • 14. omap3のC-ステート #define OMAP3_STATE_C1 0 /* C1 - MPU WFI + Core active */ IDLE 昼寝 #define OMAP3_STATE_C2 1 /* C2 - MPU WFI + Core inactive */ #define OMAP3_STATE_C3 2 /* C3 - MPU CSWR + Core inactive */ #define OMAP3_STATE_C4 3 /* C4 - MPU OFF + Core iactive */ #define OMAP3_STATE_C5 4 /* C5 - MPU RET + Core RET */ #define OMAP3_STATE_C6 5 /* C6 - MPU OFF + Core RET */ #define OMAP3_STATE_C7 6 /* C7 - MPU OFF + Core OFF */ 爆睡
  • 15. ステートの指定はどうするの? • CPUIdle Framework – CPU依存のCステート – Governor(統治者)によるポリシーベースの管理 – /sys/power/cpuidle_deepest_state – /sys/proc/pm_prepwstst • Governor – “ladder”,”menu” – drivers/cpuidle/governors
  • 16. cpuidleの構成 /sys/devices/syste/cpu/cpuidle ユーザレベル インターフェース menu ladder Governor Cpuidle アーキ無依存 Generic cpuidle omap3-cpuidle tegra2-cpuidle tegra3-cpuidle Cpuidle アーキ依存
  • 17. cpuidle • 実行可能なプロセスがない状態を管理 – 昔は単純な停止orループ – ARMでは命令を追加して明にidleを通知 WFI – WFIを呼ぶ前に、寝る深さC-Stateを指定 • 標準でLadderとmenuのGovernor – ユーザプログラムで統計情報から指定も可 • 他の省電力機能もcpuidleを起点に動作
  • 18. 他のフレームワーク • cpufreq – 動作周波数を変更 – 電源電圧も合わせて変更 • runtime_pm – SoC内部コアを機能単位ごとに停止するヒントを 管理 – SoC内の機能毎にusecountを用意し、idleのタイミ ング未使用の機能を止める – Beagle のpm_branchで実機評価可能 • cpuhotplug – cpuidleのC-state変更をCPU単位に拡張
  • 19. 上級者向けの話題 • Runtime_PM – http://elinux.org/OMAP_Power_Management – http://git.kernel.org/?p=linux/kernel/git/khilman/l inux-omap-pm.git • BeagleboardでSleep時の電流を8mWにした 話 – http://groups.google.com/group/beagleboard/bro wse_thread/thread/197a8ef6b46cc828 – 回路を改造して、ボード上のコントローラの 電源供給を止める