Page 1 of 12

APIC

Posted: Sun Jan 11, 2009 9:06 am
by Ghost
Работаю над поддержкой APIC. В приложении патчь.
Патчь дает поддержку 24 IRQ. Теперь не демаскируются все IRQ, только те что используются, плюс некоторая чистка кода.
Осталось сделать:
1) калибровку таймера LAPIC (FIX ME в core/apic.inc)
2) исправить код shutdown.inc
3) перевод части IRQ на PIC, для поддержки устройств работающих через BIOS (v86)

Патчь не очень стабилен из за не правильной калибровки таймера, и рекоммендуется выключить поддержку BIOS дисков.
Продолжу работу не раньше сегодняшнего вечера. Пока жду комментариев, предложений.

P.S. diamond: спасибо за вчерашнюю помощь.

Re: APIC

Posted: Sun Jan 11, 2009 7:48 pm
by Serge
Проверил у себя - работает но есть проблемы.
1) Индикатор показывает 100% загрузку, а CPU 0-1% загрузку OS/IDLE
2) При переходе на IOAPIC теряются номера irq из pci config. Аудиодрайвер перестаёт работать.

>перевод части IRQ на PIC, для поддержки устройств работающих через BIOS (v86)

Разве PIC и IOAPIC могут работать вместе ?

Re: APIC

Posted: Sun Jan 11, 2009 9:13 pm
by Gluk
"Теперь не демаскируются все IRQ"

это решает проблему из viewtopic.php?f=1&t=1112 ?

Re: APIC

Posted: Sun Jan 11, 2009 9:14 pm
by Ghost
Исправил калибровку таймера LAPIC, теперь проблемы со 100% загрузкой нет. Было связано с сильно маленьким квантом времени, сейчас настраивается как и положено 0,01 sec
Serge подробнее, что значит "теряются номера irq из pci config"? В некоторых звуковых драйверах есть работа с PIC на прямую, если перенастраивается irq, но в условиях как они лежат на svn этого нет.

> Разве PIC и IOAPIC могут работать вместе ?
Сейчас это проверяю ) по хорошему это разные микросхемы (как было изначально) паралельно подключенные к INT и INTA, и никто не мешает путем маскирования на одном, и демоскирования на другом выбирать от кого хотим получать IRQ.

Так как не модифицировал shutdown.inc то не работает перезагрузка ядра, выключение и перезагрузка работают.
У кого есть желание проверьте работаспособность, может ещё какие то баги найдутся.

Gluk твою проблему с irq 0x0e думаю да, тебе и карты в руки проверять )

Re: APIC

Posted: Sun Jan 11, 2009 9:22 pm
by Gluk
щас попробую - отпишусь..

попробовал

вку.. работает!
все круто, супер))
теперь не придется держать
два репозитория - для ноута и домашнего компа!..

Re: APIC

Posted: Sun Jan 11, 2009 10:56 pm
by Serge
Биос программирует чипсет и линии PIC и записывает их номера в pci config устройств. В режиме APIC прерывания от pci устройств намертво припаяны к линиям APIC ( точно до ICH5 включительно). На моём чипсете Биос назначает АС97 IRQ5, а в режиме APIC это #PIRQB = IRQ17.

Re: APIC

Posted: Sun Jan 11, 2009 11:14 pm
by Ghost
Serge
В MultiProcessor Specification есть глава 5. Default Configurations, с веселыми картинками ), судя по которым PIC каскадно подключен к APIC и через ключь к процессору, и его можно использовать паралельно с APIC.

P.S. тепер понял про проблему с PCI, надо что то решать. Как первый варинт (и прозьба за одно проверить), регистрировать драйвер на IRQ17, за одно проверим работают ли IRQ > 15.

Re: APIC

Posted: Mon Jan 12, 2009 6:21 pm
by Serge
Ghost

Драйвер заработал через irq 17 но надо программировать irq 16-23 какак level-triggered active-low
2. When programming the polarity of internal interrupt sources on the APIC, interrupts 0 through 15 receive
active-high internal interrupt sources, while interrupts 16 through 23 receive active-low internal interrupt
sources.
4. PCI Message interrupts are not prevented by hardware in these cases. However, the system must not
program these interrupts as edge-triggered (as required for PCI message interrupts) because the internal
and external PIRQs on these inputs must be programmed in level-triggered modes.

Code: Select all

   ; Reroute IOAPIC & mask all interrupts
    xor ecx, ecx
    mov eax, IOAPIC_REDTBL
@@:
    mov ebx, eax
    call    IOAPIC_read
    mov ah, 0x09           ; Delivery Mode: Lowest Priority, Destination Mode: Logical
    mov al, cl
    add al, 0x20           ; vector
    or  eax, 0x10000       ; Mask Interrupt
    cmp ecx, 16
    jb  .set
    or eax, 0xa000         ;<<< level-triggered active-low
.set:
    xchg    eax, ebx
    call    IOAPIC_write

Re: APIC

Posted: Mon Jan 12, 2009 7:24 pm
by Ghost
О! А доки на ICH5 я не читал, буду читать....

Есть идея irq0-15 завести через PIC (IOAPIC 0 Ext.), остальные через APIC. И вектора развести, от PIC отсавить 0x20+, а от APIC например 0x50+

Еще вопрос, у устройства можно узнать что оно к #PIRQB подключено?

Re: APIC

Posted: Tue Jan 13, 2009 12:23 pm
by Serge
Ghost

Похоже что самый надёжный способ через ACPI. Я попробую сделать дамп таблиц. Там есть MADT с настройками векторов для IOAPIC

Re: APIC

Posted: Tue Jan 13, 2009 12:54 pm
by Ghost
Serge это будет прекрассно, не хотел сам братся за ACPI, в лучшем случае подумывал о MPTable, но она у UP машин есть редко.

Идея завести irq0-15 через PIC связана с поддержкой BIOS дисков, BIOS в части вызова функций в RM про APIC не знает, он работает в рамках PIC.

Re: APIC

Posted: Tue Jan 13, 2009 4:46 pm
by Serge
Прочитал MADT. Всё как в учебнике PIT назначен на irq2, контроллер ACPI на irq9
Local APIC at fee00000

Local APIC [Id: 0x0, CPU Id: 0x0, enabled]
Local APIC [Id: 0x1, CPU Id: 0x1, enabled]
I/O APIC [Id: 0x2, IRQ base: 0, Addr: 0xfec00000]

Interrupt Override [ISA, Bus IRQ: 0, Glob IRQ: 2, Pol: conform, Trigger: conform]
Interrupt Override [ISA, Bus IRQ: 9, Glob IRQ: 9, Pol: active high, Trigger: level]

Local APIC NMI
[CPU id: 0, LINT#: 1 Pol: conform, Trigger: conform]

Local APIC NMI
[CPU id: 1, LINT#: 1 Pol: conform, Trigger: conform]

Re: APIC

Posted: Tue Jan 13, 2009 6:46 pm
by Ghost
как из таблицы видно что "PIT назначен на irq2, контроллер ACPI на irq9"?
то что PIT подключен к INTIN2 это дефолтная конфигурация, тут все понятно (кстати это не аксиома, на некоторых машинах и в qemu не так, код есть apic.inc -> unmask_timer).
Что делать с прерыванием ACPI?

P.S. в приложении work copy целиком
Всех с наступающим!

Re: APIC

Posted: Tue Jan 13, 2009 7:40 pm
by Serge
Interrupt Override [ISA, Bus IRQ: 0, Glob IRQ: 2, Pol: conform, Trigger: conform]
ISA, Bus IRQ: 0 - irq 0 на шине ISA мапится на Glob IRQ 2
Glob IRQ это линии APIC (0 - 23)

>Что делать с прерыванием ACPI?
Он и на PIC идёт как irq9. Но у него нестантдартные настройки: active high и по уровню а все ISA стоят по фронту. Замапить и замаскировать. Это не расшареное прерывание.

Re: APIC

Posted: Wed Jan 14, 2009 2:12 pm
by Serge
Скомпилировал acpica драйвер. Уже загружается и проходит инициализацию, ставит обработчик на irq9. Остаётся сделать нормальный frontend и будет полноценная поддержка acpi.