LINUX.ORG.RU

[kernel dev] прерывание для pci


0

1

вопрос про понимание работы pci устройств
есть некая pci плата, если опросить ее под dos, то «живет» она на irq 9, при загрузке linux и lspci также выдает irq 9 (аналогично и pci_get_device)
при инициализации модуля пишу pci_register_driver, затем в probe вызываю pci_enable_device - при этом в логе появляется запись «0000:00:11.0: PCI INT A -> Link[LNKB] -> GSI 11 (level, low) -> IRQ 11» т.е. плата «перешла» на 11 прерывание - почему так происходит?
если выгрузить этот драйвер (который еще толком ничего и не делает), то lspci выдает, что плата продолжает висеть на 11 irq (в логе появляется строка «0000:00:11.0: PCI INT A disabled»)


opensuse 11.2, 2.6.31.5-0.1-default

★★★★★

Ответ на: комментарий от anon_666

чтото мне это не стало очевидно при чтении ldd3 - можно конкретнее страницу ?
очень интересует почему pci_register_driver «кидает» плату на 11 irq, которое и так занято:
" 11: 8007 XT-PIC-XT ehci_hcd:usb1, ohci_hcd:usb2, CS5535 Audio, eth0"
чтото я не так делаю, а что непойму

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

Таблица дескрипторов прерываний инициализируется и используется процедурами BIOS, пока компьютер работает в реальном режиме. Однако когда Linux приступает к работе , таблица дескрипторов прерываний переносится в другую область оперативной памяти и инициализируется второй раз, потому что Linux не пользуется ни одной из процедур BIOS.

Бовет Д., Чезати М. Ядро Linux.

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

ядро инициализирует для защищенного режима прервания, но с теми же номерами, да и не в этом дело т.к. до вызова pci_enable_device плата сидела на свободном irq 9 (значит ядро считало параметры с платы и назначило ей свободное irq), зачем же потом её кидать на 11е ???
ведь я даже и обработчик irq еще не устанавливал, а теперь плата на 11м и от туда до перезагрузке уходить не хочет
я потом выключил lpt в bios, тогда плата при загрузке стала сидеть на 7, и опятже при pci_enable_device ядро перекинуло ее на 11 - ведь и 9е и 7е irq свободны

несовсем понял фразу «у вас не apic, линий irq мало..» - поясни, да и линии свободные же есть: 7,9

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

Хм, может не стоит использовать опции если Вы не понимаете что происходит и для чего эти опции нужны?

При старте BIOS раздает линии IRQ по своему усмотрению. Linux вправе сделать все по своему.

При этом используется масса информации, которая от Вас скрыта. Например таблицы роутинга IRQ-линий и список из BIOS зарезервированных прерываний за legacy-устройствами (например ISA).

Тут масса нюансов. Например, отсутствие ISA-разъема не означает что у вас совсем нет ISA-шины, она может быть в «виртуальном» виде на LPC-чипе. Линии IRQ могут быть разведены по простому (4 на всю PCI-шину со сдвигом «по кругу»), а могут гораздо более хитрыми способами.

В конце концов APIC совместно с кодом ядра могут дать вам некие номера IRQ, которые ничего не имеют общего с проводами. При этом выделение IRQ и разрешение сигналов происходит именно из кода pci_enable_device(). А та самая строчка в логе показывает «маршрут».

То что плате не выделяются «свободные» IRQ - ничего не значит. Например, линия INTA (провод), от того слота где стоит плата, не может быть «подключена» к любому IRQ, а только к некоторому кол-ву (нередко одному) триггеров в APIC.

Попробуйте вернуть APIC, отключить в BIOS все лишнее (включая COM, LPT, т.е. все что не нужно). Попробуйте переставить плату в другой слот.

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

да, я не очень четко понял что значит pci=noacpi, но так работает и я могу продолжать писать драйвер )
потом пришлось еще irqpoll добавить, что также не радует (там ядро ругалось на необслуженное прерывание №15, хотя я его и не трогал)
планировал разобраться позже что значат эти опции, но подробного объяснения пока не нашел (в исходниках ядра довольно скудно)
сама плата старая (делалась для dos), кто ее делел уже не найти, но надо обеспечить работу

да и пишу сейчас немного не под то железо (недоехало), конкретно под amd geode на «devel-плате» от kontron (может она еще вносит беспорядок), будет intel atom (на плате от advantech)

за разъяснения спасибо

зы можно на ты, всеже както так лучше )

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

Судя по:

pci=noacpi, но так работает и я могу продолжать писать драйвер )

потом пришлось еще irqpoll добавить

ты что-то делаешь сильно не так. Вообще-то назначение IRQ в epci_enable_device - это нормально, ты просто должен вешать свой обработчик IRQ уже _после_ этого.

tailgunner ★★★★★
()

И номер прерывания надо брать не из конфигурационого пространства платы, а из pdev->irq. Они иногда не совпадают. Сам наступал на эти грабли.

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

а то, что lspci говорит после перезагрузке, что плата «висит» на 9 irq - это что значит ? (мой драйвер при этом не загружен)
это информация от bios ?
ядро может назначить после этого плате другое прерывание ?
что же значит выдаваемая строка «0000:00:11.0: PCI INT A -> Link[LNKB] -> GSI 11 (level, low) -> IRQ 11» ?

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

ок, буду думать

заметил, что при загрузке без каких либо параметров ядро разместило на 11 irq большинство устройств, тогда как при pci=noacpi стали задействованы и 7 и 9 irq, почему так ?
(содержимое /proc/interrupts смогу представить только 28 числа)

где можно почитать подробнее про работу ядра по инициализации pci шины и распределении прерываний ?

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

> при загрузке без каких либо параметров ядро разместило на 11 irq большинство устройств, тогда как при pci=noacpi стали задействованы и 7 и 9 irq, почему так ?

Честно говоря, не знаю. Но я вполне доверяю ядру - если оно так решило, значит, так и надо :)

где можно почитать подробнее про работу ядра по инициализации pci шины и распределении прерываний ?

Вообще-то это два разных вопроса... про инициализацию PCI - в стандарте PCI (и соответствующих файлах ядра), а про распределение прерываний - это скорее описание {IO,}APIC и какой-то стандарт ACPI (но его я лично не читал).

А зачем тебе это - чистое любопытство?

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

в документации ядра про noacpi сказано совсем мало
хочу более полно понять суть происходящего в ядре в отношении обработки(инициализации) pci устройств и моей платы в частности

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