реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> PCI driver не читает BAR
Fenolftalein
сообщение Apr 6 2018, 06:34
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 20-10-09
Пользователь №: 53 097



Доброго времени суток.
Разбираюсь с написанием 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
CODE
# 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

Сообщение отредактировал Fenolftalein - Apr 6 2018, 11:47
Прикрепленные файлы
Прикрепленный файл  powerPC.txt ( 3.49 килобайт ) Кол-во скачиваний: 9
Прикрепленный файл  lspci.txt ( 11.17 килобайт ) Кол-во скачиваний: 9
Прикрепленный файл  sol_driver.txt ( 6.36 килобайт ) Кол-во скачиваний: 10
 
Go to the top of the page
 
+Quote Post
AVR
сообщение Apr 10 2018, 14:30
Сообщение #2


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



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


--------------------
Go to the top of the page
 
+Quote Post
Fenolftalein
сообщение Apr 10 2018, 16:01
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 20-10-09
Пользователь №: 53 097



Цитата(AVR @ Apr 10 2018, 17:30) *
Я не понял, это 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?
Go to the top of the page
 
+Quote Post
AVR
сообщение Apr 11 2018, 06:16
Сообщение #4


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(Fenolftalein @ Apr 10 2018, 19:01) *
Код
[ 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.


--------------------
Go to the top of the page
 
+Quote Post
Fenolftalein
сообщение Apr 11 2018, 07:05
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 20-10-09
Пользователь №: 53 097



Цитата(AVR @ Apr 11 2018, 09:16) *
Могу ошибаться, но чето 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
Go to the top of the page
 
+Quote Post
AVR
сообщение Apr 11 2018, 08:26
Сообщение #6


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(Fenolftalein @ Apr 11 2018, 10:05) *
Подключал другое устройство, PCIe плата от Xlinx. Та же история, BAR читается на x86 но не читается на PowerPC

Есть возможность сделать расширенную отладку этой платы? Добавить свои какие-то проверки, вывести принятые конфигурационные пакеты?
У меня подозрения, что BIOS на x86 делает что-то такое (конфигурирует), что не делается на PowerPC. Возможно ядро Linux можно попросить это делать каким-то образом.

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


--------------------
Go to the top of the page
 
+Quote Post
Fenolftalein
сообщение Apr 11 2018, 12:35
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 20-10-09
Пользователь №: 53 097



Цитата(AVR @ Apr 11 2018, 11:26) *
Есть возможность сделать расширенную отладку этой платы? Добавить свои какие-то проверки, вывести принятые конфигурационные пакеты?

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

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


Такая мысль тоже была. u-boot видит PCI bridge и X520. Я не могу проверить, может ли u-boot читать BAR.
Go to the top of the page
 
+Quote Post
Fenolftalein
сообщение Apr 12 2018, 15:41
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 20-10-09
Пользователь №: 53 097



Причина оказалась не в драйвере. В dtb были неверно заданы ranges для pcie. После исправления все заработало.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th April 2024 - 01:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01442 секунд с 7
ELECTRONIX ©2004-2016