设备电源管理数据类型

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

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

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()** 启动的操作。执行挂起设备所需的任何其他操作,这些操作可能会与驱动程序的 中断处理程序竞争,保证在执行 **suspend_noirq()** 时不会运行。通常期望设备在子系统级别的 **suspend_noirq()** 成功返回后处于低功耗状态(适合目标系统睡眠状态)。如果设备可以生成系统唤醒信号并且已启用以唤醒系统,则应在此时将其配置为执行此操作。但是,根据平台和设备的子系统,可能允许 **suspend()** 或 **suspend_late()** 将设备置于低功耗状态并将其配置为生成唤醒信号,在这种情况下,通常不需要定义 **suspend_noirq()**。

resume_noirq

通过执行恢复设备所需的任何操作来准备执行 **resume()**,这些操作可能会与驱动程序的中断处理程序竞争,保证在执行 **resume_noirq()** 时不会运行。

freeze_noirq

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

thaw_noirq

通过执行解冻设备所需的任何操作来准备执行 **thaw()**,这些操作可能会与驱动程序的中断处理程序竞争,保证在执行 **thaw_noirq()** 时不会运行。

poweroff_noirq

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

restore_noirq

通过执行解冻设备所需的任何操作来准备执行 **restore()**,这些操作可能会与驱动程序的中断处理程序竞争,保证在执行 **restore_noirq()** 时不会运行。类似于 **resume_noirq()**。

runtime_suspend

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

runtime_resume

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

runtime_idle

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

描述

一些设备电源状态转换是外部可见的,会影响挂起的 I/O 队列的状态,以及(对于操作硬件的驱动程序)中断、唤醒、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

在执行总线类型和驱动程序的探测例程之前调用。

sync

在成功进行驱动程序探测后调用。

dismiss

在驱动程序探测失败后和驱动程序移除后调用。

set_performance_state

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

描述

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