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.