Всех приветствую.
Как обычно изобретаю свою вундервафлю и есть вопросик по реализации некоторой фигни которая схематично описана в заголовке.
Для начала исходные данные:
-
Есть некая fpga которая может прикидываться EP сидя на шине PCIe для передачи данных от CPU в какую-то физическую среду, которая где-то там с другой стороны выходит в наружу (суть ее на важна, если кому-то нужна определенность пусть будет serdes).
-
Для эффективной и быстрой передачи делаем SG и схематоз типа сетевых карт. Заводим в памяти массив дескрипторов, где есть битовый флаг владельца этого дескриптора и адрес буфера где лежат сами данные. Ну и для полноты битик обозначающий конец массива дескрипторов (чтобы железка понимала, что надо начинать читать с начала). Для простоты, пока считаем передачу в одну сторону - MEM2DEV. Отдельно выделяем буферы для данных, адреса которых, прописываем в дескрипторы.
-
В железку, куда-то в регистр прописываем адрес начала массива дескрипторов.
Это все исходные данные.
Дальше берем линукс, пишем стандартный драйвер для pci. Где выделяем память для массива дескрипторов (конечно с когерентностью), выделяем буфера. Заполняем дескрипторы адресами буферов и битики все расставляем куда надо.
Это наше исходное состояние.
А вот теперь внимательно смотрим за руками. В драйвер кто-то закинул пакет данных. Драйвер взял первый пустой дескриптор, взял там адрес буфера, залил в этот буфер пакет данных, пометил, что оунер дескриптора стал DEV и выставил в регистре железки битик, что есть данные для передачи и пошел спать.
И вот тут у меня свербящий вопрос, что дальше делает железка?
Понятно, что железка битик сразу заметит. Как именно? Как быстро?
По моим ощущениям где-то через 1 клок внутренней частоты fpga.
Дальше запустится процесс чтения дескриптора. Как она его будет читать? По-словно по шине pcie из памяти к себе? Стартанет DMA для передачи сразу всего массива дескрипторов?
Призываются все плисоводы которые реализовывали pcie на fpga для передачи чего-то сложнее хеловорда.