PCIe系列第⼋讲、MSI和MSI-X中断机制
本章将着重讲述PCIe的MSI和MSI-X中断机制,在FPGA应⽤中主要通过XDMA中断与上位机进⾏通信,本⽂略长。
简介
在PCIe总线中,MSI和MSI-X中断机制使⽤存储器写请求TLP向处理器提交中断请求,所以将MSI/MSI-X中断信息的存储器写报⽂简称为MSI/MSI-X报⽂。
x86使⽤FSB Interrupt Message⽅式处理MSI/MSI-X中断请求。
PCIe设备在提交MSI中断请求时,都是向MSI/MSI-X Capability结构中的Meaasge Address的地址写Message Data数据,从⽽组成⼀个存储器写TLP,向处理器提交存储器写请求。
翻译⼀下就是说:
由于存储器域和PCIe域地址的相互映射,向MessageAddress地址写数据,也就是向对应的存储器域地址写数据,写⼊的数据为Message Data,从⽽组成⼀个存储器写TLP,向存储器提交存储器写请求。
虚拟中断线⽅式
在PCIe桥下挂载PCI设备时,如果该PCI设备不⽀持MSI终端机制,在PCI设备发出INTx中断请求时,PCIe桥将该INTx中断信号转换为INTx 中断消息报⽂,并向Root Complex提交中断请求。在PCIe总线中,⼀共规定了8种INTx中断消息报⽂:
当PCIe设备不使⽤MSI报⽂向RC提交中断请求时,可以⾸先使⽤ASSERT_INTx向RC提交中断请求,当RC处理完毕后发出⼀个
Deassert_INTx中断请求,设备接收到Deassert_INTx报⽂后,将结束接收到的INTx中断请求。
PCIe设备接收到⼀个INTx中断请求后,需要⾸先结束该INTx中断消息,之后根据中断路由表产⽣⼀个新的INTx中断消息,直到这个中断消息传递到RC。
Legacy Interrupt
Legacy Interrupt,翻译过来是传统中断,百思不得其解,直到看到这样⼀段解释:
Legacy interruptare two interrupts that were in ARM before GIC arrived:
nIRQ-normalinterrupt request
fIRQ-fastinterrupt
Legacyinterrupts were made for single-core processors,and they don’t support multi-coreprocessors internally.
The legacy arehardwired into one of the cores
LegacyInterrupts:传统中断,⾮MSI中断,PCI设备使⽤INTx中断请求的⽅式与电平触发类似,⽽MSI/MSI-X中断请求的⽅式与边沿触发⽅式类似。
当PCI设备的INTx信号有效时,PCIe桥将该信号转换为Assert_INTX消息报⽂,当这些INTx信号⽆效时,PCIe桥将该信号转换为Deassert_INTx中断信号。
MSI与MSI-X的区别
MSI中断机制最多⽀持32个中断请求,⽽且要求中断向量连续;
MSI-X可以⽀持更多的中断请求,⽽且并不要求中断向量连续。
MSI/MSI-X Capabiliity结构
PCIe设备可以通过MSI或MSI-X报⽂向处理器提交中断请求,但是对于某个PCIe设备,可能仅⽀持⼀种报⽂,PCIe设备可以含有两种中断Capability,⼀种是MSI Capability,另⼀种是MSI-X Capability结构,但是⼀般情况下,PCIe设备⼀般只包含⼀种结构,或为MSI Capability结构,或为MSI-X Capability结构。
MSI Capability结构
MSI Capability有四种结构形式,翻译⼀下就是有四种结构体,有两种是不带中断掩码的,32、64位的信息地址的MSI Capability,还有两种是带中断Masking的MSI Capability,MSI Capability结构体的结构如图所⽰:
pendingCapability ID
当前MSI Capability结构体的ID。
在PCIe设备中,每⼀个MSI Capability都有⾃⼰的中断号。
Message Control
存放当前PCIe设备使⽤MSI机制进⾏中断请求的状态与控制信息,诸如是否⽀持中断掩码,中断地址是否为64bit,实际分配的中断个数和理论上⽀持的中断个数。
Message Address:
当MSI Enable位有效时,该寄存器存放⽬标存储器写事务地址的低32位,该寄存器的32:2字段有效,系统软件可以对该字段进⾏读写操作,位[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内部逻辑置⼀,此时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机制进⾏中断请求的状态和控制信息。
可以看到,与MSI机制相⽐,该寄存器为16bit,将相应寄存器数量缩减⼀半。
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
位置⼀,当系统软件将Per Vector Mask清零时,PCIe设备需要提交MSI-X中断请求,同时将Pending位清零。
————————————————————
x86处理器处理MSI-X中断请求
PCIe设备发出MSI-X中断请求的⽅式与MSI机制类似,都是向对应的存储器地址(Message Address)写中断数据(Message Data),只是MSI-X机制⽀持更多的中断类型,同时允许“Message Data”中断向量可以不连续。
MSI-X机制使⽤的Message Data与Message Address并不放在配置空间中,⽽是放在BAR(基地址空间)中,从⽽可以由⽤户决定所使⽤的中断请求的个数。
PCIe设备使⽤Message Address字段
在x86处理器系统中,PCIe设备使⽤的Message Address字段仍保存PCI总线域的存储器地址,其格式为:
其中第31~20位存放FSB Interrupt存储器空间的基地址,其值为0xFEE。当PCIe设备对“0xFEEx_xxxx”这段“PCI域”的地址空间进⾏写操作时,MCH/ICH会⾸先进⾏“PCI总线域”到“存储器域”的地址转换,之后将这个写操作翻译为FSB总线的Interrupt Message 总线事务,从⽽向CPU内核提交中断请求。
Destination ID
该字段保存⽬标CPU的ID号。
RH(Redirection Hint Indication)
该字段指⽰是否进⾏中断转发,当RH为0时,表⽰FSB Interrupt Message中断报⽂直接发向与Destination ID字段相同的CPU,为1时,将使能中断转发功能。
DM(Destination Mode)
该字段表⽰在传递优先权最低的中断请求时,Destination ID字段被翻译为Logical或者Physical APIC ID。
PCIe设备使⽤Message Data字段
Trigger Mode
中断触发⽅式控制寄存器,
2’b00: PCIe设备使⽤边沿触发⽅式申请中断
2’b10: PCIe设备使⽤低电平触发⽅式申请中断
2’b11: PCIe设备使⽤⾼电平触发⽅式申请中断
Vector
表⽰这个中断使⽤的中断向量,FSB Interrupt Message总线事务在提交中断请求的同时,也将中断向量提交给处理器,因此使⽤FSB Interrupt Meaasge总线事务时,处理器不需要使⽤中断响应周期通过读取中断控制器获取中断向量号。该⽅式的中断请求效率较⾼。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。