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

2024-05-08 02:12

本文主要是介绍【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获取。

这篇关于【PCIE】基于PCIE4C的数据传输(四)——使用MSIX中断的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/969011

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

【北交大信息所AI-Max2】使用方法

BJTU信息所集群AI_MAX2使用方法 使用的前提是预约到相应的算力卡,拥有登录权限的账号密码,一般为导师组共用一个。 有浏览器、ssh工具就可以。 1.新建集群Terminal 浏览器登陆10.126.62.75 (如果是1集群把75改成66) 交互式开发 执行器选Terminal 密码随便设一个(需记住) 工作空间:私有数据、全部文件 加速器选GeForce_RTX_2080_Ti