Была такая тема написать драйвер для своего устройства и с тех пор удалось поднять PCI-E на разных платформах Lattice Versa, Altera Cyclone 4 gx (Avalon stream, Nios), Xilinx Spartan 6-T и Xilinx Kintex-7. Но тогда всегда задача состояла лишь в передаче из ПЛИС в ПК, т.е. хост.
При передаче в хост, я просто передавал результат dma_map_single в ПЛИС и засылал пачки TLP MWr, после чего следовало прерывание.
Сейчас возникла задача обратная, пытаюсь понять как ее решить, пока только думаю, делать буду через месяц. Я правильно понимаю что надо:
-
сначала взять страницу dma_map_single
-
заполнить ее данными
-
затем синхронизироваться dma_sync_single_for_device
-
отослать результат первого пункта в ПЛИС
-
запустить серию MRd пакетов, обрабатывая completion-ы
Всё ли правильно понимаю?