P CIe Kerneldriver DMA пишет по неправильным адресам - PullRequest
0 голосов
/ 30 марта 2020

В настоящее время я пишу драйвер ядра P CIe для linux ядра 4.19.
FPGA (Arria 10) под управлением Intel DMA IP подключен к процессору Linux (i7- 6700TE) через P CIe Gen 2.
Я хочу запустить передачу прямого DMA из FPGA в ОЗУ ЦП.
Сначала инициализируется драйвер P CIe. Я использую следующие инструкции по порядку:

  1. pci_enable_device
  2. pci_set_master
  3. pci_set_mwi
  4. pci_set_dma_mask DMA_BIT_MASK (64)
  5. pci_alloc_consistent

После выделения я добавляю sh физический адрес в конфигурацию DMA и начинаю передачу. После окончания я публикую MSI, который получен и обработан.
Проблема, с которой я столкнулся, заключается в том, что при чтении данных DMA с использованием виртуального адреса я читаю только нули, но не записываю нули через DMA.
Я также проверял область памяти, сначала записав рампу в память через ЦП, затем запустив DMA, затем снова считав, и рампа осталась неизменной, поэтому я совершенно уверен, что доступ к памяти в указанной области не происходил.
Почему передача MSI работает (ЦП адресного пространства), а доступ к ОЗУ - нет?
У вас есть идея, что делать дальше?
Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 30 марта 2020

Добро пожаловать на Unix & Linux StackExchange!

Ваш вопрос касается Linux программирования ядра, и поэтому вместо этого может быть лучше подходит для переполнения стека. Но в любом случае ...

Читали ли вы ядро ​​DMA API HOWTO?

Вы сказали, что вставили физический адрес в конфигурацию DMA. Но устройству с поддержкой DMA на шине требуется адрес другого типа, поскольку его представление о шине может быть другим: «адрес шины». Это может быть или не быть идентичным физическому адресу, в зависимости от архитектуры системы.

...