PCIE的MSI中断
(2022-11-23 10:02:01)
标签:
pciefpgamsi |
分类: 计算机与 Internet |
最近用FPGA实现一个PCIE Root complex以方便侦测/替换网络数据。用Xilinx的IP核实现root
complex挂接到运行Linux内核的ARM上。数据读写都可以了,现在想加入MSI中断的仿真。网上搬运了很多资料,但都对PCIE
MSI中断流程中Root complex扮演的角色语焉不详。现将相关知识梳理如下:
1. MSI中断设计到以下角色: 设备驱动,内核MSI服务, Root complex driver, Root
Complex hardware, 设备.
2. 初始化流程:
a. 设备准备配置空间里的MSI capability 块。
b. 上电时,不知道哪个角色初始化设备的MSI capability块,写入不知道什么内存的基地址和ID.
3. 中断流程
a. 设备产生中断,需要准备一个写内存的TLP. 这个TLP将中断信息写入2b中指定的内存地址。
问题是这块内存是放在什么地方? 可能的答案:
(a) CPU的寄存器空间。部分CPU支持MSI可能有相应的内存,但这个内存读写是由谁完成的? Root complex
driver吗?
从查阅的资料来看,可能某些CPU有MSI空间,但我不太确定是CPU内的空间还是CPU集成的PCIE控制器内存空间。如果是CPU内存空间,Root
complex收到TLP后怎么处理内存操作呢?
(b) Root complex的BAR空间。每个Root
complex都有2个BAR空间。我参考pcie_altera的PCIE控制器驱动里面如是说。这样更合理一些. Root
complex收到TLP后直接写自己的内存空间,并用中断通知CPU有MSI到来。
我们先假设(b)是正确的,接着梳理流程:
b. 设备将中断信息通过TLP MEM write的方式写入Root complex的BAR空间,这里有Root
complex预先设置的中断号。
c. Root complex driver
通知CPU有中断到来,并提供中断号。不知道MSI中断服务是否提供这样的通知接口。需要好好阅读linux kernel
msi相关代码。
d. 中断产生,根据中断号调用对应注册的ISR.
还是带着问题研究吧,问题梳理:
1. PCIE设备驱动相关:
问题a. 如何注册msi中断?
问题b. 如何确定中断号?
问题c. 如何初始化PCIE设备的msi structure? 地址写什么?
2. Root complex driver相关
问题a. 收到TLP后怎么操作以调用PCIE设备驱动注册的isr?
前一篇:SGMII8b/10b解码