msi和msi-x中断机制
在pci总线中,所有需要提交中断请求的设备,必须能够通过intx引脚提交中断请求,而msi机制是一个可选机制。而在pcie总线中,pcie设备必须支持msi或者msi-x中断请求机制,而可以不支持intx中断消息。
在pcie总线中,msi和msi-x中断机制使用存储器写请求tlp向处理器提交中断请求,下文为简便起见将传递msi/msi-x中断消息的存储器写报文简称为msi/msi-x报文。
不同的处理器使用了不同的机制处理这些msi/msi-x中断请求,如powerpc处理器使用mpic中断控制器处理msi/msi-x中断请求,本章将在第6.2节中介绍这种处理情况;而x86处理器使用fsb interrupt message方式处理msi/msi-x中断请求。
不同的处理器对pcie设备发出的msi报文的解释并不相同。但是pcie设备在提交msi中断请求时,都是向msi/msi-x capability结构中的message address的地址写message data数据,从而组成一个存储器写tlp,向处理器提交中断请求。
有些pcie设备还可以支持legacy中断方式[1]。但是pcie总线并不鼓励其设备使用legacy中断方式,在绝大多数情况下,pcie设备使用msi或者msi/x方式进行中断请求。
pcie总线提供legacy中断方式的主要原因是,在pcie体系结构中,存在许多pci设备,而这些设备通过pcie桥连接到pcie总线中。这些pci设备可能并不支持msi/msi-x中断机制,因此必须使用intx信号进行中断请求。
当pcie桥收到pci设备的intx信号后,并不能将其直接转换为msi/msi-x中断报文,因为pci设备使用intx信号进行中断请求的机制与电平触发方式类似,而msi/msi-x中断机制与边沿触发方式类似。
这两种中断触发方式不能直接进行转换。因此当pci设备的intx信号有效时,pcie桥将该信号转换为assert_intx报文,当这些intx信号无效时,pcie桥将该信号转换为deassert_intx报文。
与legacy中断方式相比,pcie设备使用msi或者msi-x中断机制,可以消除intx这个边带信号,而且可以更加合理地处理pcie总线的“序”。目前绝大多数pcie设备使用msi或者msi-x中断机制提交中断请求。
msi和msi-x机制的基本原理相同,其中msi中断机制最多只能支持32个中断请求,而且要求中断向量连续,而msi-x中断机制可以支持更多的中断请求,而并不要求中断向量连续。
与msi中断机制相比,msi-x中断机制更为合理。本章将首先介绍msi/msi-x capability结构,之后分别以powerpc处理器和x86处理器为例介绍msi和msi-x中断机制。
[1] 通过发送assert_intx和deassert_intx消息报文进行中断请求,即虚拟中断线方式。
msi/msi-x capability结构
pcie设备可以使用msi或者msi-x报文向处理器提交中断请求,但是对于某个具体的pcie设备,可能仅支持一种报文。在pcie设备中含有两个capability结构,一个是msi capability结构,另一个是msi-x capability结构。通常情况下一个pcie设备仅包含一种结构,或者为msi capability结构,或者为msi-x capability结构。
msi capability结构
msi capability结构共有四种组成方式,分别是32和64位的message结构,32位和64位带中断masking的结构。msi报文可以使用32位地址或者64位地址,而且可以使用masking机制使能或者禁止某个中断源。
•capability id字段记载msi capability结构的id号,其值为0x05。在pcie设备中,每一个capability结构都有唯一的id号。
•next pointer字段存放下一个capability结构的地址。
•message control字段。该字段存放当前pcie设备使用msi机制进行中断请求的状态与控制信息,如表6 1所示。
表6 1 msi cabalibities结构的message control字段
bits 定义 描述
15:9 reserved 保留位。系统软件读取该字段时将返回全零,对此字段写无意义。
8 per-vector masking capable 该位为1时,表示支持带中断masking的结构;如果为0,表示不支持带中断masking的结构。该位对系统软件只读,该位在pcie设备初始化时设置。
7 64 bit address capable 该位为1时,表示支持64位地址结构;如果为0,表示只能支持带32位地址结构。该位对系统软件只读,该位在pcie设备初始化时设置。
6:4 multiple message enable 该字段可读写,表示软件分配给当前pcie设备的中断向量数目。系统软件根据multiple message capable字段的大小确定该字段的值。在系统的中断向量资源并不紧张时,multiple message capable字段和该字段的值相等;而资源紧张时,该字段的值可能小于multiple message capable字段的值。
3:1 multiple message capable 该字段对系统软件只读,表示当前pcie设备可以使用几个中断向量号,在不同的pcie设备中该字段的值并不不同。当该字段为0b000时,表示pcie设备可以使用1个中断向量;为0b001、0b010、0b011、0b100和0b101时,表示使用4、8、16和32个中断向量;而0b110和0b111为保留位。该字段与multiple message enable字段的含义不同,该字段表示,当前pcie设备支持的中断向量个数,而multiple message enable字段是系统软件分配给pcie设备实际使用的中断向量个数。
0 msi enable 该位可读写,是msi中断机制的使能位。该位为1而且msi-x enable位为0时,当前pcie设备可以使用msi中断机制,此时legacy中断机制被禁止。一个pcie设备的msi enble和msi-x enable位都被禁止时,将使用intx中断消息报文发出/结束中断请求[1]。
message address字段。当msi enable位有效时,该字段存放msi存储器写事务的目的地址的低32位。该字段的31:2字段有效,系统软件可以对该字段进行读写操作;该字段的第1~0位为0。message upper address字段。如果64 bit address capable位有效,该字段存放msi存储器写事务的目的地址的高32位。
message data字段,该字段可读写。当msi enable位有效时,该字段存放msi报文使用的数据。该字段保存的数值与处理器系统相关,在pcie设备进行初始化时,处理器将初始化该字段,而且不同的处理器填写该字段的规则并不相同。
如果multiple message enable字段不为0b000时(即该设备支持多个中断请求时),pcie设备可以通过改变message data字段的低位数据发送不同的中断请求。mask bits字段。pcie总线规定当一个设备使用msi中断机制时,最多可以使用32个中断向量,从而一个设备最多可以发送32种中断请求。
mask bits字段由32位组成,其中每一位对应一种中断请求。当相应位为1时表示对应的中断请求被屏蔽,为0时表示允许该中断请求。系统软件可读写该字段,系统初始化时该字段为全0,表示允许所有中断请求。该字段和pending bits字段对于msi中断机制是可选字段,但是pcie总线规范强烈建议所有pcie设备支持这两个字段。
pending bits字段。该字段对于系统软件是只读位,pcie设备内部逻辑可以改变该字段的值。该字段由32位组成,并与pcie设备使用的msi中断一一对应。该字段需要与mask bits字段联合使用。
当mask bits字段的相应位为1时,如果pcie设备需要发送对应的中断请求时,pending bits字段的对应位将被pcie设备的内部逻辑置1,此时pcie设备并不会使用msi报文向中断控制器提交中断请求;
当系统软件将mask bits字段的相应位从1改写为0时,pcie设备将发送msi报文向处理器提交中断请求,同时将pending bit字段的对应位清零。在设备驱动程序的开发中,有时需要联合使用mask bits和pending bits字段防止处理器丢弃中断请求[2]。
msi-x capability结构
msi-x capability中断机制与msi capability的中断机制类似。pcie总线引出msi-x机制的主要目的是为了扩展pcie设备使用中断向量的个数,同时解决msi中断机制要求使用中断向量号连续所带来的问题。
msi中断机制最多只能使用32个中断向量,而msi-x可以使用更多的中断向量。目前intel的许多pcie设备支持msi-x中断机制。与msi中断机制相比,msi-x机制更为合理。
首先msi-x可以支持更多的中断请求,但是这并不是引入msi-x中断机制最重要的原因。因为对于多数pcie设备,32种中断请求已经足够了。而引入msi-x中断机制的主要原因是,使用该机制不需要中断控制器分配给该设备的中断向量号连续。
如果一个pcie设备需要使用8个中断请求时,如果使用msi机制时,message data的[2:0]字段可以为0b000~0b111,因此可以发送8种中断请求,但是这8种中断请求的message data字段必须连续。在许多中断控制器中,message data字段连续也意味着中断控制器需要为这个pcie设备分配8个连续的中断向量号。
有时在一个中断控制器中,虽然具有8个以上的中断向量号,但是很难保证这些中断向量号是连续的。因此中断控制器将无法为这些pcie设备分配足够的中断请求,此时该设备的“multiple message enable”字段将小于“multiple message capable”。
而使用msi-x机制可以合理解决该问题。在msi-x capability结构中,每一个中断请求都使用独立的message address字段和message data字段,从而中断控制器可以更加合理地为该设备分配中断资源。
与msi capability寄存器相比,msi-x capability寄存器使用一个数组存放message address字段和message data字段,而不是将这两个字段放入capability寄存器中,本篇将这个数组称为msi-x table。从而当pcie设备使用msi-x机制时,每一个中断请求可以使用独立的message address字段和message data字段。
除此之外msi-x中断机制还使用了独立的pending table表,该表用来存放与每一个中断向量对应的pending位。这个pending位的定义与msi capability寄存器的pending位类似。msi-x table和pending table存放在pcie设备的bar空间中。msi-x机制必须支持这个pending table,而msi机制的pending bits字段是可选的。
1 msi-x capability结构
msi-x capability结构比msi capability结构略微复杂一些。在该结构中,使用msi-x table存放该设备使用的所有message address和message data字段,这个表格存放在该设备的bar空间中,从而pcie设备可以使用msi-x机制时,中断向量号可以并不连续,也可以申请更多的中断向量号。
•capability id字段记载msi-x capability结构的id号,其值为0x11。在pcie设备中,每一个capability都有唯一的一个id号。
•next pointer字段存放下一个capability结构的地址。
•message control字段,该字段存放当前pcie设备使用msi-x机制进行中断请求的状态与控制信息,如表6 2所示。
表6 2 msi-x capability结构的message control字段
bits 定义 描述
15 msi-x enable 该位可读写,是msi-x中断机制的使能位,复位值为0,表示不使能msi-x中断机制。该位为1且msi enable位为0时,当前pcie设备使用msi-x中断机制,此时intx和msi中断机制被禁止。当pcie设备的msi enble和msi-x enable位为0时,将使用intx中断消息报文发出/结束中断请求。
14 function mask 该位可读写,是中断请求的全局mask位,复位值为0。如果该位为1,该设备所有的中断请求都将被屏蔽;如果该位为0,则由per vector mask位,决定是否屏蔽相应的中断请求。per vector mask位在msi-x table中定义,详见下文。
10:0 table size msi-x中断机制使用msi-x table存放message address字段和message data字段。该字段用来存放msi-x table的大小,该字段对系统软件只读。
table bir(bar indicator register)。该字段存放msi-x table所在的位置,pcie总线规范规定msi-x table存放在设备的bar空间中。该字段表示设备使用bar0~5寄存器中的哪个空间存放msi-x table。
该字段由三位组成,其中0b000~0b101与bar0~5空间一一对应。table offset字段。该字段存放msi-x table在相应bar空间中的偏移。pba(pending bit array) bir字段。
该字段存放pending table在pcie设备的哪个bar空间中。在通常情况下,pending table和msi-x table存放在pcie设备的同一个bar空间中。pba offset字段。该字段存放pending table在相应bar空间中的偏移。
2 msi-x table
由上图可见,msi-x table由多个entry组成,其中每个entry与一个中断请求对应。其中每一个entry中有四个参数,其含义如下所示。
•msg addr。当msi-x enable位有效时,该字段存放msi-x存储器写事务的目的地址的低32位。该双字的31:2字段有效,系统软件可读写;1:0字段复位时为0,pcie设备可以根据需要将这个字段设为只读,或者可读写。不同的处理器填入该寄存器的数据并不相同。
•msg upper addr,该字段可读写,存放msi-x存储器写事务的目的地址的高32位。
•msg data,该字段可读写,存放msi-x报文使用的数据。其定义与处理器系统使用的中断控制器和pcie设备相关。
•vector control,该字段可读写。该字段只有第0位(即per vector mask位)有效,其他位保留。当该位为1时,pcie设备不能使用该entry提交中断请求;为0时可以提交中断请求。该位在复位时为0。per vector mask位的使用方法与msi机制的mask位类似。
3 pending table
在pending table中,一个entry由64位组成,其中每一位与msi-x table中的一个entry对应,即pending table中的每一个entry与msi-x table的64个entry对应。与msi机制类似,pending位需要与per vector mask位配置使用。
当per vector mask位为1时,pcie设备不能立即发送msi-x中断请求,而是将对应的pending位置1;当系统软件将per vector mask位清零时,pcie设备需要提交msi-x中断请求,同时将pending位清零。
[1] 此时pci设备配置空间command寄存器的“interrupt disable”位为1。[2] msi机制提交中断请求的方式类似与边界触发方式,而使用边界触发方式时,处理器可能会丢失某些中断请求,因此在设备驱动程序的开发过程中,可能需要使用这两个字段。
SENSORO展示AIoT智能安全服务 成为城市安全空间“看得见”的智慧未来
华为在新加坡发布两款智能手表
聊聊如何实现一种闪存缓存设计
降-升压模式电源LTM4607的性能特点及应用范围
5G与物联网的安全应具体表现在四个方面
简述MSI和MSI-X中断机制
讯飞智能学习机X2 Pro为学子提供超实用的涨分秘籍
汽车线束如何进行气密性防水检测
干货!Kickstarter十大最具创新项目
行业资讯 I 芯片短缺对汽车供应链有何影响?
华为云在公有云基础设施领域首次进入中国市场前三
HiFS2023 | 华为金融云网,构筑金融数字化网络底座
中国半导体企业整合进入2.0时代
智能视频与毫米波雷达多模融合技术
什么是手机EFR/STK服务
联咏TDDI市场领先位置坚固,非三星OLED阵营中占主导
fireflyCORE-3399PRO主板JD4驱动开发介绍
射频同轴电缆的质量检测方法
家用网络的资源共享
OPPO联手通信技术服务商加速5G商用落地