2017-01-18 47 views
1

我有一个用System Verilog编写的PCIe模型,但我认为这个问题是语言不可知的。该模型执行PCIe配置读取和写入和内存读取和写入完美的模拟。但是,我需要做的是“发现”我的PCIe设备并在模拟中配置我的配置空间寄存器。是否存在代表Linux PCIe枚举过程的伪代码锅炉块,我可以添加我自己的模型事务功能,以便我可以获得“总线漫游”,然后是BAR编程,如果发现了SR-IOV, MSIx配置?看起来这将是PCIe设备的常见练习,所以也许有模型。PCIe设备发现算法伪代码

回答

3

这并不难。基本上,你循环遍历配置空间,检查第一个根总线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。