本文参考PCIe协议 5.0:https://download.youkuaiyun.com/download/zz2633105/89204842
PCIe配置空间
Bridge标准配置空间
Vendor ID Register (Offset 00h)
PCIe设备厂商ID,比如Intel的Vendor ID通常是0x8086。需要注意的是,厂商的ID不是厂商随意定的,而是由厂商花钱申请的,已申请PCIe厂商ID可以通过网址查询。
Device ID Register (Offset 02h)
PCIe设备ID,需要厂商自定义,通常用来区分不同种类的设备。在系统中,一般通过厂商ID(Vendor ID)和设备ID(Device ID)来加载驱动,较复杂的设备还可能借助子系统ID(Subsystem ID)和子系统厂商ID(Subsystme Vendor ID)。
Command Register (Offset 04h)
该寄存器为PCI设备的命令寄存器,在初始化时,其值为0,此时这个PCIe设备除了能够接受配置请求总线事务之外,不能接收任何存储器或I/O请求。系统软件需要合理设置该寄存器之后,才能访问该设备的存储器或者I/O空间。在linux系统中,设备驱动程序调用pci_enable_device函数,使能该寄存器的I/O和Memory Space位之后,才能访问该设备的存储器或者I/O地址空间。
说明
bit | 功能 |
---|---|
0 | I/O Space Bit,该Bit表示PCIe设备是否响应I/O请求,为1时响应,为0时不响应。如果PCIe设备支持I/O地址空间,系统软件会将该Bit置1,复位值为0。 |
1 | Memory Space Bit,该Bit表示PCIe设备是否响应内存请求(Memory Read/Write),为1时响应,为0时不响应。如果PCIe设备支持内存空间,系统软件会将Bit置1,复位值为0。 |
2 | Bus Master Bit,对于EP,该Bit表示PCIe设备是否可以主动发起I/O和内存请求,为1时表示可以,为0时表示不可以,复位时为0。 对于Bridge,该Bit除了表示自身是否可以主动发起I/O和内存请求外,还可以控制Bridge是否转发下行端口的I/O和存储器请求到上行端口。若该Bit为0,则拒绝转发下行端口的I/O和内存请求,并对Non-Posted请求给予回复UR(Unsupported Requests),Posted请求丢弃。 |
3 | Special Cycle Enable,该BIt为PCI设备特有的。对于PCIe设备,该Bit无意义,必须硬连接到0 b。 |
4 | Memory Write and Invalidate,该BIt为PCI设备特有的。对于PCIe设备,该Bit无意义,必须硬连接到0 b。 |
5 | VGA Palette Snoop,该BIt为PCI设备特有的。对于PCIe设备,该Bit无意义,必须硬连接到0 b。 |
6 | Parity Error Response,复位值为0,当PCIe报文传输过程中出现奇偶校验错误时,该Bit为0,则只会将Status寄存器的Detected Parity Error bit置1,该Bit为1,则即将Status寄存器的Detected Parity Error bit置1,又将Status寄存器的Master Data Parity Error bit置1。 |
7 | IDSEL Stepping/Wait Cycle Control,该BIt为PCI设备特有的。对于PCIe设备,该Bit无意义,必须硬连接到0 b。 |
8 | SERR# Enable,复位值为0。该Bit为1时,当PCIe设备出现错误,则允许发送Messages报文上报错误,具体的错误类型上报还需要看PCI Express Capability 的Device Control Register 寄存器。 |
9 | Fast Back-to-Back Transactions Enable,该BIt为PCI设备特有的。对于PCIe设备,该Bit无意义,必须硬连接到0 b。 |
10 | Interrupt Disable,控制PCIe生成INTx中断的能力。置位为1时,禁止PCIe产生INTx中断。需要注意的是,PCIe设备取消了INTx中断线,改成Message方式上报INTx中断。对于Bridge,该BIt只会影响自身产生中断,不会影响中断转发。 |
Status Register (Offset 06h)
该寄存器绝大多数位都是只读位,保存PCIe设备状态。
bit | 功能 |
---|---|
0 | Immediate Readiness,可选位,当该Bit为1时,表示该function可以随时响应有效的配置请求。比如对某个function执行FLR(function层面复位)操作,正常情况下,主机应至少等待100ms才能发出配置请求访问这个function,但该Bit置1的话,主机便可立即访问该function。 |
3 | Interrupt Status,复位值为0,只读Bit,当该Bit为1时,表示有一个INTx传统中断在设备内部挂起。驱动程序很少使用该Bit判断是否有中断未处理,大多数是采用BAR空间中自定义Bit来确定某个中断是否pending。 |
4 | Capabilities List,只读Bit,为1时表示Capability Pointer寄存器中值有效,对于PCIe设备,必需实现PCI Express Capability,因此,该BIt需要硬连线置1。 |
5 | 66 MHz Capable,该BIt为PCI设备特有的。对于PCIe设备,该Bit无意义,必须硬连接到0 b。 |
7 | Fast Back-to-Back Transactions Capable,该BIt为PCI设备特有的。对于PCIe设备,该Bit无意义,必须硬连接到0 b。 |
8 | Master Data Parity Error,复位值为0,如果 Comand 寄存器的 Parity Error Response 为 0,那么该位在任何情况下都是 0。若该Bit为1,则: 对于EP,表示接收到Poisoned Completion TLP或者发送了Poisoned Request TLP。 对于Bridge,表示从下游(Downstream)收到Poisoned Completion TLP或者向上游(Upstream)发送了Poisoned Request TLP。 |
10:9 | DEVSEL Timing,为PCI设备特有的。对于PCIe设备,该字段无意义,必须硬连线到00 b。 |
11 | Signaled Target Abort,复位值为0,设备收到 Posted 或者 Non-Posted 请求后,如果对该请求产生一个 Completer Abort Error,则将该Bit置为 1。如果收到的是 Non-Posted 请求,则设备需要向请求端回复一个带 Completion Abort Completion Status 的 Completion。 |
12 | Received Target Abort,该Bit写1清除,复位值为0,置1时,表示设备收到带有 Completer Abort Completion Status 的 Completion。 |
13 | Received Master Abort,该Bit写1清除,复位值为0,置1时,表示设备收到带有 Unsupported Request Completion Status 的 Completion。 |
14 | Signaled System Error,该Bit写1清除,复位值为0,在 Command 寄存器的 SERR# Enable 位设置为 1 的前提下,如果设备发送过 ERR_FATAL 或者 ERR_NONFATAL 消息,那么会将该位置为 1。 |
15 | Detected Parity Error, 该位的设置不受 Command 寄存器的 Parity Error Response 位的影响。 对于EP,设备收到 Poisoned TLP 时会将该位置 1。 对于Bridge,当它从上游(Primary )侧收到 Poisoned TLP 时,会将该位置 1。 |
Revision ID Register (Offset 08h)
修订ID寄存器存放硬件修订标识符,值由厂商自定义。一般系统会使用设备ID、厂商ID、修订ID来决定加载哪个驱动程序。厂商必须确保所选择的值不会导致使用不兼容的设备驱动程序。
Class Code Register (Offset 09h)
设备分类信息寄存器, 只读,表示PCIe设备属于哪一种类别,如网卡,存储卡,显卡等,是需要重点关注的一个寄存器。
Base Class Code
Base Class Code | Description |
---|---|
0x00 | Unclassified device |
0x01 | Mass storage controller |
0x02 | Network controller |
0x03 | Display controller |