LINUX.ORG.RU

Передать от host в fpga страницу памяти

 , ,


0

2

Была такая тема написать драйвер для своего устройства и с тех пор удалось поднять PCI-E на разных платформах Lattice Versa, Altera Cyclone 4 gx (Avalon stream, Nios), Xilinx Spartan 6-T и Xilinx Kintex-7. Но тогда всегда задача состояла лишь в передаче из ПЛИС в ПК, т.е. хост.

При передаче в хост, я просто передавал результат dma_map_single в ПЛИС и засылал пачки TLP MWr, после чего следовало прерывание.

Сейчас возникла задача обратная, пытаюсь понять как ее решить, пока только думаю, делать буду через месяц. Я правильно понимаю что надо:

  1. сначала взять страницу dma_map_single

  2. заполнить ее данными

  3. затем синхронизироваться dma_sync_single_for_device

  4. отослать результат первого пункта в ПЛИС

  5. запустить серию MRd пакетов, обрабатывая completion-ы

Всё ли правильно понимаю?

Да. Только будь готов, что completionов будет много на один запрос и они будут разного размера, вплоть до 64 байт. Root complex нашинкует как ему удобнее. Если запускать несколько запросов (с разным tag) то completionы будут перемешаны.

Также, формально, по протоколу, нельзя запрашивать за раз на чтение больше чем max_read_request байт. Но это значение можно менять в драйвере и, вообще, всем хостам что я видел абсолютно пофиг что запрашивается больше чем нужно.

Kosyak ★★★★ ()
Ответ на: комментарий от Kosyak

Да. Только будь готов, что completionов будет много на один запрос и они будут разного размера, вплоть до 64 байт. Root complex нашинкует как ему удобнее. Если запускать несколько запросов (с разным tag) то completionы будут перемешаны.

Да, спасибо, чем то таким меня пугали товарищи плисоводы, а я до сих пор не вижу в этом сложности. Да они перемешаются, но адреса то я в ПЛИС сам буду разбирать и отдавать данные. Вижу гемор, но непреодолимой ее не считаю.

P.S. Пока борюсь с тем что pcie-ядро прерывания принимает и подтверждает ack, а в Linux у драйвера /etc/interrupts все нули. У меня есть старые наработки дров, разницы вроде нет, но ни ISR обработчик не срабатывает, и вообще всё падает. Число зарегистрированных прерываний пока ноль...

DMA осилил. Это я сейчас MSI-прерывания на Xilinx натягиваю. Legacy interrupts пробовал тоже, разница какая то мутная у них в этом месте. На Altera/Lattice как то проще было, там сразу заработало, а у Xilinx застрял чето, падает драйвер, затем ядро глючит.

I-Love-Microsoft ★★★★★ ()
Последнее исправление: I-Love-Microsoft (всего исправлений: 3)
Ограничение на отправку комментариев: только для зарегистрированных пользователей