Linux5.2/Documentation/driver-api/pm/notifiers.rst 翻译
Linux中的大多数代码都是设备驱动程序,因此大多数Linux电源管理(PM)代码也是特定于驱动程序的。 大多数驱动会做的很少; 其它的,尤其是小电池平台(如手机),会做很多事情。
本文概述了驱动程序如何与系统范围的电源管理目标进行交互,强调了连接到驱动程序模型核心的所有内容共享的模型和接口。 将其作为您使用任何特定驱动程序执行的特定于域的工作的背景阅读。
两种设备电源管理模型
======================================
驱动程序将使用这些模型中的一个或两个将设备置于低功耗状态:
系统睡眠模型:
驱动器可以进入低功耗状态,作为进入系统范围的低功耗状态的一部分,如“suspend”(也称为“挂起到RAM”),或(主要用于带磁盘的系统)“hibernation”(也称为“挂起到硬盘”)。
这是设备,总线和类驱动程序通过实现各种特定于角色的suspend和resume方法来协作,以便干净地关闭硬件和软件子系统,然后在不丢失数据的情况下重新激活它们。
某些驱动程序可以处理硬件唤醒事件,从而使系统从低功耗状态退出。 可以使用相关的:/sys/devices/.../power/wakeup 文件启用或禁用此功能(对于以太网驱动程序,ethtool使用的ioctl接口也可用于此目的);
启用它可能会耗费一些电力,但让整个系统更频繁地进入低功耗状态。
运行时电源管理模型:
在系统运行时,设备也可以进入低功率状态,原则上与其他电源管理活动无关。 但是,设备通常不是彼此独立的(例如,除非所有子设备都被挂起,否则不能挂起父设备)。 此外,根据设备所处的总线类型,可能需要为此目的在设备上执行一些特定于总线的操作。 在运行时进入低功耗状态的设备可能需要在系统范围的电源转换(暂停或休眠)期间进行特殊处理。
由于这些原因,不仅设备驱动程序本身,而且适当的子系统(总线类型,设备类型或设备类)驱动程序和PM核心都涉及运行时电源管理。 与系统睡眠电源管理案例一样,他们需要通过实施各种特定于角色的挂起和恢复方法进行协作,以便在没有数据或服务丢失的情况下干净地关闭和重新激活硬件。
关于那些低功耗状态没有太多可说的,除了它们是非常特定于系统的,并且通常是特定于设备的。 此外,如果有足够的设备进入低功耗状态(在运行时),效果可能非常类似于进入一些系统范围的低功耗状态(系统睡眠)...... 并且存在协同作用,因此有几个使用运行时PM的驱动程序可能会使系统进入可以获得更深省电选项的状态。
大多数挂起的设备将使所有 I/O 静默:不再有DMA或IRQ(唤醒事件除外),不再读取或写入数据,并且不再接受来自上游驱动程序的请求。 但是,给定的总线或平台可能有不同的要求。
硬件唤醒事件的示例包括来自实时时钟的警报,网络LAN唤醒数据包,键盘或鼠标活动以及媒体插入或移除(用于PCMCIA,MMC / SD,USB等)。
进入系统睡眠状态的接口
===========================================
为子系统(总线类型,设备类型,设备类)和设备驱动程序提供编程接口,以允许它们参与所关注设备的电源管理。 这些接口涵盖系统睡眠和运行时电源管理。
设备电源管理操作
----------------------------------
子系统级别以及设备驱动程序级别的设备电源管理操作是通过定义和填充类型| struct dev_pm_ops |的对象来实现的。 在 include/linux/pm.h 中定义。
其中包含的方法的作用将在下面解释。 现在,应该记住,这个结构体的最后三个方法是特定于运行时电源管理的,而其余方法则在系统范围的电源转换期间使用。
还有一个已弃用的“old”或“legacy”接口,用于至少对某些子系统可用的电源管理操作。 这种方法不使用| struct dev_pm_ops | 这些对象仅适用于以有限的方式实现系统睡眠功率管理方法。 因此,本文档中未对其进行描述,因此请直接参阅源代码以获取有关它的更多信息。
子系统级方法
-----------------------
暂停和恢复设备的核心方法位于| struct dev_pm_ops | 被| struct dev_pm_domain | 的 ops 成员指向,或者由 | struct bus_type | ,| struct device_type | 和| struct class | 的 pm 成员指向。
它们使为平台和总线编写基础设施的人感兴趣,如PCI或USB,或设备类型和设备类驱动程序。 它们还与设备驱动程序的编写者相关,其子系统(PM域,设备类型,设备类和总线类型)不提供所有的电源管理方法。
总线驱动程序为驱动和硬件驱动适当地实现这些方法; PCI的工作方式与USB不同,依此类推。 没有多少人编写子系统级驱动程序; 大多数驱动程序代码是基于总线特定框架代码构建的“设备驱动程序”。
有关这些驱动程序调用的更多信息,请参阅后面的说明; 每个设备都会根据驱动程序模型树中的父子序列分阶段调用它们。
该翻译::file:`/sys/devices/.../power/wakeup` files
未完待续。。。。。
posted on 2019-06-23 20:53 Hello-World3 阅读(321) 评论(0) 编辑 收藏 举报