APIC

Internal structure and you change requests/suggestions
  • Проверил у себя - работает но есть проблемы.
    1) Индикатор показывает 100% загрузку, а CPU 0-1% загрузку OS/IDLE
    2) При переходе на IOAPIC теряются номера irq из pci config. Аудиодрайвер перестаёт работать.

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

    Разве PIC и IOAPIC могут работать вместе ?
  • "Теперь не демаскируются все IRQ"

    это решает проблему из viewtopic.php?f=1&t=1112 ?
    И мы уже давно не пешки,
    Мы пули, мы орлы, и решки!
    Война ютит бинарный код,
    Умри, или иди вперед!
  • Исправил калибровку таймера LAPIC, теперь проблемы со 100% загрузкой нет. Было связано с сильно маленьким квантом времени, сейчас настраивается как и положено 0,01 sec
    Serge подробнее, что значит "теряются номера irq из pci config"? В некоторых звуковых драйверах есть работа с PIC на прямую, если перенастраивается irq, но в условиях как они лежат на svn этого нет.

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

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

    Gluk твою проблему с irq 0x0e думаю да, тебе и карты в руки проверять )
    Attachments
    patch2.zip (9.57 KiB)
    Downloaded 509 times
  • щас попробую - отпишусь..

    попробовал

    вку.. работает!
    все круто, супер))
    теперь не придется держать
    два репозитория - для ноута и домашнего компа!..
    И мы уже давно не пешки,
    Мы пули, мы орлы, и решки!
    Война ютит бинарный код,
    Умри, или иди вперед!
  • Биос программирует чипсет и линии PIC и записывает их номера в pci config устройств. В режиме APIC прерывания от pci устройств намертво припаяны к линиям APIC ( точно до ICH5 включительно). На моём чипсете Биос назначает АС97 IRQ5, а в режиме APIC это #PIRQB = IRQ17.
  • Serge
    В MultiProcessor Specification есть глава 5. Default Configurations, с веселыми картинками ), судя по которым PIC каскадно подключен к APIC и через ключь к процессору, и его можно использовать паралельно с APIC.

    P.S. тепер понял про проблему с PCI, надо что то решать. Как первый варинт (и прозьба за одно проверить), регистрировать драйвер на IRQ17, за одно проверим работают ли IRQ > 15.
  • 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
    
  • О! А доки на ICH5 я не читал, буду читать....

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

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

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

    Идея завести irq0-15 через PIC связана с поддержкой BIOS дисков, BIOS в части вызова функций в RM про APIC не знает, он работает в рамках PIC.
  • Прочитал 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]
  • как из таблицы видно что "PIT назначен на irq2, контроллер ACPI на irq9"?
    то что PIT подключен к INTIN2 это дефолтная конфигурация, тут все понятно (кстати это не аксиома, на некоторых машинах и в qemu не так, код есть apic.inc -> unmask_timer).
    Что делать с прерыванием ACPI?

    P.S. в приложении work copy целиком
    Всех с наступающим!
    Attachments
    workcopy.zip (571.17 KiB)
    Downloaded 549 times
  • 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 стоят по фронту. Замапить и замаскировать. Это не расшареное прерывание.
  • Скомпилировал acpica драйвер. Уже загружается и проходит инициализацию, ставит обработчик на irq9. Остаётся сделать нормальный frontend и будет полноценная поддержка acpi.
  • Who is online

    Users browsing this forum: No registered users and 5 guests