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

    

PCI driver не читает BAR

Доброго времени суток.

Разбираюсь с написанием PCI драйвера для PCIe EP устройства на Linux для PowerPC (P2020 процессор, кастомная плата). Для эксперимента использую сетевую плату Intel X520. Конфигурационные регистры читаются/записываются без проблем, но чтение BAR всегда возвращает 0xffffffff. Для эксперимента скомпилировал мой драйвер под x86_64 Arch Linux. BAR читается без проблем, значит дело не в моем драйвере. Сравнивая выводы lcpi -vvv для Arch и для Embedded Linux я заметил, что в Embedded для PCI bridge не назначен Interrup pin (конфигурационный регистр 0x3D = 0x00)

С чем связана невозможность чтения BAR на кастомной плате PowerPC?

  1. 1 Может быть причина в отсутствии interrupt pin для pcibridge в embedded linux?
  2. 2 Разная разрядность? Область BAR 64 разрядная. Мой драйвер нормально читает BAR на 64 разрядной Arch, но не может прочитать на 32 разрядной Embedded Linux

 

lspci -vvv для PCI bridge на Embedded linux

# lspci -s a000:00:00.0 -vv
a000:00:00.0 PCI bridge: Freescale Semiconductor Inc P2020 (rev 21) (prog-if 00 [Normal decode])
       Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
       Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
       Latency: 0
       Interrupt: pin ? routed to IRQ 24
       Region 0: Memory at <ignored> (32-bit, non-prefetchable) [size=1M]
       Bus: primary=00, secondary=01, subordinate=01, sec-latency=0
       I/O behind bridge: 00000000-00000fff
       Memory behind bridge: c0000000-dfffffff
       Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- <SERR- <PERR-
       BridgeCtl: Parity- SERR- NoISA- VGA- MAbort- >Reset- FastB2B-
               PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn-
       Capabilities: [44] Power Management version 2
               Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=0mA PME(D0+,D1+,D2+,D3hot+,D3cold+)
               Status: D0 NoSoftRst- PME-Enable+ DSel=0 DScale=0 PME-
       Capabilities: [4c] Express (v1) Root Port (Slot-), MSI 00
               DevCap: MaxPayload 256 bytes, PhantFunc 0
                       ExtTag- RBE-
               DevCtl: Report errors: Correctable+ Non-Fatal+ Fatal+ Unsupported+
                       RlxdOrd+ ExtTag- PhantFunc- AuxPwr- NoSnoop+
                       MaxPayload 128 bytes, MaxReadReq 512 bytes
               DevSta: CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr- TransPend-
               LnkCap: Port #0, Speed 2.5GT/s, Width x4, ASPM L0s, Exit Latency L0s <2us, L1 unlimited
                       ClockPM- Surprise- LLActRep- BwNot- ASPMOptComp-
               LnkCtl: ASPM Disabled; RCB 128 bytes Disabled- CommClk-
                       ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
               LnkSta: Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk- DLActive- BWMgmt- ABWMgmt-
               RootCtl: ErrCorrectable- ErrNon-Fatal- ErrFatal- PMEIntEna+ CRSVisible-
               RootCap: CRSVisible-
               RootSta: PME ReqID 0000, PMEStatus- PMEPending-
       Capabilities: [100 v1] Advanced Error Reporting
               UESta:  DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
               UEMsk:  DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
               UESvrt: DLP+ SDES- TLP- FCP+ CmpltTO- CmpltAbrt- UnxCmplt- RxOF+ MalfTLP+ ECRC- UnsupReq- ACSViol-
               CESta:  RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr-
               CEMsk:  RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr-
               AERCap: First Error Pointer: 00, GenCap+ CGenEn- ChkCap+ ChkEn-
       Kernel driver in use: pcieport

 

Добавил исходный код драйвера, dmesg загрузки/выгрузки драйвера, полный вывод lspci -vvv. Ремаппинг для BAR0 происходит в probe, чтение из BAR0 в sol_write(). Карта X520 имеет два номера функции, драйвер ремапит и читает bar в a000:01:00.1

powerPC.txt

lspci.txt

sol_driver.txt

Изменено пользователем Fenolftalein

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


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

Я не понял, это PowerPC выступает в роли PCI-E EP? Или суть в том, что есть некое устройство (на базе чего?), которое подключаем к x86 хосту и всё нормуль, а когда к PowerPC хосту то BAR считывает 0xFFFFFFFF?

А что должно возвращать чтение BAR по-хорошему?

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


Ссылка на сообщение
Поделиться на другие сайты
Я не понял, это PowerPC выступает в роли PCI-E EP? Или суть в том, что есть некое устройство (на базе чего?), которое подключаем к x86 хосту и всё нормуль, а когда к PowerPC хосту то BAR считывает 0xFFFFFFFF?

А что должно возвращать чтение BAR по-хорошему?

PowerPC выступает в роли PCI-E RC, на кастомной плате разведен слот для PCI, куда вставлена карта X520.

По хорошему (на x86 с установленной X520) драйвер читает значения не равные 0xffffffff. Например, первые регистры BAR0 X520 на x86

[ 1743.634529] bar 0x0000       : 0x00000000
[ 1743.634531] bar 0x0004       : 0x00000000
[ 1743.634532] bar 0x0008       : 0x00080000
[ 1743.634533] bar 0x000c       : 0xdeadbeef
[ 1743.634534] bar 0x0010       : 0xdeadbeef
[ 1743.634536] bar 0x0014       : 0xdeadbeef
[ 1743.634537] bar 0x0018       : 0x00010000
[ 1743.634538] bar 0x001c       : 0xdeadbeef

 

 

То что драйвер не работает именно на плате PowerPC указывает, что проблема не в нем. Поскольку конфиг хедер X520 читается без проблем, я исключаю аппаратные косяки в плате. Значит проблема или в linux/dtb, или в u-boot. При загрузке в логе есть сообщения вида (a000:00:00.0 - RC)

[ 4608.157545] pci a000:00:00.0: PCI bridge to [bus 01-ff]
[ 4608.162894] pci a000:00:00.0: BAR 0: assigned [mem 0xc0000000-0xc00fffff]
[ 4608.169711] ====================__find_resource: 650===============
[ 4608.176082] pci a000:00:00.0: BAR 8: no space for [mem size 0x20000000]
[ 4608.182700] pci a000:00:00.0: BAR 8: failed to assign [mem size 0x20000000]
[ 4608.189674] pci a000:00:00.0: BAR 9: assigned [mem 0xc0100000-0xc02fffff 64bit pref]
[ 4608.197414] ====================__find_resource: 650===============
[ 4608.203764] pci a000:00:00.0: BAR 7: no space for [io  size 0x10000]
[ 4608.210127] pci a000:00:00.0: BAR 7: failed to assign [io  size 0x10000]

Что может быть причиной таких сообщений? Может ли это влиять на чтение BAR ов устройств, подключенных к RC?

 

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


Ссылка на сообщение
Поделиться на другие сайты
[ 4608.157545] pci a000:00:00.0: PCI bridge to [bus 01-ff]
[ 4608.162894] pci a000:00:00.0: BAR 0: assigned [mem 0xc0000000-0xc00fffff]
[ 4608.169711] ====================__find_resource: 650===============
[ 4608.176082] pci a000:00:00.0: BAR 8: no space for [mem size 0x20000000]
[ 4608.182700] pci a000:00:00.0: BAR 8: failed to assign [mem size 0x20000000]
[ 4608.189674] pci a000:00:00.0: BAR 9: assigned [mem 0xc0100000-0xc02fffff 64bit pref]
[ 4608.197414] ====================__find_resource: 650===============
[ 4608.203764] pci a000:00:00.0: BAR 7: no space for [io  size 0x10000]
[ 4608.210127] pci a000:00:00.0: BAR 7: failed to assign [io  size 0x10000]

Что может быть причиной таких сообщений? Может ли это влиять на чтение BAR ов устройств, подключенных к RC?

Могу ошибаться, но чето IO какие-то большие оно хочет откушать. Эта область совсем не резиновая.

А может другое устройство попробовать? Сомневаюсь что Intel заботит то, как работает их балалайка на не-x86.

Взять любое дешевое не-Intel устройство с PCI-E.

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


Ссылка на сообщение
Поделиться на другие сайты
Могу ошибаться, но чето IO какие-то большие оно хочет откушать. Эта область совсем не резиновая.

А может другое устройство попробовать? Сомневаюсь что Intel заботит то, как работает их балалайка на не-x86.

pci a000:00:00.0 это не X520, а PCI bridge.

# lspci -tv
-+-[a000:00]---00.0-[01]--+-00.0  Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection
|                        \-00.1  Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection
\-[0000:00]-

 

Взять любое дешевое не-Intel устройство с PCI-E.

Подключал другое устройство, PCIe плата от Xlinx. Та же история, BAR читается на x86 но не читается на PowerPC

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


Ссылка на сообщение
Поделиться на другие сайты
Подключал другое устройство, PCIe плата от Xlinx. Та же история, BAR читается на x86 но не читается на PowerPC

Есть возможность сделать расширенную отладку этой платы? Добавить свои какие-то проверки, вывести принятые конфигурационные пакеты?

У меня подозрения, что BIOS на x86 делает что-то такое (конфигурирует), что не делается на PowerPC. Возможно ядро Linux можно попросить это делать каким-то образом.

 

(я свою карточку на ARM пробовал, BARы видит и всё конфигурит, хотя там простой u-boot, который ничего с PCI не делает)

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


Ссылка на сообщение
Поделиться на другие сайты
Есть возможность сделать расширенную отладку этой платы? Добавить свои какие-то проверки, вывести принятые конфигурационные пакеты?

Смотрели со стороны платы на Xlinx, при чтении BAR на Xlinx тишина.

У меня подозрения, что BIOS на x86 делает что-то такое (конфигурирует), что не делается на PowerPC. Возможно ядро Linux можно попросить это делать каким-то образом.

 

(я свою карточку на ARM пробовал, BARы видит и всё конфигурит, хотя там простой u-boot, который ничего с PCI не делает)

 

Такая мысль тоже была. u-boot видит PCI bridge и X520. Я не могу проверить, может ли u-boot читать BAR.

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


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

Причина оказалась не в драйвере. В dtb были неверно заданы ranges для pcie. После исправления все заработало.

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти