设备电源管理数据类型

struct dev_pm_ops

设备 PM 回调。

定义:

struct dev_pm_ops {
    int (*prepare)(struct device *dev);
    void (*complete)(struct device *dev);
    int (*suspend)(struct device *dev);
    int (*resume)(struct device *dev);
    int (*freeze)(struct device *dev);
    int (*thaw)(struct device *dev);
    int (*poweroff)(struct device *dev);
    int (*restore)(struct device *dev);
    int (*suspend_late)(struct device *dev);
    int (*resume_early)(struct device *dev);
    int (*freeze_late)(struct device *dev);
    int (*thaw_early)(struct device *dev);
    int (*poweroff_late)(struct device *dev);
    int (*restore_early)(struct device *dev);
    int (*suspend_noirq)(struct device *dev);
    int (*resume_noirq)(struct device *dev);
    int (*freeze_noirq)(struct device *dev);
    int (*thaw_noirq)(struct device *dev);
    int (*poweroff_noirq)(struct device *dev);
    int (*restore_noirq)(struct device *dev);
    int (*runtime_suspend)(struct device *dev);
    int (*runtime_resume)(struct device *dev);
    int (*runtime_idle)(struct device *dev);
};

成员

prepare

此回调的主要作用是阻止设备的新的子设备在其返回后被注册(驱动程序的子系统以及通常内核的其余部分应该阻止新的 probe 方法调用在 prepare() 成功后被执行)。如果 prepare() 检测到它无法处理的情况(例如,已在进行的子设备的注册),它可以返回 -EAGAIN,以便 PM 核心可以再次执行它(例如,在新子设备注册后),以从竞争条件中恢复。此方法针对所有类型的挂起转换执行,并且紧跟着其中一个挂起回调:suspend()freeze()poweroff()。如果转换是挂起到内存或待机状态(即,与休眠无关),则 prepare() 的返回值可用于指示 PM 核心,如果适用,将设备留在运行时挂起状态。即,如果 prepare() 返回一个正数,则 PM 核心将理解为声明该设备似乎已运行时挂起,并且如果其所有后代也处于运行时挂起状态,则可以在整个转换和随后的恢复期间将其保持在该状态。如果发生这种情况,complete() 将在 prepare() 之后直接执行,并且必须确保设备在系统恢复后的正常运行。PM 核心在开始为任何设备调用挂起回调之前,为所有设备执行子系统级别 prepare(),因此通常可以假设设备是功能正常的,或者在执行 prepare() 时响应运行时恢复请求。但是,设备驱动程序不得假设此时用户空间是否可用,并且从 prepare() 中请求固件是无效的(这样做为时已晚)。从 GFP_KERNEL 模式下的 prepare() 中分配大量内存也是无效的。[要解决这些限制,驱动程序可以注册在任务冻结之前执行的挂起和休眠通知程序。]

complete

撤消 prepare() 所做的更改。此方法在所有类型的恢复转换中执行,紧跟其中一个恢复回调:resume()thaw()restore()。如果在驱动程序的挂起回调:suspend()freeze()poweroff() 可以执行之前,状态转换失败(例如,如果挂起回调对 PM 核心之前尝试挂起的其他设备之一失败),也会调用此方法。PM 核心在为所有设备执行适当的恢复回调后,执行子系统级别 complete()。如果挂起转换开始时对应的 prepare() 返回一个正数,并且设备处于运行时挂起状态(没有为其执行任何挂起和恢复回调),则 complete() 将是在恢复期间为设备执行的唯一回调。在这种情况下,complete() 必须准备好执行任何必要的步骤,以确保设备在系统恢复后正常运行。为此,complete() 可以检查设备的 power.direct_complete 标志,以了解是否已(未设置)或未(已设置)为其执行先前的挂起和恢复回调。

suspend

在将系统置于保留主存储器内容的睡眠状态之前执行。要执行的确切操作取决于设备的子系统(PM 域、设备类型、类或总线类型),但通常设备在子系统级别 suspend() 返回后必须处于静止状态,因此它不会执行任何 I/O 或 DMA。在为所有设备调用子系统级别 prepare() 之后,为所有设备执行子系统级别 suspend()

resume

在系统从保留主存储器内容的睡眠状态唤醒后执行。要执行的确切操作取决于设备的子系统,但通常驱动程序应再次开始工作,响应硬件事件和软件请求(设备本身可以保持在低功耗状态,等待运行时恢复发生)。运行其驱动程序的 resume() 回调时,设备的状态取决于平台和设备所属的子系统。在大多数平台上,在 resume() 期间,对时钟等资源的可用性没有限制。在为所有设备调用子系统级别 resume_noirq() 之后,为所有设备执行子系统级别 resume()

freeze

特定于休眠,在创建休眠映像之前执行。类似于 suspend(),但它不应使设备能够发出唤醒事件或更改其电源状态。大多数子系统(PCI 总线类型是值得注意的例外)希望驱动程序级别 freeze() 将设备设置保存在内存中,以供 restore() 在随后的从休眠恢复期间使用。在为所有设备调用子系统级别 prepare() 之后,为所有设备执行子系统级别 freeze()

thaw

特定于休眠,在创建休眠映像之后或者如果映像创建失败时执行。在尝试从这样的映像恢复主存储器的内容失败后也会执行。撤消先前的 freeze() 所做的更改,以便设备可以像在调用 freeze() 之前立即一样运行。在为所有设备调用子系统级别 thaw_noirq() 之后,为所有设备执行子系统级别 thaw()。在转换错误的情况下,它也可以在 freeze() 之后直接执行。

poweroff

特定于休眠,在保存休眠映像后执行。类似于 suspend(),但它不需要将设备的设置保存在内存中。在为所有设备调用子系统级别 prepare() 之后,为所有设备执行子系统级别 poweroff()

restore

特定于休眠,在从休眠映像恢复主存储器的内容后执行,类似于 resume()

suspend_late

继续由 suspend() 启动的操作。对于许多设备,suspend_late() 可能会指向与运行时挂起回调相同的回调例程。

resume_early

准备执行 resume()。对于许多设备,resume_early() 可能会指向与运行时恢复回调相同的回调例程。

freeze_late

继续由 freeze() 启动的操作。类似于 suspend_late(),但它不应使设备能够发出唤醒事件或更改其电源状态。

thaw_early

准备执行 thaw()。撤消先前的 freeze_late() 所做的更改。

poweroff_late

继续由 poweroff() 启动的操作。类似于 suspend_late(),但它不需要将设备的设置保存在内存中。

restore_early

准备执行 restore(),类似于 resume_early()

suspend_noirq

完成由 suspend() 启动的操作。执行挂起设备可能与其驱动程序的 interrupts 处理程序竞争所需的任何其他操作,保证在执行 suspend_noirq() 时不会运行 interrupts 处理程序。通常,在子系统级别 suspend_noirq() 成功返回后,预计设备将处于低功耗状态(适用于目标系统睡眠状态)。如果设备可以生成系统唤醒信号并且已启用唤醒系统,则应在该时间配置为这样做。但是,根据平台和设备的子系统,suspend()suspend_late() 可能允许将设备置于低功耗状态,并将其配置为生成唤醒信号,在这种情况下,通常不需要定义 suspend_noirq()

resume_noirq

准备执行 resume(),方法是执行恢复设备可能与其驱动程序的 interrupts 处理程序竞争所需的任何操作,保证在执行 resume_noirq() 时不会运行 interrupts 处理程序。

freeze_noirq

完成由 freeze() 启动的操作。执行冻结设备可能与其驱动程序的 interrupts 处理程序竞争所需的任何其他操作,保证在执行 freeze_noirq() 时不会运行 interrupts 处理程序。设备的电源状态不应被 freeze()freeze_late()freeze_noirq() 更改,并且不应通过任何这些回调配置为发出系统唤醒信号。

thaw_noirq

准备执行 thaw(),方法是执行解冻设备可能与其驱动程序的 interrupts 处理程序竞争所需的任何操作,保证在执行 thaw_noirq() 时不会运行 interrupts 处理程序。

poweroff_noirq

完成由 poweroff() 启动的操作。类似于 suspend_noirq(),但它不需要将设备的设置保存在内存中。

restore_noirq

准备执行 restore(),方法是执行解冻设备可能与其驱动程序的 interrupts 处理程序竞争所需的任何操作,保证在执行 restore_noirq() 时不会运行 interrupts 处理程序。类似于 resume_noirq()

runtime_suspend

由于电源管理,准备设备处于无法与 CPU 和 RAM 通信的状态。这不一定意味着应将设备置于低功耗状态。例如,如果设备位于即将关闭的链接之后,则设备可能保持全功率状态。如果设备确实进入低功耗状态并且能够生成运行时唤醒事件,则应为其启用远程唤醒(即,允许设备通过中断请求更改其电源状态的硬件机制)。

runtime_resume

响应硬件生成的唤醒事件或软件的请求,将设备置于完全活动状态。如果需要,将设备置于全功率状态并恢复其寄存器,使其完全运行。

runtime_idle

设备似乎不活动,如果满足所有必要条件,则可能将其置于低功耗状态。检查这些条件,如果允许 PM 核心为设备排队挂起请求,则返回 0。

描述

几个设备电源状态转换在外部可见,影响挂起的 I/O 队列的状态,以及(对于接触硬件的驱动程序)interrupts、唤醒、DMA 和其他硬件状态。也可能存在到驱动程序堆栈的其余部分透明的各种低功耗模式的内部转换(例如,关闭未主动使用的时钟的驱动程序)。

外部可见的转换是在此结构中包含的回调的帮助下处理的,通常涉及两个级别的回调。首先,PM 核心执行 PM 域、设备类型、类和总线类型提供的回调。它们是子系统级别的回调,预计会执行设备驱动程序提供的回调,尽管它们可以选择不这样做。如果驱动程序回调被执行,它们必须与子系统级别的回调协作,以实现适合给定系统转换的目标,给定转换阶段和设备所属的子系统。

除了 complete() 之外,所有上述回调都返回错误代码。但是,由 resume()thaw()restore()resume_noirq()thaw_noirq()restore_noirq() 返回的错误代码不会导致 PM 核心中止返回它们的恢复转换。在这些情况下返回的错误代码仅打印到系统日志以进行调试。尽管如此,建议驱动程序仅在不可恢复的故障情况下(即,当正在处理的设备拒绝恢复并变得不可用时)从其恢复方法返回错误代码,以允许将来修改 PM 核心,使其可以避免尝试处理未能恢复的设备及其子设备。

允许在执行上述回调时注销设备。但是,回调例程不得尝试注销为其调用的设备,尽管它可以注销该设备的子设备(例如,如果它检测到系统处于睡眠状态时子设备已拔下)。

还有与设备的运行时电源管理相关的回调。同样,按照惯例,这些回调由 PM 核心为子系统(PM 域、设备类型、类和总线类型)执行,并且子系统级别的回调预计会调用驱动程序回调。此外,设备驱动程序的回调要执行的确切操作通常取决于平台和设备所属的子系统。

有关 runtime_suspend()runtime_resume()runtime_idle() 回调在设备运行时电源管理中的作用的更多信息,请参阅I/O 设备的运行时电源管理框架

struct dev_pm_domain

电源管理域表示。

定义:

struct dev_pm_domain {
    struct dev_pm_ops       ops;
    int (*start)(struct device *dev);
    void (*detach)(struct device *dev, bool power_off);
    int (*activate)(struct device *dev);
    void (*sync)(struct device *dev);
    void (*dismiss)(struct device *dev);
    int (*set_performance_state)(struct device *dev, unsigned int state);
};

成员

ops

与此域关联的电源管理操作。

start

当用户需要通过域启动设备时调用。

detach

从域中删除设备时调用。

activate

在为总线类型和驱动程序执行 probe 例程之前调用。

sync

在成功的驱动程序 probe 后调用。

dismiss

在不成功的驱动程序 probe 后以及驱动程序删除后调用。

set_performance_state

调用以请求新的性能状态。

描述

电源域提供在系统挂起、休眠、系统恢复期间以及运行时 PM 转换期间执行的回调,而不是子系统级别和驱动程序级别的回调。