Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Чт дек 13, 2018 12:26 am

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 27 сообщений ]  На страницу 1 2 След.
Автор Сообщение
 Заголовок сообщения: IRQ's unmasking problem
СообщениеДобавлено: Ср июл 30, 2008 1:11 am 
Не в сети
Аватара пользователя

Зарегистрирован: Пн апр 16, 2007 6:38 pm
Сообщения: 1222
Есть комп УМПК Rover A700GQ. Колибри на нём не грузится: виснет после вывода "Unmasking all IRQs" (проверялось на дистрибутивах от Leency и diamond). Если в конце загрузки ядра вместо разрешения всех прерываний разрешать все, кроме irq 0E, то система работает нормально. (заменить "mov al,0/out 0xA1,al" на "mov al,0x40/out 0xA1,al/mov al,0")
pcidev в списке устройств видит ровно одно устройство с irq 0E, VenID/DevID = 1106/3104, bus/dev/fn = 00/10/04, rev = 90, class/subclass/interface = 0C/03/20; комментарии VIA TECHNOLOGIES/Serial B.. (дальше надпись выезжает за край экрана). В чём может быть дело и как этот глюк исправить в общем случае?

_________________
И мы уже давно не пешки,
Мы пули, мы орлы, и решки!
Война ютит бинарный код,
Умри, или иди вперед!


Вернуться к началу
 Заголовок сообщения: Re: IRQ's unmasking problem
СообщениеДобавлено: Ср июл 30, 2008 10:23 am 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3952
Контроллер USB выдаёт прерывание. Это марзм от МеОС. Ядро размаскирует все прерывания, хотя не умеет их обрабатывать. Скоро проблема решится, потому что вся обработка прерываний будет полностью переработана.


Вернуться к началу
 Заголовок сообщения: Re: IRQ's unmasking problem
СообщениеДобавлено: Сб авг 02, 2008 5:57 pm 
Не в сети
Just Flooding

Зарегистрирован: Сб янв 06, 2007 2:30 pm
Сообщения: 269
to Serge
Я тут недавно узнал что на машинах P4 и выше добавился ещё IRQ контроллер и теперь IRQ не 16 а, больше. Раньше внимания просто не обращал, что звуковуха ALC850 висит на IRQ22.


Вернуться к началу
 Заголовок сообщения: Re: IRQ's unmasking problem
СообщениеДобавлено: Сб авг 02, 2008 7:18 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Пн мар 20, 2006 10:44 am
Сообщения: 557
Пока Колибри дружет толко с PIC проблему не решить, думаю в скором времени птичька подружится с APIC тогда вопрос решится )


Вернуться к началу
 Заголовок сообщения: Re: IRQ's unmasking problem
СообщениеДобавлено: Ср авг 06, 2008 7:51 pm 
Не в сети

Зарегистрирован: Вс мар 11, 2007 4:05 pm
Сообщения: 64
Причем тут APIC ? Конечно его поддержка нужна.
Но проблема в том что IRQ это ресурс который нужно настраивать. Если для ISA устройств нет проблем. То для PCI устройств проблема в том что на одном сидит несколько устройств. Нужно настроить IRQ routing проще всего через PCI BIOS (или BIOS32). Колибри его держит. Для интузиастов есть ACPI и прямо в порты(железо зависимо) Неизвестные устройства сожаем на одно irq и его маскируем.

Так как на одном прерывании сидит несколько устройств. Чтобы опознать чье устройстов вызволо прерывание. надо передать обработчик каждому драйверу, а он проверит его это устройство или нет.

У ISA проблемы почти такиеже. Хотя это в старых компьютерах шина была ISA. В новых всего чучуть ISA устройст и они отлично отделяются от PCI. Теже COM1 COM2 COM3 COM4 делят 2 прерывания. Это редкость что в компе 4 порта. Но смысл в томже что нужно проверить что это именно тот устройство вызволо прерывание и если нет передать следующему. ISA устройства имеют каждое свое прерывание так что там таких проблем нет. Но на старых компах были свои проблемы. У PCI свои проблемы о которых не упоминул.

ЗЫ. Пишу статью по системе прерываний .

_________________
http://wiki.osdev.ru/


Вернуться к началу
 Заголовок сообщения: Re: IRQ's unmasking problem
СообщениеДобавлено: Чт авг 07, 2008 6:04 am 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Пн мар 20, 2006 10:44 am
Сообщения: 557
Pavia
Дело как раз в том, что на старом PIC`е до IRQ22 не добратся. Кроме того "Неизвестные устройства сожаем на одно irq" не всегда возможно, не все железяки поддерживают изменение irq (например в связи с удещевлением смехотехники). С APIC я разобрался, ничего сложного, поддерживает он минимум 24 irq (программно ограничего 255, аппаратно зависит от производителя...). Чегото "железо зависимо" особо нет, только настройка базового адресса (который впрочем при инициализации контроллера у всех равен 0xfec00000). Скоро добавлю его поддержку в Колибри, осталось только локализовать и по человечески оформить код работы с PIC, который сейчас размазан по коду ядра.
P.S. С понедельника я вернулся на работу из отпуска, работы навалилось много, так что с выходных не возвращался к этому вопросу, но надеюсь в ближайшее время вернусь к вопросу.


Вернуться к началу
 Заголовок сообщения: Re: IRQ's unmasking problem
СообщениеДобавлено: Чт авг 07, 2008 10:53 am 
Не в сети

Зарегистрирован: Вс мар 11, 2007 4:05 pm
Сообщения: 64
Над спарингом прерываний надо будет еще подумать.

Согластно спецификации майкрософт. Биос должен настроить прерывания для всех PCI устройств. Подрузамивается что он настраивает их для PIC. А вслучии чего виндовс сам их каретирует одним из 3 способов.
Насчет IRQ22. PIRQ можно за мепировать на любое прерывание PIC от 0-15. Ручками для каждой материнке элементарно, но железо зависимо. А вот можно через PCI BIOS.
Хотя тут както странно. Сейчас переведу что в спецификации написанно. Прочитал там для каждого устройства на пине нужно изменять прерывание. Хотя на самом деле это ненужно.
А те устройства которые используют другой способ посылки прерываний MSI то их можно настроить на любое прерывание, но это только для APIC, или можно по таймеру их проверять. MSI это расширение так что такие устройства можно настроить на PIRQ. Если не ошибаюсь MSI появилась в спецификации PCI 2.1.

_________________
http://wiki.osdev.ru/


Вернуться к началу
 Заголовок сообщения: Re: IRQ's unmasking problem
СообщениеДобавлено: Чт авг 07, 2008 12:55 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Пн мар 20, 2006 10:44 am
Сообщения: 557
Вроде MSI появился 2.3 но с ним я не разбирался. Курим спецификацию PCI 3.0 и MSI-HOWTO.

Поддержку PCI BIOS в Колибри писал я, и как сейчас помню, проверял всё кроме роутинга(или как он там называется). Если можеш - проверь, будут проблемы - обращайся, помогу с исправлениями/багфиксами.

P.S. про то что и кому BIOS должен - бабка надвое сказала ))


Вернуться к началу
 Заголовок сообщения: Re: IRQ's unmasking problem
СообщениеДобавлено: Чт авг 07, 2008 1:45 pm 
Не в сети

Зарегистрирован: Вс мар 11, 2007 4:05 pm
Сообщения: 64
IRQ Routing нужен только для настройки. И позже не используется. Так что на него можно забить, и сразу переходить к APIC, у него все настроенно причем по свойму. :!:

Но это проблему не решает. Дапустим что на одном прерывании висит два устройство одно известное драйвер есть в ситеме. Второе не известное драйвера нет. Вопрос в том что будет если неизвестное устройство выставит прерывание? Ответ система зависнит. Решение проблемы отключить прерывания (PCI 3.0 это позволяет) или устройство. Замаскировать прерывания нельзя так как мы теряем и устройство на которое есть драйвер. Перенести неможем так как переносятся устройства с одинаковым пином. Тоесть разделить не получиться. Можно через MSI попробовать отделить. Так что пока решения я не вижу. :( Хотя можно молиться на то что пока устройство не запрограмированно оно не должно посылать прерываний.
Ура нашел. :D надо в PCI CFG выставить Interrupt Line Register=255. Должно запретить прерывания правда неуверен что это работает. Еще нашел что виндос использует также значение 0.

PS. Тут нашел редкую доку: PCI Design Issues For Windows 95 and Windows NT Microsoft Corporation. Там описанны какие проблемы встретила майкрософт и что как она использует.Незнаю почему, но в интернете не находиться!

_________________
http://wiki.osdev.ru/


Вернуться к началу
 Заголовок сообщения: Re: IRQ's unmasking problem
СообщениеДобавлено: Чт авг 07, 2008 3:23 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3952
Interrupt Line Register это это справочное поле оно ни на что не влияет. У Quantum-а на ac97 ich0 там стоит 0 что не мешает контроллеру генерировать прерывания.


Вернуться к началу
 Заголовок сообщения: Re: IRQ's unmasking problem
СообщениеДобавлено: Чт авг 07, 2008 3:32 pm 
Не в сети

Зарегистрирован: Вс мар 11, 2007 4:05 pm
Сообщения: 64
Тогда я незнаю как такую проблему решать. Может у вас есть предложения?

_________________
http://wiki.osdev.ru/


Вернуться к началу
 Заголовок сообщения: Re: IRQ's unmasking problem
СообщениеДобавлено: Чт авг 07, 2008 8:32 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3952
Ставить бит 10 в PCICMD ?


Вернуться к началу
 Заголовок сообщения: Re: IRQ's unmasking problem
СообщениеДобавлено: Чт авг 07, 2008 9:17 pm 
Не в сети

Зарегистрирован: Вс мар 11, 2007 4:05 pm
Сообщения: 64
Этот бит появился в PCI 3.0 intel ввела его чуть раньше. Так что это не выход.

_________________
http://wiki.osdev.ru/


Вернуться к началу
 Заголовок сообщения: Re: IRQ's unmasking problem
СообщениеДобавлено: Чт авг 07, 2008 10:20 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Пн мар 20, 2006 10:44 am
Сообщения: 557
А как вариант с функцией PCI BIOS 0xb10f (Set PCI Hardware Interrupt)? Код контакта можно узнать функцией 0xb10e (Get PCI Interrupt Routing Options). Конечно можно переназначать irq только из диапазона 0-15, да и то не со 100% успехом, но всётки выход.

P.S.
Цитата:
Вопрос в том что будет если неизвестное устройство выставит прерывание? Ответ система зависнит.

Почему? Почему его нельзя просто игнорировать?


Вернуться к началу
 Заголовок сообщения: Re: IRQ's unmasking problem
СообщениеДобавлено: Пт авг 08, 2008 12:23 am 
Не в сети

Зарегистрирован: Вс мар 11, 2007 4:05 pm
Сообщения: 64
Шина PCI устроена следующем образом. У нее 4 провода для прерываний И каждая карта имеет 4 вывода PIRQ#A PIRQ#B PIRQ#C PIRQ#D. Линии эти устроены, так что они циклически сдвигаются, при переходи от 1 устройства ко второму. Тем самым первое устройство подсоединю к линии A второе к B третье к С и четверное к D пятое к A и тд. Тем самым на одной линии сидит несколько устройств. Когда устройству нужно прерывание оно выставляет логическую 1. Шина PCI позволяет совместно использовать прерывания.
Так как провода просто соединены. То они тем самым выполняют роль логического И. Контроллер прерываний срабатывает в отличии от шины ISA не по перепаду из 0 в 1. А по фронту – выставленному значению 1 . Если он видит 1 то срабатывает и будет срабатывать пока устройство не снимет прерывание.
Цитата:
Почему? Почему его нельзя просто игнорировать?


Есть там тайм аут или его нету неясно. Но факт в том что колибри зависает. Насколько я понимаю чтобы снять прерывание надо обратиться к устройству. Попрати меня если нетак. Возможно там есть таймаут, но я сомневаюсь в этом.
Простая посылка EOI сбрасывает только триггер в контроллере и не меняет состояние линии поэтому контроллер должен тут же сработать еще раз.

На самом деле если включен режим PIC , то линя PIRQ преобразуется в IRQ. Это преобразование называется IRQ Routing. Номера какой линии PIRQ преобразуется в какой номер IRQ задается. Запрограммировать его можно одним из 3 способов: ACPI, PCI BIOS, через порты ввода вывода.
Последний способ это железо зависимый способ. В мосту PCI -to –ISA выставляются соответствующие биты.
В PCI BIOS 0xb10f (Set PCI Hardware Interrupt) читаем описание нужно пройтись по всем устройства одного пина(линии PIRQ) и перенозначить прерывание. Разнести прерывания с одного пина просто не получиться, железо не позволяет.

Если включен, I/O APIC линии не переназначаются они напрямую идут к контактам 16-19(IRQ16-19) а он уже волн сменить номер вектора.

При появлении прерывании на шине PCI, сигнал преобразовывается c линий PIRQ в линию IRQ на контроллер прерываний. Тот выставляет INTR. Процессор, получив сигнал, генерирует ответ. Для этого на шине PCI выставляется специальный запрос - interrupt acknowledge cycle. Этот запрос распространяется по всей шине PCI в результате чего он доходит до контроллера прерываний. Контроллер прерываний находится на ISA(LPC) шине. Поэтому мост между PCI и ISA генерирует два сигнала INTA и получает ответ от контроллера прерываний, шина PCI передает ответ процессору. Прекращается acknowledge cycle.

Но такой подход не порадовал разработчиков. И был придуман второй способ посылки прерываний.
Message Signaled Interrupt (MSI) сообщение сигнализирующее прерывание. Устройство пишет сообщение по определенном адресу, определенного формата. Это сообщение сигнализирует о прерывании. Это позволяет избежать задержек связанных с interrupt acknowledge cycle.
Сообщение MSI отправляется на адресс пренадлежащий контроллеру прерываний I/O APIC. В следующем формате...


Есть еще PIRQ#E-PIRQ#H это изобретинье интел. И похожи на PIRQ#A-PIRQ#D

_________________
http://wiki.osdev.ru/


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 27 сообщений ]  На страницу 1 2 След.

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB