PCIE中断发送与接收

1. EndPoint模式下中断的发送

在EP模式下,PCIE会根据配置信息只产生MSI或者INTA中断中的一种,然后传送到RC端。

1.1 INTA中断的发送

INTA中断以带内消息(Assert_INTA/Deassert_INTA)的形式传递中断,其作用相当于传统PCI总线中使用边带中断信号线传递中断。根据以下步骤可产生INTA中断:

  • 往EP_IRQ_SET寄存器写“1”,PCIE产生Assert_INTA消息;
  • 往EP_IRQ_CLR寄存器写“1”,PCIE产生Deassert_INTA消息;

一旦一个Assert_INTA消息产生了,就必须等到Deassert_INTA消息产生后,才能产生下一个Assert_INTA消息,可通过查看EP_IRQ_STATUS寄存器确定中断的状态。

1.2 MSI中断的发送

MSI transaction的本质是中断 memory write transaction(IMWr),IMWr transaction是往设置好的一个固定地址里写入中断向量,每个EP支持32个中断向量。当设备生成MSI中断请求时,向远端设备产生一个IMWr transaction ,此transaction 的地址(IMWr)为MSI寄存器(MSI_ADDR_LOW_REG, MSI_ADDR_HIGH_REG)中的地址,数据(IMWr数据)为将MSI数据寄存器(MSI_DATA_REG)中的低5位修改为中断向量号,其余位不变。PCIE仅在EP模式时才有MSI接口。MSI transaction 支持iATU。

根据以下步骤产生MSI中断:

  • 确保MSI中断已使能,即将寄存器MSI_CAP中MSI_En写为“1”,此时INTA中断使能必须关掉;
  • 查询MSI地址寄存器,确定MSI中断的存储地址;
  • 查询MSI数据寄存器;
  • 确定分配给设备的MSI中断向量;
  • 根据分配的中断向量,向RC发送一个Memory Write请求,地址为MSI寄存器中的地址,数据为将MSI数据寄存器中的数据低5位修改成中断向量,其余位不变。

2. RC模式下中断的接收

2.1 INTA中断的接收

RC模式下接收INTA中断时,需要在配置阶段做以下配置:

  • 查询LEGACY_A_IRQ_EN寄存器,确认INTA中断使能是否打开,如果没有打开,往LEGACY_A_IRQ_EN寄存器第“0”位写“1”;
  • 查询寄存器LEGACY_A_IRQ_MASK,确认INTA中断屏蔽位是否关掉,如果处于屏蔽状态,往寄存器LEGACY_A_IRQ_MASK第“0”位写“0”;
  • 可通过查询寄存器LEGACY_A_IRQ_STATUS确定是否收到INTA中断请求,

2.2 MSI中断的接收

MSI中断支持32个中断向量,产生PCIE_MSI_Int0-PCIE_MSI_Int7八个中断事件,分别送给CorePac0-CorePac7。RC端PCIE接收到MSI transaction 后,当MSI transaction 的地址与RC端MSI地址寄存器(MSI_CTRL_ADDR_LOW_REG, MSI_CTRL_ADDR_HIGH_REG)中的地址匹配时,PCIE根据MSI transaction 的数据解析出MSI中断;地址不匹配时,通过AXI转接桥写到对应的Memory空间,PCIE并不区分MSI transaction与Memory Write transaction 。

RC模式下接收MSI中断时,需要在配置阶段做以下设置:

  • 查询寄存器MSI_CTRL_INT_EN_REG,确认MSI中断使能是否打开,如果没有打开,往寄存器MSI_CTRL_INT_EN_REG的对应位写“1”;
  • 查询寄存器MSI_CTRL_INT_EN_MASK_REG,确认MSI中断屏蔽位是否关掉,如果处于屏蔽状态,往寄存器MSI_CTRL_INT_EN_MASK_REG的对应位写“0”;
  • 可查询寄存器MSI_CTRL_INT_EN_STATUS_REG确认是否收到MSI中断请求。

MSI_CTRL_INT_EN_REG,MSI_CTRL_INT_MASK_REG,MSI_CTRL_INT_STATUS_REG这三个寄存器的每一位对应一个中断向量的配置或者状态,例如:bit0对应中断向量0,bit7对应中断向量7。

### PCIE 中断工作原理 PCIE 设备可以使用多种方式报告中断事件,其中最常用的是基于消息的 MSI (Message Signaled Interrupts) 和传统的 INTx 方式。 对于传统中断(INTx),其机制依赖于专用的硬件线路。PCI设备配置空间中的Interrupt Pin寄存器会指定该设备使用的具体哪一根INTx信号线(INTA, INTB, INTC 或者 INTD)[^2]。当发生特定条件时,设备将拉低相应的引脚电压水平以通知处理器发生了中断请求。随后操作系统调用相应驱动程序注册过的ISR(Interrupt Service Routine),由后者负责查询并处理实际发生的事件。 相比之下,MSI则采用更现代的方法——通过发送特殊格式的消息给目标CPU来触发中断响应流程。这种方式不仅减少了竞争状况的发生几率,还支持多条独立的消息路径从而提高效率和支持更多并发中断源[^1]。 一旦接收到任何类型的中断指示后,系统软件需执行必要的诊断措施确认问题根源,并采取适当行动予以纠正。如果遇到无法解析或持续存在的异常情况,则可能涉及到硬件层面的因素如连接不良或是组件损坏等问题[^3]。 ```python # Python伪代码展示简单中断处理逻辑 def handle_interrupt(interrupt_type): if interrupt_type == 'MSI': process_msi_message() elif interrupt_type == 'INTx': check_int_pin_status() # 检查哪个pin被激活 read_device_register() # 获取更多信息用于调试目的 def main(): while True: int_type = wait_for_interrupt() handle_interrupt(int_type) main() ``` #### 常见问题及其解决方案 - **频繁误报中断**:可能是由于共享IRQ冲突引起;尝试重新分配资源或将受影响的服务迁移到其他位置。 - **无响应/丢失中断**:这往往指向潜在的硬件兼容性难题或者是固件版本过旧;更新BIOS以及相关驱动至最新状态或许有所帮助。 - **性能瓶颈**:大量短时间内的高频率中断可能导致系统负载过高;考虑优化应用程序行为减少不必要的IO操作次数或者调整内核参数增强吞吐量表现。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值