2016-11-03 23 views
4

Я использую порт PCI-e на процессоре Freescale MPC8308 (который основан на архитектуре PowerPC), и у меня есть некоторые проблемы при попытке его использовать. Конечное устройство PCI-e имеет объем памяти, равный 256 МБ. Я могу легко прочитать и записать конфигурационное пространство устройства конечной точки, используя пакет «pciutils».Доступ к памяти в формате PCI-e с mmap

После написания правильных значений в конфигурационных регистрах и получения разрешения на доступ к памяти; Я пытался получить доступ к области памяти, используя «ММАП()» функции в C и используется дескриптор файла, расположенного по адресу:

«/sys/devices/pci0000:00/0000:00:00.0/resource0»

который был ровно 256 МБ (равным памяти пространства конечного устройства), поэтому кажется, что я использую правильный путь для дескриптора файла. здесь вы можете найти свой код, используя «ММАП()», как упомянуто в https://github.com/billfarrow/pcimem:

https://github.com/billfarrow/pcimem/blob/master/pcimem.c

Но, к сожалению, когда я пытаюсь использовать пространство памяти, используя возвращаемый адрес «ттар()» функции; Я не могу правильно считывать регистры только для чтения устройства конечной точки. Кроме того, когда я читаю адреса больше, чем «0x7FFFFFC», MPC8308 перезагружается. Учитывая вышеописанную ситуацию, не могу ли я пропустить какие-либо шаги для инициализации интерфейса PCI-e? Должен ли я что-либо изменить в изображении ядра Linux или кодах U-Boot? Есть ли что-то другое для использования PowerPC PCI-e с mmap()? У вас есть код примера, который может помочь мне прочитать память PCI-e?

Thanks

+0

256 МБ пространства памяти для конечной точки кажется слишком большим. На моем процессоре (i.MX6) я не могу иметь конечную точку размером больше 16 МБ. У вас есть ошибка init при загрузке Linux для PCIe? Каково ваше устройство памяти PCI-e? Это ПЛИС? – FabienM

+0

да, это тоже показалось мне слишком большим, но у меня нет ошибок при загрузке Linux, и он посвятил 256 Мб памяти для устройства, как я могу видеть в/proc/iomem. конечное устройство не является ПЛИС. Его ASIC с интерфейсом PCI-e. –

+1

Другим маршрутом будет поиск физического адреса устройства и его ограничение, а также отображение в/dev/mem. (Честно говоря, это не может гарантировать, что это сработает. Мне интересно, если это так.) – ruthafjord

ответ

1

mmap() - очень полезный, но случайный способ доступа к устройствам PCIe из пользовательского пространства.

Я замечаю, что вы передаете 0 в качестве первого аргумента mmap. В моем случае FPGA-карты, подключенной к компьютеру x86, я вызываю lspci, чтобы получить физический адрес карты в слоте pcie. Затем я использую этот физический адрес в качестве первого аргумента для mmap. Я знаю, что вы пишете BAR в конфигурационном пространстве устройства, но, возможно, дважды проверяете lspci.

$ sudo lspci -s 02:00 -v 
02:00.0 Memory controller: Xilinx Corporation Device 8028 
    Subsystem: Xilinx Corporation Device 0007 
    Flags: bus master, fast devsel, latency 0, IRQ 11 
    Memory at f7e00000 (32-bit, non-prefetchable) [size=1M] 
    Capabilities: [80] Power Management version 3 
    Capabilities: [90] MSI: Enable- Count=1/1 Maskable- 64bit+ 
    Capabilities: [c0] Express Endpoint, MSI 00 
    Capabilities: [100] Advanced Error Reporting 
0

Предупреждение: подготовьтесь к отказу. Похоже, вы делаете это из пользовательского пространства. Устройства MMAPing в пользовательском пространстве не являются обычной практикой (это имело бы ужасные последствия для безопасности, если вы не учитываете архитектуру). Честно говоря, я даже не уверен, что это возможно. Я боюсь думать о случаях, когда это делается. Обычно устройства используются только в ядре, и я бы рекомендовал писать драйвер или модуль ядра вместо того, чтобы играть в пользовательском пространстве.

+1

Спасибо за отзыв. вы можете найти с помощью mmap() как общее решение, появившееся для доступа к устройствам, особенно когда вы используете PCI-e. например, в главе 15 книги «Linux device driver» упоминается, что mmap() можно использовать для доступа к пространству памяти PCI-e.однако я согласен с тем, что создание модуля ядра для этой цели является более стратегическим решением; у него также есть свои проблемы по сравнению с простым использованием mmap, особенно когда ваше устройство известно ядром, а соответствующие области пространства памяти посвящены конечному устройству. –

+0

Наверное, я смущен тем, что вы намерены здесь. ¯ \ _ (ツ) _/¯ Если у вас есть брокер устройств с драйверами mmap, которые уже есть (что, по-видимому, является тем, что поощряется этой книгой, от некоторого быстрого скимминга), тогда это может быть разумным (например, что каждая графика Nvidia карта делает это, чтобы избежать буферов отказов). Часть, которая заставляет меня нервничать, отображает всю область MMIO устройства (которая, предположительно, позволяет пользователю полностью контролировать устройство и подрывает всю точку разделения пользователя и ядра). – ruthafjord