解释PCIe MSI 中断要求中断向量连续?PCIe 规范里并没有明确指出

news2024/9/23 5:29:48

MSI 向量必须连续?

前言

MSI 物理条件,MSI 中断产生的逻辑是RC初始化的时候,由软件将配置写入到 EP 的 2 个寄存器中,这两个寄存器一个指示的是地址 Message Address,一个指示的是数据 Message Data。当 EP 试图触发中断的时候,将会发起一个 MW 事务,往对应的 Message Address 写入 Message Data 的值。

引入问题

MSI 可以配置多达 32 个中断,那么如果是一个相同的 MW 事务,往对应的 Message Address 写入 Message Data 的值,而 Message Data 的值一直是 RC 初始化时配置的值,那么 RC 怎么可以区分不同的中断呢?

分析问题

上面的问题,写入同样的 Message Data 肯定是不能解决的。所以 EP 写的 Data 肯定是变化的,这样 RC 才能区分不同的中断。所以修改代码进行验证。

验证步骤

  1. 硬件 CPU: FT E2000 PCIe: NVME 硬盘 (CPU 使用的 ITS 的中断方式来处理 MSI 中断)
  2. 修改代码逻辑
    在这里插入图片描述
    __pci_write_msi_msg 为最后的将 msi_msg 写入 EP 配置空间的操作函数。
  • 修改1:struct msi_msg *msg 传入的数据结构里面 Message Address 是 ITS 的某个寄存器的地址,Message Data 是 its_get_event_id 获取的 id 。申请一个非缓存的内存空间 __phys_addr 来冒充这个 Message Address。随机选取了 Message Data 为 0xF0 来观察变化。
// 分配非缓存空间
    noncache_memory = kmalloc(ALLOC_SIZE, GFP_KERNEL | __GFP_HIGHMEM);

    if (!noncache_memory) {
        printk(KERN_ERR "Failed to allocate non-cacheable memory\n");
        return -ENOMEM;
    }    
	__phys_addr = virt_to_phys(noncache_memory);
    printk(KERN_INFO "Non-cacheable memory allocated. Physical Address: %pa\n", &__phys_addr);
 
  • 修改 2:创建一个定时器,来定时查询这个 __phys_addr 的值有没有被修改
#define ALLOC_SIZE 128
static void* noncache_memory;
static phys_addr_t __phys_addr;
static void __iomem *its_virtual_address;

#include <linux/timer.h>
struct irq_data * irq_data_save[128] = {0};

//irq_chip_retrigger_hierarchy
// 内核线程函数
static struct timer_list my_timer;

#define DATA_MSI   0xF0

static void my_kernel_thread(struct timer_list *timer) {
	int *paddr = noncache_memory;
		if (*paddr != 0) {
			printk("msi data change :0x%x irq_data:%px", *paddr, (void*)irq_data_save[97 + (*paddr-(DATA_MSI))]);
			irq_chip_retrigger_hierarchy(irq_data_save[97 + (*paddr-DATA_MSI)]);
			
			*paddr = 0;
		}
    // 重新设置定时器,以实现循环定时
    mod_timer(timer, jiffies + msecs_to_jiffies(1)); 
}

代码中使用 irq_chip_retrigger_hierarchy 来触发 ITS 的中断。97 是写死了,是人为查看系统中 MSI 中断的号起始。

实验结果

nvme 可以正常使用,CPU 是 2 核心,系统中创建了 3 个 MSI 的中断号,97 98 99 一共 3 个中断。
通过观察打印,可以分析得出,EP试图触发中断时,会往刚刚修改的 __phys_addr 的这个内存地址写入数据,有 0xF0, 0xF1, 0xF2 。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MTK联发科MT6762/MT6763/MT6765安卓核心板参数规格比较

MT6762安卓核心板 MTK6762安卓核心板是一款工业级高性能、可运行 android9.0 操作系统的 4G智能模块。 CPU&#xff1a;4xCortex-A53 up to 2.0Ghz/4xCortex-A53 up to 1.5GhzGraphics&#xff1a;IMG GE8320 Up to 650MhzProcess&#xff1a;12nmMemory&#xff1a;1xLP3 9…

小学语文老师重点工作

小学语文老师是学生在语言学习过程中的关键引导者&#xff0c;他们的主要职责是帮助学生建立正确的语言基础&#xff0c;培养良好的阅读习惯&#xff0c;并提高学生的语文素养。以下是小学语文老师的一些重点工作。 一、教授语言知识 小学语文老师首要的任务是教授学生语言知识…

【深度学习】卷积神经网络结构组成与解释

卷积神经网络是以卷积层为主的深度网路结构&#xff0c;网络结构包括有卷积层、激活层、BN层、池化层、FC层、损失层等。卷积操作是对图像和滤波矩阵做内积&#xff08;元素相乘再求和&#xff09;的操作。 1. 卷积层 常见的卷积操作如下&#xff1a; 卷积操作解释图解标准卷…

LSTM模型预测时间序列:根据历史销量数据预测商品未来销量

经常会遇到一些需要预测的场景&#xff0c;比如预测品牌销售额&#xff0c;预测产品销量。 时间序列 今天分享一波使用 LSTM 进行端到端时间序列预测的完整代码和详细解释。 我们先来了解两个主题&#xff1a; 什么是时间序列分析&#xff1f; 什么是 LSTM&#xff1f; 时…

【nlp】3.6 Tansformer模型构建(编码器与解码器模块耦合)

Tansformer模型构建(编码器与解码器模块耦合) 1. 模型构建介绍2 编码器-解码器结构的代码实现3 Tansformer模型构建过程的代码实现4 小结1. 模型构建介绍 通过上面的小节, 我们已经完成了所有组成部分的实现, 接下来就来实现完整的编码器-解码器结构耦合. Transformer总体架…

leetcode刷题详解一

算法题常用API std::accumulate 函数原型&#xff1a; template< class InputIt, class T > T accumulate( InputIt first, InputIt last, T init );一般求和的&#xff0c;代码如下&#xff1a; int sum accumulate(vec.begin() , vec.end() , 0);详细用法参考 lo…

微信小程序富文本拓展rich-text

微信小程序富文本插件 功能介绍 支持解析<style>标签中的全局样式支持自定义默认的标签样式支持自动设置标题 若html中存在title标签,将自动把title标签的内容设置到页面的标题上,并在回调bindparse中返回,可以用于转发支持添加加载提示 可以在Parser标签内添加加载提…

Vue3-Pinia

Pinia是什么 Pinia是Vue的最新状态管理工具&#xff0c;是Vuex的替代品 比Vuex更大的优势在于&#xff1a; 1.提供更加简单的API&#xff08;去掉了mutation&#xff09; 2.提供符合&#xff0c;组合式风格的API&#xff08;和Vue3新语法统一&#xff09; 3.去掉了modules…

CS5511规格书|CS5511方案应用说明|DP转双路LVDS/eDP芯片方案

概述&#xff1a;CS5511是一个将DP/eDP输入转换为LVDS信号的桥接芯片&#xff0c;此外&#xff0c;CS5511可以用作在DP/eDP输入到DP/eDP输出场景中桥接芯片。CS5511的高级接收器支持VEDA DisplayPort&#xff08;DP&#xff09;1.3和嵌入式DisplayPort&#xff08;eDP&#xf…

鸿蒙开发-ArkTS 语言

鸿蒙开发-ArkTS 语言 1. 初识 ArkTS 语言 ArkTS 是 HarmonyOS 优选主力开发语言。ArkTS 是基于 TS(TypeScript)扩展的一门语言&#xff0c;继承了 TS 的所以特性&#xff0c;是TS的超集。 主要是扩展了以下几个方面&#xff1a; 声明式UI描述和自定义组件&#xff1a; ArkTS允…

「可移动工具车」物料管理的得力助手

随着工业制造企业不断发展&#xff0c;仓储的运营变得越来越重要&#xff0c;物料高效管理也迎来了新的挑战&#xff0c;工厂物料管理直接影响着生产效率和成本控制&#xff0c;不合理的物料管理可能导致物料溢出、过度库存、损耗增加等问题&#xff0c;进而影响企业的整体竞争…

1. HarmonyOS 应用开发入门知识

前言 本文编辑时&#xff1a; 最新 DevEco Studio Release版本为&#xff1a;DevEco Studio 3.1.1 最新 Compile SDK Release版本为&#xff1a;3.1.0&#xff08;API 9&#xff09; 最新 构建方式为 HVigor&#xff0c;而非 Gradle 最新版本已不再支持 &#xff08;“Jav…

【反射】简述反射的构造方法,成员变量成员方法

&#x1f38a;专栏【JavaSE】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 &#x1f970;欢迎并且感谢大家指出我的问题 文章目录 &#x1f384;什么是反射&#x1f384;获取class对象的三种方式⭐代码实现 &#x1f3…

oracle闪回恢复表数据

oracle闪回恢复表数据 1.打开监听和数据库&#xff0c;进入需要操作的表的所属用户下 [oraclemydb ~]$ lsnrctl start [oraclemydb ~]$ sqlplus / as sysdba SQL> startup SQL> conn test/123456 SQL> select * from test1&#xff1b;2.删除任意数据&#xff1a; …

Error querying database. Cause: java.lang.reflect.InaccessibleObjectException:

最近开发过程中&#xff0c;居然碰到了一个Arrays.asList的错&#xff0c;怎么个场景呢&#xff1f;传参一个用固定符号拼接的字符串&#xff0c;需要转成集合然后再myBatis里in判断。然后就报错了。 一、代码层面 service层面&#xff1a; shortDetailUrlList Arrays.asLi…

C语言——从终端(键盘)读入 20 个数据到数组中,统计其中正数的个数,并计算这些正数之和

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int i0;int sum0;int count0;int arr[20];printf("输入20个数据&#xff1a;\n");for(i1;i<20;i){scanf("%d",&arr[i]);if(arr[i]>0){count;sumarr[i];}}printf("正…

文献速递:非专业任务医生在审查X光片时受益于正确的可解释人工智能建议

非专业任务医生在审查X光片时受益于正确的可解释人工智能建议 01****文献速递介绍 本文主要探讨了人工智能&#xff08;AI&#xff09;在放射学中的应用&#xff0c;特别是在胸部X光片的诊断中AI临床决策支持系统&#xff08;AI-CDSS&#xff09;的作用。研究发现&#xff0c…

Websocket “未完成操作“与真机报错 问题

关于弱小又无助的小前端开发工程师的经历分享&#xff1a; 在用uniapp开发微信小程序的过程中&#xff0c;需要使用websocket进行数据的传输&#xff0c;在开发过程中没有任何的问题&#xff0c;但是进入生产环境时&#xff0c;真的是三路十八弯&#xff0c;让小前端尝遍了微信…

起动电流小,工作频率 可达500kHz的Dc-Dc开关电源芯片B3842芯片描述

B3842/43/44是专为脱线和Dc-Dc开关电源应用设计的恒频电流型Pwd控制器内部包含温度补偿精密基准、供精密占空比调节用的可调振荡器、高增益混放大器、电流传感比较器和适合作功率MOST驱动用的大电流推挽输出颇以及单周期徊滞式限流欠压锁定、死区可调、单脉冲计数拴锁等保护电路…