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

Как определить, когда завершена транзакция чтения?

Устройство (endpoint) подключено к шине PCI Express. Оно посылает последовательность TLP WrMem, данные записываются в память хоста. Как драйвер, выполняющийся на хосте, может узнать, что данные уже записаны в память?

 

- pci_map_single()

- старт операции чтения, опрос состояния устройства

- pci_unmap_single()

 

Можно опрашивать регистр состояния устройства или получить от него прерывание, но все-таки нужно знать, когда полностью завершена транзакция и можно делать pci_unmap_single().

Хост работает под Linux Ubuntu. Устройство сделано на основе Xilinx XAPP1171.

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


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

Устройство (endpoint) подключено к шине PCI Express. Оно посылает последовательность TLP WrMem, данные записываются в память хоста. Как драйвер, выполняющийся на хосте, может узнать, что данные уже записаны в память?

 

- pci_map_single()

- старт операции чтения, опрос состояния устройства

- pci_unmap_single()

 

Можно опрашивать регистр состояния устройства или получить от него прерывание, но все-таки нужно знать, когда полностью завершена транзакция и можно делать pci_unmap_single().

Хост работает под Linux Ubuntu. Устройство сделано на основе Xilinx XAPP1171.

 

Решено.

Сначала я опрашивал регистр состояния CDMA, установленного на endpoint устройстве. Это есть неправильно. После того, как я сделал ожидание прерывания, все проблемы устранились.

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


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

Не понятно, а регистр состояния CDMA намного раньше выставляется, чем кидается прерывание?

Не знаком с XAPP1171, но у нас сделано так:

драйвер дает задание для DMA,

DMA выставляет в регистр состояния "выполняю работу",

после окончания выполнения задания (пересылки всех данных) DMA выставляет в регистр состояния "выполнил работу" и кидает прерывание.

То есть вот в нашей системе абсолютно без разницы - читать регистр состояния или ожидать прерывание.

Наш программист даже опцию такую сделал (для отладочных целей): работать только по регистру состояния или работать по прерываниям.

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


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

Не понятно, а регистр состояния CDMA намного раньше выставляется, чем кидается прерывание?

Не знаком с XAPP1171, но у нас сделано так:

драйвер дает задание для DMA,

DMA выставляет в регистр состояния "выполняю работу",

после окончания выполнения задания (пересылки всех данных) DMA выставляет в регистр состояния "выполнил работу" и кидает прерывание.

То есть вот в нашей системе абсолютно без разницы - читать регистр состояния или ожидать прерывание.

Наш программист даже опцию такую сделал (для отладочных целей): работать только по регистру состояния или работать по прерываниям.

 

Не понятно, а регистр состояния CDMA намного раньше выставляется, чем кидается прерывание?

Нет. Можно сделать задержку, но я не делал.

 

Чтение регистра состояния выполняется по шине PCIe. Может, это мешало? Хотя ведь передача по шине дуплексная.

 

Но раньше при чтении больших блоков памяти (4 МБ) были ошибки - некоторые фрагменты приемного буфера не заполнялись данными. . Теперь ошибок нет.

 

 

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


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

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

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

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

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

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

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

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

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

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