APIC

Internal structure and you change requests/suggestions
  • Лучше завести глобальную переменную irq_mode: IRQ_PIC IRQ_APIC и высталяеть её при загрузке ядра. Плохо нет файлов конфигурации.
  • Така переменная уже есть, почти
    ACPI
    но ка я понимаю если в пик моде все просто, то в апик вектор может менятся и его всетки надо определять
  • Ghost

    Да, вектора меняются для всех PCI устройств. И простого и надёжного способа определения не видно. Через ACPI пока нашлась таблица только для PCI 0 т.е. для встроенных устройств южного моста. Для внешних устройств видимо надо определять с учётом ротации как писал Pavia
  • Для PIC тоже определять надо. Можно еще через PCI BIOS или PCI IRQ Routing Table.
    Windows вначале пробает ACPI потом PCI IRQ Routing Table.
  • Serge когда смотрел код линуха (вроде 2.0.* или даже младше), там есть функция найти устройство с заданным Vend.ID/Dev.ID на который система возвращает структуру-элемент pci, в это структуре есть поле irq, как я понимаю оно заполняется например с помощью ACPI, если это поле 0, то драйвер определяет irq своего устройства методом probe_irq_on/probe_irq_off, если не нуль то просто использует это значение.

    P.S. кстати про код из linux, рекоммендую обратить внимание на OpenSolaris, там тоже много интересных решений, и при том что в ней поддерживается меньше платформ - проще читать код и меньше универсального мусора.
  • Насколько я помню там если в структуре 0, то вызывается функция что-то типмо получить IRQ.
  • Да, только это процедура драйвера, ибо только он знает как высечь из железки прерывание )
  • Pavia

    Для PIC bios прописывает вектора в pci config. Пока мне попадалось только одно исключение, так что можно обойтись.

    Ghost

    Проверять вектора "методом тыка" как то сомнительно. Это надо гарантировано остановить все устройства и ядро. А если драйвер загружается когда система уже работает это практически невозможно.
  • На самом деле во время работы системы тоже не проблема, есть у нас вызов irq_serv.irq_* в нем просто фиксируем факт прерывания, и отдаем текущему обработчику, (в линукс такие счетчики крутятся постоянно, в рамках мониторинга ядра), проводим N таких испытаний, в итоге по разности множеств прерываний (в общем случае за промежуток времени может произойти несколько irq) можем найти наше - заветное ). Главное уметь просить железяку прерывание произвести, но сколько помню, все устройства это умеют.

    Вроде как остается загвоздка в правильной настройне IO-APIC (edge/triged, hight/low level etc)

    P.S. пиво пью, поэтому на очепятки не обращайте внимания.
  • Наверное разработчики железа и Биос ведут войну с разработчиками ОС.
    Простое действие превращается в шаманство.
    Я попробую доделать код с ACPI но:
    драйвер сильно шустрый. Чтобы получит таблицу с прерываниями надо инициализировать подсистемы acpica. При этом драйвер начинает активно читать и писать память, порты, pci cfg и ещё ставит обработчик SCI на irq 9.
  • IO-APIC настраивать благодать.
    0 провод от каскада PIC маскируем.
    Остальные 1-15 настраиваем как для ISA. Запуск фронтом.
    последнии 16-23 настраиваем как PCI. Запуск уровнем поляризация непомню какая вроде низкий уровень поляризации.
    Способ доставки надо подсмотреть у линукса или виндовса. Скорее всего фиксированный.
    Только указать адресс процессора который будет обробатывать прерывание.
    Регистры описаны http://wiki.osdev.ru/index.php/I/O_APIC
  • Ghost

    Если прерывания расшарены будут сложности.
  • Pavia
    Ну дык это уже и сейчас есть, смотри/пробуй мой патчь download/file.php?id=563
    Остался вопрос как драйверу определить irq совего устройства

    Serge
    пусть пишет, жалко чтоли )) лиш бы работал.
    Не должно быть сложностей, так как мы повторяем процедуру несколько раз (например 5), и во время её мы принудительно просим железку извергнуть прерыване, думаю проблем с расшаренными не должно быть (так как расшарены только прерывания а не управляющие регистры).
  • Pavia, Serge раз уж все в сети, может в ирку?
  • Who is online

    Users browsing this forum: No registered users and 9 guests