Я пишу драйвер устройства Linux, который поддерживает несколько устройств. У меня есть карта x8 PCIe с 4 такими устройствами на ней. Каждый проходит через коммутатор PCIe и получает 2 полосы PCIe. Есть ли способ заставить драйвер писать на несколько полос одновременно? Если да, то как мне это сделать? Я бы подумал, что это должно быть возможно, так как все это находится в одном слоте PCIe, но я понятия не имею, как это можно сделать из драйвера.
Можно ли писать на несколько устройств, которые используют разные линии PCIe в одном слоте PCIe?
Ответы (2)
Похоже, вы ищете многоадресную рассылку PCIe. Это не имеет никакого отношения к количеству дорожек, но будет просто функцией доставки одной записи в несколько пунктов назначения с максимальной эффективностью. Для этого существует стандарт, в основном предназначенный для использования на объединительной плате, см. http://www.pcisig.com/developers/main/training_materials/get_document?doc_id=12f5c260ccf5e054366d4c96ee655fa6827db5b3
Похоже, что это поддерживается новым типом PCI BAR, где несколько устройств будут иметь один и тот же отображаемый диапазон физических адресов, и коммутатор также будет настроен так, чтобы знать об этом диапазоне многоадресной рассылки. Но все это требует поддержки ОС, и я не нашел ничего в сети, чтобы предположить, что у Linux есть компоненты, необходимые для настройки устройств для всего этого.
Поскольку ваша родительская ссылка имеет достаточную пропускную способность для насыщения всех четырех дочерних ссылок, у вас нет проблем с пропускной способностью. Единственное, что можно сэкономить с многоадресной рассылкой, - это пропускная способность подсистемы памяти. Если бы у вас была современная архитектура, вы бы сэкономили на шуме.
Другими словами, не беспокойтесь об этом. Относитесь к своим устройствам как к независимым (в любом случае это сделает драйвер более чистым) и продолжайте свой проект.
PCIe работает не совсем так, как вы думаете. Коммутатор не разделяет восходящий канал x8 на несколько каналов x2 - он просто перенаправляет трафик с одного канала на другой. Итак, вы увидите ссылку x8 на коммутатор, а затем 4 канала x2 от коммутатора к нижестоящим устройствам. Однако с другим коммутатором и другими устройствами нисходящего потока было бы равным образом возможно (например) иметь ссылки x8 повсюду, то есть канал x8 от корневого порта к коммутатору и ссылки x8 от коммутатора к нижестоящим устройствам.
Однако в вашем случае у вас есть согласованная пропускная способность на обеих сторонах коммутатора, поэтому не должно возникнуть проблем с устройствами, конкурирующими за ограниченную пропускную способность. Ваш драйвер может общаться со всеми устройствами одновременно так же эффективно, как если бы были независимые ссылки.