Fenolftalein 0 6 апреля, 2018 Опубликовано 6 апреля, 2018 (изменено) · Жалоба Доброго времени суток. Разбираюсь с написанием 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 Может быть причина в отсутствии interrupt pin для pcibridge в embedded linux? 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 Изменено 6 апреля, 2018 пользователем Fenolftalein Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 10 апреля, 2018 Опубликовано 10 апреля, 2018 · Жалоба Я не понял, это PowerPC выступает в роли PCI-E EP? Или суть в том, что есть некое устройство (на базе чего?), которое подключаем к x86 хосту и всё нормуль, а когда к PowerPC хосту то BAR считывает 0xFFFFFFFF? А что должно возвращать чтение BAR по-хорошему? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Fenolftalein 0 10 апреля, 2018 Опубликовано 10 апреля, 2018 · Жалоба Я не понял, это 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? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 11 апреля, 2018 Опубликовано 11 апреля, 2018 · Жалоба [ 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Fenolftalein 0 11 апреля, 2018 Опубликовано 11 апреля, 2018 · Жалоба Могу ошибаться, но чето 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 11 апреля, 2018 Опубликовано 11 апреля, 2018 · Жалоба Подключал другое устройство, PCIe плата от Xlinx. Та же история, BAR читается на x86 но не читается на PowerPC Есть возможность сделать расширенную отладку этой платы? Добавить свои какие-то проверки, вывести принятые конфигурационные пакеты? У меня подозрения, что BIOS на x86 делает что-то такое (конфигурирует), что не делается на PowerPC. Возможно ядро Linux можно попросить это делать каким-то образом. (я свою карточку на ARM пробовал, BARы видит и всё конфигурит, хотя там простой u-boot, который ничего с PCI не делает) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Fenolftalein 0 11 апреля, 2018 Опубликовано 11 апреля, 2018 · Жалоба Есть возможность сделать расширенную отладку этой платы? Добавить свои какие-то проверки, вывести принятые конфигурационные пакеты? Смотрели со стороны платы на Xlinx, при чтении BAR на Xlinx тишина. У меня подозрения, что BIOS на x86 делает что-то такое (конфигурирует), что не делается на PowerPC. Возможно ядро Linux можно попросить это делать каким-то образом. (я свою карточку на ARM пробовал, BARы видит и всё конфигурит, хотя там простой u-boot, который ничего с PCI не делает) Такая мысль тоже была. u-boot видит PCI bridge и X520. Я не могу проверить, может ли u-boot читать BAR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Fenolftalein 0 12 апреля, 2018 Опубликовано 12 апреля, 2018 · Жалоба Причина оказалась не в драйвере. В dtb были неверно заданы ranges для pcie. После исправления все заработало. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться