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 раз уж все в сети, может в ирку?