APIC

Internal structure and you change requests/suggestions
  • Там несколько Мб на С. Запихнуть в ядро можно только в бинарном виде. Скомпилированая длл весит 170 Кб и 70 Кб с упаковкой.
  • Ничего сложного в поиске - с каких пор (с какого железа) появилась _рабочая_ поддержка ACPI? По крайней мере, даже на своём компе (i440BX/Award4.51PG) я всегда гружу линух с 'noapic noacpi', хотя, не знаю, может и зря.
  • >Ничего сложного в поиске

    В смысле ?
  • Nable а винду ты с noacpi видел? В Linux пересобирай ядро, и будет тебе счастье, в дефолтных бинарниках обычно все по максимуму на совместимость делается, порой черезчур...

    Serge я так понял ты http://www.acpica.org/ собрал? Здорово, будем думать что с этим дельше будем делать ))
    Ты приводил пример работы этого кода, нашлось 2 IRQ, неужели это все??? Или например 14-15 считаются дефолтными и есть всегда, etc?
    Пока несколько притормаживаю свои изыскания, на работе аврал...
  • to Ghost
    То есть, если WinXP работает, то и acpi и fastcall есть?
  • Ghost

    Да, в таблице всего два прерывания. Наверное потому что их настройка отличается от остальных ISA. ACPICA работает, но с ней не всё так замечательно как хотелось бы. Чтобы запустить драйвер значительная часть ядра уже должна должна быть сконфигурирована. Остаётся переносить настройку оборудования на поздний этап загрузки системы. С информацией от ACPI тоже есть проблемы. Я делал перечисление устройств и вот что получил

    device 0 \_SB_ HID: , ADR: 0, Status: 0
    device 1 \_SB_.PWRB HID: PNP0C0C, ADR: 0, Status: 0
    device 2 \_SB_.SLPB HID: PNP0C0E, ADR: 0, Status: 0
    device 3 \_SB_.MEM_ HID: PNP0C01, ADR: 0, Status: 0
    device 4 \_SB_.PCI0 HID: PNP0A03, ADR: 0, Status: 0
    device 5 \_SB_.PCI0.CSAB HID: , ADR: 30000, Status: 0
    device 6 \_SB_.PCI0.CSAB.CSAD HID: , ADR: 10000, Status: 0
    device 7 \_SB_.PCI0.HUB0 HID: , ADR: 1e0000, Status: 0
    device 8 \_SB_.PCI0.PX40 HID: , ADR: 1f0000, Status: 0
    device 9 \_SB_.PCI0.PX40.SYSR HID: PNP0C02, ADR: 0, Status: 0
    device 10 \_SB_.PCI0.PX40.PIC_ HID: PNP0000, ADR: 0, Status: 0
    device 11 \_SB_.PCI0.PX40.DMA1 HID: PNP0200, ADR: 0, Status: 0
    device 12 \_SB_.PCI0.PX40.TMR_ HID: PNP0100, ADR: 0, Status: 0
    device 13 \_SB_.PCI0.PX40.RTC_ HID: PNP0B00, ADR: 0, Status: 0
    device 14 \_SB_.PCI0.PX40.SPKR HID: PNP0800, ADR: 0, Status: 0
    device 15 \_SB_.PCI0.PX40.COPR HID: PNP0C04, ADR: 0, Status: 0
    device 16 \_SB_.PCI0.PX40.UAR1 HID: PNP0501, ADR: 0, Status: 0
    device 17 \_SB_.PCI0.USB0 HID: , ADR: 1d0000, Status: 0
    device 18 \_SB_.PCI0.USB1 HID: , ADR: 1d0001, Status: 0
    device 19 \_SB_.PCI0.USB2 HID: , ADR: 1d0002, Status: 0
    device 20 \_SB_.PCI0.USB3 HID: , ADR: 1d0003, Status: 0
    device 21 \_SB_.PCI0.USBE HID: , ADR: 1d0007, Status: 0
    device 22 \_SB_.PCI0.ICHX HID: , ADR: 1f0001, Status: 0
    device 23 \_SB_.PCI0.ICHX.PRIM HID: , ADR: 0, Status: 0
    device 24 \_SB_.PCI0.ICHX.PRIM.MAST HID: , ADR: 0, Status: 0
    device 25 \_SB_.PCI0.ICHX.PRIM.SLAV HID: , ADR: 1, Status: 0
    device 26 \_SB_.PCI0.ICHX.SECN HID: , ADR: 1, Status: 0
    device 27 \_SB_.PCI0.ICHX.SECN.MAST HID: , ADR: 0, Status: 0
    device 28 \_SB_.PCI0.ICHX.SECN.SLAV HID: , ADR: 1, Status: 0
    device 29 \_SB_.PCI0.IDE1 HID: , ADR: 1f0002, Status: 0
    device 30 \_SB_.PCI0.IDE1.PRIM HID: , ADR: 0, Status: 0
    device 31 \_SB_.PCI0.IDE1.PRIM.DRV0 HID: , ADR: 0, Status: 0
    device 32 \_SB_.PCI0.IDE1.PRIM.DRV1 HID: , ADR: 1, Status: 0
    device 33 \_SB_.PCI0.IDE1.SECD HID: , ADR: 1, Status: 0
    device 34 \_SB_.PCI0.IDE1.SECD.DRV0 HID: , ADR: 0, Status: 0
    device 35 \_SB_.PCI0.IDE1.SECD.DRV1 HID: , ADR: 1, Status: 0
    device 36 \_SB_.PCI0.PX43 HID: , ADR: 1f0003, Status: 0
    device 37 \_SB_.PCI0.LNKA HID: PNP0C0F, ADR: 0, Status: 0
    device 38 \_SB_.PCI0.LNKB HID: PNP0C0F, ADR: 0, Status: 0
    device 39 \_SB_.PCI0.LNKC HID: PNP0C0F, ADR: 0, Status: 0
    device 40 \_SB_.PCI0.LNKD HID: PNP0C0F, ADR: 0, Status: 0
    device 41 \_SB_.PCI0.LNKE HID: PNP0C0F, ADR: 0, Status: 0
    device 42 \_SB_.PCI0.LNKF HID: PNP0C0F, ADR: 0, Status: 0
    device 43 \_SB_.PCI0.LNK0 HID: PNP0C0F, ADR: 0, Status: 0
    device 44 \_SB_.PCI0.LNK1 HID: PNP0C0F, ADR: 0, Status: 0
    device 45 \_TZ_.FAN_ HID: PNP0C0B, ADR: 0, Status: 0
    устройства ISA определились правильно а с PCI есть проблемы.
    В списке есть отключённый usb2 (№21) и нет ac97 и видеокарты и вообще видна толко одна pci шина а их три. Может я что-то напутал но простого способа правильно перечислить все устройства пока не видно. С таблицей MP тоже сложности

    MP Configuration Table version 1.4 found at 0x800f0d00
    BUS 0 PCI
    BUS 1 PCI
    BUS 2 PCI
    BUS 3 ISA
    INT BUS 0 PCI IRQ 7d APIC 2 PIN 17 B0:D31:INTB#
    INT BUS 0 PCI IRQ 75 APIC 2 PIN 19 B0:D29:INTB#
    INT BUS 0 PCI IRQ 76 APIC 2 PIN 18 B0:D29:INTC#
    INT BUS 0 PCI IRQ 74 APIC 2 PIN 16 B0:D29:INTA#
    INT BUS 0 PCI IRQ 74 APIC 2 PIN 16 B0:D29:INTA#
    INT BUS 0 PCI IRQ 7d APIC 2 PIN 17
    INT BUS 1 PCI IRQ 0 APIC 2 PIN 16 B1:D0:INTA#
    INT BUS 0 PCI IRQ 7c APIC 2 PIN 18 B0:D31:INTA#
    INT BUS 0 PCI IRQ 7c APIC 2 PIN 16 B0:D31:INTA# ???
    ExtInt BUS 3 ISA IRQ 0 APIC 2 PIN 0
    INT BUS 3 ISA IRQ 1 APIC 2 PIN 1
    INT BUS 3 ISA IRQ 0 APIC 2 PIN 2
    INT BUS 3 ISA IRQ 3 APIC 2 PIN 3
    INT BUS 3 ISA IRQ 4 APIC 2 PIN 4
    INT BUS 3 ISA IRQ 6 APIC 2 PIN 6
    INT BUS 3 ISA IRQ 8 APIC 2 PIN 8
    INT BUS 3 ISA IRQ 9 APIC 2 PIN 9
    INT BUS 3 ISA IRQ c APIC 2 PIN 12
    INT BUS 3 ISA IRQ d APIC 2 PIN 13
    INT BUS 3 ISA IRQ e APIC 2 PIN 14
    INT BUS 3 ISA IRQ f APIC 2 PIN 15

    Напрягает что один pin B0:D31:INTA# заведён сразу на две линии APIC
    По документации это IDE D31:F1:INTA# и в native mode он намерво привязан к irq18. У SATA D31:F2:INTA# и такой "железной" привязки в native mode нет. Интересно что в Win IDE работает как legacy на irq 14 и 15 а SATA в native на irq 18. Откуда берётся irq 16 неясно.
  • Serge
    Может не заморачиватся на автоматическом определении всех IRQ, а оставить за драйвером возможность резервировать IRQ и указывать режим работы (PIC/APIC)?
    Про MPTable, там скорее всего вкралась ошибка, мне кажется шины должны быть разными.
    Для MP систем есть ключь IMCR, который позволяет полностью маскировать PIC от процессора, и использовать его каскадно через IOAPIC PIN 0 (вот только не понятно, в этом случае PIC тоже EOI посылать?)

    Nable Про acpi точно не скажу, вроде можно во время установки отказатся от acpi, но по умолчанию XP работает с ним (кстати работа с кнопкой выключения идет через acpi, и не иначе). Начиная с WinXP все системные вызовы идут через fastcall (SYSENTER/SYSEXIT от Intel), прерывания для этого (вроде нашего int 0x40) не используются.
  • Ghost
    Получил таблицу прерываний через apci

    adress: 0 1fffff pin: 2 index: 16 source: << Альтернативная конфигурация ?
    adress: 0 1fffff pin: 0 index: 18 source:
    adress: 0 1fffff pin: 1 index: 17 source:
    adress: 0 1dffff pin: 0 index: 16 source:
    adress: 0 1dffff pin: 1 index: 19 source:
    adress: 0 1dffff pin: 2 index: 18 source:
    adress: 0 1dffff pin: 3 index: 23 source:
    adress: 0 1ffff pin: 0 index: 16 source: << остальные слоты ???
    adress: 0 1ffff pin: 1 index: 17 source:
    adress: 0 1ffff pin: 2 index: 18 source:
    adress: 0 1ffff pin: 3 index: 19 source:

    Это таблица назначеных пинов pci config 0x3D

    bus 0 device 31 function 1 pin 0 ;IDE native mode only
    bus 0 device 31 function 2 pin 0 ;SATA
    bus 0 device 31 function 3 pin 1 ;SMBus
    bus 0 device 31 function 5 pin 1 ;AC97

    Думаю что в таблице указана альтернативная конфигурация для SATA если IDE будет настроен в native mode. Чтобы все шесть возможных дисков не оказались на одном irq через acpi можно выбрать альтернативную конфигурацию. Интересно что в Windows IDE работает в legacy mode. Возможно по той же причине.
  • Блин написал текст, а он не сохранился.

    PCI жестко привязананы к IOAPIC но имеют альтернотивные способы вызова прерываний.

    1. Через контакт IOAPIC
    2. Через специальный регистр IOAPIC.
    3. Через MSI в верхнем мегабайте интел отвела мегабайт который перенаправляет прерывание на Local APIC

    Помимо прочего встроенные устройства могут иметь альтернативные 4 линии. Которые соответствуют IRQ 20-23 и именуются E F G H .

    PIC можно завести через APIC, но ненужно. К нему подведены все тежи прерывания. Первые 16 прерывани предлогаю считать дефолтовыми и относить их к ISA IRQ.
    IOAPIC хорош тем что в нем можно задать номер вектора для любого IRQ поэтому предлогаю установить вектор таймера такойже как для PIC и мы получим полную совместимость. А PCI отводиться 4 линии которые в APIC вынесены отдельно, а в PIC используют свободные линии.


    ACPI появился в 91-93 годах в пентиуме 1 подвопросом, а во втором уже был.
    Альтернативная конфигурация ?
    Нет. Просто ты путаешь линии на APIC и пины на устройстве.

    К каждому устройству(device, а не function) PCI подведено 4 кантакта. И оно уже распределяет между функциями.

    Но между слотами в которых эти устройства расположены провода перекручиваются . Тоесть они цеклически сдвигаются на 1.
    То есть
    Device 0 pin 1 соответствует линия 1 IRQ 16 на APIC
    Device 0 pin 2 соответствует линия 2 IRQ 17 на APIC
    Device 0 pin 3 соответствует линия 3 IRQ 18 на APIC
    Device 0 pin 4 соответствует линия 4 IRQ 19 на APIC
    Device 1 pin 1 соответствует линия 2 IRQ 17 на APIC
    Device 1 pin 2 соответствует линия 3 IRQ 18 на APIC
    Device 1 pin 3 соответствует линия 4 IRQ 19 на APIC
    Device 1 pin 4 соответствует линия 1 IRQ 16 на APIC
    На самом деле это носит рекомендательный характер насколько помню. Поищи подробную информацию в ACPI там должна быть таблица какая линия как заведен на устройство и к какому Pin
  • Pavia

    >Просто ты путаешь линии на APIC и пины на устройстве.

    Не путаю. Это та самая "таблица какая линия как заведена на устройство и к какому Pin".
    На моём южном мосте ICH5 D31 вообще не использует пин 2 в дефолтной кофигурации. Я не знаю откуда он берётся. Может это глюки БИОС.
    И жёсткой привязки устройство:пин -> линия irq к сожалению нет.
    Interrupt Pin — RO. Hardwired to 01h indicating to “software” that the Intel® ICH5 will drive INTA#. Note that this is only used in native mode. Also note that the routing to the internal interrupt controller doesn’t necessarily relate to the value in this register
  • native mode мы используем прерывания PCI.
    В Legacety 14 и 15 ISA IRQ
    Legacety используется потому что так настроил биос. Это раз. Во-вторых это хорошо у нас на одной линии PCI теперь меньше устройств что лучше. Это два.

    Если PCI CFG регистр 3Сh содержи 0 - значит нет линии. В легасити так и должно быть завтро проверю на своем комп тоже IСH5. У тебя как я понял ты уже вычел еденицу. Тут все верно у тебя устройство в Native, проверь это.

    Таблица ACPI там на все случии заведена. Просто там циклически получаются и/или ее так забили.

    Объесняю как пользоваться
    bus 0 device 31 function 3 pin 1 ;SMBus смотри номер устройства 31=1fh
    Странно в регистре PCI CFG 3Сh должено лежать 2 согласно спецификации ты поправил? Буду думать что ты просто поправил вычел 1.

    У нас есть в таблице три поля соответсвующему этому устройству bus 0 и device 31
    adress: 0 1fffff pin: 2 index: 16 source:
    adress: 0 1fffff pin: 0 index: 18 source:
    adress: 0 1fffff pin: 1 index: 17 source:
    Ищим наш пин pin 1 в таблице ему соответствует последняя строчка IRQ 17

    Это для устройст с bus 0 и device 29
    adress: 0 1dffff pin: 0 index: 16 source:
    adress: 0 1dffff pin: 1 index: 19 source:
    adress: 0 1dffff pin: 2 index: 18 source:
    adress: 0 1dffff pin: 3 index: 23 source:
    Это для устройств с bus 0 и device 1
    adress: 0 1ffff pin: 0 index: 16 source:
    adress: 0 1ffff pin: 1 index: 17 source:
    adress: 0 1ffff pin: 2 index: 18 source:
    adress: 0 1ffff pin: 3 index: 19 source:

    Аналогично должно быть еще на BUS 1 , 2 и тд.

    Сделанно это специально так как в функции железно подведено одно прерывание к одному пину. И скорее всего если устройство содержит одну функции это первый пин. То чтобы разгрузить шины сделали циклический сдвиг.
    В биосе просто забита одна таблица или прям сразу генерируется циклически. Для всех материнок. А те которые не соблюдают уже отдельно если такии имеются.

    И жёсткой привязки устройство:пин -> линия irq к сожалению нет.
    В PCI устройстве есть функции вот они жестко привязаны к пинам устройства.
    Но в зависимости от того в какой слот мы вставим наше устройство к его пинам будут подвидины разные линии. Связка номер линия->номер пин зависит от номер слота. Слот это не что иное как device number.
    Линии они строго подвидины к APIC.
    А вот на разных шинах могут быть как разные линии так и одни и тежи.
    Поэтому мы и должны пользоваться ACPI для определения соответствия IRQ <-> Pin:Number Devive:Number Bus.
  • Pavia

    Я исправил номера пинов чтобы не путаться. Для тех кто не в курсе - в таблицах ACPI и MP пины нумеруются с нуля, в PCI cfg и документации на железо с единицы.

    Проблем с сопоставлением устройств и записей в таблице нет но "лишние" строки немного напрягают. С SATA и IDE всё проще - оба контроллера не могут быть одновременно в native поэтому IDE и сидит на старых линиях irq. Значит альтернативная конфигурация SATA невозможна и откуда берётся устройство с пин 2 неясно.
  • Вопрос на засыпку, то что сейчас обсуждается, мало относится к коду APIC, заливать его на svn?
  • Ghost

    Если APIC будет включён по умолчанию PCI драйверы не смогут работать
  • Who is online

    Users browsing this forum: No registered users and 10 guests