9.9. ATA 控制器设备
ATA 控制器有两种类型:IDE 控制器(也称为 ATA 控制器)和 Serial ATA (SATA) 控制器。IDE 控制器是使用传统 IDE 编程接口的控制器,并且可能支持 Parallel ATA (P-ATA) 或 SATA 连接。SATA 控制器可能被设计为仅在仿真模式下运行、仅在原生模式下运行,或者也可能被设计为同时支持原生和非原生 SATA 模式。无论支持哪种模式,SATA 控制器都被设计为仅与支持 Serial ATA 物理接口的驱动器一起工作。如下所述,SATA 控制器与传统 IDE 控制器的处理方式相似,但并不完全相同。
包含支持原生和非原生 SATA 模式的控制器的平台,必须采取措施以确保在其运行模式对应的命名空间中放置正确的对象。
表 9.4 ATA 特定对象
| 对象 | 描述 | 控制器类型 |
|---|---|---|
| _GTF | 返回将驱动器重新初始化为启动默认值所需的 ATA task file 的可选对象。 | 两者 |
| _GTM | 返回 IDE 控制器时序信息的可选对象。 | 仅 IDE |
| _STM | 设置 IDE 控制器传输时序设置的可选控制方法。 | 仅 IDE |
| _SDD | 通知平台端口上所连接设备类型的可选控制方法。 | 仅 SATA |
9.9.1. ATA 和 SATA 控制器共用的对象
9.9.1.1. _GTF(获取任务文件)
此可选对象返回一个缓冲区,其中包含用于将驱动器恢复到启动默认值(即 POST 后驱动器状态)的 ATA 命令。返回的缓冲区是一个数组,数组中的每个元素由七个 8 位寄存器值(56 位)组成,对应于 ATA 任务寄存器 1F1 到 1F7。数组中的每个条目定义了一个发送到驱动器的命令。
参数:
无
返回值:
一个缓冲区,包含该驱动器的 ATA 命令字节流
此对象可以出现在 SATA 端口设备对象下,也可以出现在 IDE 通道对象下。
ATA 任务文件数组定义:
命令 1 的七个寄存器值
- 寄存器值:(1F1, 1F2, 1F3, 1F4, 1F5, 1F6, 1F7)
命令 2 的七个寄存器值
- 寄存器值:(1F1, 1F2, 1F3, 1F4, 1F5, 1F6, 1F7)
命令 3 的七个寄存器值
- 寄存器值:(1F1, 1F2, 1F3, 1F4, 1F5, 1F6, 1F7)
依此类推。
在给驱动器上电后,OSPM 将按指定顺序把这些命令发送给驱动器。在 SATA HBA 上,OSPM 在计算 _GTF 之前先计算 _SDD。IDE 驱动程序在将命令发送到驱动器之前,可能会修改某些特性命令或附加其自己的命令,以便更好地针对 OSPM 功能优化驱动器。
此控制方法列在每个驱动器设备对象下。OSPM 在计算 _GTF 对象之前,必须先计算 _STM 对象或 _SDD 对象。
_GTF 返回值示例:
Method(_GTF, 0x0, NotSerialized)
{
Return(GTF0)
}
Name(GTF0, Buffer(0x1c)
{
0x03, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xef, 0x03, 0x00, 0x00, 0x00, 0x00,
0xa0, 0xef, 0x00, 0x10, 0x00, 0x00, 0x00, 0xa0, 0xc6, 0x00, 0x00, 0x00,
0x00, 0x00, 0xa0, 0x91
}
9.9.2. IDE 控制器设备
大多数设备驱动程序都可以保存和恢复其设备的寄存器。对于 IDE 控制器和驱动器,情况并非如此,因为有若干驱动器设置 ATA 并未提供读取机制。此外,对于设置 IDE 控制器时序信息也没有业界标准。正因如此,需要 ACPI 接口机制向操作系统提供有关驱动器和通道当前设置的信息,并用于设置通道时序。
在关闭 IDE 子系统电源时,OSPM 和 IDE 驱动程序将遵循以下步骤:
IDE 驱动程序将调用 _GTM 控制方法以获取 IDE 通道当前的传输时序设置。这包括 DMA 和 PIO 模式信息。
IDE 驱动程序将调用标准 OS 服务,为驱动器和通道断电。
因此,OSPM 将执行适当的 _PS3 方法并关闭不需要的电源资源。
在为 IDE 子系统上电时,OSPM 和 IDE 驱动程序将遵循以下步骤:
IDE 驱动程序将调用标准 OS 服务,打开驱动器和通道电源。
因此,OSPM 将执行适当的 _PS0 方法并开启所需的电源资源。
IDE 驱动程序将调用 _STM 控制方法,传入通道的传输时序设置,以及该通道上每个驱动器的 ATA 驱动器 ID 块。_STM 控制方法将基于这些信息配置 IDE 通道。
对于 IDE 通道上的每个驱动器,IDE 驱动程序将运行 _GTF,以确定将每个驱动器重新初始化到启动默认值所需的 ATA 命令。
IDE 驱动程序将通过把这些 ATA 命令发送到驱动器来完成驱动器初始化,并可能根据操作系统支持的功能修改或添加命令。
以下显示了这些对象的命名空间:
\_SB // System bus
PCI0 // PCI bus
IDE1 // First IDE channel
_ADR // Indicates address of the channel on the PCI bus
_GTM // Control method to get current IDE channel settings
_STM // Control method to set current IDE channel settings
_PR0 // Power resources needed for D0 power state
DRV1 // Drive 0
_ADR // Indicates address of master IDE device
_GTF // Control method to get task file
DRV2 // Drive 1
_ADR // Indicates address of slave IDE device
_GTF // Control method to get task file
IDE2 // Second IDE channel
_ADR // Indicates address of the channel on the PCI bus
_GTM // Control method to get current IDE channel settings
_STM // Control method to set current IDE channel settings
_PR0 // Power resources needed for D0 power state
DRV1 // Drive 0
_ADR // Indicates address of master IDE device
_GTF // Control method to get task file
DRV2 // Drive 1
_ADR // Indicates address of slave IDE device
_GTF // Control method to get task file
操作的顺序如下:
断电
调用 _GTM。
为驱动器断电(调用 _PS3 方法并关闭电源平面)。
上电
为驱动器上电(如果存在则调用 _PS0 方法并开启电源平面)。
调用 _STM,传入来自 _GTM 的信息(可能已修改),并附带每个驱动器的 ID 数据。
初始化通道。
可以修改 _GTF 的结果。
对于每个驱动器:
– 调用 _GTF。
– 执行任务文件(可能已修改)。
9.9.2.1. IDE 控制器专用对象
9.9.2.1.1. _GTM(获取时序模式)
此控制方法存在于每个通道设备对象下,并返回 IDE 通道的当前设置。
参数:
无
返回值:
一个缓冲区,包含当前 IDE 通道时序信息块,如下方 GTM 方法结果代码表所述。
_GTM 返回一个具有以下格式的缓冲区
Buffer (){
PIO Speed 0 //DWORD
DMA Speed 0 //DWORD
PIO Speed 1 //DWORD
DMA Speed 1 //DWORD
Flags //DWORD
}
表 9.5 GTM 方法结果代码
| 字段 | 格式 | 描述 |
|---|---|---|
| PIO 速度 0 | DWORD | 驱动器 0 的 PIO 总线周期时序,单位为纳秒。0xFFFFFFFF 表示该通道不支持此模式。如果芯片组不能为每个驱动器独立设置时序参数,则此字段表示两个驱动器的时序。 |
| DMA 速度 0 | DWORD | 驱动器 0 的 DMA 总线周期时序,单位为纳秒。如果 Flags 寄存器的位 0 被置位,则该 DMA 时序用于 UltraDMA 模式;否则该时序用于多字 DMA 模式。0xFFFFFFFF 表示该通道不支持此模式。如果芯片组不能为每个驱动器独立设置时序参数,则此字段表示两个驱动器的时序。 |
| PIO 速度 1 | DWORD | 驱动器 1 的 PIO 总线周期时序,单位为纳秒。0xFFFFFFFF 表示该通道不支持此模式。如果芯片组不能为每个驱动器独立设置时序参数,则此字段必须为 0xFFFFFFFF。 |
| DMA 速度 1 | DWORD | 驱动器 1 的 DMA 总线周期时序,单位为纳秒。如果 Flags 寄存器的位 0 被置位,则该 DMA 时序用于 UltraDMA 模式;否则该时序用于多字 DMA 模式。0xFFFFFFFF 表示该通道不支持此模式。如果芯片组不能为每个驱动器独立设置时序参数,则此字段必须为 0xFFFFFFFF。 |
| Flags | DWORD | 模式标志 位 [0]:1 表示驱动器 0 使用 UltraDMA 位 [1]:1 表示驱动器 0 使用 IOChannelReady 位 [2]:1 表示驱动器 1 使用 UltraDMA 位 [3]:1 表示驱动器 1 使用 IOChannelReady 位 [4]:1 表示芯片组可以为每个驱动器独立设置时序 位 [31:5]:保留(必须为 0) |
9.9.2.1.2. _STM(设置时序模式)
此控制方法将 IDE 通道的传输时序设置为请求的设置。AML 代码必须将纳秒时序转换并设置为 IDE 控制器相应的传输模式设置。_STM 还可以进行调整,以便 _GTF 控制方法针对当前通道设置返回正确的命令。
此控制方法接受三个参数:通道时序信息(如表 9-6 所述),以及通道上每个驱动器的 ATA 驱动器 ID 块。不能保证该通道时序信息与 _GTM 返回的值相同;OS 可以根据需要调整这些值。
参数:(3)
Arg0 - 一个缓冲区,包含通道时序信息块(如表 9-6 所述)
Arg1 - 一个缓冲区,包含通道 0 的 ATA 驱动器 ID 块
Arg2 - 一个缓冲区,包含通道 1 的 ATA 驱动器 ID 块
返回值:
无
ATA 驱动器 ID 块是“识别驱动器 ATA”命令返回的原始数据,该命令的命令代码为 “0ECh”。_STM 控制方法负责修正那些错误报告其时序信息的驱动器。
9.9.3. 串行 ATA(SATA)控制器设备
9.9.3.1. 定义
HBA
主机总线适配器
原生 SATA 感知
指能够理解特定 SATA HBA 实现并理解其编程接口和电源管理行为的系统软件(平台固件、选件 ROM、操作系统等)。
非原生 SATA 感知
指不能理解特定 SATA HBA 实现,也不理解其编程接口或电源管理行为的系统软件(平台固件、选件 ROM、操作系统等)。通常,非原生 SATA 感知软件将使用 SATA HBA 的仿真接口(例如任务文件寄存器)来控制 HBA 并访问其设备。
仿真模式
SATA HBA 支持的可选模式。允许非原生 SATA 感知软件通过传统任务文件寄存器访问 SATA 设备。
原生模式
SATA HBA 支持的可选模式。允许原生 SATA 感知软件通过 HBA 专用寄存器访问 SATA 设备。
混合设备
指同时实现仿真编程接口和原生编程接口的 SATA HBA。
9.9.3.2. 概述
SATA HBA 在多个方面不同于 IDE 控制器。首先,它可以保存其完整的设备上下文。其次,它用端口取代了 IDE 通道;IDE 通道最多可支持 2 个连接的设备,而端口只支持单个连接设备,除非存在端口倍增器。有关更多信息,请参见“ACPI 相关文档的链接”中的 SATA 规范( http://uefi.org/acpi ),其标题为 “SATA 规范”。最后,SATA 不需要来自平台的时序信息,这使得在 ACPI 中表示 SATA 控制器的方式得以简化。(_GTM 和 _STM 被更简单的 _SDD 方法取代。)
所有端口,即使是通过端口倍增器连接的端口,也都表示为 SATA 控制器设备下的直接子对象。这是可行的,因为 SATA 规范不允许将端口倍增器连接到另一个端口倍增器。每个端口的 _ADR 指示其连接到哪个根端口,以及端口倍增器位置(如果适用)(参见表 6.2)
由于本规范仅涵盖主板设备的配置,因此本节中定义的控制方法也不能用于向通过附加 SATA HBA 连接的设备发送任务文件;如果主板 SATA HBA 与不在主板上的端口倍增器一起使用,也不能用于向通过该主板 SATA HBA 连接的设备发送任务文件。
以下显示了一个 SATA 命名空间示例:
\_SB - System bus
PCI0 - PCI bus
SATA - SATA Controller device
ADR - Indicates address of the controller on the PCI bus
PR0 - Power resources needed for D0 power state
PRT0 - Port 0 device
_ADR - Indicates physical port and port multiplier topology
_SDD - Identify information for drive attached to this port
_GTF - Control method to get task file
PRTn - Port n device
_ADR - Indicates physical port and port multiplier topology
_SDD - Identify information for drive attached to this port
_GTF - Control method to get task file
9.9.3.3. SATA 控制器特定的控制方法
为了确保 OSPM、固件以及连接到 SATA 控制器的设备之间能够正确交互,要求 OSPM 在某些事件发生时执行 _SDD 和 _GTF 控制方法。OSPM 对事件的响应必须如下:
COMRESET、初始 OS 加载、设备插入、HBA 从 D3 到 D0 的转换、异步信号丢失:
OSPM 向所连接设备发送 IDENTIFY DEVICE 或 IDENTIFY PACKET DEVICE 命令。
OS 执行 _SDD。_SDD 控制方法需要 1 个参数,该参数由主机发出的 IDENTIFY DEVICE 或 IDENTIFY PACKET DEVICE 命令从所连接设备接收到的数据块组成。
在 _SDD 方法完成后,OS 执行 _GTF 方法。OS 随后使用 _GTF 提供的任务文件信息,将 _GTF 任务文件发送到所连接设备。
设备移除以及 HBA 从 D0 到 D3 的转换:
- 不需要 OSPM 操作。
9.9.3.3.1. _SDD(设置设备数据)
此可选对象是一个控制方法,用于向平台传达连接到该端口的设备类型。_SDD 对象可以存在于 SATA 端口设备对象之下。平台通常使用 _SDD 对象传达的信息来构造 _GTF 对象返回的值。
OSPM 向平台传达 ATA 驱动器 ID 块,即 Identify (Packet) Device ATA 命令(命令代码 “0ech.”)返回的原始数据。更多详细信息请参见 ATA/ATAPI-6 规范。
参数:(1)
Arg0 - 一个 Buffer,包含 ATA 驱动器识别块,其内容由 ATA 规范描述
返回值:
无