【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 @(*) begin
        case (fsm_r)
        RESET: begin
            if (rst) begin
                fsm_s = RESET;
            end else begin
                fsm_s = IDLE;
            end
        end
        IDLE: begin
            if (irq_valid & irq_ready) begin
                if (|(irq_func & cfg_interrupt_msi_enable)) begin
                    fsm_s = SEND_MSI_INTR;
                end else if (|(irq_func & cfg_interrupt_msix_enable)) begin
                    fsm_s = SEND_MSIX_INTR;
                end else if (|(irq_func)) begin
                    fsm_s = SEND_LEGACY_INTR;
                end else begin
                    fsm_s = IDLE;
                end
            end else begin
                fsm_s = IDLE;
            end
        end
        SEND_LEGACY_INTR: begin
            if (cfg_interrupt_sent) begin
                fsm_s = WAIT_LEGACY_INTR;
            end else begin
                fsm_s = SEND_LEGACY_INTR;
            end
        end
        WAIT_LEGACY_INTR: begin
            if (cfg_interrupt_sent) begin
                fsm_s = IDLE;
            end else begin
                fsm_s = WAIT_LEGACY_INTR;
            end
        end
        SEND_MSI_INTR: begin
            fsm_s = WAIT_MSI_INTR;
        end
        WAIT_MSI_INTR: begin
            if (cfg_interrupt_msi_sent | cfg_interrupt_msi_fail) begin
                fsm_s = IDLE;
            end else begin
                fsm_s = WAIT_MSI_INTR;
            end
        end
        SEND_MSIX_INTR: begin
            fsm_s = WAIT_MSIX_INTR;
        end
        WAIT_MSIX_INTR: begin
            if (cfg_interrupt_msi_sent | cfg_interrupt_msi_fail) begin
                fsm_s = IDLE;
            end else begin
                fsm_s = WAIT_MSIX_INTR;
            end
        end
        endcase
    end

驱动程序设计

   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 interrupts
            if (ret < MIN_VEC_NUM) { // real allocated interrupts amount
                printk("cannot register enough irq %d", ret);
                goto irq_alloc_err; 
            }

            pcieirq = pci_irq_vector(dev, 0); // get IRQ number

            free_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 irq
            if (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.mfbz.cn/a/600170.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

矩阵的压缩存储介绍

引入 概述 特殊矩阵的压缩 对称矩阵 三角矩阵 对角矩阵 稀疏矩阵 三元组存储 十字链表法 示例

java:递归实现的案例

//求第20个月兔子的对数 //每个月兔子对数&#xff1a;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8 public class Test {//求第20个月兔子的对数//每个月兔子对数&#xff1a;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8pu…

《Python编程从入门到实践》day21

# 昨日知识点回顾 设置背景颜色 在屏幕中央绘制飞船 # 今日知识点学习 12.5 重构&#xff1a;方法_check_events()和_update_screen() 12.5.1 方法_check_events() import sys import pygame from Settings import Settings from Ship import Shipclass AlienInvasion:"…

[Maven]IDEA报错-xxx is referencing itself

在IDEA中&#xff0c;执行 mvn clean时报错xxx is referencing itself。 解决方案&#xff1a;https://stackoverflow.com/questions/64246267/maven-error-using-intellij-is-referencing-itself 具体做法&#xff1a;采用上图第二条&#xff0c;将父模块pom文件中的对子模块…

练习题(2024/5/7)

1验证二叉搜索树 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左 子树 只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例 …

JSP企业快信系统的设计与实现参考论文(论文 + 源码)

【免费】JSP企业快信系统.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89277688 JSP企业快信系统的设计与实现 摘 要 计算机网络的出现到现在已经经历了翻天覆地的重大改变。因特网也从最早的供科学家交流心得的简单的文本浏览器发展成为了商务和信息的中心…

深入理解Java虚拟机(JVM)

引言&#xff1a; Java虚拟机&#xff08;JVM&#xff09;是Java平台的核心组件&#xff0c;它负责将Java字节码转换成平台特定的机器指令&#xff0c;并在相应的硬件和操作系统上执行。JVM的引入使得Java语言具有“一次编写&#xff0c;到处运行”的跨平台特性。本文将深入探…

【练习2】

1.汽水瓶 ps:注意涉及多个输入&#xff0c;我就说怎么老不对&#xff0c;无语~ #include <cmath> #include <iostream> using namespace std;int main() {int n;int num,flag,kp,temp;while (cin>>n) {flag1;num0;temp0;kpn;while (flag1) {if(kp<2){if(…

初识C++ · 类和对象(下)

目录 1 再谈构造函数 2 类中的隐式类型转换 3 Static成员 4 友元和内部类 5 匿名对象 6 编译器的一些优化 1 再谈构造函数 先看一段代码&#xff1a; class Date { public :Date(int year, int month, int day){_year year;_month month;_day day;} private:int _ye…

Redis线程模型

文章目录 &#x1f496; Redis 单线程模型⭐ 单线程监听大量的客户端连接⭐ Redis 6.0 之前为什么不用多线程&#xff1f; &#x1f496; Redis多线程⭐ Redis 后台线程⭐ Redis 网络IO多线程 对于读写命令来说&#xff0c;Redis 一直是单线程模型。不过&#xff0c;在 Redis 4…

TinyXML-2介绍

1.简介 TinyXML-2 是一个简单、小巧的 C XML 解析库&#xff0c;它是 TinyXML 的一个改进版本&#xff0c;专注于易用性和性能。TinyXML-2 用于读取、修改和创建 XML 文档。它不依赖于外部库&#xff0c;并且可以很容易地集成到项目中。 tinyXML-2 的主要特点包括&#xff1a…

华为:三层交换机与路由器连通上网实验

三层交换机是一种网络交换机&#xff0c;可以实现基于IP地址的高效数据转发和路由功能&#xff0c;通常用于大型企业、数据中心和校园网络等场景。此外&#xff0c;三层交换机还支持多种路由协议&#xff08;如OSPF、BGP等&#xff09;&#xff0c;以实现更为复杂的网络拓扑结构…

automa警惕通过点击元素打开新的标签页,因为你可能会被他蒙蔽!

大家好&#xff0c;我是大胡子&#xff0c;专注于研究RPA实战与解决方案。 我们经常用到automa里面的【点击元素】组件&#xff0c;但要警惕通过点击元素打开新的标签页&#xff0c;例如下面这个场景&#xff0c;点击公众号的图文消息&#xff0c;之后&#xff0c;要自动输入标…

python环境下labelImg图片标注工具的使用

labelimg GitHub地址 python环境下labelImg图片标注工具的使用 1. 写在开头2. 如何使用2.1安装2.2 启动2.2.1 先启动后设置标注的目录2.2.2 指定标注的目录和预设置的标签 2.3 设置自动保存和显示类别。2.4 保存文件类型2.5 [快捷键](https://github.com/HumanSignal/labelImg…

【数据结构】C/C++ 带头双向循环链表保姆级教程(图例详解!!)

目录 一、前言 二、链表的分类 &#x1f95d;单链表 &#x1f95d;双链表 &#x1f95d;循环链表 &#x1f95d;带头双向循环链表 &#x1f34d;头节点&#xff08;哨兵位&#xff09;的作用 ✨定义&#xff1a; ✨作用&#xff1a; &#x1f347;总结 三、带头双向循环链表 …

技术速递|使用 .NET 为 Microsoft AI 构建可扩展网关

作者&#xff1a;Kara Saucerman 排版&#xff1a;Alan Wang Microsoft AI 团队构建了全面的内容、服务、平台和技术&#xff0c;以便消费者在任何设备上、任何地方获取他们想要的信息&#xff0c;并为企业改善客户和员工的体验。我们的团队支持多种体验&#xff0c;包括 Bing、…

通过氧气退火增强β-Ga₂O₃二极管.中国科技大学和河北半导体研究所的研究人员在这一特定领域取得了最新重大进展

上图所示&#xff1a;&#xff08;a&#xff09;增加台面有助于提高β-Ga2O3肖特基势垒二极管的阻断电压&#xff08;b&#xff09;。 氧气退火和自对准台面终端使β-Ga2O3二极管进一步走向商业化。 虽然β-Ga2O3电力电子技术已经取得了长足的进步&#xff0c;但仍然存在挑战&…

.双链表.

题目&#xff1a; 实现一个双链表&#xff0c;双链表初始为空&#xff0c;支持 55 种操作&#xff1a; 在最左侧插入一个数&#xff1b;在最右侧插入一个数&#xff1b;将第 k&#x1d458; 个插入的数删除&#xff1b;在第 k&#x1d458; 个插入的数左侧插入一个数&#xf…

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查找上一个&…

书生·浦语大模型实战营之XTuner多模态训练与测试

书生浦语大模型实战营之XTuner多模态训练与测试 目录 XTuner多模态训练与测试给LLM装上电子眼&#xff1a;多模态LLM原理简介文本单模态文本图像多模态 电子眼&#xff1a;LLaVA方案简介LLaVA训练阶段示意图LLaVA测试阶段示意图 项目实践环境准备XTuner安装概述Pretrain阶段Fi…