PCIe中断机制

PCIE中断分类

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

PCI总线自3.0版本开始支持MSI-X机制,对MSI做出了一些升级和改进,以克服MSI机制的三个主要的缺陷:

  1. 随着系统的发展,对于特定的大型应用,32个中断向量不够用了;
  2. 只有一个目标地址使得多核CPU情况下的,静态中断分配变得困难。如果能够使每个向量对应不同的唯一的地址,便会灵活很多;
  3. 某些应用中的中断优先级混乱问题。

MSI和MSI-X的规格对比:
在这里插入图片描述

PCIE中断机制-MSI

PCIe设备在提交MSI中断请求时,都是向MSI/MSI-X Capability结构中的Message Address的地址写Message Data数据,从而组成一个存储器写TLP,向处理器提交中断请求。

Capability ID的值是只读的,05h表示支持MSI功能。

Next Capability Pointer也是只读的,其用于查找下一个Capability Structure的位置,其值为00h则表示到达Linked List的最后了。

Message Control Register用于确定MSI的格式与支持的功能等信息
在这里插入图片描述

Mask Bits
中断掩码寄存器
PCIe总线规定当一个设备使用MSI中断机制时,最多使用32个中断向量,一个设备最多发送32种中断请求,所以Mask Bits为32位,相应位为1时表示相应的中断被屏蔽。该字段和Pending字段对于MSI中断机制是可选字段。

Pending Bits
待处理中断寄存器。
该字段对于系统软件可读,PCIe设备内部逻辑可以改变该字段的值。该字段的长度为32位,与Mask字段配合使用,当一个中断对应的Mask bit位为1(屏蔽)时,Pending Bits字段对应的位将被PCIe内部逻辑置1,此时PCIe设备并不会向中断控制器发送MSI中断报文;当系统软件将对应的Mask bit位由1改为0时,PCIe设备向中断控制器发送MSI中断报文。
在PCIe设备驱动程序开发时,有时需要Mask Bits和Pending Bits字段配合防止处理器丢失中断请求。

在这里插入图片描述

PCIE中断机制-MSI-X

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空间中的偏移。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

PCIE中断机制-MSI-X 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位类似。

在这里插入图片描述

### PCIE 中断驱动开发解决方案 #### 了解PCIE中断机制 PCI Express (PCIE) 支持多种类型的中断,包括传统INTx中断、消息信号中断(MSI)以及扩展的消息信号中断(MSI-X)[^1]。这些中断机制允许设备向主机报告事件或状态变化。 对于Linux内核中的PCIE中断处理,通常会涉及到`pci_enable_msi()` 或 `pci_enable_msix()` 函数来启用MSI/MSI-X模式下的中断支持。当配置好之后,可以通过注册相应的IRQ处理器函数来进行具体的业务逻辑处理。 #### 编写PCIE中断驱动程序的关键要素 编写一个有效的PCIE中断驱动需要考虑以下几个方面: - **初始化阶段**:在驱动加载期间完成硬件资源分配并设置合适的参数;确保正确识别所使用的中断类型(如MSIMSIX),并通过调用上述提到的相关API使能它们。 - **中断服务例程(ISR)**:定义ISR用于响应来自PCIE设备发出的中断请求。此过程可能涉及读取寄存器以获取更多信息,并执行必要的操作来清除待处理的状态位或其他标志。 - **错误恢复流程**:考虑到可能出现的各种异常情况,在设计时应加入适当的错误检测与修复措施。例如利用AER功能监控链路层发生的任何潜在问题,并采取行动防止进一步损害系统的稳定性。 ```c static irqreturn_t pcie_irq_handler(int irq, void *dev_id) { struct pci_dev *pdev = dev_id; // 处理特定于该设备的中断逻辑... return IRQ_HANDLED; /* 告诉系统已经成功处理 */ } ``` 为了实现更高效的性能优化,可以探索使用轮询方式代替传统的基于中断的方式,特别是在高频率数据交换场景下。这有助于减少CPU上下文切换开销,提高整体吞吐量[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值