HBA Memory Registers
内存寄存器位于不可缓存的内存区域,切每次访问不能超过 64bit。寄存器分为两类:一是 Global Register,二是 Port Register。前者用于控制整个 HBA 的功能支持信息,后者是对于 HBA 的 port 的状态与功能信息。
Generic Host Control
用于控制 HBA 对于软件功能支持、中断、通信机制、HBA 重启、队列控制、 AHCI 版本号、以及其他扩展功能等。具体的寄存器的值的含义需要查看对应的章节。
Port Registers (one set per port)
HBA 最重要的寄存器部分,直接控制 Port 与 ATA device 的交互。基地址是PCI Header 中的 AHCI base address。每个 Port 的长度是固定的 80 h.
Port 0 开始于100h, port 1 开始于 180h, port 2 开始于 200h, port 3开始于280h, etc. Offset 计算公式如下:
Port offset = 100h + (PI Asserted Bit Position * 80h)
Offset 00h: PxCLB – Port x Command List Base Address
保存 Command List的32位基本物理地址。在获取要执行的命令时需要获取这个基地址。该地址范围所指向的结构长度为1k字节。这个地址必须是1k字节对齐,由位09:00表示为只读。
若是支持 64 位地址的 Command LIst,则需要和Offset 04h: PxCLBU(Port x Command List Base Address Upper 32-bits)一同使用获取 Command.
Offset 08h: PxFB – Port x FIS Base Address
用于获取需要传输的 FIS 数据块的物理地址,这个地址是位于系统内存中的。若是支持 64 位地址 FIS,则与Offset 0Ch: PxFBU (Port x FIS Base Address Upper 32-bits)一起使用。
Offset 28h: PxSSTS – Port x Serial ATA Status (SCR0: SStatus)
这个32位寄存器传递 Port 和 ATA 设备 的当前状态。通过读取这个寄存器,可以获取当前 Port 连接到的设备的具体状态,是否连接建立,以及接口速度等等。 HBA持续异步更新它。当HBA发送一个COMRESET到设备时,这个寄存器被更新为它的重置值。
Offset 2Ch: PxSCTL – Port x Serial ATA Control (SCR2: SControl)
32位读写寄存器,软件通过它控制SATA功能。对该寄存器的写入将导致host adapter或接口采取操作。从寄存器中读取返回最后写入的值。
Offset 30h: PxSERR – Port x Serial ATA Error (SCR1: SError)
这个寄存器包含诊断错误信息,供诊断软件用于验证正确操作或隔离故障模式。
Offset 40h: PxFBS: Port x FIS-based Switching Control
主要用于控制Port Multiplier 的交换状态,以及获取状态信息。