6.2.11. _OSC(操作系统能力)
此可选对象是一个控制方法,OSPM 使用它向平台传达设备驱动程序所提供的特性支持或能力。该对象是设备的子对象,也可以存在于 \_SB 作用域中,在那里它可用于传达平台范围的 OSPM 能力。若受支持,OSPM 会在将设备置于 D0 电源状态后立即调用 _OSC。设备特定对象会在调用 _OSC 之后再求值。这使得从其他对象返回的值可以基于由 _OSC 传达的 OSPM 特性支持/能力信息。OSPM 可以多次求值 _OSC,以向设备指示 OSPM 能力的变化,但这可能会因特定设备要求而受到限制。因此,ACPI-Defined Devices and Device-Specific Objects 或其他适用规范中的 _OSC 用法描述,会说明优先适用的设备特定 _OSC 能力和/或限制条件。
_OSC 使平台能够配置其 ACPI 命名空间表示和对象求值,以匹配 OSPM 的能力。这使得具有新特性的平台注册系统能够支持传统操作系统;这些新特性利用了新的命名空间对象,而如果将其暴露出来,在运行传统操作系统时将不会被求值。_OSC 提供了这样一种能力:当通过动态命名空间重配置可用时,使平台过渡到由原生操作系统支持的新特性和能力。_OSC 还允许具有兼容 ID 的设备在由其原生驱动程序(例如,_HID 匹配的驱动程序)控制时提供超集功能,因为合适的对象可以根据 OSPM 对 _OSC 的求值结果相应地被暴露出来。
参数:(4)
Arg0 - 一个包含 UUID 的 Buffer
Arg1 - 一个包含缓冲区格式修订 ID 的 Integer
Arg2 - 一个包含 Arg3 中条目计数的 Integer
Arg3 - 一个包含 DWORD 能力列表的 Buffer
返回值:
一个包含能力列表的 Buffer
参数信息
Arg0:UUID - 平台将其与修订 ID 结合使用,以确定能力缓冲区的格式。
Arg1:Revision ID - 能力缓冲区格式的修订版本。该修订级别特定于该 UUID。
Arg2:Count - Arg3 中能力缓冲区里的 DWORD 数量
Arg3:Capabilities Buffer - 该缓冲区包含由 Count 指定数量的 DWORD。该缓冲区的第一个 DWORD 包含如下所述的标准位定义。后续的 DWORD 包含特定于 UUID 的位,用于向平台传达 OSPM 支持的能力和特性。Capabilities Buffer 的后续修订版本必须与较早的修订版本向后兼容。位顺序不得更改。
Capabilities Buffer 是设备特定的,因此会在具体设备定义下进行描述。有关 ACPI 设备的任何 _OSC 定义,请参见ACPI-Defined Devices and Device-Specific Objects。Capabilities Buffer 的格式和行为规则也可以由 OEM 和 IHV 为自定义设备指定,其他接口或设备管理机构(例如 PCI SIG)也可以进行指定。
能力缓冲区中的第一个 DWORD 用于返回由 _OSC 定义的错误。该 DWORD 必须始终存在,且不得被使用 _OSC 的唯一接口重新定义/重用。
位 [0] - 查询支持标志。如果置位,则该次 _OSC 调用是 OSPM 发起的查询,用于确定或与平台协商 OSPM 可接管的能力组合。在这种情况下,OSPM 在后续 DWORD 中置位相应位,以指定 OSPM 打算接管的能力。如果清零,则 OSPM 正尝试接管与后续 DWORD 中已置位位对应的能力。OSPM 只能按照平台通过查询结果所指示的内容接管相应能力。
位 [1] - 始终清零(0)。
位 [2] - 始终清零(0)。
位 [3] - 始终清零(0)。
所有其他位 - 保留。
返回值信息
Capabilities Buffer(Buffer)- 平台通过返回一个长度相同的 DWORD 缓冲区来确认能力缓冲区。置位的位表示确认 OSPM 可以接管该能力,清零的位表示平台要么不支持该能力,要么 OSPM 不得假定其具有控制权。
能力缓冲区中的第一个 DWORD 用于返回由 _OSC 定义的错误。该 DWORD 必须始终存在,且不得被使用 _OSC 的唯一接口重新定义/重用。
位 [0] - 保留(未使用)
位 [1] - _OSC 失败。平台固件无法处理该请求或查询。能力位可能已被屏蔽。
位 [2] - 无法识别的 UUID。设置该位表示平台固件无法识别通过 Arg0 传入的 UUID。能力位保持不变。
位 [3] - 无法识别的修订版本。设置该位表示平台固件无法识别通过 Arg1 传入的修订 ID。超出固件可理解范围的能力位将被屏蔽。
位 [4] - 能力已被屏蔽。设置该位表示由驱动程序软件置位的能力位已被平台固件清除。
所有其他位 - 保留。
注释
OSPM 不得使用 _OSC 求值的结果来选择兼容的设备驱动程序。OSPM 必须使用 _HID、_CID 或原生可枚举总线设备标识机制来为设备选择适当的驱动程序。
当功能控制的可用性发生变化时,平台可以发出 Notify(device, 0x08) 来通知 OSPM 重新求值 _OSC。然而,平台不得依赖 OSPM 在发出 Notify 之后求值 _OSC 来实现正确运行,因为 OSPM 无法保证存在能够接收并处理该设备 Notify 的目标实体。例如,在发出 Notify 信号时,该设备的设备驱动程序可能尚未加载。此外,对于 Capabilities Buffer 变化通知的发出和处理规则是设备特定的。因此,允许的行为由设备规范来约束:对于 ACPI 定义的设备,见ACPI 定义的设备和设备特定对象;对于其他设备,则见 OEM、IHV 或设备管理机构的设备规范。
允许 _OSC 返回 Capabilities Buffer 中所有位都被清除的结果。一个示例是,禁用基于平台的功能支持需要较长时间。然后平台稍后可以发出 Notify,以告知 OSPM 重新求值 _OSC 来接管原生控制。此行为同样是设备特定的,但也可能依赖于特定的操作系统能力。
通常,平台应支持 OSPM 通过多次调用 _OSC 来获取和放弃对特定功能支持的控制,但所需行为可能因设备而异。
由于平台在进入 S4 睡眠状态时会丢失平台上下文,OSPM 必须在从 S4 唤醒时重新求值 _OSC,以恢复先前的平台状态。此要求将取决于设备特定的 _OSC 功能。
6.2.11.1. _OSC 求值规则
本节定义 OS 必须在何时以及如何求值 _OSC,以及对固件实现的限制。
6.2.11.1.1. 查询标志
如果 OS 在求值 _OSC 时设置了查询支持标志(Capabilities DWORD 1,第 0 位),则固件不得在 _OSC 调用上下文中更改任何硬件设置。强烈建议 OS 在设置查询支持标志的情况下求值 _OSC,直到 _OSC 返回的 Capabilities Masked 位被清除,从而协商要授予 OS 进行原生支持的一组功能;在授予某项功能的原生控制之前,平台可能要求 OS 原生支持某个特定的功能组合。在设置查询标志完成协商后,OS 应在不设置该标志的情况下进行求值,以便任何协商后的值都可以对硬件生效。
6.2.11.1.2. 求值条件
OS 必须在以下条件下求值 _OSC:
在初始化任何为上文所述功能提供原生支持的驱动程序期间。这些功能可以由一个或多个驱动程序支持,但应仅由该层级结构的主总线驱动程序进行求值。辅助驱动程序必须与总线驱动程序协调以安装对这些功能的支持。驱动程序不得放弃先前已获取的功能控制(即,在协商过程之后,Capabilities DWORD3 中已置位的位必须在所有后续协商尝试中保持置位。)
当 Notify(device, 8) 被传递至 PCI 主机桥设备时。
从 S4 恢复时。从 S1-S3 恢复时,平台固件将处理上下文恢复。
6.2.11.1.3. _OSC 调用序列
以下规则适用于发往同一主机桥且发生在同一次启动过程中的 _OSC 调用序列。
OS 可以对 _OSC 进行任意次数的求值。
如果 OS 在一次 _OSC 调用中的 Support Field 中声明支持某项功能,那么它必须在所有后续调用中保持该位的置位状态(声明支持该功能)。
如果 OS 在一次 _OSC 调用中的 Control Field 中被授予某项功能的控制权,那么它必须在所有后续调用中保持该位的置位状态(请求该功能)。
固件不得拒绝其先前已经授予控制权的任何功能。
OS 没有机制可以放弃先前请求并已获授的功能控制权。
6.2.11.2. 平台范围的 OSPM 能力
OSPM 对 \_SB._OSC 进行求值,以向平台传达平台范围的 OSPM 能力。参数定义如下:
Arguments(4) :
Arg0 - UUID (Buffer): 0811B06E-4A27-44F9-8D60-3CBBC22E7B48
Arg1 - Revision ID (Integer): 1
Arg2 - Arg3 中条目的计数 (Integer): 2
Arg3 - DWORD 能力 (Buffer):
* 第一个 DWORD:如第 6.2.11 节所述 * 第二个 DWORD:见下表。
表 6.13 平台范围 _OSC Capabilities DWORD 2
| Bits | Field Name | Definition |
|---|---|---|
| 0 | Processor Aggregator Device Support | 如果 OSPM 支持 Processor Aggregator 设备,如处理器聚合器设备 {add link} 中所述,则设置此位 |
| 1 | _PPC _OST Processing Support | 如果 OSPM 会由于 _PPC 更改通知(Notify 0x80)而对处理器下定义的 _OST 对象进行求值,则设置此位。 |
| 2 | _PR3 Support | 如果 OSPM 支持读取 _PR3 并使用电源资源进行电源切换,则设置此位。请注意,此握手会转换为一种操作模型,即平台和 OSPM 都支持同时包含 D3hot 和 D3 的电源模型。 |
| 3 | Insertion / Ejection _OST Processing Support | 如果 OSPM 在处理插入和弹出源事件代码时会对设备下定义的 _OST 对象进行求值,则设置此位。 |
| 4 | APEI Support | 如果 OSPM 支持 ACPI 平台错误接口,则设置此位。参见 ACPI 平台错误接口 (APEI) {add link} |
| 5 | CPPC Support | 如果 OSPM 支持通过 _CPC 对象中描述的接口控制处理器性能,则设置此位。 |
| 6 | CPPC 2 Support | 如果 OSPM 支持 _CPC 对象的修订版 2,则设置此位。 |
| 7 | Platform Coordinated Low Power Idle Support | 如果 OSPM 支持平台协调的低功耗空闲状态(见下方注释)*,则设置此位。 |
| 8 | OS Initiated Low Power Idle Support | 如果 OSPM 支持 OS 发起的低功耗空闲状态,则设置此位。*(见下方注释)。 |
| 9 | Fast Thermal Sampling support | 如果 OSPM 支持 _TFP,则设置此位。 |
| 10 | Greater Than 16 p-state support | 如果 OSPM 支持超过 16 个 p-state,则设置此位。如果清除,则最多支持 16 个 p-state。 |
| 11 | Generic Event Device support | 如果 OSPM 支持解析通用事件设备,则设置此位。 |
| 12 | Diverse CPPC Highest Optimization Support | 如果 OSPM 能够处理处理器设备关于 CPPC Highest Performance 变化的通知,则设置此位。它还表示支持针对具有不同 Highest Performance 能力的性能域进行优化。针对不同 CPPC 最高性能的潜在 OS 优化包括但不限于:将工作放置在特定逻辑处理器上,从而获得性能或功耗收益。注意:这些优化独立于平台向 OSPM 暴露不同 Highest Performance 的现有能力,以及 OSPM 对 MADT GICC 的 Processor Power Efficiency Class 的支持。 |
| 13 | Interrupt ResourceSource support | 如果 OSPM 支持在扩展中断描述符中使用 ResourceSource,则设置此位。作为通过 _OSC 提供的握手的一部分,平台将向 OS 指示其是否支持使用 ResourceSource。如果未设置,OS 可以选择忽略扩展中断描述符中的 ResourceSource 参数。 |
| 14 | Flexible Address Space for CPPC Registers | 如果 OSPM 支持任何 CPPC 寄存器位于 PCC、SystemMemory、SystemIO 或 Functional Fixed Hardware 地址空间中,则设置此位。如果未设置,则适用 ACPI 规范 6.1 中描述的按寄存器限制。 |
| 15 | GHES_ASSIST Support | 如果 OSPM 支持 HEST Error Structures 中的 GHES_ASSIS Flag,则设置此位。参见 ACPI 平台错误接口 (APEI) {add link} |
| 16 | Multi PCC channel support for CPPC | 当 OSPM 支持用于 CPPC 协议的多个 PCC 通道时,OSPM 设置此位。 |
| 17 | Generic Initiator Support | 如果 OSPM 支持 SRAT 中的 Generic Initiator Affinity Structure,则设置此位。 |
| 18 | Native USB4 Support | OS 设置此位以指示支持 OSPM 原生 USB4 连接管理器,该管理器处理 USB4 连接事件和链路管理。 |
| 19 | Battery Charge Limiting Support | OS 设置此位以指示支持电池充电限制。此位承诺平台将始终向 OSPM 通告“真实”的充电状态。 |
| 20 | PCI BAR Target GAS Support | OS 设置此位以指示支持 PCI BAR Target GAS 结构,如表 5.2所述。 |
| 31:21 | 保留(必须为 0) |
注
- 作为通过 _OSC 提供的握手的一部分,OS 将通过标志 7 和 8 传入标志,以指示其是否支持平台协调的低功耗空闲或 OS 发起的低功耗空闲,或两者都支持(见第 8.4.4.2 节)。平台将在其响应中通过清除不支持的标志来指示其支持哪种模式。如果两者都支持,则默认是平台协调模式,且 OSPM 可以通过处理器体系结构特定机制将平台切换到 OS 发起模式。通过设置标志 7 或 8 中的任意一个或两个,OSPM 断言其支持任何与低功耗空闲状态相关联的对象(见第 8.4.4.3 节、表 8.16和第 7.2.5 节),并且支持处理器容器设备。
返回值信息
Capabilities Buffer (Buffer) - 平台通过返回一个长度相同的 DWORD 缓冲区来确认 Capabilities Buffer。置位的位表示已确认,清除的位表示平台不支持该能力。
6.2.11.3. 用于 USB 的操作系统能力(_OSC)
支持 USB4 的平台硬件和操作系统需要一些控制来回传递信息。以下定义用于传达这些信息。
连同第 6.2.11.2 节中定义的平台范围 OSPM 能力一起,此 _OSC 接口在同一作用域内实现,因此也使用同一个 _OSC Control Method,但使用不同的 UUID 值。如果平台不支持 USB4,则不应支持本节定义的 UUID。
请注意,如果表 6.15 中描述的任何功能的控制权被授予 OSPM,则系统固件不得尝试控制任何其他未授予 OSPM 的功能;在任何时刻只允许有一个连接管理器处于活动状态。OSPM 对 \_SB._OSC 进行求值,以管理平台内的 USB 能力。参数定义如下。
Arguments (4):
Arg0 – UUID (Buffer): 23A0D13A-26AB-486C-9C5F-0FFA525A575A
Arg1 – Revision ID (Integer): 1
Arg2 – Arg3 中条目的数量(双字)(Integer):3
Arg3 – 双字能力缓冲区:
第一个双字:如第 6.2.11.1 节所述
第二个双字:USB 的 OSPM 支持字段。详见表 6.14。
第三个双字:USB 的 OSPM 控制字段。详见表 6.15。
注:OSPM 必须在 S4 恢复期间重新调用 _OSC。
表 6.14 OSPM USB 支持字段
| 位 | 字段名称 | 定义 |
|---|---|---|
| 31:0 | 保留 |
表 6.15 OSPM USB 控制字段
| 位 | 字段名称 | 定义 |
|---|---|---|
| 0 | USB 隧道传输 | OSPM 通过 OSPM 原生连接管理器请求控制跨 USB4 连接的 USB 隧道传输。一旦 OSPM 获得对此功能的控制权,就不得将控制权交还给平台。 |
| 1 | DisplayPort 隧道传输 | OSPM 通过 OSPM 原生连接管理器请求控制跨 USB4 连接的 DisplayPort 隧道传输。一旦 OSPM 获得对此功能的控制权,就不得将控制权交还给平台。 |
| 2 | PCI Express 隧道传输 | OSPM 通过 OSPM 原生连接管理器请求控制跨 USB4 连接的 PCI Express 隧道传输。一旦 OSPM 获得对此功能的控制权,就不得将控制权交还给平台。 |
| 3 | 跨域 USB4 协议 | OSPM 通过 OSPM 原生连接管理器请求控制跨域 USB4 连接。一旦 OSPM 获得对此功能的控制权,就不得将控制权交还给平台。 |
| 31:4 | 保留 |
返回值信息
能力缓冲区(Buffer):平台通过返回一个长度相同的双字缓冲区来确认该能力缓冲区。控制字段中保留为 1 的位表示平台向 OSPM 移交控制权,而控制字段中被屏蔽/清除的位表示平台不允许 OSPM 控制相应的能力或特性。