Что может быть причиной задержки чтения данных PCI MMIO? - PullRequest
0 голосов
/ 29 мая 2018

Наша команда в настоящее время работает над нестандартным устройством.
Существует плата Cyclone V с подключенным к ней компьютером на базе COM Express на базе amd64.Эта плата работает как собственная конечная точка PCIe.Сначала включается, затем включается ПК.На ПК работает linux с ядром 4.10, а некоторые драйверы и программное обеспечение работают с PCI BAR0 через MMIO.
Система работает без сбоев до первой перезагрузки с терминала linux.При следующей загрузке доступ для чтения MMIO нарушен, а доступ для записи MMIO в порядке.

Допустим, есть два смещения для чтения, A и B, со значениями 0xa и 0xb соответственно.Теперь, если мы читаем байты из этих смещений, создается впечатление, что имеется задержка на 8 операций чтения в полученных значениях:

  1. read A десять раз - возвращает 0xa каждый раз
  2. read Bвосемь раз - возвращает 0xa каждый раз
  3. читает B десять раз - возвращает 0xb каждый раз
  4. читает A один раз - возвращает 0xb
  5. читает B семь раз - возвращает 0xb каждый раз
  6. чтение B один раз - возвращает 0xa
  7. чтение B десять раз - возвращает 0xb

В случае, если смещения A и B находятся в одном и том же 64-битном слове, все работает какожидается.
Доступ к MMIO осуществляется через функции readb / readw / readl / readq, фактически используемая функция вообще не влияет на эту задержку.
Последовательные перезагрузки могут исправить или прервать чтение MMIO снова.

С точки зрения Linux, mmiotrace дает ту же картину с искаженными данными.
С точки зрения устройства, логический анализатор сигнальной ленты показывает действительные значения данных на базовой шине PCIe.
У нас нет устройства анализатора шины PCI, поэтому мыне знаю пВозможность проверить обмен данными между этими двумя точками.
Что может быть причиной такого поведения и как это можно исправить?

...