5.6.9. 中断信号ACPI事件
ACPI 6.1 引入了在 OSPM 接收到中断时生成 ACPI 事件的支持,并且该中断列在通用事件设备 (GED) _CRS 对象中。 OSPM声明所有此类中断,并将它们映射到ACPI事件模型所需的适当事件方法。
5.6.9.1. 声明通用事件设备
通用事件设备 (GED) 被建模为命名空间中的设备,其 _HID 定义为 ACPI0013。 GED还必须提供一个 _CRS 和 _EVT 对象,用于声明中断并将其映射到ACPI事件,如下节所述。平台声明支持GED,并通过_OSC方法查询OS是否支持,参见第6.2.11.2节。
5.6.9.2. _CRS 中断信号事件对象
_CRS 对象将那些应由OSPM处理的中断指定为ACPI事件。该对象出现在GED的范围内,其中断源将用作中断信号事件。
参数:
无
返回值:
仅包含中断资源描述符的资源模板缓冲区。
- 对于小于 255 的事件编号,可以使用 _Exx 和 _Lxx 方法代替。在这种情况下,它们优先,并且 _EVT 将不会被调用。
示例:
Device (\_SB.GED1)
{
Name(_HID,"ACPI0013")
Name(_CRS, ResourceTemplate ()
{
Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive) {41}
Interrupt(ResourceConsumer, Level, ActiveHigh, Shared) {42}
Interrupt(ResourceConsumer, Level, ActiveHigh, ExclusiveAndWake) {43}
})
…
} //End of Scope
5.6.9.3. 用于处理中断信号事件的事件 (_EVT) 方法
平台分配给ACPI事件信号的中断列在GED设备下的_CRS 对象中。由于中断描述符还提供与事件关联的中断模式,因此它为OSPM提供了调用事件处理程序方法所需的所有信息。该方法的单个实例处理给定GED的所有ACPI事件。
- 请参阅第 5.6.4 节OSPM处理事件的要求(步骤 1-5)。
对于中断信号事件,使用事件 (_EVT) 方法。
_EVT 定义如下:
参数:(1)
Arg0 - 事件编号。一个整数,指示当前事件的事件编号(GSIV编号)。必须在 0x00000000 - 0xffffffff 范围内。
返回值:
无
描述
_EVT 方法处理中断信号事件。它必须出现在GED的范围内,其中断用于发出事件信号。
OSPM 按如下方式处理中断信号事件:
中断由OSPM处理,因为它列在GED下的_CRS 对象中。
当事件触发时,OSPM 根据其模式处理中断并调用 _EVT 方法,并向其传递事件的中断号。对于电平中断,_EVT 方法中的ASL必须负责清除设备上的中断。
从此时起,处理与 GPE 的处理完全相同。 _EVT 方法可以选择在适当的设备上调用 Notify(),并且使用OS特定的机制来通知驱动程序该事件。
例子 :
设备(_SB.GED1) { Name(_HID,"ACPI0013") Name(_CRS, ResourceTemplate () { Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive) {41} Interrupt(ResourceConsumer, Edge, ActiveHigh, Shared) {42} Interrupt(ResourceConsumer, Level, ActiveHigh, ExclusiveAndWake) {43} } Method (_EVT,1) { // Handle all ACPI Events signaled by the Generic Event Device(GED1) Switch (Arg0) // Arg0 = GSIV of the interrupt { Case (41) { // interrupt 41 Store(One, ISTS) // clear interrupt status register at device X // which is mapped via an operation region Notify (_SB.DEVX, 0x0) // insertion request } Case (42) { // interrupt 42 Notify (_SB.DEVX, 0x3) // ejection request } Case (43) { // interrupt 43 Store(One, ISTS) // clear interrupt status register at device X // which is mapped via an operation region Notify (_SB.DEVX, 0x2) // wake event } } } //End of Method } //End of GED1 Scope Device (_SB.DEVX) { … Name(_PRW,Package() { Package(2){ // EventInfo \_SB.GED1, // device reference 0x2 // event (zero-based CRS index) = 2 (maps to interrupt 43) }, 0x03, // Can wake up from S3 state PWRA // PWRA must be ON for DEVX to wake system }) … } //End of DEVX Scope
5.6.9.4. GED 唤醒事件
中断信号事件的一个重要用途是实现设备唤醒事件。基于中断的唤醒事件在第 4.1.1.2 节中描述。请注意,与该唤醒事件关联的中断必须能够根据 _CRS 对象下列出的扩展中断资源描述符进行唤醒。
考虑上一节中的ASL示例,请注意映射到DEVX唤醒事件的中断是可唤醒的。中断信号ACPI事件编程模型的组件按以下方式交互:
当设备断言其唤醒信号并且中断已被GED驱动程序启用时,中断将被断言。
如果系统正在睡眠,这将导致硬件(如果可能)将系统转换为S0状态。
一旦系统运行,OSPM将调度GED中断服务程序。
*GED需要确定哪个中断已被断言,并且可以对已断言唤醒的相应设备对象执行通知命令。
- 反过来,OSPM将通知每个设备的OSPM本机驱动程序,该驱动程序将唤醒其设备以提供服务。
唤醒事件必须专门与GED中断关联(例如,一个中断不能由多个唤醒事件共享),以便正确处理系统使用的语义
请注意,任何ACPI平台都可以利用GPIO信号和/或中断信号ACPI事件(即,它们不限于硬件简化的ACPI平台)。