版本
GEN4:4GB/s,GEN5:8 GB/s
特点
全双工,最多32条lane,每条lane支持读写双通道并行
串行中线
点对点通信,独享通道带宽
结构
树形结构
RC:为CPU代言
Switch:路由或转发
Bridge:PCI总线和PCIe总线间互转
Endpoint:PCIe设备
点到点通信
协议
分层
TLP:创建、发送、接收TLP,流量控制,QOS等
LLP:创建、发送、接收LLDP和AC/NACK,流量控制,电源管理等
物理层:负责数据传输,发送端把数据分发到各个lane并加扰,接收端把数据从各个lane汇总并去扰,以及8/10或128/130编解码等。
TLP
分类
1.memory:访问设备物理空间,要先映射到主机内存空间
a)read
b)write:不需要应答
2.configuration:访问设备的配置空间,type 0用于endpoint,type 1用于switch
a)read
b)write
3.message:不需要应答,传输中断或错误信息
a)message with data
b)message without data
4.completion:对请求者进行应答
a)completion with data
b)completion without data
格式
Header结构如下:
Fmt:Format,占3bit,表明该TLP是否带有数据,Header是3DW还是4DW;bit0为0表示Header长度是3DW,为1表示是4DW;bit1为0表示不带数据,为1表示带数据。
Type:TLP类型,占5bit,0表示memory,2表示message,4表示configuration type 0,5表示configuration type1,10表示completion。
R:Reserved,占1bit,设置为0。
TC:Traffic Class,占3bit,TLP也分三六九等,优先级高的先得到服务,可以分为8个等级,0~7,TC默认是0,数字越大,优先级越高。
Attr:Attrbiute,占3bit,bit0表示是否做cache一致性,bit1和bit2表示保序类型,强保序和弱保序。
TH:TLP Processing Hints,占1bit,提示即将访问数据。
TD:TLP Digest,占1bit,置1表示TLP包含ECRC,接收端应该做CRC校验。
EP:Poisoned Data,占1bit,有毒的数据,请远离。
AT:Address Type,占2bit,地址类型。
Length:Payload数据长度,10个bit,单位为DW,所以TLP最大数据长度是4KB;该长度总是DW的整数倍,如果TLP的数据不是DW的整数倍(不是4Byte的整数倍),则需要用到Last DW BE和1st DW BE这两个域做补齐。
Fmt:Format,占3bit,表明该TLP是否带有数据,Header是3DW还是4DW;bit0为0表示Header长度是3DW,为1表示是4DW;bit1为0表示不带数据,为1表示带数据。
Type:TLP类型,占5bit,0表示memory,2表示message,4表示configuration type 0,5表示configuration type1,10表示completion。
R:Reserved,占1bit,设置为0。
TC:Traffic Class,占3bit,TLP也分三六九等,优先级高的先得到服务,可以分为8个等级,0~7,TC默认是0,数字越大,优先级越高。
Attr:Attrbiute,占3bit,bit0表示是否做cache一致性,bit1和bit2表示保序类型,强保序和弱保序。
TH:TLP Processing Hints,占1bit,提示即将访问数据。
TD:TLP Digest,占1bit,置1表示TLP包含ECRC,接收端应该做CRC校验。
EP:Poisoned Data,占1bit,有毒的数据,请远离。
AT:Address Type,占2bit,地址类型。
Length:Payload数据长度,10个bit,单位为DW,所以TLP最大数据长度是4KB;该长度总是DW的整数倍,如果TLP的数据不是DW的整数倍(不是4Byte的整数倍),则需要用到Last DW BE和1st DW BE这两个域做补齐。
配置空间
上电时,通过configuration read读取配置空间,并完成BAR空间的映射;
一个配置空间对应一个Function,一个设备可以有多个配置空间;
通过Bus num+Device num+Function num可以唯一标志一个设备的function。
地址空间
PCIe共有三种路由方式:基于地址(Memory Address)路由、基于设备ID(Bus Number+Device Number+Function Number)路由,还有就是隐式(Implicit)路由。
1.地址路由:
switch负责路由和TLP的转发,而路由信息是存储在Switch的Configuration空间的;
每个端口都由Memory Base和Memory Limit描述其下连接的设备空间映射范围;
上游端口收到Memory Request,比较地址是否落在BAR寄存器范围内,如果是,则表示TLP是送给自己的,如果不是,则比较地址是否落在Memory Base和Limit之间;
下游端口收到Memory Request,比较地址是否落在BAR寄存器范围内,如果是,则表示TLP是送给自己的,如果不是,则比较地址是否落在Memory Base和Limit之间;
2.ID路由:
通过Bus num+Device num+Function num进行路由;
一个系统可以有256条Bus,每条Bus最多支持32个Device,每个Device最多支持8个Fuction;
链路层
发送端: 数据链路层接收上层传来的TLP,它给每个TLP加上Sequence Number(序列号,下文都用“序列号”来阐述)和LCRC(LinkCRC),然后转交给物理层。
接收端: 数据链路层接收物理层传来的TLP,检测CRC和序列号,如果有问题,会拒绝接收该TLP,即不会传到它的事务层,并且通知发送端重传;如果该TLP没有问题,数据链路层则去除TLP中的序列号和LCRC,交由它的事务层,并通知发送端TLP正确接收。
1.地址路由:
switch负责路由和TLP的转发,而路由信息是存储在Switch的Configuration空间的;
每个端口都由Memory Base和Memory Limit描述其下连接的设备空间映射范围;
上游端口收到Memory Request,比较地址是否落在BAR寄存器范围内,如果是,则表示TLP是送给自己的,如果不是,则比较地址是否落在Memory Base和Limit之间;
下游端口收到Memory Request,比较地址是否落在BAR寄存器范围内,如果是,则表示TLP是送给自己的,如果不是,则比较地址是否落在Memory Base和Limit之间;
2.ID路由:
通过Bus num+Device num+Function num进行路由;
一个系统可以有256条Bus,每条Bus最多支持32个Device,每个Device最多支持8个Fuction;
链路层
发送端: 数据链路层接收上层传来的TLP,它给每个TLP加上Sequence Number(序列号,下文都用“序列号”来阐述)和LCRC(LinkCRC),然后转交给物理层。
接收端: 数据链路层接收物理层传来的TLP,检测CRC和序列号,如果有问题,会拒绝接收该TLP,即不会传到它的事务层,并且通知发送端重传;如果该TLP没有问题,数据链路层则去除TLP中的序列号和LCRC,交由它的事务层,并通知发送端TLP正确接收。
使用了握手协议(Ack/Nak)和重传(Retry)机制来保证数据传输的一致性和完整性,另外还包括TLP流量控制和电源管理等功能。
数据链路层借助DLLP来完成这些功能,DLLP(Data Link Layer Packet,数据链路层的数据包)源于发送端的数据链路层,终于接收端的数据链路层,因此,处于高层的事务层是感知不到它的存在的。
发送端: 数据链路层生成DLLP,交由物理层,物理层加起始(SDP)和结束标志(GEN 1/2加END,GEN3则没有),然后物理传输到对方。
接收端: 物理层对DLLP掐头去尾,交由数据链路层,数据链路层对DLLP进行校验,不管正确与否,DLLP都终于这层。
主要有四大类型DLLP:
用以确保TLP传输完整性的DLLP:ACK/NAK;
流控相关的DLLP;
电源管理相关的DLLP;
厂家自定义DLLP。
物理层
Max payload Size
Max Read Request Size
PCIe省电模式ASPM
中断
引脚中断
如果该PCI设备不支持MSI终端机制,在PCI设备发出INTx中断请求时,PCIe桥将该INTx中断信号转换为INTx中断消息报文,并向Root Complex提交中断请求。在PCIe总线中,一共规定了8种INTx中断消息报文。
PCI设备首先使用ASSERT_INTx向RC提交中断请求,当RC处理完毕后发出一个Deassert_INTx中断请求,设备接收到Deassert_INTx报文后,将结束接收到的INTx中断请求。
经过中断控制器转发,效率低,MSI和MSIX是发送memory write TLP给CPU。
每个PF只能有一个中断引脚,需支持多个中断,只能中断共享,效率低。
MSI
最多支持32个中断;
中断号的申请必须连续,个数必须是2的幂次方;
pci_enable_msi(dev)给dev分配一个irq num;
pci_enable_msi_block(dev, count)给dev分配2的幂次方个irq num。
MSIX
最多支持2048个中断;
中断号的申请不需要连续,个数任意;
msix table数据结构包含两个成员vector和entry,各占16bit,vector是内核使用的irq num,entry是配置给PCIe设备的msix num;
pci_enable_msix(dev, msix_table, n)申请n个msix entry,存放在数组msix_ table中。
capabilities register
PCIe设备在提交MSI中断请求时,都是向MSI/MSI-X Capability结构中的Meaasge Address的地址写Message Data数据,从而组成一个存储器写TLP,向处理器提交存储器写请求。
PCIe设备可以通过MSI或MSI-X报文向处理器提交中断请求,但是对于某个PCIe设备,可能仅支持一种报文,PCIe设备可以含有两种中断Capability,一种是MSI Capability,另一种是MSI-X Capability结构,但是一般情况下,PCIe设备一般只包含一种结构,或为MSI Capability结构,或为MSI-X Capability结构。
MSI Capability
MSI Capability有四种结构形式,翻译一下就是有四种结构体,有两种是不带中断掩码的MSI Capability,还有两种是带中断Masking的MSI Capability。
Capability ID:当前MSI Capability结构体的ID。在PCIe设备中,每一个MSI Capability都有自己的中断号。
Message Control:存放当前PCIe设备使用MSI机制进行中断请求的状态与控制信息,诸如是否支持中断掩码,中断地址是否为六十四bit,实际分配的中断个数和理论上支持的中断个数。
Message Address:当MSI Enable位有效时,该寄存器存放目标存储器写事务地址的低32位,该寄存器的32:2字段有效,系统软件可以对该字段进行读写操作,bit[1:0]为0。
Message UpperAddress:当MSI Enable位有效时,该寄存器存放目标存储器写事务地址的高32位。
Next Pointer:下一个MSI Capability结构体的地址。
Message Data[15:0]:当MSI Enable位有效时,该字段存放MSI报文使用的中断数据,PCIe设备可以通过改变Message Data中的数据发送不同的中断请求。
如果一个PCIe设备需要使用8个中断请求且使用MSI中断机制时,Meaasge Data[2:0]字段的值可以是3’b000~3’b111,因此可以发送8个中断请求,但是这8个中断请求的中断号必须要保持连续,在许多中断控制器中,Message Data字段连续也意味着中断控制器需要为这个PCIe设备分配8个连续的中断向量号。
Mask Bits:中断掩码寄存器,PCIe总线规定当一个设备使用MSI中断机制时,最多使用32个中断向量,一个设备最多发送32种中断请求,所以Mask Bits为32位,相应位为1时表示相应的中断被屏蔽。该字段和Pending字段对于MSI中断机制是可选字段。
Pending Bits:待处理中断寄存器,该字段对于系统软件可读,PCIe设备内部逻辑可以改变该字段的值。该字段的长度为32位,与Mask字段配合使用,当一个中断对应的Mask bit位为1(屏蔽)时,Pending Bits字段对应的位将被PCIe内部逻辑置1,此时PCIe设备并不会向中断控制器发送MSI中断报文;当系统软件将对应的Mask bit位由1改为0时,PCIe设备向中断控制器发送MSI中断报文。
在PCIe设备驱动程序开发时,有时需要Mask Bits和Pending Bits字段配合防止处理器丢失中断请求。
MSI-X Capability
MSI-X中断机制提出目的是扩展PCIe设备使用的中断向量个数(次要),同时解决MSI中断要求使用中断向量必须保持连续的问题(主要)。
有时在一个PCIe中断控制器中,虽然有8个以上的中断向量号,但是很难保证这8个中断向量号是连续的,此时该PCIe设备的“”Multiple Interrupt Capable将小于“Multiple Interrupt Enable”字段。
使用MSI-X机制可以很好地解决该问题,在MSI-X Capability结构中,每一个中断向量使用独立的Meaasge Address和Message Data字段,从而中断控制器可以更加合理的为PCIe设备分配中断资源。
与MSI Capability寄存器相比,MSI-X Capability寄存器使用一个结构体来专门存放“Message Address”字段和“Message Data”字段,而不是将这两个字段放入MSI-X Capability寄存器中,MSI-X机制中存放“Message Data”和“Message Address”字段的结构体就称为MSI-X Table。
MSI-X Capability ID:该字段存放该Capability的ID号。
Next Pointer:下一个MSI-X Capability的地址。
Message Control:指明当前PCIe设备使用MSI-X机制进行中断请求的状态和控制信息。
Table BIR(BAR Indicator Register):基地址指示寄存器,该字段存放MSI-X Table所在的位置,PCIe总线规定,MSI-X Table存放在BAR空间中,该寄存器指示使用BAR0~BAR5寄存器中的哪个空间存放MSI-X Table,该字段由3位构成,3’b000~3’b101分别对应BAR0~BAR5。
Table Offset:该字段存放MSI-X Table结构体在对应BAR空间中的偏移。
PBA BIR:Pengding Bit Array字段,该字段存放Pending字段位于哪个BAR空间中,与Table BIR类似。
PBA OFFSET:该字段指示在BAR空间中,Pending字段对应的偏移。
MSI Table:MSI-X Table存放该设备使用的所有“Message Address”和“Message Data”。
MSI-X Table
由多个Entry组成,其中每个Entry与一个中断请求相对应,每个Entry中存在四个参数:
Msg Addr:
当MSI-X Enable位有效时,该字段存放MSI-X存储器写事务的目的地址低32位,该双字的31:2位有效,系统软件可读可写。
Msg Upper Addr:
当MSI-X Enable位有效时,该字段存放MSI-X存储器写事务的目的地址高32位。
Msg Data:存放MSI-X中断报文使用的数据。
Vector Control:
该字段可读可写,该字段只有第0位(Per Vector Mask)位有效,其他未保留,该位在复位时为0,为1时,PCIe设备不能使用该Entry提交中断请求,与MSI机制中的Mask位类似。
Pending Table:
Pending位需要与Per Vector Mask位配套使用。当Per Vector Mask位为1时,PCIe设备不能马上发送MSI-X中断报文,而是需要首先将对应的Pending位置1,当系统软件将Per Vector Mask清零时,PCIe设备需要提交MSI-X中断请求,同时将Pending位清零。
PCIe设备发出MSI-X中断请求的方式与MSI机制类似,都是向对应的存储器地址(Message Address)写中断数据(Message Data),只是MSI-X机制支持更多的中断类型,同时允许“Message Data”中断向量可以不连续。MSI-X机制使用的Message Data与Message Address并不放在配置空间中,而是放在BAR(基地址空间)中,从而可以由用户决定所使用的中断请求的个数。
Message Address
PCIe设备使用的Message Address字段仍保存PCI总线域的存储器地址(其中第31~20位为0xFEE,表示FSB Interrupt存储器空间的基地址)。当PCIe设备对“0xFEEx_xxxx”这段“PCI域”的地址空间进行写操作时,MCH/ICH会首先进行“PCI总线域”到“存储器域”的地址转换,之后将这个写操作翻译为FSB总线的Interrupt Message总线事务,从而向CPU内核提交中断请求。
XX:占2bit,00表示边沿触发,10表示低电平触发,11表示高电平触发。
DM:Destination Mode,占1bit,该字段表示在传递优先权最低的中断请求时,Destination ID字段被翻译为Logical或者Physical APIC ID。
RH:Redirection Hint Indication,占1bit,该字段指示是否进行中断转发,当RH为0时,表示FSB Interrupt Message中断报文直接发向与Destination ID字段相同的CPU,为1时,将使能中断转发功能。
Destination ID:占8bit,该字段保存目标CPU的ID号。
MSI TLP
Requester ID:指定了RC;
MSI Message Address:指定映射的内存地址;
MSI Message Data:对于MSI来说就是irq num,对于MSIX来说就是msix entry num。
MSI和MSIX中断机制
X86处理器使用FSB总线的Interrupt Message总线事务,向CPU提交MSI/MSI-X中断请求。
PCIe设备在发送MSI/MSI-X中断请求之前,系统软件需要合理的设置PCIe设备的MSI/MSI-X Capability寄存器,使Message Address寄存器的值为0xFEexx00y(xx:APIC ID y:RH+DM),同时合理的设置Message Data寄存器和Vector字段。
PCIe设备提交MSI/MSI-X中断请求时,首先需要向“Message Address”0xFEexx00y地址写“Message Data”寄存器中包含的数据,并以存储器写事务TLP的形式发送到RC。
P2P桥发现这个存储器写事务TLP的目的地址在FSB Interrupt存储器空间中,则将这个PCIe存储器写事务转换为Interrupt Message总线事务,并在FSB总线上传播。
FSB总线上的CPU,根据APIC ID信息,选择是否接受这个Interrupt Message总线事务,并进入中断状态,之后该CPU将直接从这个总线事务中获得中断向量号,执行相应的中断处理函数,而不需要从APICID中断控制器获得中断向量。