我正在编写一个支持多个设备的 Linux 设备驱动程序。我有一个 x8 PCIe 卡,上面有 4 个这样的设备。每个都通过一个 PCIe 交换机并获得 2 个 PCIe 通道。有没有办法让司机同时写入多个车道?如果是这样,我该怎么做?我认为这应该是可能的,因为它都在一个 PCIe 插槽上,但我不知道如何从驱动程序中完成。
2 回答
PCIe 并不像您想象的那样工作。交换机不会将上游 x8 链路划分为多个 x2 链路——它只是将流量从一条链路转发到另一条链路。因此,您将看到一个到交换机的 x8 链路,然后是从交换机到下游设备的 4 个 x2 链路。然而,对于不同的交换机和不同的下游设备,同样有可能(例如)在任何地方都有 x8 链路,即从根端口到交换机的 x8 链路和从交换机到下游设备的 x8 链路。
但是,在您的情况下,您在交换机的两侧都有匹配的带宽量,因此设备竞争有限的带宽应该没有问题。您的驱动程序可以像有独立链接一样有效地同时与所有设备通信。
听起来您正在寻找 PCIe 多播。这与通道的数量无关,而只是将单个写入尽可能高效地传递到多个目的地的功能。有一个标准,主要用于背板用途,请参阅:http ://www.pcisig.com/developers/main/training_materials/get_document?doc_id=12f5c260ccf5e054366d4c96ee655fa6827db5b3
新的 PCI BAR 类型似乎支持这一点,其中多个设备将具有相同的映射物理地址范围,并且交换机也将被配置为了解此多播范围。但这一切都需要操作系统支持,而且我在网上没有找到任何东西表明 Linux 具有配置设备以完成所有这些工作所需的部分。
由于您的父链接有足够的带宽来饱和所有四个子链接,因此您不会遇到吞吐量问题。使用多播唯一可以节省的是来自内存子系统的带宽。如果您拥有现代建筑,那么您将节省的金额将在噪音中。
换句话说,不要担心。将您的设备视为独立的(无论如何,这将使驱动程序更清洁)并继续您的项目。