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