Выполняет сканирование шин ACPI и PCI, определяет диапазоны ввода-вывода и другие необходимые ресурсы. В конце работы выводит таблицу обнаруженных устройств PCI и номера IRQ в PIC и APIC режимах. Устройства не использующие irq в список не попадают. Пример таблицы:
Code: Select all
PCI_8086_24d2 bus:0 devfn: e8 pin 1 bios irq: 5 acpi irq: 16
PCI_8086_24d4 bus:0 devfn: e9 pin 2 bios irq: 4 acpi irq: 19
PCI_8086_24d7 bus:0 devfn: ea pin 3 bios irq: 11 acpi irq: 18
PCI_8086_24de bus:0 devfn: eb pin 1 bios irq: 5 acpi irq: 16
PCI_8086_24dd bus:0 devfn: ef pin 4 bios irq: 3 acpi irq: 23
PCI_8086_24d1 bus:0 devfn: fa pin 1 bios irq: 0 acpi irq: 18
PCI_8086_24d3 bus:0 devfn: fb pin 2 bios irq: 7 acpi irq: 17
PCI_8086_24d5 bus:0 devfn: fd pin 2 bios irq: 7 acpi irq: 17
PCI_1002_9495 bus:1 devfn: 0 pin 1 bios irq: 5 acpi irq: 16
PCI_1002_aa38 bus:1 devfn: 1 pin 2 bios irq: 7 acpi irq: 17
PCI_1106_3106 bus:2 devfn: 8 pin 1 bios irq: 10 acpi irq: 21
На первом этапе необходимо включить в ядро патч Ghost-a настраивающий APIC. Примерный порядок работы: ядро проверяет наличие ioapic и возможность работы через io_apic, устанавливает переменную apic_mode в ACPI_IRQ_MODEL_IOAPIC=1, затем загружает диспетчер устройств. Диспетчер выполняет инициализацию ACPICA и определение устройств, описанное выше. В конце инициализации в кофигурационное пространство PCI будет записан номер IRQ в режиме IOAPIC. После этого существующие драйверы смогут работать с устройствами без изменения кода.
На втором этапе необходимо убрать из ядра и перенести в диспетчер устройств
- прямой доступ к шине PCI(bus/pci32.inc)
- резервирование портов ввода-вывода
Переписать работу с обработчиками irq
- удалить функции 41 42 44 45
- сделать каскадные обработчики irq
- сделать обработчики irq пользовательского режима.
Заключительный этап. Переход к полноценной драйверной модели.
- к существующим спискам устройств acpi и pci добавляются списки логических устройств и драйверов/сервисов. Каждое устройство монтируется на виртуальную шину. Каждый драйвер реализует необходимые обработчики подключения и отключения устройства, управления питанием и т.д. Существующая сейчас возможность резервировать любые порты ввода-вывода и линии irq а также читать и писать конфигурационное пространство любых PCI устройств закрывается. По крайней мере для драйверов пользовательского режима. Все подобные операции осуществляются только с учётом ресурсов, используемых устройством.