Перейти к содержанию
    

Короткие TLP

Изучаю PCIe на ките альтеры с Cyclone-IV. В качестве основы для прошивки использую то, что генерит бесплатный IP compiler for PCI Express.

Написал простейший драйвер под WinXP, который мапит бары в user space и отдает эти виртуальные адреса приложению Win32 (вернее, приложение у драйвера их запрашивает). DMA не использую.

В приложении я просто делаю записи по этим адресам. Указатели объявил типа __int64 *.

В ПЛИСине с помощью SignalTap смотрю, что из корки сыпется в обработчик TLP.

Вот что мне не понятно:

Если я делаю запись по виртуальному адресу, например : *pBuffer = 0xBEEFCAFEDEADFACE, то вижу, что из корки летит 2 TLP. Один со старшей частью, а второй с младшей.

Если в указатель буду пихать больше данных, например с помощью memcpy, то из корки прилетит столько TLP, сколько 32-битных слов я запишу в указатель.

Я расчитывал, что все данные будут в одном единственном TLP.

Подскажите, в какую сторону копать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Описанное вами много раз уже обсуждалось. Например, у нас не удалось заставить ОС (у нас линукс используется) описанными вами способами самостоятельно посылать длинные пакеты. Выход - формировать со стороны ПЛИС запрос на чтение из памяти ПК большого блока. А ПК уже ответит на этот запрос кучкой пакетов (разобъет на пакеты, размеры которых не превышают параметр MAX_PAYLOAD_SIZE).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за информацию.

 

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

Если не сложно, дайте ссылку на Вашу тему.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я вам не в укор сказал, что это много раз обсуждалось, а в том смысле, что многие с этим сталкиваются, я тоже никак не мог понять, как пк заставить гнать большие блоки данных. Вот нашел тему с таким же вопросом как у вас http://electronix.ru/forum/index.php?showtopic=44551

 

Вы написали про "бесплатный IP compiler for PCI Express". А в Qsys вы можете pcie ядро сгенерить? Я вот сейчас как раз занимаюсь переводом нашего проекта PCIE+DMA+DDR3+(еще всякая логика) под Qsys. Раньше все генерил мегавизардом, потом руками состыковывал на vhdl, если что-то менялось, добавлялся новый блок - столько кода приходилось перелопачивать. А qsys позволяет всё кубиками соединить, потом квартус интерконнекты сам вставляет. Есть небольшие заморочки, но они решаются. Так что если вы только начали работать с PCIE и в последствии придется добавить другие ядра/блоки, посмотрите в сторону Qsys.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите, в какую сторону копать?

 

Делать busmaster (DMA), и вариантов почти нет. Да и PCIe это не PCI - разницы, генерировать TLP в ответ, или инициировать транзакцию самому, нет.

 

PC, в подавляющем своем большинстве, не умеет общаться с PCI устройствами данными, больше, чем 32 бита за транзакцию. Можно попытаться использовать MMX инструкции, чтобы получить 64 или 128 битные пакеты, и то, вероятность, что чипсет их оставит таковыми, крайне низка. Если это получится, то ОЧЕНЬ повезло с чипсетом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

-> SM

Сегодня решил немного поэкспериментировать. Стал писать в девайс не через виртуальные адреса, выдаваемые драйвером, а с помощью IOCTL закидывал в драйвер данные, а в нем с помощью WRITE_REGISTER_BUFFER_ULONG64 кидал в девайс. Результат такой: TLP стали содержать по одному 64-битному слову. Но это прокатит только для 64-битных операционок. Но все равно, это не та скорость, о которой так долго говорили большевики :)

Хотел попробовать через виртуальные адреса, но из Win64 приложения. Но тот код, что работал под 32, не поехал. Второй вызов SetupDiGetDeviceInterfaceDetail постоянно выдает ошибку 1784. Но это уже не по теме.

 

-> novartis

Спасибо за ссылку.

С QSys я как раз и хотел начать, чтобы не заморачиваться с разбором TLP. Но ничего не получилось. Делал все по инструкции из UG_pci_express, только подправляя под свою плату (она 1х, а не 4х). Скомпилилось нормально, TQ не ругался, но устройсво виндой не обнаруживалось вообще. ltssm никаких признаков жизни не демонстрировали, оставаясь все время в 0. В общем, не дожал я это дело. Да и не лежит как то душа к этим "кубикам".

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но все равно, это не та скорость, о которой так долго говорили большевики :)

Да даже и не заморачивайтесь, не будет пакетных передач в slave, несмотря даже на "prefetchable" бит. Как я уже сказал - максимум, что, может быть, добьетесь, это по 128 бит, и то вряд-ли, и то на отдельных чипсетах. Так что, сразу делайте мастера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Понял. Спасибо.

Ближайшее будущее мне видится в синих тонах. Видимо, из - за экранов. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...