OSPM接收SCI后如何判断事件类型及对应检查的寄存器?
OSPM接收SCI后如何区分固定事件与通用事件?
我正在学习ACPI事件编程模型。根据ACPI 6.5规范,SCI(System Control Interrupt,系统控制中断)由两类事件触发:fixed event(固定事件)和general-purpose event(通用事件)。
ACPI 6.5规范第5.6.1节表5.185中的相关定义:
PM1x_STS位触发固定ACPI事件。当PM1x_STS位被置位时,若对应的PM1x_EN位也被置位,则会触发ACPI SCI事件。
GPEx_STS位触发通用事件。当GPEx_STS位被置位时,若对应的GPEx_EN位也被置位,则会触发通用SCI事件。
核心疑问是:当OSPM(操作系统中负责电源管理和平台配置的子系统)接收到SCI时,如何判断该SCI对应的是哪种事件?这直接影响处理逻辑——固定事件由OSPM自行处理,通用事件则可能需要调用ASL控制方法,但ACPI规范中未明确说明这一点。
换一种表述:OSPM可通过检查PM1x_STS或GPEx_STS寄存器确定触发源,但它如何知晓应检查哪个寄存器?还是会同时检查两者?
实际处理逻辑
OSPM不会提前知晓SCI的触发源类型,而是通过遍历所有已初始化的事件状态寄存器来排查,具体流程如下:
- 初始化阶段准备:OSPM会从ACPI表(如FADT、GPE块描述表)中获取所有
PM1x_STS、GPEx_STS及其对应使能寄存器的地址、位定义等信息,并完成注册。 - SCI触发后的排查:当SCI中断发生时,OSPM会按照既定优先级(通常先固定事件,后通用事件)逐一检查这些寄存器:
- 先读取
PM1x_STS寄存器,匹配已置位且对应PM1x_EN位也置位的标志,若找到则判定为固定事件,进入内核级处理流程; - 若
PM1x_STS中无有效事件,则依次检查各个GPEx_STS寄存器,找到符合条件的置位标志后,判定为通用事件,进而调用对应的ASL控制方法(如_Lxx/_Exx)处理。
- 先读取
- 多事件处理:硬件可能同时触发多个事件,OSPM会遍历所有寄存器,处理所有有效事件后才结束本次SCI中断处理。
这种全覆盖检查的逻辑是ACPI实现的通用标准,虽然规范未明确写出遍历顺序,但主流OSPM(如Linux ACPI子系统、Windows ACPI驱动)均采用此方式。
内容的提问来源于stack exchange,提问作者smwikipedia
相关产品推荐
相关产品推荐

