MSI-X总结-程序员宅基地

技术标签: c  linux  

PCIe有三种中断,分别为INTx中断,MSI中断,MSI-X中断,其中INTx是可选的,MSI/MSI-X是必须实现的。
MSI, message signal interrupt, 是PCI设备通过写一个特定消息到特定地址,从而触发一个CPU中断。特定消息指的是PCIe总线中的Memory Write TLP, 特定地址一般存放在MSI capability中。

1、 MSI-X Capabiliity结构
MSI-X中断机制提出目的是扩展PCIe设备使用的中断向量个数(次要),同时解决MSI中断要求使用中断向量必须保持连续的问题(主要)。
https://cloud.tencent.com/developer/article/1661649

MSI和MSI-X的规格对比:

MSI MSI-X
中断向量数: 32 2048
中断号约束: 必须连续 可以随意分配
MSI信息存放: capability寄存器 MSI-X Table(BAR空间)

总之,PCIe设备在提交MSI中断请求时,都是向MSI/MSI-X Capability结构中的Message Address的地址写Message Data数据,从而组成一个存储器写TLP,向处理器提交中断请求。
在这里插入图片描述
Capability ID:记载MSI-X Capability结构的ID号,其值为0x11
Message Control: 存放当前PCIe设备使用MSI-x机制进行中断请求的状态和控制信息。
在这里插入图片描述
MSI-x enable,控制MSI-x的中断使能 ;
Function Mask,是中断请求的全局Mask位,如果该位为1,该设备所有的中断请求都将被屏蔽;如果该位为0,则由Per Vector Mask位,决定是否屏蔽相应的中断请求。Per Vector Mask位在MSI-X Table中定义;
Table Size, 存放MSI-X table的大小
Table BIR:BAR Indicator Register。该字段存放MSI-X Table所在的位置,PCIe总线规范规定MSI-X Table存放在设备的BAR空间中。该字段表示设备使用BAR0 ~ 5寄存器中的哪个空间存放MSI-X table。
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 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位类似。

3、 如何查找
每个PCI逻辑设备都有自己的配置空间,里面存储了一些基本信息,生产商,IRQ中断号,还有就是定义了mem空间和io空间的起始地址和大小。
通过Table BIR和Table offset知道了MSI-Xtable在哪一个bar中以及在bar中的偏移,就可以找到对应的MSI-X table。

PCIe设备配置空间:
在这里插入图片描述
4、 如何使用MSI-x中断
传统中断在系统初始化扫描PCI bus tree时就已自动为设备分配好中断号, 但是如果设备需要使用MSI,驱动需要进行一些额外的配置。
当前linux内核提供pci_alloc_irq_vectors来进行MSI/MSI-X capablity的初始化配置以及中断号分配。

int pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
                unsigned int max_vecs, unsigned int flags);

函数的返回值为该PCI设备分配的中断向量个数。
min_vecs是设备对中断向量数目的最小要求,如果小于该值,会返回错误。
max_vecs是期望分配的中断向量最大个数。
flags用于区分设备和驱动能够使用的中断类型,一般有4种:

#define PCI_IRQ_LEGACY		(1 << 0) /* Allow legacy interrupts */
#define PCI_IRQ_MSI		(1 << 1) /* Allow MSI interrupts */
#define PCI_IRQ_MSIX		(1 << 2) /* Allow MSI-X interrupts */
#define PCI_IRQ_ALL_TYPES   (PCI_IRQ_LEGACY | PCI_IRQ_MSI | PCI_IRQ_MSIX)

与之对应的是释放中断资源的函数pci_free_irq_vectors(), 需要在设备remove时调用:

void pci_free_irq_vectors(struct pci_dev *dev);

此外,linux还提供了pci_irq_vector()用于获取IRQ number.

int pci_irq_vector(struct pci_dev *dev, unsigned int nr);

参考链接:https://cloud.tencent.com/developer/article/1661649
参考链接:https://www.it610.com/article/1297014612327211008.htm

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_35399548/article/details/118517037

智能推荐

HikariPool-1 - Connection is not available, request timed out after,springboot如何设置连接池大小-程序员宅基地

文章浏览阅读2.6k次。问题描述项目压测的时候一直报错HikariPool-1 - Connection is not available, request timed out after解决方案在yml中配置如下参数hikari: connection-timeout: 60000 idle-timeout: 60000 login-timeout: 5 max-lifetime: 60000 maximum-pool-size: 400 mi

java怎么调用其他包里的类_java怎么调用另一个包中的类-程序员宅基地

文章浏览阅读5.2k次。比如现在有以下两个包:现在想在Boss类里面实现对Employee的调用,怎么做呢?(视频教程推荐:java视频)Employee.java:package payroll2;public class Employee {public void move(){System.out.print("this is employee");}}如果想实现对包的调用,可使用import关键字,然后再用调用类..._java调用其他包的静态类

Linux相关知识-程序员宅基地

文章浏览阅读76次。运行级别 0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动运行运行级别 1:单用户工作状态,root权限,用于系统维护,找回丢失root密码,禁止远程登陆运行级别 2:多用户状态没有网络服务(没有NFS)运行级别 3:多用户状态有网络服务(有NFS),登陆后进入控制台命令行模式运行级别 4:系统未使用保留给用户运行级别 5:图形界面运行级别 6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动常用运行级别是3和5,工作中一般用3,也可以指定默认运行级别。_linux相关

使用S32DS集成S32K的MCAL_s32ds教程-程序员宅基地

文章浏览阅读4.7k次,点赞9次,收藏67次。一、软件准备前往恩智浦官网下载MCAL软件包、EB Tresos 、以及S32DS IDE:以下软件均有NXP免费提供,但需注册账号获取S32DS IDE下载EB Tresos以及MCAL下载S32DS版本为:S32 Design Studio 3.2其中EB Tresos版本为:24.0MCAL版本为:S32K14X_MCAL4_2_RTM_1_0_0​NXP MCAL软件包后缀说明:HF为补丁版本 RTMC为发布版本软件安装请参考:NXP_AUT.._s32ds教程

欧拉法、改进的欧拉法、龙格-库塔法求解初值问题_欧拉法计算初值问题csdn-程序员宅基地

文章浏览阅读1.9w次,点赞37次,收藏202次。求解初值问题简介前期准备欧拉法改进的欧拉法龙格-库塔法三级三阶显式Kutta公式三级四阶显式Heun公式四级四阶显式Kutta公式四级四阶显式Gill公式简介通过求解简单的初值问题:{dudx=f(x,u)(1)u(x0)=u0(2)\begin{cases}\dfrac{du}{dx}=f(x,u)&&&&&&(1)\\u(x_0)=u..._欧拉法计算初值问题csdn

Git取消add 、 commit、push的命令_git 取消add-程序员宅基地

文章浏览阅读2w次,点赞284次,收藏328次。撤销已经add,但是没有commit的问题git reset HEAD撤销已经commit,但是没有push到远端的文件(仅撤销commit 保留add操作)git reset --soft HEAD^查看状态查看没有git add的文件git checkout 查看当前提交状态git status......_git 取消add

随便推点

Android小游戏开发:简单的合金弹头游戏(一)游戏框架_android 小游戏开发-程序员宅基地

文章浏览阅读4.9k次,点赞3次,收藏29次。本篇博客适合给初学安卓,熟悉基本的JAVA语法,并希望用安卓写个小游戏的初学者参考,因为博主也因大学课程需要,是在2个星期内自学的JAVA和安卓开发,可能会有一些错误和需要优化的地方,望指出 我在这2个星期内看的书为《JAVA核心技术卷I》和李华明写的《Android游戏编程之从零开始》,有些内容是借鉴书上而来。 《Android游戏编程之从零开始》的电子版 链接:ht_android 小游戏开发

【企业架构工具】2023 年 18 大企业架构工具_国内ea系统工具-程序员宅基地

文章浏览阅读369次。这些流行和新兴的 EA 工具为企业提供了支持企业架构和数字化转型所需的一切。企业架构系统并不总是必不可少的。据推测,在 1940 年代,国际商业机器公司的一位领导人小托马斯·沃森 (Thomas Watson Jr.) 曾说过:“我认为大约有 5 台计算机的全球市场。” 没有人需要定制软件来跟踪这么短的列表。然而,现代企业则大不相同。一些员工仅在他们的办公桌上就有超过五台计算机。即使是小型组织也可..._国内ea系统工具

计算机专业求职信英语,计算机科学专业毕业生英文求职信范文-程序员宅基地

文章浏览阅读166次。计算机科学专业毕业生英文求职信范文英文求职信范文就求职者是向外企hr介绍自己想要的职位时所写的关于自己的求职信例文。下面小编就为大家推荐计算机科学专业毕业生英文求职信范文。dear mr. ××,i would like to be considered as a candidate for the assistant computer programmer position advertised..._假设你是李华是一所中等职业学校计算机专业的毕业生,你想要一份计算机销售经

Ubuntu18.04中LXC安装配置以及简单使用_lxc-create 离线文件ubuntu-程序员宅基地

文章浏览阅读1.2k次。LXC的安装配置以及简单使用_lxc-create 离线文件ubuntu

Springboot——mybatis配置_springboot配置mybatis-程序员宅基地

文章浏览阅读7.5k次,点赞2次,收藏2次。serverTimezone=Asia/Shanghai:可以实现北京时间入库。_springboot配置mybatis

计算机网络体系结构-程序员宅基地

文章浏览阅读825次,点赞27次,收藏18次。计算机网络分层结构,计算机网络协议、接口、服务的概念