Решение проблемы с IRQ на nForce2 материнках в Linux'е.
В последнее время, после выхода большого количества материнских плат на
базе микросхем Nvidia nForce2 от разных производителей, в интернете появилось масса статей
связанных с использованием таких материнок под Linux'ом. Основной упор этих статей делался
на железячные проблемы и драйвера, одна из таких статей, на мой взгляд довольно интересная,
находится на сайте Johannes Deisenhofer http://home.t-online.de/home/Johannes.Deisenhofer/nforce2linux.html,
автор статьи описывает некоторые нюансы с имеющейся у него материнской платой Asus A7N8X Deluxe
и как он пытался подружить эту материнку с Linux'ом. Сегодня эту статью можно считать сильно устаревшей,
так как с выходом ядра 2.4.21 и патча для этого ядра от Алана Кокса 2.4.21-ac4, многие проблемы
связанных с драйверами решены:
- Появилась полноценная поддержка onboard IDE контроллера
- Появился драйвер AGPGART, теперь можно использовать видеокарты не от Nvidia(2.4.21-ac4)
- Появились драйвера для контроллеров SATA
- Исправлены глюки в драйвере IEEE1394 (firewire)
- Улучшена поддержка USB v.2.0
Всех изменений не перечислишь, однако есть еще драйвера от самой Nvidia для nForce2 под Linux.
Их драйвера содержат полноценную поддержку встроенной Nvidia Ethernet и Audio. Загрузить
их можно с официального сайта Nvidia http://www.nvidia.com
из секции Download. Если звуковой драйвер полностью открытый, то для ethernet закрытый, на
что многие пользователи Linux относятся отрицательно и требуют открыть исходники на это
устройство.
Если с драйверами ситуация понятная, то вот с поддержкой ACPI очень и очень туманная.
Что такое ACPI? ACPI (Advanced Configuration & Power Interface) - это расширенный интерфейс конфигурирования
компьютера и управления питанием. ACPI представляет собой весьма объемный стандарт, описывающий правила
распределения линий IRQ и каналов DMA для устройств на шинах AGP и PCI, наблюдения за системными событиями,
управление статусом компьютера и отдельных устройств и т.д. Все знают, что можно прекрасно прожить без ACPI,
так как большенство этих функций спокойно берет на себя сам биос, а функции Power Management(PM) доступны
через APM. Но время идет, если до не давнего времени биос спокойно справлялся с раздачей IRQ и DMA для
используемых в системе PCI и AGP устройств, то с принятием ACPI v.2.0 все изменилось, теперь биос ограничен
в своих правах и эта возможность почти полностью в распоряжении ACPI. Полноценная поддержка ACPI существует
только в OC Windows 2000 и XP, но после того как один из разработчиков ACPI, компания Intel, открыла
спецификацию на ACPI и даже открыла целый проект
для разработчиков, разместив на своем сайте исходные коды и утилиты, то процесс по внедрению поддержки ACPI в другие ОС
пошел полным ходом. Страничка поддержки ACPI в Linux'е находится по адресу http://acpi.sourceforge.net.
Не смотря на то, что проекту уже больше года, полноценная поддержка ACPI в Linux'е еще не завершена.
Не многие материнские платы работают с линуксовым ACPI. Материнские платы на nForce/nForce2 заявлены
как не поддерживающие линуксовый ACPI, об этом официально заявляет Nvidia и ACPI4Linux Team. Если
функции PM этих материнок считаются как бы работающими, то функция распределения линий IRQ и каналов
DMA - нет. Зачем это надо? Дело в том, что некоторые устройства на этих материнках отказываются работать,
так как IRQ для них не определено и биос ничего не может с этим сделать, получается что эти устройства
как бы присутствуют, но не работают. У меня эта проблема возникла с одним из 3х USB хабом и SMBus(System Management Bus),
которым требуется для нормальной работы прерывания. Больше месяца я бился с этой проблемой, читал
списки рассылки по kernel и ACPI, оказалось, что проблема с IRQ routing'ом на материнках с nForce2 давно
известна, но вот решений по этому поводу никаких нет, Nvidia тоже не пытается решать эту проблему.
После многочисленных попыток заставить работать линуксовый ACPI драйвер с моей Epox EP-8RDA+, мои попытки увенчались
успехом. Проблема оказалась в использовании дополнительной таблицы прерываний, с IRQ 16 по IRQ 23,
причем ACPI пыталась честно назначить прерывания из этого диапазона всем существующим устройствам
PCI и AGP, оставляя при этом основную таблицу прерываний от 0 до 15 всем этим же устройствам, видимо
из-за этого подвисала загрузка линукса на первом же драйвере, который пытался определить используемое
устройством прерывание. Это примерно выглядело так:
ACPI: Interpreter enabled
ACPI: Using PIC for interrupt routing
ACPI: System [ACPI] (supports S0 S1 S4 S5)
ACPI: PCI Root Bridge [PCI0] (00:00)
PCI: Probing PCI hardware (bus 00)
ACPI: PCI Interrupt Link [LNK1] (IRQs 3 4 5 6 7 10 *11 12 14 15)
ACPI: PCI Interrupt Link [LNK2] (IRQs 3 4 5 6 7 10 11 12 14 15, disabled)
....
ACPI: PCI Interrupt Link [LIDE] (IRQs 3 4 5 6 7 10 11 12 14 15, disabled)
ACPI: PCI Interrupt Link [APC1] (IRQs *16)
ACPI: PCI Interrupt Link [APC2] (IRQs 17, disabled)
....
ACPI: PCI Interrupt Link [APCZ] (IRQs 20 21 22, disabled)
PCI: Probing PCI hardware
ACPI: PCI Interrupt Link [LNK2] enabled at IRQ 10
ACPI: PCI Interrupt Link [LNK3] enabled at IRQ 10
ACPI: PCI Interrupt Link [LNK5] enabled at IRQ 10
ACPI: PCI Interrupt Link [LUBA] enabled at IRQ 5
ACPI: PCI Interrupt Link [LMCI] enabled at IRQ 11
ACPI: PCI Interrupt Link [LSMB] enabled at IRQ 10
ACPI: PCI Interrupt Link [L3CM] enabled at IRQ 5
ACPI: PCI Interrupt Link [LIDE] enabled at IRQ 11
ACPI: PCI Interrupt Link [APC2] enabled at IRQ 17
ACPI: PCI Interrupt Link [APC3] enabled at IRQ 18
ACPI: PCI Interrupt Link [APC5] enabled at IRQ 16
ACPI: PCI Interrupt Link [APCF] enabled at IRQ 20
ACPI: PCI Interrupt Link [APCG] enabled at IRQ 22
ACPI: PCI Interrupt Link [APCH] enabled at IRQ 21
ACPI: PCI Interrupt Link [APCI] enabled at IRQ 20
ACPI: PCI Interrupt Link [APCJ] enabled at IRQ 22
ACPI: PCI Interrupt Link [APCK] enabled at IRQ 21
ACPI: PCI Interrupt Link [APCS] enabled at IRQ 23
ACPI: PCI Interrupt Link [APCL] enabled at IRQ 20
ACPI: PCI Interrupt Link [APCM] enabled at IRQ 22
ACPI: PCI Interrupt Link [AP3C] enabled at IRQ 21
ACPI: PCI Interrupt Link [APCZ] enabled at IRQ 20
PCI: Using ACPI for IRQ routing
PCI: if you experience problems, try using option 'pci=noacpi' or even 'acpi=off'
....
Видно, что основная таблица прерываний состоит из 8-ми линков, когда как
дополнительная из ACPI почти в 2-а раза больше. Похоже, что ACPI драйвер не совсем корректно
делает назначения дополнительных прерываний, грубо говоря - просто бредит! Радует одно,
что есть такая возможность, как использование DSDT(Differentiated System Description Table),
суть в ее использования заключается в том, что мы сами можем определить правила для работы ACPI.
Как работать с DSDT, можно узнать по ссылке http://acpi.sourceforge.net/wiki/index.php,
если коротко, то мы в начале считываем программу управления ACPI из биоса, дизассемблируем
ее имеющимися у нас утилитами от Intel, делаем необходимые исправления или добавления,
переводим все в hex формат и интегрируем эту полученную новую DSDT в наш ACPI драйвер.
Именно этим способом мне удалось запустить работу ACPI IRQ роутинга, после того, как
я выкинул из DSDT таблицы все, что было связано с дополнительной таблицей прерываний и
на ее место прописал основную стандартную. При этом все устройства на материнской плате
были найдены и им были присвоены все необходимые прерывания. Теперь у меня работают
все USB порты, а так же стал определяться SMBus, с которым, по идее, должен нормально
работать Lm_sensors, правда проверить эту возможность у меня пока небыло времени.
Вот как сейчас выглядит лог при загрузки Linux'а по части ACPI:
ACPI: Interpreter enabled
ACPI: Using PIC for interrupt routing
ACPI: System [ACPI] (supports S0 S1 S4 S5)
ACPI: PCI Root Bridge [PCI0] (00:00)
PCI: Probing PCI hardware (bus 00)
ACPI: PCI Interrupt Link [LNK1] (IRQs 3 4 5 6 7 10 *11 12 14 15)
ACPI: PCI Interrupt Link [LNK2] (IRQs 3 4 5 6 7 10 11 12 14 15, disabled)
....
ACPI: PCI Interrupt Link [LIDE] (IRQs 3 4 5 6 7 10 11 12 14 15, disabled)
PCI: Probing PCI hardware
ACPI: PCI Interrupt Link [LNK2] enabled at IRQ 10
ACPI: PCI Interrupt Link [LNK3] enabled at IRQ 10
ACPI: PCI Interrupt Link [LNK5] enabled at IRQ 10
ACPI: PCI Interrupt Link [LUBA] enabled at IRQ 5
ACPI: PCI Interrupt Link [LMCI] enabled at IRQ 11
ACPI: PCI Interrupt Link [LSMB] enabled at IRQ 10
ACPI: PCI Interrupt Link [L3CM] enabled at IRQ 5
ACPI: PCI Interrupt Link [LIDE] enabled at IRQ 11
PCI: Using ACPI for IRQ routing
PCI: if you experience problems, try using option 'pci=noacpi' or even 'acpi=off'
....
Все эти эксперименты я проделывал с материнской платой Epox EP-8RDA+,
скорее всего моя подправленная таблица DSDT должна подойти к другим материнским платам
выполненных на базе микросхем nForce2, если нет, то мы можем создать специальную
базу подправленных DSDT таблиц для разных материнских плат на базе nForce2 и выложить их на
этом сайте. Что бы вы сам смогли сделать исправления в DSDT для своей материнки, я сделал специальный
diff файлик, где наглядно видно какие нужно делать изменения.
Так как я в основном работаю с дистрибутивами от RedHat, то мною за время
этих экспериментов было собрано ядро на основе патчей от RedHat и своих собственных.
Если кому интересно, то вы можете взять собранное мною ядро специально для nForce2 и
оптимизированное под Athlon, правда это ядро предназначено для работы в RedHat 7.x и 8.0,
для RH9 я еще этим не занимался, ядра для RH9 имеют некоторые особенности и поэтому ряд
патчей входящих в мое ядро прикрутить не так просто, если у меня будет свободное время, то
я постараюсь собрать ядро со своими патчами для 9-ки.
Данное ядро основано на последней официальной версии 2.4.21,
патчами от Алана Кокса 2.4.21-ac4,
некоторыми специфичными патчами от RedHat'а и немного своими.
Список собранных RPM пакетов:
kernel-2.4.21-1.w4l.athlon.rpm(собран gcc-3.2)
kernel-doc-2.4.21-1.w4l.athlon.rpm
kernel-source-2.4.21-1.w4l.athlon.rpm
Основные особенности:
- Поддержка Win4Lin
- ACPI IRQ routing для nForce2(Epox EP-8RDA+)
- AGPGART для nForce2
- Все последние драйвера от Nvidia, включая модуль для видео
- Поддержка ZIV1 и других устройств на базе контроллера USS-725
- Все дополнения, которые входят в состав RedHat'овского ядра (lm_sensors, tux и т.д.)
Тем кому интересно собрать это ядро самостоятельно, то вы можете взять tar архив со всеми
патчами и спек файлами, отсутствует только исходники самого ядра 2.4.21 и патча 2.4.21-ac4 от Алана, это
сделано специально, что бы уменьшить размер и не тянуть лишний раз одно и тоже...
[Продолжение следует....]
30.06.03 McMCC (mcmcc@mail.ru)