PCIe总线-PCIe配置空间介绍(三)

news2024/9/21 2:47:04

1.概述

配置空间是PCIe设备/桥的标识符,其保存了设备/桥的信息。主机在枚举设备/桥的时候需要先访问配置空间,获取设备厂家、型号、类型、所需资源等信息,然后再分配资源,最后才能访问PCIe设备的存储或IO地址空间。PCIe总线规定了三种类型的配置空间,分别是PCIe Agent设备使用的配置空间、PCIe桥使用的配置空间和Cardbus桥片使用的配置空间,本节只介绍前两种。

2.配置空间布局

PCIe配置空间的布局如下图所示,总共4KB,PCIe设备的每个Function都对应一个配置空间。0-3Fh(64字节)是PCI兼容配置空间头,按类型可分为Type 0配置空间头和Type 1配置空间头。PCIe设备使用Type 0配置空间头,PCIe桥使用Type 1配置空间头。所有的PCI、PCI-X、PCIe设备(桥)必须支持64字节的配置空间头,即00h-40h。40h-FFh(192字节)是PCI/PCI-X和PCIe扩展的配置空间,主要存放一些与MSI或者MSI-X中断机制和电源管理相关的Capability Structures。支持中断的PCI、PCI-X、PCIe设备(桥)必须支持40h-FFh的配置空间。0-FFh(256字节)是PCI兼容配置空间,可通过传统的PCI方式(基于ID寻址)或PCIe ECAM(Enhanced Configuration Access Mechanism)访问。100h-FFFh(3840字节)是PCIe协议扩展的可选配置空间,主要存放AER、虚拟通道、设备序列号等Capability Structures。100h-FFFh只能通过PCIe ECAM访问。

PCIe配置空间布局

在一个PCIe总线中,Type 0配置空间头和Type 1配置空间头如下图所示。

Type0_And_Type1_Header

3.Type 0 Header

Type 0配置空间头如下图所示。

type0配置空间头

每个字段的具体意义如下:

字段意义偏移地址宽度
Vendor ID厂商ID,由PCI-SIG统一分配,如Intel的厂商ID为0x8086,0x002B
Device ID设备ID,由PCI-SIG统一分配,如Intel 82571EB网卡的设备ID为0x105E0x022B
Command命令寄存器,初始化的时候默认值为0,具体见下面的解释0x042B
Status保存PCIe状态0x062B
Revision ID保存PCIe版本号0x081B
Class Code保存PCIe设备的分类,由Base Class Code、Sub Class Code和Interface组成。Base Class Code是设备的基本分类,如显卡、网卡、PCIe桥等设备。Sub Class Code则会将设备进一步细分。Interface定义编程接口。0x093B
Cache Line Size保存主机处理器的Cache行长度,该寄存器由主机的系统软件设置。若PCIe设备不支持与Cache相关的总线事务,系统软件可不设置该寄存器。0x0C1B
Latency Timer控制PCI设备占用总线的时间,对PCIe总线无意义。0x0D1B
Header Type记录设备的类型。bit[7]=0表示单功能设备,bit[7]=1表示多功能设备,bit[6:0]=0表示PCIe Agent设备,bit[6:0]=1表示PCIe桥设备,bit[6:0]=2表示PCIe CardBus桥。0x0E1B
BIST可选,用于内部自检0x0F1B
Base Address 0BAR寄存器,保存主机分配给该PCIe设备的PCIe域地址,64位地址使用2个BAR0x104B
Base Address 1BAR寄存器,保存主机分配给该PCIe设备的PCIe域地址,64位地址使用2个BAR0x144B
Base Address 2BAR寄存器,保存主机分配给该PCIe设备的PCIe域地址,64位地址使用2个BAR0x184B
Base Address 3BAR寄存器,保存主机分配给该PCIe设备的PCIe域地址,64位地址使用2个BAR0x1C4B
Base Address 4BAR寄存器,保存主机分配给该PCIe设备的PCIe域地址,64位地址使用2个BAR0x204B
Base Address 5BAR寄存器,保存主机分配给该PCIe设备的PCIe域地址,64位地址使用2个BAR0x244B
Cardbus CIS Pointer不介绍0x284B
Subsystem Vendor ID记录PCIe设备生产厂商0x2C2B
Subsystem ID记录PCIe设备生产厂商0x2E2B
Expansion ROM Base Address固件程序地址,用于初始化PCIe设备0x304B
Capabilities PointerCapabilities寄存器相对于配置空间的偏移地址,PCI-X和PCIe必须支持该功能0x341B
Reserved保留0x353B
Reserved保留0x384B
Interrupt Line保存当前PCIe设备使用的中断向量号,由主机系统软件分配,通常不使用0x3C1B
Interrupt Pin保存PCIe设备使用的中断引脚,由主机系统软件分配,1表示INTA#,2表示INTB#,3表示INTC#,4表示INTD#,PCIe设备可使用INTx模拟INTA~D#中断0x3D1B
Min_GntPCIe设备能忍受的最大延时,只读寄存器0x3E1B
Max_LatPCIe设备期望的最小延时,只读寄存器0x3F1B

3.1.Command

Command寄存器为PCIe设备的命令寄存器,默认值为0,此时PCIe设备除了能够接收配置请求总线事之外,不能接收任何存储器或者I/O请求。

Command寄存器位域如下图所示:

Command寄存器

Command寄存器位域定义如下表所示:

位域意义属性
0I/O Space位,默认值为0。表示是否响应I/O请求。为1时响应,为0时不响应。如果支持I/O空间,系统软件会将该位置1。RW
1Memory Space位,默认值为0。表示是否响应Memory请求。为1时响应,为0时不响应。如果支持Memory地址空间,系统软件会将该位置1。RW
2Bus Master位,默认值为0。对于EP表示是否可以发送I/O或者Memory请求,包括MSI/MSI-X中断,对于Root和Switch端口表示是否会将I/O或者Memory请求转发到上行端口。为1时可以发送或者可以转发,为0时不发送或者不转发。RW
3Special Cycle位,默认值为0。表示是否响应Special总线事务。为1时响应,为0时不响应。Special总线事务可以将一些信息广播到多个目标设备RO
4Memory Write and Invalidate位,默认值为0。对于PCIe总线没有意义RO
5VGA Palette Snoop位,默认值为0。对于PCIe总线没有意义RO
6Parity Error Response位,默认值为0。此位控制TLP出现奇偶校验错误时是否在Status寄存器中记录。为1时记录,为0时不记录RW
7IDSEL Stepping/Wait Cycle Control位,默认值为0。对于PCIe总线没有意义RO
8SERR# Enable位,默认值为0。对于PCIe总线没有意义RO
9Fast Back-to-Back Transactions Enable位,默认值为0。对于PCIe总线没有意义RO
10Interrupt Disable位,默认值为0。表示EP是否可以发送INTx中断。为1时不可以,为0时可以。RW

3.2.Status

Status寄存器保存PCIe设备的状态。
Status寄存器的位域如下图所示:

Status寄存器

Status寄存器的位域定义如下表所示:

位域意义属性
0-2保留RO
3中断状态位。该位为1时且Command bit[10]=0,表示PCIe设备使用INTx信号提交中断。大多数的PCIe设备有自己的中断状态寄存器,可同通过BAR访问,很少使用该寄存器。RO
4Capabilities List有效位。为1时Capabilities Pointer有效,否则无效RO
566MHz Capability位,默认值为0。为1时表示PCIe设备支持66MHz的PCI总线。对PCIe总线无意义RO
6保留RO
7Fast Back-to-Back Transactions Capable位,默认值为0。对于PCIe总线没有意义RO
8Master Data Parity Error位,默认值为0。当该位设置且Command寄存器bit[6]=1,对于EP Function来说,表示其收到了错误的完成报文或者其发送了错误的请求,对于Root Port、Switch上行口或者Switch下行口,表示其接收到了下行口的错误完成报文或者向上行口发送了错误的请求。Command寄存器bit[6]=0,该位保持为0RW1C
9-10DEVSEL Timing,默认值为0。对于PCIe总线没有意义RO
11Signaled Target Abort位,默认值为0。This bit is Set when a Function completes a Posted or Non-Posted Request as a Completer Abort error. This applies to a Function with a Type 1 Configuration header when the Completer Abort was generated by its Primary Side.RW1C
12Received Target Abort位,默认值为0。This bit is Set when a Requester receives a Completion with Completer Abort Completion Status. On a Function with a Type 1 Configuration header, the bit is Set when the Completer Abort is received by its Primary Side.RW1C
13Received Master Abort位,默认值为0。This bit is Set when a Requester receives a Completion with Unsupported Request Completion Status. On a Function with a Type 1 Configuration header, the bit is Set when the Unsupported Request is received by its Primary Side.。RW1C
14Signaled System Error位,默认值为0。This bit is Set when a Function sends an ERR_FATAL or ERR_NONFATAL Message, and the SERR# Enable bit in the Command register is 1.RW1C
15Detected Parity Error,This bit is Set by a Function whenever it receives a Poisoned TLP, regardless of the state the Parity Error Response bit in the Command register. On a Function with a Type 1 Configuration header, the bit is Set when the Poisoned TLP is received by its Primary Side.RW1C

3.3.Base Address

Base Address寄存器简称为BAR,保存了PCIe设备/桥的Function使用的PCIe总线域地址的基地址。Type 0设备每个Function最多可以有6个BAR,Type 1设备每个Function最多可以有2个BAR。若使用64位PCIe总线域地址,则2个BAR表示一个64位地址,BARn表示低32位,BARn+1表示高32位。

BAR保存的PCIe总线域基地址有两种类型,分别是IO地址空间和存储地址空间,存储地址空间有4中属性,分别是预取(prefetchable)、非预取(non-prefetchable)、32位和64位。主机在枚举的时候先读取BAR,然后判断所需的总线域基地址类型,若是存储地址空间,则进一步获取存储地址空间的属性,接着向BAR写如0xFFFFFFFF,最后再读取BAR,根据可以写入的最低有效位,获取Function请求IO地址空间和存储地址空间的长度。

当BAR表示的是存储地址空间时,位域如下图所示:

BAR存储空间

当BAR表示的是IO地址空间时,位域如下图所示:

BAR_IO空间

  1. 32位存储地址空间
    32位存储地址空间分为预取(prefetchable)和非预取(non-prefetchable)。下面以32位非预取存储地址空间的初始化流程为例进行分析:
    1. 当PCIe Function初始化完成后,BAR的基地址类型和属性也初始化完毕。图中bit[3-0]都是0,表示这是一个32位非预取存储地址空间。
    2. 主机先读取BAR,获取BAR的类型和属性。图中未画出。
    3. 主机向BAR的所有bit写1,此时BAR中可以写入的bit变为1,不可写入bit的保持原来的值。图中bit[31-12]=1,表示该BAR请求的存储地址空间大小为2^12=4KB。
    4. 主机获取这些信息后,向BAR中配置存储地址空间的基地址。图中配置的是0xF9000000,bit[11-0]保持为0,即该BAR表示的32位非预取存储地址空间范围为0xF9000000-0xF9000FFF,大小为4KB。

32‐Bit_Non‐Prefetchable_Memory_BAR_Set_Up

实质上,当该BAR表示的PCIe总线域地址向存储域地址转换时,bit[31-12]被转换为存储域基地址,bit[11-0]被视为存储域基地址的偏移,直接映射到存储域空间,不做转换。

  1. 64位存储地址空间
    64位存储地址空间分为预取(prefetchable)和非预取(non-prefetchable)。下面以64位预取存储地址空间的初始化流程为例进行分析:
    1. 当PCIe Function初始化完成后,BAR的基地址类型和属性也初始化完毕。图中bit[3-0]=0xC,表示这是一个64位预取存储地址空间,需要两个BAR表示。
    2. 主机先读取BAR,获取BAR的类型和属性。图中未画出。
    3. 主机向BARn和BARn+1的所有bit写1,此时BAR中可以写入的bit变为1,不可写入bit的保持原来的值。图中bit[63-26]=1,表示该BAR请求的存储地址空间大小为2^26=64MB。
    4. 主机获取这些信息后,向BAR中配置存储地址空间的基地址。图中配置的是0x240000000,bit[25-0]保持为0,即该BAR表示的64位预取存储地址空间范围为0x240000000-0x243FFFFFF,大小为64MB。

64‐Bit_Prefetchable_Memory_BAR_Set_Up

实质上,当该BAR表示的PCIe总线域地址向存储域地址转换时,bit[63-26]被转换为存储域基地址,bit[25-0]被视为存储域基地址的偏移,直接映射到存储域空间,不做转换。

  1. IO地址空间
    IO地址空间的初始化流程如下图所示:
    1. 当PCIe Function初始化完成后,BAR的基地址类型也初始化完毕。图中bit[0]=0x0,表示这是一个IO地址空间。
    2. 主机先读取BAR,获取BAR的类型。图中未画出。
    3. 主机向BAR的所有bit写1,此时BAR中可以写入的bit变为1,不可写入bit的保持原来的值。图中bit[31-8]=1,表示该BAR请求的存储地址空间大小为2^8=256B。
    4. 主机获取这些信息后,向BAR中配置IO地址空间的基地址。图中配置的是0x4000,bit[7-0]保持为0,即该BAR表示的IO地址空间范围为0x4000-0x40FF,大小为256B。

IO_BAR_Set_Up

早期的IO设备内部寄存器只能通过IO地址空间进行访问,但是这种方式局限性很大,而且效率低。后来为了提高灵活性和效率,将IO设备内部寄存器统一映射到存储地址空间,使用MMIO方式访问IO设备内部寄。PCIe为了兼容PCI,保留了IO地址空间,但现在很少使用。

4.Type 1 Header

Type 1配置空间用来描述PCIe桥,PCIe桥除了作为PCIe设备之外,还需要管理其下面连接的PCIe子总线使用的各类资源。Type 1配置空间头如下图所示。

type1配置空间头

每个字段的具体意义如下:

字段意义偏移地址宽度
Vendor ID厂商ID,由PCI-SIG统一分配,如Intel的厂商ID为0x8086,0x002B
Device ID设备ID,由PCI-SIG统一分配,如Intel 82571EB网卡的设备ID为0x105E0x022B
Command命令寄存器,初始化的时候默认值为0,具体见下面的解释0x042B
Status保存PCIe状态0x062B
Revision ID保存PCIe的版本号0x081B
Class Code保存PCIe设备的分类,由Base Class Code、Sub Class Code和Interface组成。Base Class Code是设备的基本分类,如显卡、网卡、PCIe桥等设备。Sub Class Code则会将设备进一步细分。Interface定义编程接口。0x093B
Cache Line Size保存主机处理器的Cache行长度,该寄存器由主机的系统软件设置。若PCIe设备不支持与Cache相关的总线事务,系统软件可不设置该寄存器。0x0C1B
Primary Latency Timer上游总线的延迟时间,对PCIe总线无意义。0x0D1B
Header Type记录设备的类型。bit[7]=0表示单功能设备,bit[7]=1表示多功能设备,bit[6:0]=0表示PCIe Agent设备,bit[6:0]=1表示PCIe桥设备,bit[6:0]=2表示PCIe CardBus桥。0x0E1B
BIST可选,用于内部自检0x0F1B
Base Address 0BAR寄存器,保存主机分配给桥的PCIe域地址,64位地址使用2个BAR0x104B
Base Address 1BAR寄存器,保存主机分配给桥的PCIe域地址,64位地址使用2个BAR0x144B
Primary Bus Number保存该PCIe桥的上游PCIe总线号0x181B
Secondary Bus Number保存桥的下游总线中总线编号最小的PCIe总线号0x191B
Subordinate Bus Number保存桥的下游总线中总线编号最大的PCIe总线号0x1A1B
Secondary Latency TimerSecondary总线的延迟时间,对PCIe总线无意义。0x1B1B
I/O Base保存桥的下游总线连接的所有PCIe设备IO地址空间的基地址。若桥没有实现I/O地址空间,则应该只读并且返回0,反之高4位可以修改0x1C1B
I/O Limit保存桥的下游总线连接的所有PCIe设备IO地址空间的大小。若桥没有实现I/O地址空间,则应该只读并且返回0,反之高4位可以修改0x1D1B
Secondary Status记录Secondary总线的状态0x1E2B
Memory Base保存桥的下游总线连接的所有PCIe设备非预取存储地址空间的基地址0x202B
Memory Limit保存桥的下游总线连接的所有PCIe设备非预取存储地址空间的大小0x222B
Prefetchable Memory Base保存桥的下游总线连接的所有PCIe设备预取存储地址空间的基地址0x242B
Prefetchable Memory Limit保存桥的下游总线连接的所有PCIe设备预取存储地址空间的大小0x262B
Prefetchable Base Upper 32 Bits保存桥的下游总线连接的所有PCIe设备预取存储地址空间基地址的高32位0x284B
Prefetchable Limit Upper 32 Bits保存桥的下游总线连接的所有PCIe设备预取存储地址空间大小的高32位0x2C4B
I/O Base Upper 16 Bits保存桥的下游总线连接的所有PCIe设备IO地址空间基地址的高16位。若桥没有实现I/O地址空间,则应该只读并且返回00x302B
I/O Limit Upper 16 Bits保存桥的下游总线连接的所有PCIe设备IO地址空间大小的高16位。若桥没有实现I/O地址空间,则应该只读并且返回00x322B
Capability PointerCapabilities寄存器相对于配置空间的偏移地址,PCI-X和PCIe必须支持该功能0x341B
Reserved保留0x353B
Expansion ROM Base Address固件程序地址,用于初始化PCIe桥0x384B
Interrupt Line保存当前PCIe设备使用的中断向量号,由主机系统软件分配,通常不使用0x3C1B
Interrupt Pin保存PCIe设备使用的中断引脚,由主机系统软件分配,1表示INTA#,2表示INTB#,3表示INTC#,4表示INTD#,PCIe设备可使用INTx模拟INTA~D#中断0x3D1B
Bridge Control控制桥的寄存器,最终要的是bit[6](Secondary Bus Reset), 当bit[6]=1时,PCIe桥将对该port下面连接的所有PCIe设备/桥发起hot reset。0x3E2B

4.1.Base Address

Type 1设备中只含有两个BAR,其意义和Type 0中的BAR寄存器相同。但在Type 1表示的PCIe桥中,这两个BAR寄存器是可选的,如果桥设备不存在私有寄存器,可以不使用这两个BAR寄存器。不存在私有寄存器,且没有专门驱动的PCIe桥,被称为透明桥。

4.2.I/O地址空间

I/O Base、I/O Limit、I/O Base Upper 16 Bits和I/O Limit Upper 16 Bits共同决定了桥的下游总线IO地址空间范围。计算方法如下图所示:

  1. I/O Base和I/O Limit的低2位决定了IO地址是16位还是32位,若是32位则需要使用I/O Base Upper 16 Bits和I/O Limit Upper 16 Bits。
  2. I/O Base表示I/O地址空间基地址,按4KB对齐,低12位都是0,因此图中的I/O基地址为0x4000。
  3. I/O Limit表示I/O地址空间最大地址,低12位都是1,即为0xFFF。因此图中的I/O地址空间最大地址为0x4FFF。
  4. 图中I/O地址空间为16位,因此I/O地址空间范围为0x4000-0x4FFF。

IO_Base和IO_Limit

4.3.非预取地址空间

Memory Base和Memory Limit共同决定了非预取地址空间的范围。计算方法如下图所示:

  1. Memory Base和Memory Limit低4位只读,默认为0,非预取地址空间默认为32位。
  2. Memory Base表示非预取地址空间基地址,按1MB对齐,即低20位为0。
  3. Memory Limit表示非预取地址空间最大地址,低20位都为1,即为0xFFFFF。
  4. 因此非预取地址空间范围为0xF9000000-0xF90FFFFF。

非预取地址空间计算方法

4.4.预取地址空间

Prefetchable Memory Base、Prefetchable Memory Limit、Prefetchable Base Upper 32 Bits和Prefetchable Limit Upper 32 Bits共同决定了预取地址空间的范围。计算方法如下图所示:

  1. Prefetchable Memory Base和Prefetchable Memory Limit低4位只读,而且决定了预取地址空间是32位还是64位,0x0表示32位,0x1表示64位。若是64位地址,则需要使用Prefetchable Base Upper 32 Bits和Prefetchable Limit Upper 32 Bits。
  2. Prefetchable Memory Base表示预取地址空间基地址,按1MB对齐,即低20位为0。
  3. Prefetchable Memory Limit表示预取地址空间最大地址,低20位都为1,即为0xFFFFF。
  4. 图中预取地址空间为64位,因此I/O地址空间范围为0x240000000-0x243FFFFFF。

预取地址空间计算方法

5.Capabilities Structures

Capabilities Structures主要有MSI、MSI-X、PCI Express、电源、AER、PCI Express Extended等Capabilities Structures。第一个Capabilities Structures的地址由配置空间Header的Capabilities Pointer寄存器保存,系统可以根据此遍历所有的Capabilities Structures。Capabilities Structures的链表如下图所示。

Capability结构链表

每一个Capabilities Structures都有一个独一无二的Capability ID,该ID保存在Capabilities Structures的开始地址,系统软件根据此判断Capabilities Structures的类型。

PCI标准Capabilities ID如下图所示。

PCI_Standard_Capabilities

PCIe扩展Capabilities ID参考PCI Express® Base Specification Revision 5.0的9.3.7节。

5.1.MSI Capability Structures

MSI使用报文的形式向主机发送中断。具体是使用存储器写请求,向MSI Capability Structures中的Message Address写入Message Data,写入后会在主机侧触发中断。

MSI最多支持32个中断,且要求主机分配的中断号连续。MSI Capability Structures共有4种形式,分别是32位和64位不带中断Mask和Pending Structure,32位和64位带中断Mask和Pending Structures,具体如下图所示。

MSI_Capability_Structure

MSI_Capability_Structure_for_32-bit_Message_Address_and_PVM

MSI_Capability_Structure_for_64-bit_Message_Address_and_PVM

MSI Capability Structures各个寄存器的定义如下表所示:

定义描述属性
Capability ID记录MSI Capability的ID号,值为0x05RO
Next Capability Pointer存放下一个Capability Structure的偏移地址,0x00表示该Capability是最后一个RO
Message Control存放Function使用MSI机制进行中断请求的状态与控制信息-
Message Address存放MSI存储器写事务目的地址的低32位,bit[1:0]为0,4字节对齐,该地址由系统软件分配并设置RW
Message Upper Address存放MSI存储器写事务目的地址的高32位,该地址由系统软件分配并设置RW
Message Data存放MSI存储器写事务携带的数据。总共4字节,Message占低2字节,若扩展Message数据使能,则高2字节为扩展Message数据,否则为0。当只有一个MSI中断(Multiple Message Enable=0)时,Message表示一个真实的数据,Function不会改变Message。当有多个MSI中断(Multiple Message Enable>0)时,Message表示Function可以改变Message低位的bit数,以产生不同的中断,比如当Multiple Message Enable=2时,表示Function需要4个中断,则Function可以修改Message的bit[1]和bit[0],以区分4个中断RW
Extended Message Data存放MSI存储器写事务携带的数据。总共4字节,Message占低2字节,若扩展Message数据使能,则高2字节为扩展Message数据,否则为0RW/undefined/RsvdP
Mask Bits存放MSI中断屏蔽位。系统软件可以向某个bit写1,此时会将对应的中断禁止,清零时会使能对应的中断RW
Pending Bits存放MSI中断Pending位。当Function中断发生时,根据中断号会将对应的bit设置为1RO

Message Control寄存器位域如下图所示:

Message_Control_Register的意义

Message Control寄存器位域的定义如下表所示:

位域定义描述属性
15:11RsvdP保留-
10Extended Message Data Enable扩展Message数据使能位,系统软件需要先读取Extended Message Data Capable判断Function是否支持扩展Message数据,若支持再判断是否使能该位RW/RO
9Extended Message Data CapableFunction是否支持扩展Message数据RO
8Per-Vector Masking CapableFunction是否支持MSI中断Mask和Pending。0表示不支持,1表示支持RO
764-bit Address CapableFunction是否支持64位地址Structure。0表示只支持32位地址Structure,1表示支持64位地址StructureRO
6:4Multiple Message Enable该位域保存系统软件给Function实际分配的MSI中断数量。系统软件先读取Multiple Message Capable位确定Function请求的中断数量,然后再分配。通常情况下两者相等,若系统中断数量不足,则Multiple Message Enab可能会小于Multiple Message CapableRW
3:1Multiple Message CapableFunction需要的中断向量数量,按2的n次方对齐,如0表示需要1个中断向量,1表示需要2个中断向量,…,5表示需要32个中断向量,6和7保留。若设备实际上需要3个中断,则需要设置为2。系统软件根据此位域给Function分配MSI中断数量RO
0MSI EnableMSI中断机制使能位,当MSI或MSI-X使能时,INTx中断将被自动禁止RW

5.2. MSI-X

MSI-X的中断机制和MSI类似,都是向主机的某个地址写Message数据以产生中断。但MSI-X每一个中断都有独立的Message Address和Message Data,Message Address和Message Data组成一个中断向量表,同时MSI-X使用了独立的中断Pending表。中断向量表和中断Pending表存放在BAR空间中。因此MSI-X支持的中断数量更多,且不需要中断号连续。

5.2.1.MSI-X Capability Structures

MSI-X Capability Structures主要的作用是记录中断向量表和Pending表保存的位置。MSI-X Capability Structure如下图所示。

MSI-X_Capability_Structure

MSI Capability Structures各个寄存器的定义如下表所示:

定义描述属性
Capability ID记录MSI-X Capability的ID号,值为0x11RO
Next Capability Pointer存放下一个Capability Structure的偏移地址,0x00表示该Capability是最后一个RO
Message Control存放Function使用MSI-X机制进行中断请求的状态与控制信息-
Table BIR表示MSI-X中断向量表存放在那个BAR空间中,0-5与BAR0-5对应,若是64位的BAR,则表示低32位BAR的编号RO
Table Offset表示该MSI-X中断向量表在对应BAR空间中的偏移地址,偏移地址为32位,低3位为0,按8字节对齐RO
PBA BIR表示MSI-X中断Pending表存放在那个BAR空间中,0-5与BAR0-5对应,若是64位的BAR,则表示低32位BAR的编号。通常情况下中断向量表和中断Pending表存放在同一个BAR空间中RO
PBA Offset表示该MSI-X中断Pending表在对应BAR空间中的偏移地址,偏移地址为32位,低3位为0,按8字节对齐RO

Message Control寄存器位域如下图所示:

Message_Control_Register_for_MSI-X

Message Control寄存器位域的定义如下表所示:

位域定义描述属性
15MSI-X EnableMSI-X中断机制使能位,当MSI、MSI-X和INTx中断只能使用其中一个RW
14Function MaskMSI-X中断全局Mask位,当此位为1时,无论Pending表如何设置,所有中断都会被屏蔽RO
13:11Reserved保留RsvdP
10:0Table SizeMSI-X中断向量表的大小,存放Message Address和Message Data。若系统软件读取的值为0x3,则中断向量表的大小为4字节。RO
5.2.2.MSI-X Table

MSI-X Table如下图所示。每一个Entry表示一个MSI-X中断向量,占用16字节。一个Entry由4部分组成,分别是Message Address、Message Upper Address、Message Data、Vector Control。

MSI-X_Table_Structure

MSI-X Table每个Entry的寄存器定义如下表所示:

定义描述属性
Message Address存放MSI存储器写事务目的地址的低32位,bit[1:0]为0,4字节对齐,该地址由系统软件分配并设置RW
Message Upper Address存放MSI存储器写事务目的地址的高32位,如果为0,则使用32地址,否则使用64位地址,该地址由系统软件分配并设置。RW
Message Data存放MSI存储器写事务携带的数据,总共4字节RW
Vector Control控制该中断entry的行为-

Vector Control寄存器位域如下图所示:

Vector_Control_Register_for_MSI-X_Table_Entries

Vector Control寄存器位域定义如下表所示:

位域定义描述属性
31:24ST Upper如果Function实现了TPH Requester Extended Capability而且ST表位域值为10b,同时Extended TPH Requester Supported位为1,则ST Upper保存了高8位的Steering Tag,可以读写,否则保留RW or Rsvd
23:16ST Lower如果Function实现了TPH Requester Extended Capability而且ST表位域值为10b,则ST Lower保存了低8位的Steering Tag,可以读写,否则保留RW or Rsvd
15:1Reserved保留RW or RsvdP
0Mask Bit中断屏蔽位,为1屏蔽该MSI-X中断,为0时可以正常发送MSI-X中断,默认值为1RW
5.2.3.MSI-X PBA

MSI-X中断Pending Table如下图所示。每一个Entry由64位组成,其中每一位与MSI-X中断表中的一个Entry对应,则一个Entry和MSI-X中断表的64个Entry对应。当Pending Table中的某一个bit置1时,表明与之对应的MSI-X中断发生了。

MSI-X_PBA_Structure

5.3.PCI Express Capability Structure

PCI Express Capability Structure存放和PCIe总线相关的信息,包括PCIe链路、插槽、设备状态、是否支持PCIe新特性等信息。PCI Express Capability Structure整体的Structure如下图所示。

所有PCIe设备Functions必须实现PCI Express Capabilities、Device Capabilities、Device Status和Device Control寄存器。PCIe设备Functions选择实现Device Capabilities 2、Device Status 2和Device Control 2寄存器,若没有实现,则保持为0。

Root Ports、Switch Ports、Bridges和Endpoints(非RCiEPs)必须实现Link Capabilities、Link Status、Link Control、Link Capabilities 2, Link Status 2和Link Control 2寄存器,Functions无需实现上述寄存器,保持为0即可。

Switch Downstream和Root Ports选择实现Slot Capabilities、Slot Status和Slot Control寄存器。如果port连接了插槽,则必须实现Slot Capabilities寄存器,如果port连接了插槽或者Data Link Layer Link Active Reporting Capable位设置,则必须实现Slot Status和Slot Control寄存器。Functions无需实现上述寄存器,保持为0即可。Switch Downstream和Root Ports选择实现Slot Capabilities 2、Slot Status 2和Slot Control 2寄存器,Functions无需实现上述寄存器,保持为0即可。

Root Ports and Root Complex Event Collectors必须实现Root Capabilities, Root Status, and Root Control寄存器,Functions无需实现上述寄存器,保持为0即可。

PCI_Express_Capability_Structure

下面只介绍比较重要的寄存器。

5.3.1.PCI Express Capabilities Register

PCI Express Capabilities寄存器记录了PCIe设备Function类型及相关的capabilities,位域如下图所示。

PCI_Express_Capabilities_Register

PCI Express Capabilities位域的定义如下表所示:

位域定义描述属性
14UndefinedPCIe5.0之前的版本表示是否支持TCS Routing,PCIe5.0未定义RO
13:9Interrupt Message Number使用MSI或MSI-X中断的编号。当Slot Status或Root Status寄存器的状态发生变化时,该PCIe设备可以通过MSI或MSI-X中断通知主机。RO
8Slot Implemented该位为1时表示当前port连接了PCIe插槽。对下行port有效,对上行port无效HwInit
7:4Device/Port Type保存PCIe Function类型,对于多Function的设备,Function类型可能不相同。Type 0配置空间头:0x0表示PCI Express Endpoint,0x1表示Legacy PCI Express Endpoint,0x9表示RCiEP,0xA表示Root Complex Event Collector。Type 1配置空间头:0x4表示Root Port of PCI Express Root Complex,0x5表示Upstream Port of PCI Express Switch,0x6表示Downstream Port of PCI Express Switch,0x7表示PCI Express to PCI/PCI-X Bridge,0x8表示PCI/PCI-X to PCI Express BridgeRO
3:0Capability Version保存PCI-SIG定义的PCI Express Capability structure版本编号RO
5.3.2.Device Capabilities Register

Device Capabilities寄存器记录了PCIe设备Function特有的capabilities,位域如下图所示。

Device_Capabilities_Register

Device Capabilities寄存器位域的定义如下表所示:

位域定义描述属性
28Function Level Reset Capability是否支持FLRRO
27:26Captured Slot Power Limit Scale上行port最大功耗系数,0x0表示1.0,0x1表示0.1,0x2表示0.01,0x3表示0.001RO
25:18Captured Slot Power Limit Value上行port最大功耗,和Captured Slot Power Limit Scale一起使用RO
16ERR_COR Subclass Capable是否支持ERR_COR SubclassRO
15Role-Based Error Reporting是否支持错误上报RO
14:12Undefined未定义RO
11:9Endpoint L1 Acceptable Latency退出L1状态所能接收的延时。0x0表示最大1us,0x1表示最大2us,0x2表示最大4us,0x3表示最大8us,0x4表示最大16us,0x5表示最大32us,0x6表示最大64usRO
8:6Endpoint L0s Acceptable Latency退出L0s状态所能接收的延时。0x0表示最大64ns,0x1表示最大128ns,0x2表示最大256ns,0x3表示最大512ns,0x4表示最大1us,0x5表示最大2us,0x6表示最大4usRO
5Extended Tag Field Supported表示最大支持的Tag长度,0x0表示支持5bit,0x1表示支持8bitRO
4:3Phantom Functions Supported是否支持Phantom FunctionsRO
2:0Max_Payload_Size Supported保存了TLP包中数据包的最大长度。0x0表示128字节,0x1表示256字节,0x2表示512字节,0x3表示1024字节,0x4表示2028字节,0x5表示4096字节。RO
5.3.3.Device Control Register

Device Control寄存器的位域如下图所示,主要用于设置MPS(Max_Payload_Size)、MRRS(Max_Read_Request_Size)。
Device Control Register

5.4.PCI Express Extended Capabilities

PCI Express Extended Capabilities保存在配置空间的100h-FFFh中。PCI Express Extended Capabilities只能通过EACM访问。PCI Express Extended Capabilities布局如下图所示,详细信息可以参考PCIe Space文档。

PCI_Express_Extended_Configuration_Space_Layout

Linux中访问PCI Express Extended Capabilities的代码如下所示。

[include/uapi/linux/pci_regs.h]
#define PCI_CFG_SPACE_SIZE	256
#define PCI_CFG_SPACE_EXP_SIZE	4096
[drivers/pci/pci.c]
int pci_find_next_ext_capability(struct pci_dev *dev, int start, int cap)
{
	u32 header;
	int ttl;
	int pos = PCI_CFG_SPACE_SIZE;

	/* minimum 8 bytes per capability */
	ttl = (PCI_CFG_SPACE_EXP_SIZE - PCI_CFG_SPACE_SIZE) / 8;

	if (dev->cfg_size <= PCI_CFG_SPACE_SIZE)
		return 0;

	if (start)
		pos = start;

	if (pci_read_config_dword(dev, pos, &header) != PCIBIOS_SUCCESSFUL)
		return 0;

	/*
	 * If we have no capabilities, this is indicated by cap ID,
	 * cap version and next pointer all being 0.
	 */
	if (header == 0)
		return 0;

	while (ttl-- > 0) {
		if (PCI_EXT_CAP_ID(header) == cap && pos != start)
			return pos;

		pos = PCI_EXT_CAP_NEXT(header);
		if (pos < PCI_CFG_SPACE_SIZE)
			break;

		if (pci_read_config_dword(dev, pos, &header) != PCIBIOS_SUCCESSFUL)
			break;
	}

	return 0;
}

PCIe的配置空间内容很多,且版本升级后又会增加。上述只介绍了配置空间中比较常见的内容,详细内容需要参考最新的PICe Spec文档。

参考资料

  1. PCIEXPRESS体系结构导读
  2. PCI Express technology 3.0
  3. PCI_Express_Base_r3.0_10Nov10
  4. PCI-to-PCI Bridge Architecture Specification Revision 1.1
  5. https://blog.csdn.net/qq_42208449/article/details/132475653
  6. PCI Express® Base Specification Revision 5.0 Version 1.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1611955.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript之分时函数、分时间段渲染页面、提高用户体验、参数归一化、高阶函数、分段、appendChild、requestIdleCallback

MENU 前言效果图html原始写法优化方式一(参数归一化)优化方式二(当浏览器不支持requestIdleCallback方法的时候)优化方式三(判断环境) 前言 当前需要向页面插入十万个div元素&#xff0c;如果使用普通的渲染方式&#xff0c;会造成延迟。这时候就需要通过分时函数来实现渲染了。…

【R数据分析-基础】

R语言介绍 为什么使用R&#xff1f; R&#xff1a;数据分析与可视化平台 R的获取和安装 http://cran.r-project.org 免费下载 一、R、Rtools安装 R语言&#xff1a; 免费开源 支持多平台&#xff0c;包括Windows、UNIX、Mac OS 擅长统计与可视化 Rtools&#xff1a;R语言…

Android安卓写入WIFI热点自动连接NDEF标签

本示例使用的发卡器&#xff1a;Android Linux RFID读写器NFC发卡器WEB可编程NDEF文本/网址/海报-淘宝网 (taobao.com) package com.usbreadertest;import android.os.Bundle; import android.view.MenuItem; import android.view.View; import android.widget.EditText; impo…

C++从入门到出门

C 概述 c 融合了3中不同的编程方式&#xff1a; C语言代表的过程性语言C 在C语言基础上添加的类代表的面向对象语言C 模板支持的泛型编程 1、在c语言中头文件使用扩展名.h,将其作为一种通过名称标识文件类型的简单方式。但是c得用法改变了&#xff0c;c头文件没有扩展名。但是…

大数据平台搭建2024(二)

二&#xff1a;Hive安装 只在node01上操作 1 安装MySQL 8.0 最小化安装需要安装这个 yum install -y wget1-1 下载MySQL的yum源 wget http://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm检查是否安装成功 rpm -qpl mysql80-community-release-el7-7.n…

[Collection与数据结构] 二叉树(三):二叉树精选OJ例题(下)

1.二叉树的分层遍历 OJ链接 上面这道题是分层式的层序遍历,每一层有哪些结点都很明确,我们先想一想普通的层序遍历怎么做 /*** 层序遍历* param root*/public void levelOrder1(Node root){Queue<Node> queue new LinkedList<>();queue.offer(root);while (!qu…

《MATLAB科研绘图与学术图表绘制从入门到精通》示例:绘制伊甸火山3D网格曲面图

11.4.2小节我们使用3D曲面图可视化分析伊甸火山数据&#xff0c;本小节我们采用3D网格曲面图可视化分析伊甸火山数据&#xff0c;以展示其地形&#xff0c;具体示例代码如下。 购书地址&#xff1a;https://item.jd.com/14102657.html

C语言开源库iniparser解析ini文件

1 ini文件介绍 INI&#xff08;Initialization File&#xff09;文件是一种简单直观的数据存储格式&#xff0c;常用于配置应用程序的初始化设置。这种文件通常包含若干个节&#xff08;section&#xff09;和键值对&#xff08;key-value pairs&#xff09;。INI文件的每一部…

数据结构10:堆和堆排序

文章目录 树的概念及结构树的概念树的相关概念树的表示树在实际中的应用表示文件系统的目录树结构 二叉树概念及结构概念特殊的二叉树二叉树的性质二叉树的存储结构顺序存储链式存储 二叉树的顺序结构及实现二叉树的顺序结构堆的概念及结构 堆的实现堆的插入堆的删除堆的创建向…

【大数据】TiDB: A Raft-based HTAP Database

文章目录 数据库知识介绍数据库系统的ACID特性分布式系统和CAP理论关系型数据库与非关系型数据库关系型数据库非关系型数据库 OldSQL、NoSQL、NewSQLOldSQLNoSQLNewSQL OLTP、OLAP、HTAP 前言&#xff1a;为什么选择TiDB学习&#xff1f;pingCAP介绍TiDB介绍TiDB的影响力TiDB概…

Wireshark TS | 再谈应用传输缓慢问题

问题背景 来自于朋友分享的一个案例&#xff0c;某某客户反馈电脑应用软件使用时打开很慢&#xff0c;并提供了一个慢时所捕获的数据包文件以及服务端 IP。以前也说过&#xff0c;所谓的慢有很多种现象&#xff0c;也会有很多原因引起&#xff0c;在没有更多输入条件的情况下&…

Redis集合[持续更新]

Redis&#xff08;全称&#xff1a;Remote Dictionary Server 远程字典服务&#xff09;是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库&#xff0c;并提供多种语言的 API。 数据结构 1. string 字符串 字符串类型是 Redis 最…

云知识库怎么搭建才适合中小企业?用这几个工具很轻松

当我们想到知识库时&#xff0c;可能会联想到庞大的公司和复杂的系统&#xff0c;但实际上&#xff0c;随着技术的发展&#xff0c;中小企业也可以利用各种工具来建立自己的云知识库。这样不仅能够提升企业的知识管理效率&#xff0c;还能优化客户服务流程。这篇文章会介绍三款…

【QT+QGIS跨平台编译】182:【QGIS+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、qgis模块介绍二、QGIS下载三、文件分析四、pro文件五、编译实践一、qgis模块介绍 qgis模块作为QGIS启动模块,集成底层所有的模块。 二、QGIS下载 QGIS网址: QGIS Source Download 获取qgis.tar.bz2文件。 三、文件分析 解压缩qgis.tar.bz2文件,进入到qgis\…

编写Spark独立应用程序

执行本文之前&#xff0c;先搭建好spark的开发环境&#xff0c;我目前只搭建了standalone模式&#xff0c;参考链接 &#xff1a; Spark Standalone模式部署-CSDN博客 1. 安装sbt 1&#xff09;下载sbt 网址&#xff1a;https://www.scala-sbt.org/download.html &#xff0c…

# Win10 打不开【本地组策略编辑器】解决方案

Win10 打不开【本地组策略编辑器】解决方案 段子手168 问题描述&#xff1a; 当在 WIN R 打开【运行】输入&#xff1a;gpedit.msc 打开【本地组策略编辑器】时&#xff0c;出现错误时&#xff0c; 或者在【计算机管理】中 没有【本地用户和组】这一项。 可以试一下以下方…

8.MMD ray渲染主流常用插件介绍

导入一个场景&#xff0c;做好基础操作 导入控制器、天空盒、材质 1. AutoLuminous4 自发光的插件 ![[Pasted image 20240421103420.png]] 拖进去以后可以让场景中的自发光材质发光 也可以让不发光的材质强行发光 打开MME&#xff0c;找到AL_EmitterRT 展开场景&#x…

解线性方程组——直接解法:LU分解、PLU分解(类似列主元消去法) | 北太天元

L: lower triangular 下三角 U: upper triangular 上三角 LU 分解&#xff0c;顾名思义&#xff0c;为 把一个 矩阵 分成 一个下三角矩阵 乘上一个上三角矩阵的形式。 Example 为什么可以这样 几个基本的初等行变换&#xff0c;可以自己验算一下&#xff0c;等式的左边与右边…

spring高级篇(二)

1、Aware和InitializingBean Aware和InitializingBean都与Bean的生命周期管理相关。 Aware接口: 概念: Aware接口是Spring框架中的一个标记接口&#xff0c;它表示一个类能够感知到&#xff08;aware of&#xff09;Spring容器的存在及其特定的环境。Spring框架提供了多个Awar…

一周学会Django5 Python Web开发-Django5模型数据修改

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计47条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…