Page 3 of 12
Re: APIC
Posted: Mon Jan 19, 2009 4:09 pm
by Ghost
как вариант могу предложить реализовать простой вариант, по типу linux probe_irq_on/probe_irq_off.
Смысл там такой:
Code: Select all
probe_irq_on();
говорим_жлезке_сделать_irq();
sleep(немного);
irq = probe_irq_off();
probe_irq_off возвращает номер irq произошедшего за время после probe_irq_on.
Можно и более гуманный способ, (тоже как в linux), тоже самое, но мы зарание знаем возможные номера irq, тогда ловим только с них...
Как идея?
Re: APIC
Posted: Mon Jan 19, 2009 4:35 pm
by Serge
Лучше завести глобальную переменную irq_mode: IRQ_PIC IRQ_APIC и высталяеть её при загрузке ядра. Плохо нет файлов конфигурации.
Re: APIC
Posted: Mon Jan 19, 2009 5:00 pm
by Ghost
Така переменная уже есть, почти
ACPI
но ка я понимаю если в пик моде все просто, то в апик вектор может менятся и его всетки надо определять
Re: APIC
Posted: Mon Jan 19, 2009 5:50 pm
by Serge
Ghost
Да, вектора меняются для всех PCI устройств. И простого и надёжного способа определения не видно. Через ACPI пока нашлась таблица только для PCI 0 т.е. для встроенных устройств южного моста. Для внешних устройств видимо надо определять с учётом ротации как писал Pavia
Re: APIC
Posted: Mon Jan 19, 2009 6:58 pm
by Pavia
Для PIC тоже определять надо. Можно еще через PCI BIOS или PCI IRQ Routing Table.
Windows вначале пробает ACPI потом PCI IRQ Routing Table.
Re: APIC
Posted: Mon Jan 19, 2009 7:00 pm
by Ghost
Serge когда смотрел код линуха (вроде 2.0.* или даже младше), там есть функция найти устройство с заданным Vend.ID/Dev.ID на который система возвращает структуру-элемент pci, в это структуре есть поле irq, как я понимаю оно заполняется например с помощью ACPI, если это поле 0, то драйвер определяет irq своего устройства методом probe_irq_on/probe_irq_off, если не нуль то просто использует это значение.
P.S. кстати про код из linux, рекоммендую обратить внимание на
OpenSolaris, там тоже много интересных решений, и при том что в ней поддерживается меньше платформ - проще читать код и меньше универсального мусора.
Re: APIC
Posted: Mon Jan 19, 2009 7:04 pm
by Pavia
Насколько я помню там если в структуре 0, то вызывается функция что-то типмо получить IRQ.
Re: APIC
Posted: Mon Jan 19, 2009 7:08 pm
by Ghost
Да, только это процедура драйвера, ибо только он знает как высечь из железки прерывание )
Re: APIC
Posted: Mon Jan 19, 2009 7:54 pm
by Serge
Pavia
Для PIC bios прописывает вектора в pci config. Пока мне попадалось только одно исключение, так что можно обойтись.
Ghost
Проверять вектора "методом тыка" как то сомнительно. Это надо гарантировано остановить все устройства и ядро. А если драйвер загружается когда система уже работает это практически невозможно.
Re: APIC
Posted: Mon Jan 19, 2009 8:11 pm
by Ghost
На самом деле во время работы системы тоже не проблема, есть у нас вызов irq_serv.irq_* в нем просто фиксируем факт прерывания, и отдаем текущему обработчику, (в линукс такие счетчики крутятся постоянно, в рамках мониторинга ядра), проводим N таких испытаний, в итоге по разности множеств прерываний (в общем случае за промежуток времени может произойти несколько irq) можем найти наше - заветное ). Главное уметь просить железяку прерывание произвести, но сколько помню, все устройства это умеют.
Вроде как остается загвоздка в правильной настройне IO-APIC (edge/triged, hight/low level etc)
P.S. пиво пью, поэтому на очепятки не обращайте внимания.
Re: APIC
Posted: Mon Jan 19, 2009 8:28 pm
by Serge
Наверное разработчики железа и Биос ведут войну с разработчиками ОС.
Простое действие превращается в шаманство.
Я попробую доделать код с ACPI но:
драйвер сильно шустрый. Чтобы получит таблицу с прерываниями надо инициализировать подсистемы acpica. При этом драйвер начинает активно читать и писать память, порты, pci cfg и ещё ставит обработчик SCI на irq 9.
Re: APIC
Posted: Mon Jan 19, 2009 8:29 pm
by Pavia
IO-APIC настраивать благодать.
0 провод от каскада PIC маскируем.
Остальные 1-15 настраиваем как для ISA. Запуск фронтом.
последнии 16-23 настраиваем как PCI. Запуск уровнем поляризация непомню какая вроде низкий уровень поляризации.
Способ доставки надо подсмотреть у линукса или виндовса. Скорее всего фиксированный.
Только указать адресс процессора который будет обробатывать прерывание.
Регистры описаны
http://wiki.osdev.ru/index.php/I/O_APIC
Re: APIC
Posted: Mon Jan 19, 2009 8:39 pm
by Serge
Ghost
Если прерывания расшарены будут сложности.
Re: APIC
Posted: Mon Jan 19, 2009 8:41 pm
by Ghost
Pavia
Ну дык это уже и сейчас есть, смотри/пробуй мой патчь
download/file.php?id=563
Остался вопрос как драйверу определить irq совего устройства
Serge
пусть пишет, жалко чтоли )) лиш бы работал.
Не должно быть сложностей, так как мы повторяем процедуру несколько раз (например 5), и во время её мы принудительно просим железку извергнуть прерыване, думаю проблем с расшаренными не должно быть (так как расшарены только прерывания а не управляющие регистры).
Re: APIC
Posted: Mon Jan 19, 2009 8:49 pm
by Ghost
Pavia, Serge раз уж все в сети, может в ирку?