【PCI】PCIe EP标准配置空间(十)

本文参考PCIe协议 5.0:https://download.csdn.net/download/zz2633105/89204842

PCIe配置空间

EP标准配置空间

在这里插入图片描述

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功能
0I/O Space Bit,该Bit表示PCIe设备是否响应I/O请求,为1时响应,为0时不响应。如果PCIe设备支持I/O地址空间,系统软件会将该Bit置1,复位值为0。
1Memory Space Bit,该Bit表示PCIe设备是否响应内存请求(Memory Read/Write),为1时响应,为0时不响应。如果PCIe设备支持内存空间,系统软件会将Bit置1,复位值为0。
2Bus 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请求丢弃。
3Special Cycle Enable,该BIt为PCI设备特有的。对于PCIe设备,该Bit无意义,必须硬连接到0 b。
4Memory Write and Invalidate,该BIt为PCI设备特有的。对于PCIe设备,该Bit无意义,必须硬连接到0 b。
5VGA Palette Snoop,该BIt为PCI设备特有的。对于PCIe设备,该Bit无意义,必须硬连接到0 b。
6Parity 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。
7IDSEL Stepping/Wait Cycle Control,该BIt为PCI设备特有的。对于PCIe设备,该Bit无意义,必须硬连接到0 b。
8SERR# Enable,复位值为0。该Bit为1时,当PCIe设备出现错误,则允许发送Messages报文上报错误,具体的错误类型上报还需要看PCI Express Capability 的Device Control Register 寄存器。
9Fast Back-to-Back Transactions Enable,该BIt为PCI设备特有的。对于PCIe设备,该Bit无意义,必须硬连接到0 b。
10Interrupt Disable,控制PCIe生成INTx中断的能力。置位为1时,禁止PCIe产生INTx中断。需要注意的是,PCIe设备取消了INTx中断线,改成Message方式上报INTx中断。对于Bridge,该BIt只会影响自身产生中断,不会影响中断转发。

Status Register (Offset 06h)

该寄存器绝大多数位都是只读位,保存PCIe设备状态。

在这里插入图片描述

bit功能
0Immediate Readiness,可选位,当该Bit为1时,表示该function可以随时响应有效的配置请求。比如对某个function执行FLR(function层面复位)操作,正常情况下,主机应至少等待100ms才能发出配置请求访问这个function,但该Bit置1的话,主机便可立即访问该function。
3Interrupt Status,复位值为0,只读Bit,当该Bit为1时,表示有一个INTx传统中断在设备内部挂起。驱动程序很少使用该Bit判断是否有中断未处理,大多数是采用BAR空间中自定义Bit来确定某个中断是否pending。
4Capabilities List,只读Bit,为1时表示Capability Pointer寄存器中值有效,对于PCIe设备,必需实现PCI Express Capability,因此,该BIt需要硬连线置1。
566 MHz Capable,该BIt为PCI设备特有的。对于PCIe设备,该Bit无意义,必须硬连接到0 b。
7Fast Back-to-Back Transactions Capable,该BIt为PCI设备特有的。对于PCIe设备,该Bit无意义,必须硬连接到0 b。
8Master 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:9DEVSEL Timing,为PCI设备特有的。对于PCIe设备,该字段无意义,必须硬连线到00 b。
11Signaled Target Abort,复位值为0,设备收到 Posted 或者 Non-Posted 请求后,如果对该请求产生一个 Completer Abort Error,则将该Bit置为 1。如果收到的是 Non-Posted 请求,则设备需要向请求端回复一个带 Completion Abort Completion Status 的 Completion。
12Received Target Abort,该Bit写1清除,复位值为0,置1时,表示设备收到带有 Completer Abort Completion Status 的 Completion。
13Received Master Abort,该Bit写1清除,复位值为0,置1时,表示设备收到带有 Unsupported Request Completion Status 的 Completion。
14Signaled System Error,该Bit写1清除,复位值为0,在 Command 寄存器的 SERR# Enable 位设置为 1 的前提下,如果设备发送过 ERR_FATAL 或者 ERR_NONFATAL 消息,那么会将该位置为 1。
15Detected 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 CodeDescription
0x00Unclassified device
0x01Mass storage controller
0x02Network controller
0x03Display controller
0x04Multimedia device
0x05Memory Controller
0x06Bridge Device
0x07Simple communications controllers
0x08Base system peripherals
0x09Inupt devices
0x0ADocking Stations
0x0BProcessorts
0x0CSerial bus controllers
0x0DWireless controller
0x0EIntelligent controller
0x0FSatellite communications controller
0x10Encryption controller
0x11Signal processing controller
0x12Processing accelerators
0x13Non-Essential Instrumentation
0x40Coprocessor
0xFFUnassigned class
Sub Class Code & Programming Interface
Unclassified device(0x00)
Sub Class CodeDescription
0x00Non-VGA unclassified device
0x01VGA compatible unclassified device
0x05Image coprocessor
Mass storage controller(0x01)
Sub Class CodeDescriptionProgramming Interface & Description
0x00SCSI storage controllerN/A
0x01IDE interface0x00 ISA Compatibility mode-only controller
0x05 PCI native mode-only controller
0x0a ISA Compatibility mode controller, supports both channels switched to PCI native mode
0x0f PCI native mode controller, supports both channels switched to ISA compatibility mode
0x80 ISA Compatibility mode-only controller, supports bus mastering
0x85 PCI native mode-only controller, supports bus mastering
0x8a ISA Compatibility mode controller, supports both channels switched to PCI native mode, supports bus mastering
0x8f PCI native mode controller, supports both channels switched to ISA compatibility mode, supports bus mastering
0x02Floppy disk controllerN/A
0x03IPI bus controllerN/A
0x04RAID bus controllerN/A
0x05ATA controller0x20 ADMA single stepping
0x30 ADMA continuous operation
0x06SATA controller0x00 Vendor specific
0x01 AHCI 1.0
0x02 Serial Storage Bus
0x07Serial Attached SCSI controller0x01 Serial Storage Bus
0x08Non-Volatile memory controller0x01 NVMHCI
0x02 NVM Express
0x09Universal Flash Storage controller0x00 Vendor specific
0x01 UFSHCI
0x80Mass storage controllerN/A
Network controller(0x02)
Sub Class CodeDescriptionProgramming Interface & Description
0x00Ethernet controllerN/A
0x01Token ring network controllerN/A
0x02FDDI network controllerN/A
0x03ATM network controllerN/A
0x04ISDN controllerN/A
0x05WorldFip controllerN/A
0x06PICMG controllerN/A
0x07Infiniband controllerN/A
0x08Fabric controllerN/A
0x80Network controllerN/A
Display controller(0x03)
Sub Class CodeDescriptionProgramming Interface & Description
0x00VGA compatible controller0x00 VGA controller
0x001 8514 controller
0x01XGA compatible controllerN/A
0x023D controllerN/A
0x80Display controllerN/A
Multimedia controller(0x04)
Sub Class CodeDescriptionProgramming Interface & Description
0x00Multimedia video controllerN/A
0x01Multimedia audio controllerN/A
0x02Computer telephony deviceN/A
0x03Audio deviceN/A
0x80Multimedia controllerN/A
Memory controller(0x05)
Sub Class CodeDescriptionProgramming Interface & Description
0x00RAM memoryN/A
0x01FLASH memoryN/A
0x02CXL0x00 CXL Memory Device - vendor specific
0x10 CXL Memory Device (CXL 2.x)
0x80Memory controllerN/A
Bridge(0x06)
Sub Class CodeDescriptionProgramming Interface & Description
0x00Host bridgeN/A
0x01ISA bridgeN/A
0x02EISA bridgeN/A
0x03MicroChannel bridgeN/A
0x04PCI bridge0x00 Normal decode
0x01 Subtractive decode
0x05PCMCIA bridgeN/A
0x06NuBus bridgeN/A
0x07CardBus bridgeN/A
0x08RACEway bridge0x00 Transparent mode
0x01 Endpoint mode
0x09Semi-transparent PCI-to-PCI bridge0x40 Primary bus towards host CPU
0x80 Secondary bus towards host CPU
0x0aInfiniBand to PCI host bridgeN/A
0x80BridgeN/A
Communication controller(0x07)
Sub Class CodeDescriptionProgramming Interface & Description
0x00Serial controller0x00 8250
0x01 16450
0x02 16550
0x03 16650
0x04 16750
0x05 16850
0x06 16950
0x01Parallel controller0x00 SPP
0x01 BiDir
0x02 ECP
0x03 IEEE1284
0xfe IEEE1284 Target
0x02Multiport serial controllerN/A
0x03Modem0x00 Generic
0x01 Hayes/16450
0x02 Hayes/16550
0x03 Hayes/16650
0x04 Hayes/16750
0x04GPIB controllerN/A
0x05Smard Card controllerN/A
0x80Communication controllerN/A
Generic system peripheral(0x08)
Sub Class CodeDescriptionProgramming Interface & Description
0x00PIC0x00 8259
0x01 ISA PIC
0x02 EISA PIC
0x10 IO-APIC
0x20 IO(X)-APIC
0x01DMA controller0x00 8237
0x01 ISA DMA
0x02 EISA DMA
0x02Timer0x00 8254
0x01 ISA Timer
0x02 EISA Timers
0x03 HPET
0x03RTC0x00 Generic
0x01 ISA RTC
0x04PCI Hot-plug controllerN/A
0x05SD Host controllerN/A
0x06IOMMUN/A
0x80System peripheral
0x99Timing Card0x01 TAP Timing Card
Input device controller(0x09)
Sub Class CodeDescriptionProgramming Interface & Description
0x00Keyboard controllerN/A
0x01Digitizer PenN/A
0x02Mouse controllerN/A
0x03Scanner controllerN/A
0x04Gameport controller0x00 Generic
0x10 Extended
0x80Input device controllerN/A
Docking station(0x0a)
Sub Class CodeDescriptionProgramming Interface & Description
0x00Generic Docking StationN/A
0x80Docking StationN/A
Processor(0x0b)
Sub Class CodeDescriptionProgramming Interface & Description
0x00386N/A
0x01486N/A
0x02PentiumN/A
0x10AlphaN/A
0x20Power PCN/A
0x30MIPSN/A
0x40Co-processorN/A
Serial bus controller(0x0c)
Sub Class CodeDescriptionProgramming Interface & Description
0x00FireWire (IEEE 1394)0x00 Generic
0x10 OHCI
0x01ACCESS BusN/A
0x02SSAN/A
0x03USB controller0x00 UHCI
0x10 OHCI
0x20 EHCI
0x30 XHCI
0x40 USB4 Host Interface
0x80 Unspecified
0xfe USB Device
0x04Fibre ChannelN/A
0x05SMBusN/A
0x06InfiniBandN/A
0x07IPMI Interface0x00 SMIC
0x01 KCS
0x02 BT (Block Transfer)
0x08SERCOS interfaceN/A
0x09CANBUSN/A
0x80Serial bus controllerN/A
Wireless controller(0x0d)
Sub Class CodeDescriptionProgramming Interface & Description
0x00IRDA controllerN/A
0x01Consumer IR controllerN/A
0x10RF controllerN/A
0x11BluetoothN/A
0x12BroadbandN/A
0x20802.1a controllerN/A
0x21802.1b controllerN/A
0x80Wireless controllerN/A
Intelligent controller(0x0e)
Sub Class CodeDescriptionProgramming Interface & Description
0x00I2ON/A
Satellite communications controller(0x0f)
Sub Class CodeDescriptionProgramming Interface & Description
0x01Satellite TV controllerN/A
0x02Satellite audio communication controllerN/A
0x03Satellite voice communication controllerN/A
0x04Satellite data communication controllerN/A
Encryption controller(0x10)
Sub Class CodeDescriptionProgramming Interface & Description
0x00Network and computing encryption deviceN/A
0x10Entertainment encryption deviceN/A
0x80Encryption controllerN/A
Signal processing controller(0x11)
Sub Class CodeDescriptionProgramming Interface & Description
0x00DPIO moduleN/A
0x01Performance countersN/A
0x10Communication synchronizerN/A
0x20Signal processing managementN/A
0x80Signal processing controllerN/A
Processing accelerators(0x12)
Sub Class CodeDescriptionProgramming Interface & Description
0x00Processing acceleratorsN/A
0x01SNIA Smart Data Accelerator Interface (SDXI) controllerN/A
Non-Essential Instrumentation(0x13)

N/A

Coprocessor(0x40)

N/A

Unassigned class(0xff)

N/A

Cache Line Size Register (Offset 0Ch)

cache缓存大小,是为了PCI设备设计的。对于PCIe设备,该寄存器的值无意义。

Latency Timer Register (Offset 0Dh)

为了PCI bridge设备设计的,对于PCIe设备,该寄存器的值无意义。

Header Type Register (Offset 0Eh)

PCIe设备头类型寄存器, 表示该设备是PCIe EP设备还是PCIe bridge设备。 PCIe 配置空间是type0类型还是type1类型,就是由该寄存器定义。该寄存器只读,由8位组成。

  • 第 7 Bit 为1表示当前PCI设备为多功能设备,为0表示为单功能设备(对于单PF多VF的设备,需要填写为0)。
  • 第 6-0 Bit 表示当前配置空间类型,为0表示普通PCIe设备配置空间,为1表示PCIe bridge设备配置空间,为2表示Cardbus桥片配置空间。

BIST Register (Offset 0Fh)

Built In Self Test(内部自检测试),用于BIST的控制和状态检查,调用BIST功能的function不能影响PCIe link状态。
在这里插入图片描述

BitDescription
3:0Completion Code,表示自检的完成状态,0000b表示自检测ok,非0000b表示自检测失败。
6Start BIST,用于软件启用function自检测功能,当 BIST Capable 为1时,系统软件可以通过对该BIt写1激活function自检。function应保证在2s内完成自检,并清除该Bit,将自检结果显示在Completion Code字段。若function在2s内未清除该Bit,则软件可以认为设备出现故障,进行故障处理操作。
7BIST Capable,为1时,表示支持BIST功能(内部自检测试)。

Base Address Registers (Offset 10h - 24h)

BAR地址寄存器负责PCIe设备内部空间的映射。

PCIe EP配置空间头部有6个BAR(Base Address Registers)寄存器, 决定PCIe设备空间映射到系统空间具体位置的寄存器, BAR记录了设备所需要的地址空间的类型(memory space或者I/O space),基址以及其他属性。 BAR的格式如下:
在这里插入图片描述

Bit描述
0表示这个BAR是I/O空间还是mem空间,1表示I/O空间,0表示mem空间。
2:1表示这个BAR是32bit还是64bit,00b表示32Bit,10b表示64Bit,当BAR为64Bit时,其高32Bit在下一个BAR中填写,比如BAR0和BAR1组成一个64Bit BAR寄存器。注意,由于PCIe Bridge的non prefetchable memory limit/base(offset 0x20h)位宽限制,PCIe EP设备不可预取BAR只能使用32 Bit,即使该字段值为10b,host也只会分配32 Bit的地址空间下来。
31表示mem空间可预取,0表示不可预取。注意,如果BAR支持可预取,请确保BAR空间没有副作用(读无副作用、内部值不会意外改变)。

type0(PCIe EP设备)有6个32bit的BAR寄存器,type1(PCIe Bridge设备)有2个32bit的BAR寄存器。每一个BAR地址对应一个地址空间。

在BAR寄存器有些bit是只读的,是PCI设备在出厂前就固定好的bit,写全1进去,如果值保持不变,就说明这些bit是厂家固化好的,这些固化好的bit提供了这块内部空间的一些信息。

举个例子:

上电时,系统软件首先会读取PCIe设备的BAR0,得到数据:
在这里插入图片描述
然后系统软件往该BAR0写入全1,得到:
在这里插入图片描述
低12bit没变,表明该设备空间大小是4KB(2的12次方),BAR地址的低4位表明了该存储空间的一些属性。然后系统软件根据这些信息,在系统内存空间找到这样一块地方来映射这4KB的空间,把分配的基地址写入到BAR寄存器。

系统启动时通过BAR地址把PCIe设备空间映射到存储器空间,CPU要访问该PCIe设备空间,只需访问对应的存储器空间。CPU发出一个物理地址,RC检查该地址,如果发现该内存空间地址是某个PCIe设备空间的映射,就会触发其产生TLP,去访问对应的PCIe设备,读取或者写入PCIe设备。

Cardbus CIS Pointer Register (Offset 28h)

为了PCI bridge设备设计的,对于PCIe设备,该寄存器的值无意义。

Subsystem Vendor ID Register/Subsystem ID Register (Offset 2Ch/2Eh)

PCIe设备的子系统厂商和子系统ID。比如inter提供了一个PCIe总线接口的IP核,并且IP核固化了设备ID和厂商ID为inter,但其他厂商使用这个IP生产了设备,所以可以通过子系统厂商和子系统ID来区分不同设备。

Expansion ROM Base Address Register (Offset 30h)

扩展ROM映射基地址寄存器。分配给ROM使用,用于PCIe设备在处理器还没有运行操作系统之前,完成基本的初始化设置。比如显卡、键盘、硬盘等设备,在处理器初始化过程中将运行这段ROM程序,初始化这些PCIe设备。这个寄存器记载这段ROM程序的基地址(类似BAR寄存器)。
在这里插入图片描述

Bit描述
0Expansion ROM Enable,使能位,表示这个设备是否支持ExROM,1表示支持,0表示不支持。
3:1Expansion ROM Validation Status,表示硬件验证ExROM内容的状态。例如,厂商制造了PCIe设备卖给客户,客户可以自行更换有效可信的ExROM程序,如果非法,则通过该字段告知host主机,让host主机忽略执行ExROM程序。
000b:验证不支持
001b:验证进行中
010b:验证通过,内容有效,但未执行信任测试
011b:验证通过,内容有效且可信
100b:验证失败,内容无效
101b:验证失败,内容有效但不可信(例如,过时、过期或已撤销的证书)
110b:警告通过,具有特定实现警告,内容有效,但未执行信任测试
111b:警告通过,具有特定实现警告,内容有效且可信。
7:4Expansion ROM Validation Details,ExROM验证详细信息,包含与Expansion ROM验证相关的可选的、特定于实现的详细信息。
1. 如果function不支持验证,则此字段为RsvdP(保留位)。
2. 此字段是可选的。当支持验证但未实现此字段时,此字段必须硬连到0000b。此字段中的任何未使用位都可以硬连到0b。
3. 如果验证正在进行中(Expansion ROM验证状态为001b),此字段的非零值表示验证进度的特定于实现的指示(例如,50%完成)。值0000b表示未提供验证进度信息。
4. 如果验证已完成(Expansion ROM验证状态为010b到111b),此字段中的非零值表示附加的特定于实现的信息。值0000b表示未提供信息。
5. 如果功能支持验证并具有用于Expansion ROM的增强分配能力(EA条目),则此字段为HwInit(硬件初始化)。 否则,此字段为只读位。
6. 此字段仅通过冷复位重置,并不受其他复位的影响。
7. 一旦验证过程完成,此字段的值不能更改。
8. 建议系统软件在报告验证状态(例如,错误日志)时包含此字段的值。

Capabilities Pointer (Offset 34h)

PCIe capbility的地址偏移, capbility用于表示PCIe设备支持的能力。该寄存器存放Capabilities 结构链表的头指针。在一个PCIe 设备中,可能含有多个Capability 结构,这些寄存器组成一个链表:
在这里插入图片描述
注意,PCIe设备必须要实现PCI Power Management Capability和PCI Express Capability,所以该字段必然不会为0。

Interrupt Line Register (Offset 3Ch)

表示当前PCIe设备使用的中断向量号,注意,这是由系统软件配置下来的,PCIe硬件不使用该寄存器。

Interrupt Pin Register (Offset 3Dh)

传统中断引脚只读寄存器,如果PCIe设备不支持传统中断,该寄存器值必须为0x00h。0x01~0x04值对应INTA、INTB、INTC和INTD中断,对于单function的PCIe设备,只能使用INTA,对于多function的PCIe设备,需要依次按序使用中断引脚号。

Min_Gnt Register/Max_Lat Register (Offset 3Eh/3Fh)

为了PCI设备设计的。对于PCIe设备,该寄存器的值无意义。

下一篇将讲解PCIe Bridge标准配置空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值