我有一个用System Verilog编写的PCIe模型,但我认为这个问题是语言不可知的。该模型执行PCIe配置读取和写入和内存读取和写入完美的模拟。但是,我需要做的是“发现”我的PCIe设备并在模拟中配置我的配置空间寄存器。是否存在代表Linux PCIe枚举过程的伪代码锅炉块,我可以添加我自己的模型事务功能,以便我可以获得“总线漫游”,然后是BAR编程,如果发现了SR-IOV, MSIx配置?看起来这将是PCIe设备的常见练习,所以也许有模型。PCIe设备发现算法伪代码
回答
这并不难。基本上,你循环遍历配置空间,检查第一个根总线0上的每个可能的设备。当找到设备时,根据它的请求大小为它分配一个内存空间并相应地对BAR进行编程。如果你找到任何网桥,你也可以配置并启用它们 - 基本的网桥寄存器是标准的。这包括分配上游和下游总线编号,然后允许您枚举新的下游总线,等等。
我必须这样做才能访问没有OS或其他软件环境的系统上的PCI I/O卡。它并不算太糟糕,它跨越了两家供应商的两座桥梁,以及I/O卡寄存器和CPU总线根桥设置。这是PCI,而不是PCIe,但它会非常相似。如果硬件没有改变,你甚至可以用完全硬编码的数字来完成,但在我的情况下有几个变体,所以我实际上必须做一些简单的枚举来动态地查找设备编号。一个问题是,您可能需要延迟一段时间或重试,以便在尝试访问它们之前给所有设备上线时间。
在这样做,我发现这本书是无价的:PCI System Architecture (4th Edition)。我注意到还有一个PCIe版本:PCI Express System Architecture (1st Edition)。如果你还没有,我肯定会得到其中的一个。这些书包含详细的算法和有关如何做到这一切的解释。当时我没有真正使用或参考任何代码来说,但...
我找到的最佳代码资源是U-Boot。它运行在一个类似的低层次,完全独立,并且仍然相当小并且尽可能简单。例如,枚举似乎开始于功能pci_init()
调用特定于板的pci_xxx_init()
。然后设置根桥,然后在drivers/pci/pci.c中调用pci_hose_scan_bus()
来完成真正的工作。还请检查drivers/pci/pci_auto.c中的例程以及文件夹的其余部分。
对于您的任务,您可能只需要一个非常小的子集,并可以将这些文件的一部分分解为简单的驱动程序。基本上用for()循环和一些pci_read/write_config()调用逻辑来识别你的设备和网桥ID。
- 1. Python伪代码实现算法
- 2. minmax算法的伪代码
- 3. 递归算法伪代码
- 4. Fortune算法的伪代码
- 5. 贪婪算法伪代码
- 6. a *算法伪代码
- 7. 该算法的伪代码
- 8. 无法理解CYK算法伪代码
- 9. 伪代码 - 地方发现者Python
- 10. CYK算法伪代码混淆
- 11. 插入排序算法伪代码
- 12. 伪代码/ Java神秘算法
- 13. 用C#实现A *算法(了解伪代码)
- 14. 实现其在C伪代码的算法++
- 15. 在Python中实现“最简单的协议”伪代码算法
- 16. 散列运算伪代码
- 17. 在pcie gen 3插槽上未检测到Pcie 1.1设备
- 18. Netbeans伪代码的伪代码和方法的代码完成
- 19. 无法发现BLE设备
- 20. 从python代码中提取算法/伪代码
- 21. 主要压缩算法的伪代码(或代码)
- 22. 放气算法伪码
- 23. DMA over PCIe到其他设备
- 24. MSI注册PCIE设备驱动程序
- 25. 算法模拟乘法加法(伪代码)
- 26. 您是否在编码之前用伪代码写出算法?
- 27. 统一成本搜索算法伪代码/ ocaml表示法
- 28. 伪算法
- 29. Hadoop:从主设备发送到从设备的代码
- 30. 此代码的伪代码