ACPI 通知

PEP 的 AcceptAcpiNotification 回调例程接收的每个 ACPI 通知都附带一个 Notification 参数(指示通知的类型)和一个 Data 参数,该参数指向包含指定通知类型信息的数据结构。

在此调用中,Notification 参数设置为指示通知类型的PEP_NOTIFY_ACPI_XXX常量值。 Data 参数指向与此通知类型关联的PEP_ACPI_XXX结构类型。

AcceptAcpiNotification 回调例程使用以下 ACPI 通知 ID。

通知 ID 关联的结构
PEP_NOTIFY_ACPI_PREPARE_DEVICE 0x01 PEP_ACPI_PREPARE_DEVICE
PEP_NOTIFY_ACPI_ABANDON_DEVICE 0x02 PEP_ACPI_ABANDON_DEVICE
PEP_NOTIFY_ACPI_REGISTER_DEVICE 0x03 PEP_ACPI_REGISTER_DEVICE
PEP_NOTIFY_ACPI_UNREGISTER_DEVICE 0x04 PEP_ACPI_UNREGISTER_DEVICE
PEP_NOTIFY_ACPI_ENUMERATE_DEVICE_NAMESPACE 0x05 PEP_ACPI_ENUMERATE_DEVICE_NAMESPACE
PEP_NOTIFY_ACPI_QUERY_OBJECT_INFORMATION 0x06 PEP_ACPI_QUERY_OBJECT_INFORMATION
PEP_NOTIFY_ACPI_EVALUATE_CONTROL_METHOD 0x07 PEP_ACPI_EVALUATE_CONTROL_METHOD
PEP_NOTIFY_ACPI_QUERY_DEVICE_CONTROL_RESOURCES 0x08 PEP_ACPI_QUERY_DEVICE_CONTROL_RESOURCES
PEP_NOTIFY_ACPI_TRANSLATED_DEVICE_CONTROL_RESOURCES 0x09 PEP_ACPI_TRANSLATED_DEVICE_CONTROL_RESOURCES

PEP_NOTIFY_ACPI_PREPARE_DEVICE

通知:值PEP_NOTIFY_ACPI_PREPARE_DEVICE。 数据:指向按名称标识设备的PEP_ACPI_PREPARE_DEVICE结构的指针。

允许 PEP 选择是否为设备提供 ACPI 服务。

Windows 电源管理框架 (PoFx) 当 Windows ACPI 驱动程序在设备枚举期间在 ACPI 命名空间中发现新设备时发送此通知。 此通知将发送到实现 AcceptAcpiNotification 回调例程的 PEP。

若要发送PEP_NOTIFY_ACPI_PREPARE_DEVICE通知,PoFx 调用 PEP 的 AcceptAcpiNotification 例程。 在此调用中,Notification 参数值PEP_NOTIFY_ACPI_PREPARE_DEVICE,Data 参数指向包含设备名称的PEP_ACPI_PREPARE_DEVICE结构。 如果 PEP 准备为此设备提供 ACPI 服务,则 PEP 将此结构的 DeviceAccepted 成员设置为 TRUE。 为了拒绝提供此类服务,PEP 将此成员设置为 FALSE。

如果 PEP 通过设置 DeviceAccepted = TRUE 来指示 (,) 它已准备好为设备提供 ACPI 服务,则 PoFx 将通过向 PEP 发送PEP_NOTIFY_ACPI_REGISTER_DEVICE通知以将 PEP 注册为设备 ACPI 服务的唯一提供商来做出响应。 PoFx 只要求一个 PEP 声明设备 ACPI 服务提供商的角色。

最佳做法是,不要执行任何设备初始化来响应PEP_NOTIFY_ACPI_PREPARE_DEVICE通知。 相反,请推迟此初始化,直到收到设备的PEP_NOTIFY_ACPI_REGISTER_DEVICE通知,或者 (ACPI 控制方法,例如,为设备调用_INI) 。

对于PEP_NOTIFY_ACPI_PREPARE_DEVICE通知,始终在 IRQL = PASSIVE_LEVEL调用 AcceptAcpiNotification 例程。

PEP_NOTIFY_ACPI_ABANDON_DEVICE

通知:值PEP_NOTIFY_ACPI_ABANDON_DEVICE。

数据:指向标识已放弃设备的PEP_ACPI_ABANDON_DEVICE结构的指针。

通知 PEP 指定的设备已放弃,不再需要 PEP 中的 ACPI 服务。

Windows 电源管理框架 (PoFx) 发送此通知,以通知 PEP 操作系统不再使用该设备。 PEP 可以使用此通知来清理已分配用于跟踪设备状态的任何内部存储。

若要发送PEP_NOTIFY_ACPI_ABANDON_DEVICE通知,PoFx 调用 PEP 的 AcceptAcpiNotification 回调例程。 在此调用中,通知参数值PEP_NOTIFY_ACPI_ABANDON_DEVICE,Data 参数指向PEP_ACPI_ABANDON_DEVICE结构。

PoFx 仅将此通知发送给已选择在以前的PEP_NOTIFY_ACPI_PREPARE_DEVICE通知中为设备提供 ACPI 服务的 PEP。 如果 PEP 已注册以在以前的PEP_NOTIFY_ACPI_REGISTER_DEVICE通知中提供这些服务,则 PoFx 将在发送PEP_NOTIFY_ACPI_ABANDON_DEVICE通知之前为设备发送PEP_NOTIFY_ACPI_UNREGISTER_DEVICE通知。

对于PEP_NOTIFY_ACPI_ABANDON_DEVICE通知,始终在 IRQL = PASSIVE_LEVEL 调用 AcceptAcpiNotification 例程。

PEP_NOTIFY_ACPI_REGISTER_DEVICE

通知:值PEP_NOTIFY_ACPI_REGISTER_DEVICE。

数据:指向标识设备的PEP_ACPI_REGISTER_DEVICE结构的指针。 为了响应此通知,PEP 应创建有效的 PEPHANDLE 值来标识设备并将此句柄值写入结构。

将 PEP 注册为指定设备 ACPI 服务的唯一提供商。

Windows 电源管理框架 (PoFx) 将此通知发送到 PEP(在前面的PEP_NOTIFY_ACPI_PREPARE_DEVICE通知中指示已准备好为指定设备提供 ACPI 服务)。

若要发送PEP_NOTIFY_ACPI_REGISTER_DEVICE通知,PoFx 调用 PEP 的 AcceptAcpiNotification 例程。 在此调用中,Notification 参数值PEP_NOTIFY_ACPI_REGISTER_DEVICE,Data 参数指向标识 PEP 要为其提供 ACPI 服务的设备的PEP_ACPI_REGISTER_DEVICE结构。

对于PEP_NOTIFY_ACPI_REGISTER_DEVICE通知,始终在 IRQL = PASSIVE_LEVEL 调用 AcceptAcpiNotification 例程。

PEP_NOTIFY_ACPI_UNREGISTER_DEVICE

通知:值PEP_NOTIFY_ACPI_UNREGISTER_DEVICE。

数据:指向包含设备的 PEPHANDLE 的PEP_ACPI_UNREGISTER_DEVICE结构的指针。

从 PEP 取消 ACPI 服务的指定设备的注册。

为了响应此通知,PEP 可以销毁 PEP 在以前的PEP_NOTIFY_ACPI_REGISTER_DEVICE通知中为此设备创建的 PEPHANDLE。

为了发送PEP_NOTIFY_ACPI_UNREGISTER_DEVICE通知,PoFx 调用 PEP 的 AcceptAcpiNotification 回调例程。 在此调用中,Notification 参数值PEP_NOTIFY_ACPI_UNREGISTER_DEVICE,Data 参数指向PEP_ACPI_UNREGISTER_DEVICE结构。

对于PEP_NOTIFY_ACPI_UNREGISTER_DEVICE通知,始终在 IRQL = PASSIVE_LEVEL调用 AcceptAcpiNotification 例程。

PEP_NOTIFY_ACPI_ENUMERATE_DEVICE_NAMESPACE

通知:值PEP_NOTIFY_ACPI_ENUMERATE_DEVICE_NAMESPACE。

数据:指向PEP_ACPI_ENUMERATE_DEVICE_NAMESPACE结构的指针,该结构包含设备的 ACPI 命名空间中对象的枚举。

在 ACPI 命名空间的指定设备下,) PEP 支持的本机方法 (ACPI 对象列表查询 PEP 对象列表。

Windows ACPI 驱动程序使用此通知枚举的对象来生成指定设备的命名空间。 此后,在引用此设备时,ACPI 驱动程序将仅查询这些对象的 PEP。

Windows 电源管理框架 (PoFx) 在发现设备后不久发送PEP_NOTIFY_ACPI_ENUMERATE_DEVICE_NAMESPACE通知,PEP 寄存器为设备提供 ACPI 服务。 有关此注册的详细信息,请参阅 PEP_NOTIFY_ACPI_REGISTER_DEVICE。

若要发送PEP_NOTIFY_ACPI_ENUMERATE_DEVICE_NAMESPACE通知,PoFx 调用 PEP 的 AcceptAcpiNotification 回调例程。 在此调用中,Notification 参数值PEP_NOTIFY_ACPI_ENUMERATE_DEVICE_NAMESPACE,Data 参数指向PEP_ACPI_ENUMERATE_DEVICE_NAMESPACE结构。

AcceptAcpiNotification 例程应处理PEP_NOTIFY_ACPI_ENUMERATE_DEVICE_NAMESPACE通知并返回 TRUE。 否则会导致 bug 检查。

对于PEP_NOTIFY_ACPI_ENUMERATE_DEVICE_NAMESPACE通知,始终在 IRQL = PASSIVE_LEVEL 调用 AcceptAcpiNotification 例程。

PEP_NOTIFY_ACPI_QUERY_OBJECT_INFORMATION

通知:值PEP_NOTIFY_ACPI_QUERY_OBJECT_INFORMATION。

数据:指向PEP_ACPI_QUERY_OBJECT_INFORMATION结构的指针,该结构指定 ACPI 对象的属性。

在 PEP 中查询有关以前枚举的 ACPI 对象的信息。

Windows 电源管理框架 (PoFx) 发送此通知,以在 PEP 中查询在处理以前的PEP_NOTIFY_ACPI_ENUMERATE_DEVICE_NAMESPACE通知期间枚举的对象的属性。 目前,枚举的唯一对象是控制方法。

若要发送PEP_NOTIFY_ACPI_QUERY_OBJECT_INFORMATION通知,PoFx 调用 PEP 的 AcceptAcpiNotification 回调例程。 在此调用中,通知参数值PEP_NOTIFY_ACPI_QUERY_OBJECT_INFORMATION,Data 参数指向PEP_ACPI_QUERY_OBJECT_INFORMATION结构。

对于PEP_NOTIFY_ACPI_QUERY_OBJECT_INFORMATION通知,始终在 IRQL = PASSIVE_LEVEL 调用 AcceptAcpiNotification 例程。

PEP_NOTIFY_ACPI_EVALUATE_CONTROL_METHOD

通知:值PEP_NOTIFY_ACPI_EVALUATE_CONTROL_METHOD。

数据:指向PEP_ACPI_EVALUATE_CONTROL_METHOD结构的指针,该结构指定要计算的 ACPI 控制方法、要提供给此方法的输入参数以及结果的输出缓冲区。

用于评估其 PEP 为注册处理程序的 ACPI 控制方法。

Windows 电源管理框架 (PoFx) 当 Windows ACPI 驱动程序需要评估 PEP 实现的 ACPI 控制方法时,会将此通知发送到 PEP。

若要发送PEP_NOTIFY_ACPI_EVALUATE_CONTROL_METHOD通知,PoFx 调用 PEP 的 AcceptAcpiNotification 回调例程。 在此调用中,Notification 参数值PEP_NOTIFY_ACPI_EVALUATE_CONTROL_METHOD,Data 参数指向PEP_ACPI_EVALUATE_CONTROL_METHOD结构。

平台设计器可以选择是让 PEP 还是 ACPI 固件处理特定的 ACPI 控制方法。 如果 PEP 是 ACPI 控制方法的注册处理程序,则 PoFx 会响应来自 Windows ACPI 驱动程序的请求,以便通过向 PEP 发送PEP_NOTIFY_ACPI_EVALUATE_CONTROL_METHOD通知来评估此方法。

下面是 PEP 可以为设备处理的 ACPI 控制方法的示例列表:

设备标识和配置:_HID、_CID、_UID、_ADR、_CLS、_SUB、_CRS、_PRS等。 设备电源管理和唤醒:通过_PS3_PS0、_PR0_PR3、_DSW等。 特定于设备的方法:_DSM和任何特定于设备堆栈的控制方法。 对于特殊设备(例如 ACPI 时间和警报设备),此通知用于评估时间和警报方法 (_GCP、_GRT、_SRT等) 。

对于PEP_NOTIFY_ACPI_EVALUATE_CONTROL_METHOD通知,始终在 IRQL = PASSIVE_LEVEL调用 AcceptAcpiNotification 例程。

PEP_NOTIFY_ACPI_QUERY_DEVICE_CONTROL_RESOURCES

通知:值PEP_NOTIFY_ACPI_QUERY_DEVICE_CONTROL_RESOURCES。

数据:指向包含电源资源列表的PEP_ACPI_QUERY_DEVICE_CONTROL_RESOURCES结构的指针。

在 PEP 中查询控制设备电源所需的原始资源列表。

为了响应此通知,PEP 提供了控制设备电源所需的原始资源列表。 Windows ACPI 驱动程序需要此列表,以便可以保留设备所需的电源资源,并通过发送PEP_NOTIFY_ACPI_TRANSLATED_DEVICE_CONTROL_RESOURCES通知) 向 PEP (提供相应的已转换资源列表。 有关详细信息,请参阅原始资源和翻译的资源。

若要发送PEP_NOTIFY_ACPI_QUERY_DEVICE_CONTROL_RESOURCES通知,Windows 电源管理框架 (PoFx) 调用 PEP 的 AcceptAcpiNotification 回调例程。 在此调用中,通知参数值PEP_NOTIFY_ACPI_QUERY_DEVICE_CONTROL_RESOURCES,Data 参数指向PEP_ACPI_QUERY_DEVICE_CONTROL_RESOURCES结构。

对于PEP_NOTIFY_ACPI_QUERY_DEVICE_CONTROL_RESOURCES通知,始终在 IRQL = PASSIVE_LEVEL 调用 AcceptAcpiNotification 例程。

PEP_NOTIFY_ACPI_TRANSLATED_DEVICE_CONTROL_RESOURCES

通知:值PEP_NOTIFY_ACPI_TRANSLATED_DEVICE_CONTROL_RESOURCES。

数据:指向包含已翻译资源列表的PEP_ACPI_TRANSLATED_DEVICE_CONTROL_RESOURCES结构的指针。

为 PEP 提供设备所需的任何电源控制资源的已翻译资源列表。

如果 PEP 列出了任何原始资源以响应前面的PEP_NOTIFY_ACPI_QUERY_DEVICE_CONTROL_RESOURCES通知,则 Windows 电源管理框架 (PoFx) 发送此通知。 PEP_NOTIFY_ACPI_TRANSLATED_DEVICE_CONTROL_RESOURCES通知为 PEP 提供相应的已翻译资源列表。 有关详细信息,请参阅原始资源和翻译的资源。

若要发送PEP_NOTIFY_ACPI_TRANSLATED_DEVICE_CONTROL_RESOURCES通知,PoFx 调用 PEP 的 AcceptAcpiNotification 回调例程。 在此调用中,Notification 参数值PEP_NOTIFY_ACPI_TRANSLATED_DEVICE_CONTROL_RESOURCES,Data 参数指向PEP_ACPI_TRANSLATED_DEVICE_CONTROL_RESOURCES结构。

对于PEP_NOTIFY_ACPI_TRANSLATED_DEVICE_CONTROL_RESOURCES通知,始终在 IRQL = PASSIVE_LEVEL 调用 AcceptAcpiNotification 例程。

PEP_NOTIFY_ACPI_WORK

通知:值PEP_NOTIFY_ACPI_WORK。

数据:指向PEP_WORK结构的指针。

每次 PEP 调用 RequestWorker 例程以从 Windows 电源管理框架 (PoFx) 请求工作项时,都发送到 PEP 一次。 此通知用于仅限 ACPI 的工作。

在 PEP 调用 RequestWorker 例程来请求工作项后,PoFx 将通过向 PEP 发送PEP_NOTIFY_ACPI_WORK通知来响应。 但是,在资源 (即处理工作项所需的工作线程) 可用之前,不会发送此通知。 通过这种方式,PoFx 保证 PEP 在通知期间传递给 PoFx 的工作请求永远不会因资源不足而失败。

输入时,PEP 应假定PEP_WORK结构未初始化。 若要处理此通知,PEP 应将 WorkInformation 成员设置为指向 PEP 分配的PEP_WORK_INFORMATION结构,该结构描述正在请求的工作。 此外,PEP 应将 PEP_WORK 结构的 NeedWork 成员设置为 TRUE,以确认 PEP 已处理PEP_NOTIFY_ACPI_WORK通知,并且 WorkInformation 成员指向有效的PEP_WORK_INFORMATION结构。 如果 PEP 无法处理通知或无法分配PEP_WORK_INFORMATION结构,则 PEP 应将 WorkInformation 成员设置为 NULL,并将 NeedWork 成员设置为 FALSE。

对于PEP_NOTIFY_ACPI_WORK通知,始终在 IRQL = PASSIVE_LEVEL 调用 AcceptAcpiNotification 例程。