2.1 PCI Header
下面表格是截取自 AHCI Spec,主要是介绍 PCI header 的每个字段的具体含义,根据获取这个 header 的数据可以来解析这个 HBA 的具体的配置。不同字段的各个值的含义,可以参考AHCI spec HBA Configuration Registers 章节。本文主要是介绍几个重要的字段。
PCI Header:
额外介绍一下对于不同字段寄存器的属性设置:
- RO---只读
- RW---可读可写
- RWC---可读可写,通过写入 1 可以置 0
- RW1---可读可写,通过写入 1 来置起
- Impl. Spec ---特定于实现——HBA可以自由选择其实现
- HwInit---默认状态取决于设备和系统配置。
该值在重置时初始化,可以由扩展ROM初始化,或者在集成设备的情况下,由平台BIOS初始化。
Offset 00h: ID - Identifiers
由厂商设置分配不同设备不同的设备编号;
Offset 06h: STS - Device Status
标识当前 HBA 的状态,用于检测当前 device 是否有错误产生,以及 HBA 的操作频率等信息。
Offset 09h: CC - Class Code
类型码,可以根据这个字段的值来获取 device 的具体类型,也可以看出 HBA 其实也就是个 PCI 设备。
当是一个 SATA 设备时,class code 应该是 01h,sub class 应该是 06h;
对于支持RAID的 HBA,Sub Class Code复位值应该是04h,Programming Interface复位值应该是00h。
Offset 0Fh: BIST – Built In Self Test (Optional)
这是一个可选的功能,用于指示 HBA 是否支持 BIST 的功能以及 BIST 的状态。
Offset 24h: ABAR – AHCI Base Address
用来指示 HBA 在系统内存的内存类型,以及基地址,后面会介绍的HBA memory registers 就是在这个基地址的基础上加上 offset 来获取寄存器的值的。必须为ABAR分配足够的空间,以容纳全局AHCI寄存器、每个端口特定于端口的寄存器以及任何特定于供应商的空间(如果需要)。
Offset 30h: EROM – Expansion ROM (Optional)
若是 HBA 有自己的扩展 ROM 的话,需要这个字段来获取扩展 ROM 的基地址。
标签:ROM,AHCI,HBA,---,PCI,Offset From: https://blog.csdn.net/JUSTIN_TYL/article/details/137519170