2013-03-20 2 views
3

Я пытаюсь получить доступ к PCI BAR (№5) для моста PCIe SATA из пользовательского пространства, но всякий раз, когда я mmap() из BAR через /sys/bus/pci/devices/.../resource5, я получаю 0xFF при каждом смещении в файл. Другие устройства, такие как контроллер Intel SATA, отвечают разумными данными.Пользовательское пространство доступа PCI BAR возвращает 0xFF при каждом смещении

BAR показан в lspci -vv так же, как и для контроллера Intel (только адрес отличается).

Region 5: Memory at f7b10000 (32-bit, non-prefetchable) [size=2K] 

Оба устройства совпадают драйвером ahci, а контроллер SATA работает в противном случае - можно получить доступ подключенных дисков.

Я пытаюсь получить доступ из пользовательского пространства, потому что на данный момент я просто хочу высунуть в регистры экспериментально. Для этого я использую измененную форму pcimem, измененную для доступа к регистрам, которые меня волнуют. Однако, любое смещение возвращает 0xFF, так что даже с простым pcimem:

pcimem /sys/bus/pci/devices/0000\:01\:00.0/resource5 0 w 

возвращает 0xFFFFFFFF ("W" означает "слово" читать, следовательно, 4 байта).

Что мешает BAR5 для этого устройства быть доступным, когда другие устройства? Имеет ли смысл делать такой доступ к пользовательскому пространству для PCI BAR?

ответ

1

Не знаете, насколько это будет полезно, но я видел то же самое, когда писал драйвер для нового устройства PCI-FPGA.

Объем памяти PCI BAR MMAP-ed будет возвращать 0xFFFFFFFF (-1) при возникновении ошибки на устройстве. Единственный способ решить эту проблему - сбросить карту с полной перезагрузкой компьютера.

+0

Я также думал об ужасной ошибке устройства, но диски кажутся видимыми и могут быть установлены, поэтому мост работает, я просто не могу прочитать BAR. Я перезагружался несколько раз, но один и тот же результат каждый раз. – Inductiveload

+1

Тогда в этом случае это может быть просто неактивный регион BAR, который они выставили и никогда не использовали. –

+0

Но регистры для аппаратных модулей (например, интерфейсы GPIO, I2C и SPI), которые я хочу использовать, относятся к BAR5. Это единственный BAR, который является областью памяти, размер и число соответствуют рекламе данных, а в таблице данных перечислены десятки регистров, которые, как я полагаю, могут получить доступ к скрипке с оборудованием. – Inductiveload

0

Я столкнулся с одной и той же проблемой, отлаживающей горячий модуль NVMe hdds. Если перед запросом GRUB был слот hdd в слоте PCIe, вы можете подключить другие диски в этом слоте, а если нет, pci_ioremap_bar() возвращает область памяти, считывая все 0xffffffff. Странное дерьмо.

Смежные вопросы