72797
現在、組込みLinuxのプロジェクトに携わっており、  
ターゲットCPUは TI AM3352, Kernel Version 4.19.59です。

要求項目として  
・スリープ →DDR3-SDRAM セルフリフレッシュで内容を保持、他のデバイスはPower Off  
・レジューム →スリープから通常の動作状態に復帰する。  
があります。

一応、コンフィグレーション項目としては

```

    CONFIG_SUSPEND:
       Allow the system to enter sleep states in which main memory is
       powered and thus its contents are preserved, such as the
       suspend-to-RAM state (e.g. the ACPI S3 state).
    
       Symbol: SUSPEND [=y]
       Type  : bool
       Prompt: Suspend to RAM and standby
         Location:
           -> Power management options
         Defined at kernel/power/Kconfig:1
         Depends on: ARCH_SUSPEND_POSSIBLE [=y]
    
```

があるので、これを'y'にするのが必須とは考えております。

だが仕組みがわかりません。とくにPower Offされるデバイスに対する状態の保持と復帰についてです。

DDR3-SDRAMはスリープ時Self refreshモードにし、電源はPower Onのままのため  
スリープ時も内容が保持されるためあまり気にする必要は無いと思いますが  
スリープ時Power Offされる各(というか実装されている全ての)デバイスはPower
Offされる前に今までデバイスに設定した状態の保持と復帰が必要になるはずです。  
そのような仕組みがあるとすれば、おそらく、その仕組は、それぞれのデバイスドライバで担務していると考えています。

## 質問

(1) Linuxのデバイスドライバは、そのようにsuspend-to-RAMに対応した仕組みがあるのでしょうか？  
だとすれば、そればどのような仕組みでしょうか？ このソースが参考になる的でも構いません。  
(2) suspend-to-RAMに関する仕組みについてよい解説かリンク先があればお教えください。
CC BY-SA 4.0
2020-04-27T07:03:56.843
66024
2020-12-21T08:58:03.493
2020-06-17T08:14:45.997
-1
7844
question
linux kernel
LinuxにおけるSuspend to RAMの仕組みをお教えください。
[AM335x
Sitara™プロセッサのマニュアル](https://www.tij.co.jp/jp/lit/ds/symlink/am3352.pdf?ts=1608530538705&ref_url=https%253A%252F%252Fwww.tij.co.jp%252Fproduct%252Fjp%252FAM3352)の88ページにある、

> 表 5-11. AM335x Low-Power Modes Power Consumption Summary

が参考になるのではないでしょうか？

表から、低消費電力モードには、Standby, Deepsleep1, Deepsleep0の３種類があり、それぞれについて  
・保たれる情報、失われる情報が何で、それらをどのメモリに保存すべきか  
・起動(Wakeup)の手順  
が概説されています。

例えば、Deepsleep0だと、以下のように説明されています（括弧内は直訳です。あまり正確ではない可能性があります）

> ・PD_PER peripheral and CortexA8/MPU register information will be lost.  
>  （PD＿PERのperipheralおよびContexA8/MPUのレジスタの情報は失われる。）  
>  ・On-chip peripheral register(context) information of PD-PER domain must be
> saved by （application to SDRAM before entering this mode.  
>  チップ上のperipheralレジスタのPD-
> PERドメインの情報は、このモードに入る前にアプリケーションでSDRAMに保存しておかなければならない。）  
>  ・DDR is in selfrefresh.  
>  （DDRは、selfrefreshモードになる。）  
>  ・For wakeup, boot ROM executes and branches to peripheral context restore
> followed by system resume.  
>  （ウェイクアップは、boot ROMを実行し、peripheralのcontextの復元、systemの復元と続く）

＝＝  
こうしたCPUチップ内プログラム(boot ROM等）、OS(Linux)のカーネル、Linuxが、どのような構成／階層になるのかは判りません。  
sleep時の情報保存・復元の機能が、デバイスドライバという形式で提供されるかどうかも判りません。

マニュアルから僕が拾い出せた情報を回答しました。
CC BY-SA 4.0
2020-12-21T07:42:47.480
72794
2020-12-21T07:42:47.480
217
66024
answer
### (1)について

Linuxカーネルにはその仕組みがあります。  
デバイスドライバーにとってはオプションなので, 実装しているとは限りません。(ちなみにドライバー作ったことありますがデスクトップ用だったので
`open`/`close` `read`/`write` 程度の実装でした)  
`suspend` や `resume` といったエントリーを実装できるので, 実装し・その情報をセットするだけです。  
ソースについては, Linux kernel標準のドライバーの中から実装してそうなのを探し出すしか無いと思います
(ディスプレイドライバー辺り実装してそうな？)

### (2)資料について

  * 4.19の Power Management資料 [Device Power Management Basics](https://www.kernel.org/doc/html/v4.19/driver-api/pm/devices.html)
  * 2.4のころのですが日本語資料です (ただしものによってはバージョンで構造体がお大きく異なることもあるので注意)。[電源管理の使用方法と電源管理のドライバの追加方法](http://linuxjf.osdn.jp/JFdocs/kernel-docs-2.4/pm.txt.html)
  * これも古いですが詳細が分かるのではないかと [LinuxにおけるACPI構造の解説](https://osdn.co.jp/event/kernel2002/pdf/C06.pdf)
CC BY-SA 4.0
2020-12-21T08:58:03.493
72797
2020-12-21T08:58:03.493
43025
66024
answer