当前位置: 首页 > news >正文

linux 中 PCIE 中断映射机制

PCIE 中断映射机制

1、 PCIE 中有三种中断方式, MSI,MSI-X 和INTx

PCIe总线继承了PCI总线的所有中断特性(包括INTx和MSI/MSI-X),以兼容早期的一些PCI应用层软件。

PCI总线最早采用的中断机制是INTx,这是基于边带信号的。

后续的PCI/PCI-X版本,为了消除边带信号,降低系统的硬件设计复杂度,逐渐采用了MSI/MSI-X(消息信号中断)的中断机制。

需要注意的是PCIE 继承了INTx 中断,并没有采用边带信号,而是用了Message TLP 的方式

另外一点, PCI规范中MSI和MSI-X都是可选的功能。但从PCIe规范开始,要求PCIe设备必须支持64位的MSI或者MSI-X。尽管1个PCIe设备可能同时支持Virtual INTx#/MSI/MSI-X,系统软件必须只Enable其中一种中断机制。

在这里插入图片描述

INTx 中断:

INTx一般被称为传统的(Legacy)PCI中断机制,每个PCI设备最多支持四个中断信号(边带信号,INTA#、INTB#、INTC#和INTD#)
在这里插入图片描述
PCIE 中使用Message 来实现INTx 中断, 具体实现如下(Assert_INTx消息表示INTx信号的下降沿。Dessert_INTx消息表示INTx信号的上升沿):

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

从协议分析以上可以看到, 由于INTA 是电平信号,所有用Assert_INTA Msg 和Deassert_INTA Msg 来表示, 两个Msg之间的时间,对应的就是INTA 的电平长度
在这里插入图片描述

MSI 中断:

MSI 中断并不是Message TLP, 而是Memory Write TLP 。
MSI capability 的结构体,在configure space 中格式如下, 其中Capability ID 0x05h 表示是MSI capability:
在这里插入图片描述

这边需要讲一下MSI (Memory Write) TLP 是由EP 发给RC 的,RC 向EP 的configure space中,填写 MSI capability 中的Message Address和Message Data。

EP 获取configure space 中的MSI capability 中的Message Address和Message Data, 将这个信息填充到MSI Memory Write TLP 中, 产生中断后,发给RC。

在这里插入图片描述
注: 在x86 架构中, 0xFEExxxxx 的地址APIC (Advanced Programmable Interrupt Controller高级可编程中断控制器) 的地址, EP 会将MSI 的MWr TLP 发给它,由它向x86 上报中断。

下面给出了MSI 的例子,MSI capability Structure 如下, Message address 为0xBF376000, Message data 为0x01
在这里插入图片描述

发送MSI Mwr TLP, 会获取MSI capability Structure中的地址和data, 然后发给host, 具体如下:
在这里插入图片描述

MSI-X 中断:

1)为什么需要MSI-X中断

一、MSI最大只支持32个中断,在很多应用中32个中断是不够的,因此引进了MSI-X, MSI-X 最大支持2048个中断可以满足各种应用的需求。

二、MSI机制下每个PCI Function的所有中断向量都共用1个Message Address,无法将其分配到不同CPU以实现中断服务在CPU间均衡分配

三、MSI机制下每个PCI Function的所有中断向量都是连续的,在某些平台连续的中断向量意味着同样的中断优先级,无法满足区分中断优先级的需求

在这里插入图片描述

Table BIR(BAR Indicator Register)
基地址指示寄存器,该字段存放MSI-X Table所在的位置,PCIe总线规定,MSI-X Table存放在BAR空间中,该寄存器指示使用BAR0~BAR5寄存器中的哪个空间存放MSI-X Table,该字段由3位构成,3’b000 ~ 3’b101分别对应BAR0 ~ BAR5。

在这里插入图片描述
Pending Table

在Pending Table中,一个Entry由64位组成,其中每一位与MSI-X Table中的一个Entry对应,即Pending Table中的每一个Entry与MSI-X Table的64个Entry对应。与MSI机制类似,Pending位需要与Per Vector Mask位配置使用。

当Per Vector Mask位为1时,PCIe设备不能立即发送MSI-X中断请求,而是将对应的Pending位置1;当系统软件将Per Vector Mask位清零时,PCIe设备需要提交MSI-X中断请求,同时将Pending位清零。
在这里插入图片描述
具体例子如下: 从device config spec 可以找到MSI-X Capability structure
在这里插入图片描述

以NVME 为例,更新MSI-X Table Entries:
配置Address (0x00000000 BF37c000) 和 Message Data (0x00000001), 设置Vector Control 的中断Mask bit(bit 0),所以就是4个Dword
配置Address (0x00000000 BF37c000) 和 Message Data (0x00000002), 没有设置Vector Control 的中断Mask bit,所以就是3个Dword
在这里插入图片描述

发送MSI-X 的MWr TLP, 向地址0xBF37c000 发送data 是0x2的中断
在这里插入图片描述

相关文章:

  • 大学生毕业设计网站/域名ip查询入口
  • wordpress阅读排行榜/上海优化公司排行榜
  • 在本地用dedecms做好的网站如何上传到服务器?/万网域名管理平台
  • 泉州做网站工资/沪深300指数怎么买
  • 用python做的网站模板/网络信息发布平台
  • 杭州网站建设q479185700惠/如何推广普通话的建议6条
  • 机器学习基础——k-近邻算法概述和简单实现
  • Effective C++条款40:明智而审慎地使用多重继承(Use multiple inheritance judiciously)
  • 智慧水务能效管理平台在污水处理厂电气节能中的应用
  • Cookie/ Session简介
  • 小程序公众号干货运营之注销篇
  • 【算法题解】10. 环形链表
  • 自动驾驶专题介绍 ———— 超声波雷达
  • 9个Python 内置装饰器: 显著优化代码
  • Django REST framework--渲染器
  • JAVA面试(如何进行有效面试)
  • 拉伯证券|大股东或易主,阿里巴巴换股入局
  • JavaWeb-JavaScript