tech-sjh

2012年11月15日 星期四

Linux runtime PM and system suspend resume

在 Linux kernel 3.1 比原本的 device driver suspend/resume
多了另一組 runtime PM,隸屬於 struct device 的新屬性
include/linux/device.h 中定義的 struct device 可以看到:

struct device {
...
  struct device_driver *driver;
  struct dev_pm_info  power;

Documentation/power/devices.txt
runtime PM 分成:prepare, suspend, suspend_noirq 三個階段

1. prepare 鎖定 parent, child 關係,申請需要的記憶體空間
2. suspend 停止 I/O 讓 device 進 low power mode 或斷電,可能有
  wake up event
3. 關閉 irq 後進入 suspend_noirq 顧名思義是不會再收到 irq request
  備份所有必要的暫存器,讓 device 進 low power mode 或斷電

相對應的是 resume_noirq, resume, complete

原本的 device driver suspend/resume
struct device_driver {
...

  int (*suspend) (struct device *dev, pm_message_t state);
  int (*resume) (struct device *dev);

Android 的 early_suspend, late_resume 是最外層,但是
runtime PM 跟 device driver suspend/resume 的順序關係為何?
文件中叫我們自己 trace code...

Documentation/power/runtime_pm.txt
直接看 runtime PM 的資料是開機 default suspend 不管硬體狀態
,在 system running 可依定義的 runtime PM 群組 suspend/resume

suspend 是由 child -> parent,由下而上的順序相依關係
因此要使用 runtime PM 的 device 還需要使用的 device class 或
subsystem, bus type 也使用 runtime PM 才行

/sys/devices/.../power/control 寫入 "on" 可以呼叫
pm_runtime_forbid() 保持在 active mode 禁止 runtime PM 動作
等確定可用後再寫入 "auto"

如果 runtime PM 在 running 沒執行過會由 kernel/power/suspend.c
進行 suspend,resume 最好先全部 active 再說?

PM core 會在呼叫 suspend/resume 時個別設定 counter 加一或減一


drivers/usb/gadget/omap_udc.c
會用到 udc->driver->suspend()
drivers/usb/core/driver.c
會用到 udriver->suspend()

所以還是要確定 device driver suspend 順序跟 runtime PM 的順序關
係為何?



沒有留言:

張貼留言

版權宣告、免責聲明


創用 CC 授權條款
本著作係採用創用 CC 姓名標示-非商業性-相同方式分享 4.0 國際 授權條款授權.
免責聲明: 本文所載資料僅供參考,並不構成投資建議,
讀者閱讀或使用該資料所導致結果需要自擔風險與責任,
作者概不承擔閱讀人行為之任何風險與責任。
除非有特別宣稱,作者言論並不代表所屬任何團體、公司、或其他人意見。