searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

PCIe基础

2024-06-11 08:55:40
3
0

版本


GEN44GB/sGEN58 GB/s

特点

全双工,最多32lane,每条lane支持读写双通道并行

串行中线

点对点通信,独享通道带宽

结构

树形结构

RC:为CPU代言

Switch:路由或转发

BridgePCI总线和PCIe总线间互转

EndpointPCIe设备

点到点通信

协议

分层

TLP:创建、发送、接收TLP,流量控制,QOS

LLP:创建、发送、接收LLDPAC/NACK,流量控制,电源管理等

物理层:负责数据传输,发送端把数据分发到各个lane并加扰,接收端把数据从各个lane汇总并去扰,以及8/10128/130编解码等。

TLP

分类

1.memory:访问设备物理空间,要先映射到主机内存空间

a)read

b)write:不需要应答

2.configuration:访问设备的配置空间,type 0用于endpointtype 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结构如下:

FmtFormat,占3bit,表明该TLP是否带有数据,Header3DW还是4DWbit00表示Header长度是3DW,为1表示是4DWbit10表示不带数据,为1表示带数据。

TypeTLP类型,占5bit0表示memory2表示message4表示configuration type 05表示configuration type110表示completion

RReserved,占1bit,设置为0

TCTraffic Class,占3bitTLP也分三六九等,优先级高的先得到服务,可以分为8个等级,07TC默认是0,数字越大,优先级越高。

AttrAttrbiute,占3bitbit0表示是否做cache一致性,bit1bit2表示保序类型,强保序和弱保序。

THTLP Processing Hints,占1bit,提示即将访问数据。

TDTLP Digest,占1bit,置1表示TLP包含ECRC,接收端应该做CRC校验。

EPPoisoned Data,占1bit,有毒的数据,请远离。

ATAddress Type,占2bit,地址类型。

LengthPayload数据长度,10bit,单位为DW,所以TLP最大数据长度是4KB;该长度总是DW的整数倍,如果TLP的数据不是DW的整数倍(不是4Byte的整数倍),则需要用到Last DW BE1st DW BE这两个域做补齐。

FmtFormat,占3bit,表明该TLP是否带有数据,Header3DW还是4DWbit00表示Header长度是3DW,为1表示是4DWbit10表示不带数据,为1表示带数据。

TypeTLP类型,占5bit0表示memory2表示message4表示configuration type 05表示configuration type110表示completion

RReserved,占1bit,设置为0

TCTraffic Class,占3bitTLP也分三六九等,优先级高的先得到服务,可以分为8个等级,07TC默认是0,数字越大,优先级越高。

AttrAttrbiute,占3bitbit0表示是否做cache一致性,bit1bit2表示保序类型,强保序和弱保序。

THTLP Processing Hints,占1bit,提示即将访问数据。

TDTLP Digest,占1bit,置1表示TLP包含ECRC,接收端应该做CRC校验。

EPPoisoned Data,占1bit,有毒的数据,请远离。

ATAddress Type,占2bit,地址类型。

LengthPayload数据长度,10bit,单位为DW,所以TLP最大数据长度是4KB;该长度总是DW的整数倍,如果TLP的数据不是DW的整数倍(不是4Byte的整数倍),则需要用到Last DW BE1st DW BE这两个域做补齐。

配置空间

上电时,通过configuration read读取配置空间,并完成BAR空间的映射;

一个配置空间对应一个Function,一个设备可以有多个配置空间;

通过Bus num+Device num+Function num可以唯一标志一个设备的function

地址空间

PCIe共有三种路由方式:基于地址(Memory Address)路由、基于设备IDBus Number+Device Number+Function Number)路由,还有就是隐式(Implicit)路由。

1.地址路由:

switch负责路由和TLP的转发,而路由信息是存储在SwitchConfiguration空间的;

每个端口都由Memory BaseMemory Limit描述其下连接的设备空间映射范围;

上游端口收到Memory Request,比较地址是否落在BAR寄存器范围内,如果是,则表示TLP是送给自己的,如果不是,则比较地址是否落在Memory BaseLimit之间;

下游端口收到Memory Request,比较地址是否落在BAR寄存器范围内,如果是,则表示TLP是送给自己的,如果不是,则比较地址是否落在Memory BaseLimit之间;

2.ID路由:

通过Bus num+Device num+Function num进行路由;

一个系统可以有256Bus,每条Bus最多支持32Device,每个Device最多支持8Fuction

链路层

发送端: 数据链路层接收上层传来的TLP,它给每个TLP加上Sequence Number(序列号,下文都用“序列号”来阐述)和LCRCLinkCRC),然后转交给物理层。

接收端: 数据链路层接收物理层传来的TLP,检测CRC和序列号,如果有问题,会拒绝接收该TLP,即不会传到它的事务层,并且通知发送端重传;如果该TLP没有问题,数据链路层则去除TLP中的序列号和LCRC,交由它的事务层,并通知发送端TLP正确接收。

1.地址路由:

switch负责路由和TLP的转发,而路由信息是存储在SwitchConfiguration空间的;

每个端口都由Memory BaseMemory Limit描述其下连接的设备空间映射范围;

上游端口收到Memory Request,比较地址是否落在BAR寄存器范围内,如果是,则表示TLP是送给自己的,如果不是,则比较地址是否落在Memory BaseLimit之间;

下游端口收到Memory Request,比较地址是否落在BAR寄存器范围内,如果是,则表示TLP是送给自己的,如果不是,则比较地址是否落在Memory BaseLimit之间;

2.ID路由:

通过Bus num+Device num+Function num进行路由;

一个系统可以有256Bus,每条Bus最多支持32Device,每个Device最多支持8Fuction

链路层

发送端: 数据链路层接收上层传来的TLP,它给每个TLP加上Sequence Number(序列号,下文都用“序列号”来阐述)和LCRCLinkCRC),然后转交给物理层。

接收端: 数据链路层接收物理层传来的TLP,检测CRC和序列号,如果有问题,会拒绝接收该TLP,即不会传到它的事务层,并且通知发送端重传;如果该TLP没有问题,数据链路层则去除TLP中的序列号和LCRC,交由它的事务层,并通知发送端TLP正确接收。

使用了握手协议(Ack/Nak)和重传(Retry)机制来保证数据传输的一致性和完整性,另外还包括TLP流量控制和电源管理等功能。

数据链路层借助DLLP来完成这些功能,DLLPData Link Layer Packet,数据链路层的数据包)源于发送端的数据链路层,终于接收端的数据链路层,因此,处于高层的事务层是感知不到它的存在的。

发送端: 数据链路层生成DLLP,交由物理层,物理层加起始(SDP)和结束标志(GEN 1/2ENDGEN3则没有),然后物理传输到对方。

接收端: 物理层对DLLP掐头去尾,交由数据链路层,数据链路层对DLLP进行校验,不管正确与否,DLLP都终于这层。

主要有四大类型DLLP

用以确保TLP传输完整性的DLLPACK/NAK

流控相关的DLLP

电源管理相关的DLLP

厂家自定义DLLP

 

物理层

Max payload Size

Max Read Request Size

PCIe省电模式ASPM

中断

引脚中断

如果该PCI设备不支持MSI终端机制,在PCI设备发出INTx中断请求时,PCIe桥将该INTx中断信号转换为INTx中断消息报文,并向Root Complex提交中断请求。在PCIe总线中,一共规定了8INTx中断消息报文。

PCI设备首先使用ASSERT_INTxRC提交中断请求,当RC处理完毕后发出一个Deassert_INTx中断请求,设备接收到Deassert_INTx报文后,将结束接收到的INTx中断请求。

 

经过中断控制器转发,效率低,MSIMSIX是发送memory write TLPCPU

每个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数据结构包含两个成员vectorentry,各占16bitvector是内核使用的irq numentry是配置给PCIe设备的msix num

pci_enable_msix(dev, msix_table, n)申请nmsix entry,存放在数组msix_ table中。

 

capabilities register

PCIe设备在提交MSI中断请求时,都是向MSI/MSI-X Capability结构中的Meaasge Address的地址写Message Data数据,从而组成一个存储器写TLP,向处理器提交存储器写请求。

PCIe设备可以通过MSIMSI-X报文向处理器提交中断请求,但是对于某个PCIe设备,可能仅支持一种报文,PCIe设备可以含有两种中断Capability,一种是MSI Capability,另一种是MSI-X Capability结构,但是一般情况下,PCIe设备一般只包含一种结构,或为MSI Capability结构,或为MSI-X Capability结构。

MSI Capability

MSI Capability有四种结构形式,翻译一下就是有四种结构体,有两种是不带中断掩码的MSI Capability,还有两种是带中断MaskingMSI 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]字段的值可以是3b000~3b111,因此可以发送8个中断请求,但是这8个中断请求的中断号必须要保持连续,在许多中断控制器中,Message Data字段连续也意味着中断控制器需要为这个PCIe设备分配8个连续的中断向量号。

Mask Bits:中断掩码寄存器,PCIe总线规定当一个设备使用MSI中断机制时,最多使用32个中断向量,一个设备最多发送32种中断请求,所以Mask Bits32位,相应位为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 BitsPending Bits字段配合防止处理器丢失中断请求。

MSI-X Capability

MSI-X中断机制提出目的是扩展PCIe设备使用的中断向量个数(次要),同时解决MSI中断要求使用中断向量必须保持连续的问题(主要)。

有时在一个PCIe中断控制器中,虽然有8个以上的中断向量号,但是很难保证这8个中断向量号是连续的,此时该PCIe设备的“”Multiple Interrupt Capable将小于“Multiple Interrupt Enable”字段。

使用MSI-X机制可以很好地解决该问题,在MSI-X Capability结构中,每一个中断向量使用独立的Meaasge AddressMessage 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:该字段存放该CapabilityID号。

Next Pointer:下一个MSI-X Capability的地址。

Message Control:指明当前PCIe设备使用MSI-X机制进行中断请求的状态和控制信息。

Table BIRBAR Indicator Register):基地址指示寄存器,该字段存放MSI-X Table所在的位置,PCIe总线规定,MSI-X Table存放在BAR空间中,该寄存器指示使用BAR0~BAR5寄存器中的哪个空间存放MSI-X Table,该字段由3位构成,3b000~3b101分别对应BAR0~BAR5

Table Offset:该字段存放MSI-X Table结构体在对应BAR空间中的偏移。

PBA BIRPengding Bit Array字段,该字段存放Pending字段位于哪个BAR空间中,与Table BIR类似。

PBA OFFSET:该字段指示在BAR空间中,Pending字段对应的偏移。

MSI TableMSI-X Table存放该设备使用的所有“Message Address”和“Message Data”。

MSI-X Table

由多个Entry组成,其中每个Entry与一个中断请求相对应,每个Entry中存在四个参数:

Msg Addr

MSI-X Enable位有效时,该字段存放MSI-X存储器写事务的目的地址低32位,该双字的312位有效,系统软件可读可写。

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 DataMessage 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:占2bit00表示边沿触发,10表示低电平触发,11表示高电平触发。

DMDestination Mode,占1bit,该字段表示在传递优先权最低的中断请求时,Destination ID字段被翻译为Logical或者Physical APIC ID

RHRedirection Hint Indication,占1bit,该字段指示是否进行中断转发,当RH0时,表示FSB Interrupt Message中断报文直接发向与Destination ID字段相同的CPU,为1时,将使能中断转发功能。

Destination ID:占8bit,该字段保存目标CPUID号。

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寄存器的值为0xFEexx00yxxAPIC ID yRH+DM),同时合理的设置Message Data寄存器和Vector字段。

PCIe设备提交MSI/MSI-X中断请求时,首先需要向“Message Address0xFEexx00y地址写“Message Data”寄存器中包含的数据,并以存储器写事务TLP的形式发送到RC

P2P桥发现这个存储器写事务TLP的目的地址在FSB Interrupt存储器空间中,则将这个PCIe存储器写事务转换为Interrupt Message总线事务,并在FSB总线上传播。

FSB总线上的CPU,根据APIC ID信息,选择是否接受这个Interrupt Message总线事务,并进入中断状态,之后该CPU将直接从这个总线事务中获得中断向量号,执行相应的中断处理函数,而不需要从APICID中断控制器获得中断向量。

 

 

0条评论
作者已关闭评论
c****6
11文章数
1粉丝数
c****6
11 文章 | 1 粉丝
c****6
11文章数
1粉丝数
c****6
11 文章 | 1 粉丝
原创

PCIe基础

2024-06-11 08:55:40
3
0

版本


GEN44GB/sGEN58 GB/s

特点

全双工,最多32lane,每条lane支持读写双通道并行

串行中线

点对点通信,独享通道带宽

结构

树形结构

RC:为CPU代言

Switch:路由或转发

BridgePCI总线和PCIe总线间互转

EndpointPCIe设备

点到点通信

协议

分层

TLP:创建、发送、接收TLP,流量控制,QOS

LLP:创建、发送、接收LLDPAC/NACK,流量控制,电源管理等

物理层:负责数据传输,发送端把数据分发到各个lane并加扰,接收端把数据从各个lane汇总并去扰,以及8/10128/130编解码等。

TLP

分类

1.memory:访问设备物理空间,要先映射到主机内存空间

a)read

b)write:不需要应答

2.configuration:访问设备的配置空间,type 0用于endpointtype 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结构如下:

FmtFormat,占3bit,表明该TLP是否带有数据,Header3DW还是4DWbit00表示Header长度是3DW,为1表示是4DWbit10表示不带数据,为1表示带数据。

TypeTLP类型,占5bit0表示memory2表示message4表示configuration type 05表示configuration type110表示completion

RReserved,占1bit,设置为0

TCTraffic Class,占3bitTLP也分三六九等,优先级高的先得到服务,可以分为8个等级,07TC默认是0,数字越大,优先级越高。

AttrAttrbiute,占3bitbit0表示是否做cache一致性,bit1bit2表示保序类型,强保序和弱保序。

THTLP Processing Hints,占1bit,提示即将访问数据。

TDTLP Digest,占1bit,置1表示TLP包含ECRC,接收端应该做CRC校验。

EPPoisoned Data,占1bit,有毒的数据,请远离。

ATAddress Type,占2bit,地址类型。

LengthPayload数据长度,10bit,单位为DW,所以TLP最大数据长度是4KB;该长度总是DW的整数倍,如果TLP的数据不是DW的整数倍(不是4Byte的整数倍),则需要用到Last DW BE1st DW BE这两个域做补齐。

FmtFormat,占3bit,表明该TLP是否带有数据,Header3DW还是4DWbit00表示Header长度是3DW,为1表示是4DWbit10表示不带数据,为1表示带数据。

TypeTLP类型,占5bit0表示memory2表示message4表示configuration type 05表示configuration type110表示completion

RReserved,占1bit,设置为0

TCTraffic Class,占3bitTLP也分三六九等,优先级高的先得到服务,可以分为8个等级,07TC默认是0,数字越大,优先级越高。

AttrAttrbiute,占3bitbit0表示是否做cache一致性,bit1bit2表示保序类型,强保序和弱保序。

THTLP Processing Hints,占1bit,提示即将访问数据。

TDTLP Digest,占1bit,置1表示TLP包含ECRC,接收端应该做CRC校验。

EPPoisoned Data,占1bit,有毒的数据,请远离。

ATAddress Type,占2bit,地址类型。

LengthPayload数据长度,10bit,单位为DW,所以TLP最大数据长度是4KB;该长度总是DW的整数倍,如果TLP的数据不是DW的整数倍(不是4Byte的整数倍),则需要用到Last DW BE1st DW BE这两个域做补齐。

配置空间

上电时,通过configuration read读取配置空间,并完成BAR空间的映射;

一个配置空间对应一个Function,一个设备可以有多个配置空间;

通过Bus num+Device num+Function num可以唯一标志一个设备的function

地址空间

PCIe共有三种路由方式:基于地址(Memory Address)路由、基于设备IDBus Number+Device Number+Function Number)路由,还有就是隐式(Implicit)路由。

1.地址路由:

switch负责路由和TLP的转发,而路由信息是存储在SwitchConfiguration空间的;

每个端口都由Memory BaseMemory Limit描述其下连接的设备空间映射范围;

上游端口收到Memory Request,比较地址是否落在BAR寄存器范围内,如果是,则表示TLP是送给自己的,如果不是,则比较地址是否落在Memory BaseLimit之间;

下游端口收到Memory Request,比较地址是否落在BAR寄存器范围内,如果是,则表示TLP是送给自己的,如果不是,则比较地址是否落在Memory BaseLimit之间;

2.ID路由:

通过Bus num+Device num+Function num进行路由;

一个系统可以有256Bus,每条Bus最多支持32Device,每个Device最多支持8Fuction

链路层

发送端: 数据链路层接收上层传来的TLP,它给每个TLP加上Sequence Number(序列号,下文都用“序列号”来阐述)和LCRCLinkCRC),然后转交给物理层。

接收端: 数据链路层接收物理层传来的TLP,检测CRC和序列号,如果有问题,会拒绝接收该TLP,即不会传到它的事务层,并且通知发送端重传;如果该TLP没有问题,数据链路层则去除TLP中的序列号和LCRC,交由它的事务层,并通知发送端TLP正确接收。

1.地址路由:

switch负责路由和TLP的转发,而路由信息是存储在SwitchConfiguration空间的;

每个端口都由Memory BaseMemory Limit描述其下连接的设备空间映射范围;

上游端口收到Memory Request,比较地址是否落在BAR寄存器范围内,如果是,则表示TLP是送给自己的,如果不是,则比较地址是否落在Memory BaseLimit之间;

下游端口收到Memory Request,比较地址是否落在BAR寄存器范围内,如果是,则表示TLP是送给自己的,如果不是,则比较地址是否落在Memory BaseLimit之间;

2.ID路由:

通过Bus num+Device num+Function num进行路由;

一个系统可以有256Bus,每条Bus最多支持32Device,每个Device最多支持8Fuction

链路层

发送端: 数据链路层接收上层传来的TLP,它给每个TLP加上Sequence Number(序列号,下文都用“序列号”来阐述)和LCRCLinkCRC),然后转交给物理层。

接收端: 数据链路层接收物理层传来的TLP,检测CRC和序列号,如果有问题,会拒绝接收该TLP,即不会传到它的事务层,并且通知发送端重传;如果该TLP没有问题,数据链路层则去除TLP中的序列号和LCRC,交由它的事务层,并通知发送端TLP正确接收。

使用了握手协议(Ack/Nak)和重传(Retry)机制来保证数据传输的一致性和完整性,另外还包括TLP流量控制和电源管理等功能。

数据链路层借助DLLP来完成这些功能,DLLPData Link Layer Packet,数据链路层的数据包)源于发送端的数据链路层,终于接收端的数据链路层,因此,处于高层的事务层是感知不到它的存在的。

发送端: 数据链路层生成DLLP,交由物理层,物理层加起始(SDP)和结束标志(GEN 1/2ENDGEN3则没有),然后物理传输到对方。

接收端: 物理层对DLLP掐头去尾,交由数据链路层,数据链路层对DLLP进行校验,不管正确与否,DLLP都终于这层。

主要有四大类型DLLP

用以确保TLP传输完整性的DLLPACK/NAK

流控相关的DLLP

电源管理相关的DLLP

厂家自定义DLLP

 

物理层

Max payload Size

Max Read Request Size

PCIe省电模式ASPM

中断

引脚中断

如果该PCI设备不支持MSI终端机制,在PCI设备发出INTx中断请求时,PCIe桥将该INTx中断信号转换为INTx中断消息报文,并向Root Complex提交中断请求。在PCIe总线中,一共规定了8INTx中断消息报文。

PCI设备首先使用ASSERT_INTxRC提交中断请求,当RC处理完毕后发出一个Deassert_INTx中断请求,设备接收到Deassert_INTx报文后,将结束接收到的INTx中断请求。

 

经过中断控制器转发,效率低,MSIMSIX是发送memory write TLPCPU

每个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数据结构包含两个成员vectorentry,各占16bitvector是内核使用的irq numentry是配置给PCIe设备的msix num

pci_enable_msix(dev, msix_table, n)申请nmsix entry,存放在数组msix_ table中。

 

capabilities register

PCIe设备在提交MSI中断请求时,都是向MSI/MSI-X Capability结构中的Meaasge Address的地址写Message Data数据,从而组成一个存储器写TLP,向处理器提交存储器写请求。

PCIe设备可以通过MSIMSI-X报文向处理器提交中断请求,但是对于某个PCIe设备,可能仅支持一种报文,PCIe设备可以含有两种中断Capability,一种是MSI Capability,另一种是MSI-X Capability结构,但是一般情况下,PCIe设备一般只包含一种结构,或为MSI Capability结构,或为MSI-X Capability结构。

MSI Capability

MSI Capability有四种结构形式,翻译一下就是有四种结构体,有两种是不带中断掩码的MSI Capability,还有两种是带中断MaskingMSI 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]字段的值可以是3b000~3b111,因此可以发送8个中断请求,但是这8个中断请求的中断号必须要保持连续,在许多中断控制器中,Message Data字段连续也意味着中断控制器需要为这个PCIe设备分配8个连续的中断向量号。

Mask Bits:中断掩码寄存器,PCIe总线规定当一个设备使用MSI中断机制时,最多使用32个中断向量,一个设备最多发送32种中断请求,所以Mask Bits32位,相应位为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 BitsPending Bits字段配合防止处理器丢失中断请求。

MSI-X Capability

MSI-X中断机制提出目的是扩展PCIe设备使用的中断向量个数(次要),同时解决MSI中断要求使用中断向量必须保持连续的问题(主要)。

有时在一个PCIe中断控制器中,虽然有8个以上的中断向量号,但是很难保证这8个中断向量号是连续的,此时该PCIe设备的“”Multiple Interrupt Capable将小于“Multiple Interrupt Enable”字段。

使用MSI-X机制可以很好地解决该问题,在MSI-X Capability结构中,每一个中断向量使用独立的Meaasge AddressMessage 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:该字段存放该CapabilityID号。

Next Pointer:下一个MSI-X Capability的地址。

Message Control:指明当前PCIe设备使用MSI-X机制进行中断请求的状态和控制信息。

Table BIRBAR Indicator Register):基地址指示寄存器,该字段存放MSI-X Table所在的位置,PCIe总线规定,MSI-X Table存放在BAR空间中,该寄存器指示使用BAR0~BAR5寄存器中的哪个空间存放MSI-X Table,该字段由3位构成,3b000~3b101分别对应BAR0~BAR5

Table Offset:该字段存放MSI-X Table结构体在对应BAR空间中的偏移。

PBA BIRPengding Bit Array字段,该字段存放Pending字段位于哪个BAR空间中,与Table BIR类似。

PBA OFFSET:该字段指示在BAR空间中,Pending字段对应的偏移。

MSI TableMSI-X Table存放该设备使用的所有“Message Address”和“Message Data”。

MSI-X Table

由多个Entry组成,其中每个Entry与一个中断请求相对应,每个Entry中存在四个参数:

Msg Addr

MSI-X Enable位有效时,该字段存放MSI-X存储器写事务的目的地址低32位,该双字的312位有效,系统软件可读可写。

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 DataMessage 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:占2bit00表示边沿触发,10表示低电平触发,11表示高电平触发。

DMDestination Mode,占1bit,该字段表示在传递优先权最低的中断请求时,Destination ID字段被翻译为Logical或者Physical APIC ID

RHRedirection Hint Indication,占1bit,该字段指示是否进行中断转发,当RH0时,表示FSB Interrupt Message中断报文直接发向与Destination ID字段相同的CPU,为1时,将使能中断转发功能。

Destination ID:占8bit,该字段保存目标CPUID号。

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寄存器的值为0xFEexx00yxxAPIC ID yRH+DM),同时合理的设置Message Data寄存器和Vector字段。

PCIe设备提交MSI/MSI-X中断请求时,首先需要向“Message Address0xFEexx00y地址写“Message Data”寄存器中包含的数据,并以存储器写事务TLP的形式发送到RC

P2P桥发现这个存储器写事务TLP的目的地址在FSB Interrupt存储器空间中,则将这个PCIe存储器写事务转换为Interrupt Message总线事务,并在FSB总线上传播。

FSB总线上的CPU,根据APIC ID信息,选择是否接受这个Interrupt Message总线事务,并进入中断状态,之后该CPU将直接从这个总线事务中获得中断向量号,执行相应的中断处理函数,而不需要从APICID中断控制器获得中断向量。

 

 

文章来自个人专栏
技术讨论
11 文章 | 1 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0