LINUX.ORG.RU

Не работает PCIe устройство в компе с не Intel-ой архитектурой

 


0

4

Устройство - PCIe NT Bridge. Соответственно какого-то особенного драйвера эта штука не требует, так как для инициализации нужно то прочитать BAR-ы, да записать туда правильные данные. В обычной ПЭВМ инициализация проходит успешно уже похоже на стадии отработки BIOS (загораются контрольные индикаторы). А тут хоть тресни - не работает. Т.е. lspci не выдает ничего подозрительного. Но правильного функционирования не наблюдается. Может кто-нибудь посоветует, куда начать смотреть?

У тебя на не-x86 нет bios который эту инициализацию сделает, так что надо эту инициализацию сделать, либо в стартовом коде борды, либо в драйвере pci устройства.

Dark_SavanT ★★★★★
()

PCIe NT Bridge: NT значит non-transparent? Вообще вся конфигурация PCIe устройств происходит на стадии первых секунд работы BIOS-а. Linux для x86 как правило полагается на то что BIOS всё сделал.

Дай вывод sudo lspci -vvv в части этого устройства. Есть ли там «Memory behind bridge» или «Region *: Memory at»?

И кстати, что у тебя за не-x86 железяка?

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от Dark_SavanT

У тебя на не-x86 нет bios который эту инициализацию сделает

Какую инициализацию может делать bios, которую потом не делает (не может сделать) ядро?

zloy_starper ★★★
() автор топика
Ответ на: комментарий от zloy_starper

Ну хотя бы регионы назначить, пронюхать какие там устройства за бриджем сидят и настроить тот же самый «Memory behind bridge» - это ж бридж всё таки, а по логике PCI устройств, нужно знать что торчит за бриджем.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Linux для x86 как правило полагается на то что BIOS всё сделал.

Считал, что ядро само может настроить PCI-железки. Ошибался?

Дай вывод sudo lspci -vvv в части этого устройства. Есть ли там «Memory behind bridge» или «Region *: Memory at»?

Сейчас не могу (разобрал стенд). Но «Memory behind bridge» или «Region*: Memory at» там есть и назначены.

zloy_starper ★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Ну хотя бы регионы назначить, пронюхать какие там устройства за бриджем сидят и настроить тот же самый «Memory behind bridge» - это ж бридж всё таки, а по логике PCI устройств, нужно знать что торчит за бриджем.

Так зачем для этого bios, если это ядро может сделать? Железка на mips-е.

zloy_starper ★★★
() автор топика
Ответ на: комментарий от zloy_starper

Считал, что ядро само может настроить PCI-железки. Ошибался?

Может (есть даже LinuxBIOS или что-то подобное), но видимо это надо отдельно включать. Ведь не все ОС могут так (особенно ранние), а зачем переназначать коней на переправе?

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от zloy_starper

Какую инициализацию может делать bios, которую потом не делает (не может сделать) ядро?

Ядро всё может, но может о чем-то не знать.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Ядро всё может, но может о чем-то не знать.

О чем может не знать ядро, но при этом может знать bios? Ну хотя бы для примера.

Погано то, что непонятно, как локализовать проблему. Ковырять платформозависимый код смысла мало. Если lspci показывает вполне осмысленную информацию, то root-complex проинициализирован нормально. Остальное делает драйвер ядра, универсальный для всех платформ. Может он что-то «не доделывает» при отсутствии bios до загрузки. Но как это проверить? x86 без bios не бывает.

zloy_starper ★★★
() автор топика
Ответ на: комментарий от zloy_starper

Выше уже сказали про Expansion ROM.
BIOS издавна в процессе своей инициализации сканировал адресное пространство всех карт с некоторым шагом и пытался найти там байтики AA55. Наверняка в PCIe механизм поменялся, но суть та же. Так вот если он найдет эти AA55, то считает, что это Expansion ROM и передает ему управление, чтобы тот сделал инициализацию. Если девайс для x86, то в ROM у него соответственно инструкции для x86, если для SPARC, то FCode, и т.д.

bigbit ★★★★★
()
Ответ на: комментарий от zloy_starper

О чем может не знать ядро, но при этом может знать bios? Ну хотя бы для примера.

Об ошибках в конкретном устройстве. Или о специфической нестандартной инициализации.

Погано то, что непонятно, как локализовать проблему.

Например, попробовать устройство в машинах с разным BIOS. Ну и про expansion ROM уже сказали - в XFree86 был даже бинарный эмулятор x86.

tailgunner ★★★★★
()
Ответ на: комментарий от zloy_starper

В обычной ПЭВМ инициализация проходит успешно уже похоже на стадии отработки BIOS (загораются контрольные индикаторы).

Учитывая это, крайне сомнительно, что там нет Expansion ROM.

bigbit ★★★★★
()
Ответ на: комментарий от zloy_starper

Может другую железяку использовать, вместо прибитой к x86 каки? В чем уникальность данного бриджа? Ты так и не показал нам что выводит sudo lspci -vvv для этой железке на компе и что на MIPS системе, чтобы можно было сравнить и понять что там не выставилось.

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 2)

Давай diff -u для lspci -vvv -s XYZ на мипсине и интеле.

mv ★★★★★
()
Ответ на: комментарий от zloy_starper

Погано то, что непонятно, как локализовать проблему. Ковырять платформозависимый код смысла мало. Если lspci показывает вполне осмысленную информацию, то root-complex проинициализирован нормально. Остальное делает драйвер ядра, универсальный для всех платформ. Может он что-то «не доделывает» при отсутствии bios до загрузки. Но как это проверить? x86 без bios не бывает.

1. Вставляешь железку в x86. После загрузки дампишь регистры железки (Надеюсь, дока на неё есть. Если доки нету, то тоже, конечно, можно, но если это делается не для себя и не ради фана - то лучше нахер такое.).

2. Вставляешь железку в не-x86. После загрузки дампишь регистры железки.

3. Сравниваешь дампы и находишь различия.

4. Ликвидируешь различия

5. PROFIT

Stanson ★★★★★
()

Вот какая разница получается (этих мостов много что ли???): http://paste.org.ru/?wulje1

Вот это меня смущает: Region 1: Memory at <unassigned> (32-bit, non-prefetchable) [size=2] - никогда такого не видал, раз не задействован BAR то и не инициализируется и соответственно его размер не запрашивается.

На MIPS: Expansion ROM at <unassigned> [disabled] [size=2] - как так, ведь на x86 этого не было. Может и в самом деле BIOS видит этот ROM, выполняет его, а потом эта опция получается скрытой.

ParErr+ SERR+ вот это тоже смущает, хорошее дело ERR не назовут, какие-то ошибки передачи. Ну явно 2 байта размер региона быть не может...

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от tailgunner

А вообще, тем занятная, жутко любопытно было бы погонять своё устройство на ARMе или там Эльбрусе, на чем-то не-x86, насколько высока независимость от архитектуры.

I-Love-Microsoft ★★★★★
()
-    Interrupt: pin A routed to IRQ 11
-    Region 0: Memory at df000000 (32-bit, non-prefetchable) [size=256K]
-    Region 2: Memory at d2000000 (64-bit, prefetchable) [size=32M]
-    Region 4: Memory at d0000000 (64-bit, prefetchable) [size=32M]
+    Interrupt: pin A routed to IRQ 0
+    Region 0: Memory at 0e000000 (32-bit, non-prefetchable) [disabled] [size=256K]
+    Region 1: Memory at <unassigned> (32-bit, non-prefetchable) [disabled] [size=2]
+    Region 2: Memory at 08000000 (64-bit, prefetchable) [disabled] [size=32M]
+    Region 4: Memory at 0a000000 (64-bit, prefetchable) [disabled] [size=32M]
+    Expansion ROM at <unassigned> [disabled] [size=2]

Как понимать эти disabled, они похоже все disabled, я бы не рассчитывал на работу устройство когда такое дело.

Interrupt 0? Чето не видал на рабочих устройства такого номера, но может это корректно, я не уверен.

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

Опа, спасибо, смотрел смотрел, а такое пропустил. Это очень похоже на причину. Потом расскажу. Надо бежать.

zloy_starper ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.