【PCIE】基于PCIE4C的数据传输(四)——使用MSIX中断

   基于PCIE4C的数据传输(三)——遗留中断与MSI中断 一文介绍了遗留中断与MSI中断两种中断方式的代码实现,本文继续基于Xilinx Ultrascale+HBM VCU128开发板与linux(RHEL8.9),介绍MSIX中断方式的代码实现。本文分为MSIX中断简述、FPGA逻辑设计、驱动程序设计、上板测试四个部分。

MSIX中断简述

   MSIX中断是PCIe3.0引入的中断方式,其主要目的是解决系统中空闲中断向量号碎片化的情况下,MSI中断方式要求中断向量必须连续分配进而导致无法分配足够多中断向量的问题,可参考《PCIe系列第八讲、MSI和MSI-X中断机制》。

图片

   MSIX方式为了解决中断向量不连续的问题,将申请每个中断所需的信息作为两张表(MSI-X Table及Pending Bit Table)存储到PCIe终端设备的BAR空间中。配置空间负责提供中断信息表所在的BAR空间编号(Table BIR)及所在BAR空间的基地址(Table Offset及PBA Offset)。

   如下图所示,每条32字节(4 DWORD)的entry为1个MSIX中断表项,当PCIe终端设备想要引起对应的MSIX中断时,只需发送向对应地址(Msg Upper Addr + Msg Addr)写特定数据(Msg Data)的TLP包。

图片

FPGA逻辑设计

PCIE4C IP核配置

   MSIX中断可在前文IP核配置的基础上添加,在 功能 选项卡中的 MSI-X选项 部分,可选择外置MSI-X接口、内置MSI-X接口、AXI MSI-X接口三种方式,三种方式在IP核引脚上略有区别,本文介绍外置MSI-X接口方式的使用方法。

图片

   在启用MSI-X接口后,可于MSI-X功能部分配置MSI-X中断表与MSI-X暂挂表在指定BAR空间中的特定地址,本文选择使用如下配置,使用1个MSIX中断(大小32字节),中断表和暂挂表均在BAR0中,起始地址分别为0x40和0x50。

图片

用户逻辑实现

   MSIX的接口功能及时序要求可于PCIE4C手册查看,对应输出波形如下,其中addr、data需要填写响应中断系统分配并填入用户存储器的对应数据,以本文IP配置启用1个MSIX中断为例,想要发送中断需要向0x40-0x47存储的Msg addr发送0x48-0x4b存储的Msg Data(在系统分配中断完成后):

图片

   参考PCIE4C手册对于中断相关引脚的定义,最终状态机跳转实现如下:

always @(*) begincase (fsm_r)RESET: beginif (rst) beginfsm_s = RESET;end else beginfsm_s = IDLE;endendIDLE: beginif (irq_valid & irq_ready) beginif (|(irq_func & cfg_interrupt_msi_enable)) beginfsm_s = SEND_MSI_INTR;end else if (|(irq_func & cfg_interrupt_msix_enable)) beginfsm_s = SEND_MSIX_INTR;end else if (|(irq_func)) beginfsm_s = SEND_LEGACY_INTR;end else beginfsm_s = IDLE;endend else beginfsm_s = IDLE;endendSEND_LEGACY_INTR: beginif (cfg_interrupt_sent) beginfsm_s = WAIT_LEGACY_INTR;end else beginfsm_s = SEND_LEGACY_INTR;endendWAIT_LEGACY_INTR: beginif (cfg_interrupt_sent) beginfsm_s = IDLE;end else beginfsm_s = WAIT_LEGACY_INTR;endendSEND_MSI_INTR: beginfsm_s = WAIT_MSI_INTR;endWAIT_MSI_INTR: beginif (cfg_interrupt_msi_sent | cfg_interrupt_msi_fail) beginfsm_s = IDLE;end else beginfsm_s = WAIT_MSI_INTR;endendSEND_MSIX_INTR: beginfsm_s = WAIT_MSIX_INTR;endWAIT_MSIX_INTR: beginif (cfg_interrupt_msi_sent | cfg_interrupt_msi_fail) beginfsm_s = IDLE;end else beginfsm_s = WAIT_MSIX_INTR;endendendcaseend

驱动程序设计

   MSIX中断驱动同样可参考Kernel.org,本文基于RHEL8.9,对应设置MSIX中断的驱动代码如下,从驱动代码上看,MSIX中断与MSI中断几乎一致:

            printk("start create msix interrupt");interrupt_type = INTERRUPT_MSIX;ret = pci_alloc_irq_vectors(dev, MIN_VEC_NUM, MAX_VEC_NUM, PCI_IRQ_MSIX); // allocate specific amount of interruptsif (ret < MIN_VEC_NUM) { // real allocated interrupts amountprintk("cannot register enough irq %d", ret);goto irq_alloc_err; }pcieirq = pci_irq_vector(dev, 0); // get IRQ numberfree_irq(pcieirq, (void*)legacy_irq_handler);                                                   // clear exist pending interrupt (if any)ret = request_irq(pcieirq, legacy_irq_handler, 0, "test_driver", (void*)legacy_irq_handler);    // associate handler and enable irqif (ret != 0) { printk("cannot register irq %d", ret);goto irq_alloc_err; }printk("finish create msix interrupt");

上板测试

   Vivado查看MSIX中断接口相关波形
在这里插入图片描述

   使用lspci -vv 查看PCIe链路情况

图片

   使用cat /proc/interrupts 查看中断情况

图片

   加载驱动并查看系统分配的MSIX中断表项内容,可以看到MSIX中断表项内容为0x00000000_00000021_00000000_FEE08000,根据MSIX中断表项的定义,系统分配给MSIX0中断的Msg Addr为0xffe08000,Msg Data为0x21。

图片

完整代码

   工程代码可于同名公众号回复PCIE4C_MSIX获取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/321264.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ROS机器人实用技术与常见问题解决

问题速查手册&#xff08;时实更新&#xff09;更加全面丰富的问题手册记录 1.机器人使用GPARTED挂载未分配空间 需要在图型界面下操作&#xff0c;建议使用no machine连接 安装gparted磁盘分区工具, sudo apt-get install gparted -y 启动软件 sudo gparted 点击磁盘/内存…

ILI9341显示驱动芯片的使用

ILI9341是一种常见的TFT LCD显示驱动芯片&#xff0c;它在众多的应用中都有广泛的使用。这种芯片的一个显著特点是它支持16位RGB565颜色&#xff0c;这意味着它可以显示多达65536种不同的颜色。这使得ILI9341能够提供鲜艳、生动的色彩效果&#xff0c;对于需要表现丰富色彩的应…

外网禅道配置

exportfs -avrf 修改代码&#xff0c;避免启动太慢&#xff1a;vi /opt/zbox/bin/zbox.php 启动和停止 /opt/zbox/zbox start /opt/zbox/zbox stop

【MATLAB源码-第204期】基于matlab的语音降噪算法对比仿真,谱减法、维纳滤波法、自适应滤波法;参数可调。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 语音降噪技术的目的是改善语音信号的质量&#xff0c;通过减少或消除背景噪声&#xff0c;使得语音更清晰&#xff0c;便于听者理解或进一步的语音处理任务&#xff0c;如语音识别和语音通讯。在许多实际应用中&#xff0c;如…

保研面试408复习 1——操作系统、计网、计组

文章目录 1、操作系统一、操作系统的特点和功能二、中断和系统调用的区别 2、计算机组成原理一、冯诺依曼的三个要点二、MIPS&#xff08;每秒百万条指令&#xff09;三、CPU执行时间和CPI 3、计算机网络一、各个层常用协议二、网络协议实验——数据链路层a.网络速率表示b.数据…

Linux中的YUM源仓库和NFS文件共享服务

目录 1.YUM仓库服务 1.1 YUM概述 1.2 准备安装源 1.3 搭建yum本地ftp源仓库 1.4 yum在线源替换方法 1.5 yum的常用操作命令 2.NFS文件共享服务 2.1 NFS&#xff08;共享存储服务&#xff09;简介 2.2 NFS服务的实现 2.3 使用NFS发布共享资源 2.4 NSF配置 2.5 如何指…

matlab

图像配准&#xff1a; %手动选择执行图片(由于程序为分开&#xff0c;此处保存的mat文件为图MRI6的信息&#xff0c;所以请选择图MRI6) [filename,pathname]uigetfile({*.jpg;*.bmp;*.tif;*.png;*.gif,All Image Files;*.*,All Files}); image imread([pathname,filename]); …

LNMP一键安装包

LNMP一键安装包是什么? LNMP一键安装包是一个用Linux Shell编写的可以为CentOS/RHEL/Fedora/Debian/Ubuntu/Raspbian/Deepin/Alibaba/Amazon/Mint/Oracle/Rocky/Alma/Kali/UOS/银河麒麟/openEuler/Anolis OS Linux VPS或独立主机安装LNMP(Nginx/MySQL/PHP)、LNMPA(Nginx/MySQ…

基于vue.js+thymeleaf模板引擎+ajax的注册登陆简洁模板(含从零到一详细介绍)

文章目录 前言1、数据库准备2、工具类与相关基类使用2.1、工具类2.2、相关基类 3、web包目录说明4、注册功能设计&#xff08;本文核心部分&#xff09;4.1、注册页面设计4.2、注册逻辑设计 5、登陆功能设计5.1、登陆页面设计5.2、登陆逻辑设计 6、运行效果图 前言 大多数的网…

Finder Windows for Mac:双系统窗口,一键切换!

Finder Windows for Mac是一款专为Mac用户设计的实用工具&#xff0c;它模拟了Windows系统的窗口管理功能&#xff0c;让Mac用户也能享受到类似Windows的窗口操作体验。这款软件的主要功能是提供一个浮动面板&#xff0c;帮助用户随时即时访问打开的Finder窗口列表&#xff0c;…

HCIP的学习(OSPF总篇)

HCIA的复习 这边可以与我之前写的HCIA博客结合起来一起看&#xff0c;效果更好 HCIA的学习&#xff08;6&#xff09; OSPF状态机 down—关闭-----一旦启动OSPF进程&#xff0c;并发出hello报文&#xff0c;则进入下一个状态init----初始化状态------当收到的hello报文中存在…

C语言 main( ) 函数的指针数组形参是怎么回事?

一、问题 在使⽤⼀些开发⼯具⽣成C语⾔⽂件时&#xff0c;主函数 mian( ) 中会有参数&#xff0c;这个参数到底是怎么回事⼉呢&#xff1f; 二、解答 mian( ) 称为主函数&#xff0c;是所有程序运⾏的⼊口。 mian( ) 函数是由系统调⽤的&#xff0c;当处于操作命令状态下&…

js之遍历方法

先创建一个数组&#xff0c;然后使用for.in进行遍历&#xff0c;如下图所示sub代表下标并且遍历几次&#xff0c;arr代表数组 <script>let arr [1, 2, 3, 4, 5, 6];for (let sub in arr) {console.log(arr);}</script> 第二种方法则是for循环遍历&#xff0c;根据…

嵌入式学习——C语言基础——day15

1. 段错误调试 1.1 打印法 在可能出现错误的位置加入打印,前一句能够打印出来,后一句打印不出来,问题就可以定位到两次打印中间的代码 1.2 gbd调试法 1. 编译代码时加入-g选项 gcc filename.c -g 2. 使用gdb调试生成的代码 gdb a.out 3. gdb调试命令 l 查看…

蓝牙模块HC-08+WIFI模块ESP-01S

蓝牙模块 又叫蓝牙串口模块。 串口透传技术&#xff1a;透传即透明传送&#xff0c;是指在数据的传输过程中&#xff0c;通过无线的方式使这组数据不发生任何形式的改变&#xff0c;仿佛传输过程是透明的一样&#xff0c;同时保证传输的质量&#xff0c;原封不动地道了最终接收…

Qt下使用7Z源码进行压缩和解压缩

7Z压缩是一款常用的压缩算法和工具&#xff0c;本文主要介绍一款在qt环境下进行编译的压缩方法。 本人测试是可以正常跑通的&#xff0c;具体代码部分请下载&#xff1a;下载链接&#xff0c;提取码&#xff1a;ev9t 7z源码网址&#xff1a;7-Zip 7z简介&#xff1a; 7z 是…

.[[MyFile@waifu.club]].svh勒索病毒数据库恢复方案

.[[MyFilewaifu.club]].svh勒索病毒有什么特点&#xff1f; .[[MyFilewaifu.club]].svh是一种最近多发的勒索病毒&#xff0c;它通过加密受害者的文件并要求支付赎金来解锁&#xff0c;从而达到勒索钱财的目的。恢复重要数据请添加技术服务号(safe130)。以下是关于这种病毒的详…

【计算机科学速成课】笔记一

文章目录 写在前面1.计算机的早期历史2.电子计算机3.布尔运算和逻辑门4.二进制5.算术逻辑单元-ALU6.寄存器和内存 写在前面 所有的一切源于这样一个网站——CS自学指南。 这是新手小白入门计算机科学必要了解的知识——【计算机科学速成课】[40集全/精校] - Crash Course Comp…

Redis(Redis配置和订阅发布)

文章目录 1.Redis配置1.网络配置1.配置文件位置 /etc/redis.conf2.bind&#xff08;注销支持远程访问&#xff09;1.默认情况bind 127.0.0.1 只能接受本机的访问2.首先编辑配置文件3.进入命令模式输入/bind定位&#xff0c;输入n查找下一个&#xff0c;shift n查找上一个&…

恒创科技「5月活动」中国香港/美国服务器配置及价格汇总

值此 5 月&#xff0c;各大云服务商的促销活动也是接连不断。近日&#xff0c;恒创科技上线了 5 月出海乐购“惠”活动&#xff0c;从 4 月 28 日开始&#xff0c;持续整个 5 月份。活动分精选云产品、主流物理服务器、DDoS 防护、免费试用等四大专区&#xff0c;包含几十款企业…