P CIe UIO multi-DWORD проблемы с доступом - PullRequest
0 голосов
/ 23 января 2020

У меня есть конечная точка Intel FPGA P CIe. Он правильно отображается в lspci, и вся информация lspci -vv выглядит правильно (карта памяти, IRQ, размер BAR0 выглядят нормально). Я хочу передать некоторые данные через BAR0 и регистры статуса чтения / записи внутри моего IP. На моей хост-машине установлен процессор Intel x86_64 и установлена ​​ОС Debian.

В настоящее время я делаю следующее:

  1. open() вызов /sys/class/uio/uio0/device/resource0 -> возвращает дескриптор файла.
  2. mmap 4 КБ для этого файлового дескриптора с защитой PROT_READ + PROT_WRITE и флагами MAP_SHARED. Смещение равно 0. -> возвращает указатель.
  3. In al oop установите смещения относительно указателя на случайные числа. Сделайте это для ~ 1000 байтов, 4 байта за раз. После каждой записи в указатель вызовите msync.
  4. Считайте указатель обратно на один DWORD время.
  5. Массовое чтение указателя с помощью memcpy.

Результатом шага # 4 является то, что большая часть данных выглядит правильно, а некоторые нет (что является странно). Результатом числа 5 является то, что я получаю 0xffff_ffff за все, что даже странно.

Если я пытаюсь заменить шаг # 3 одной последовательностью memset / msync, программа зависает для Некоторое время, а затем возвращает ошибку шины. После этого lspci заявляет, что BAR0 отключен и d Я больше не могу с ним взаимодействовать.

Есть идеи, что я делаю не так? Это может быть проблема HW, но HW сейчас действительно прост. Я сконфигурировал FPGA так, чтобы он действовал исключительно как подчиненное устройство, а ответом на чтение были зарегистрированные данные записи, поступающие через интерфейс BAR0. У IP-адреса, с которым я работаю, есть только строка с верным ответом на чтение (без ответа на запись, так или иначе), который я жестко запрограммировал в 1. Кажется, что размер пакета больше 1 вызывает некоторые проблемы с P C Ie core, как видно из проблем с memcpy / memset, но я не понимаю, почему это так.

EDIT / UPDATE:

Я смог обойти это. Предполагается, что MMIO предназначен только для 32b, поэтому решение проблемы заключается в написании al oop, который одновременно обращается к указателю 32b.

...