linux 中 PCIE 中断映射机制

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

PCIE 中断映射机制

1、 PCIE 中有三种中断方式 MSIMSI-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一般被称为传统的LegacyPCI中断机制每个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 BIRBAR 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 bitbit 0所以就是4个Dword
配置Address (0x00000000 BF37c000) 和 Message Data (0x00000002), 没有设置Vector Control 的中断Mask bit所以就是3个Dword
在这里插入图片描述

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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: linux