IRQ's unmasking problem

Internal structure and you change requests/suggestions
  • Контроллер USB выдаёт прерывание. Это марзм от МеОС. Ядро размаскирует все прерывания, хотя не умеет их обрабатывать. Скоро проблема решится, потому что вся обработка прерываний будет полностью переработана.
  • to Serge
    Я тут недавно узнал что на машинах P4 и выше добавился ещё IRQ контроллер и теперь IRQ не 16 а, больше. Раньше внимания просто не обращал, что звуковуха ALC850 висит на IRQ22.
  • Пока Колибри дружет толко с PIC проблему не решить, думаю в скором времени птичька подружится с APIC тогда вопрос решится )
  • Причем тут APIC ? Конечно его поддержка нужна.
    Но проблема в том что IRQ это ресурс который нужно настраивать. Если для ISA устройств нет проблем. То для PCI устройств проблема в том что на одном сидит несколько устройств. Нужно настроить IRQ routing проще всего через PCI BIOS (или BIOS32). Колибри его держит. Для интузиастов есть ACPI и прямо в порты(железо зависимо) Неизвестные устройства сожаем на одно irq и его маскируем.

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

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

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

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

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

    P.S. про то что и кому BIOS должен - бабка надвое сказала ))
  • 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. Там описанны какие проблемы встретила майкрософт и что как она использует.Незнаю почему, но в интернете не находиться!
  • Interrupt Line Register это это справочное поле оно ни на что не влияет. У Quantum-а на ac97 ich0 там стоит 0 что не мешает контроллеру генерировать прерывания.
  • Тогда я незнаю как такую проблему решать. Может у вас есть предложения?
  • Ставить бит 10 в PCICMD ?
  • Этот бит появился в PCI 3.0 intel ввела его чуть раньше. Так что это не выход.
  • А как вариант с функцией PCI BIOS 0xb10f (Set PCI Hardware Interrupt)? Код контакта можно узнать функцией 0xb10e (Get PCI Interrupt Routing Options). Конечно можно переназначать irq только из диапазона 0-15, да и то не со 100% успехом, но всётки выход.

    P.S.
    Вопрос в том что будет если неизвестное устройство выставит прерывание? Ответ система зависнит.
    Почему? Почему его нельзя просто игнорировать?
  • Шина 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
  • Who is online

    Users browsing this forum: No registered users and 7 guests