From: McMCC <mcmcc@mail.ru>
Newsgroups: mcmcc.bat.ru
Date: Mon, 3 Oct 2003 14:31:37 +0000 (UTC)
Subject: Решение проблемы с IRQ на nForce2 материнках в Linux.
Оригинал: http://www.mcmcc.bat.ru/acpi_nforce2/
Решение проблемы с 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, многие проблемы связанных с драйверами решены:
1. Появилась полноценная поддержка onboard IDE контроллера
2. Появился драйвер AGPGART, теперь можно использовать видеокарты не
от Nvidia(2.4.21-ac4)
3. Появились драйвера для контроллеров SATA
4. Исправлены глюки в драйвере IEEE1394 (firewire)
5. Улучшена поддержка USB v.2.0
Всех изменений не перечислишь, однако есть еще драйвера от самой
Nvidia для nForce2 под Linux. Их драйвера содержат полноценную
поддержку встроенной Nvidia Ethernet и Audio. Загрузить их можно с
официального сайта Nvidia http://www.nvidia.com из секции Download.
Если звуковой драйвер полностью открытый, то для ethernet закрытый, на
что многие пользователи Linux относятся отрицательно и требуют
(http://www.petitiononline.com/nforce2/petition.html) открыть исходники
на это устройство.
Если с драйверами ситуация понятная, то вот с поддержкой 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 http://www.intel.com/ ,
открыла спецификацию на ACPI и даже открыла целый проект
http://developer.intel.com/technology/iapc/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 из биоса, дизассемблируем ее
http://www.mcmcc.bat.ru/acpi_nforce2/downloads/dsdt.dsl
имеющимися у нас утилитами от Intel, делаем необходимые исправления
http://www.mcmcc.bat.ru/acpi_nforce2/downloads/1-dsdt.dsl
или добавления, переводим все в hex формат и интегрируем
http://www.mcmcc.bat.ru/acpi_nforce2/downloads/1-dsdt.hex
http://www.mcmcc.bat.ru/acpi_nforce2/downloads/linux-2.4.21-acpi_nforce2_dsdt_mc1.patch
эту полученную новую 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 должна подойти к другим
http://www.mcmcc.bat.ru/acpi_nforce2/downloads/1-dsdt.hex
материнским платам выполненных на базе микросхем nForce2, если нет, то
мы можем создать специальную базу подправленных DSDT таблиц для разных
материнских плат на базе nForce2 и выложить их на этом сайте. Что бы вы
сам смогли сделать исправления в DSDT для своей материнки, я сделал
специальный diff файлик, где наглядно видно какие нужно делать
изменения http://www.mcmcc.bat.ru/acpi_nforce2/downloads/diff_dsdt.diff
Так как я в основном работаю с дистрибутивами от RedHat, то мною за
время этих экспериментов было собрано ядро на основе патчей от RedHat и
своих собственных. Если кому интересно, то вы можете взять собранное
мною ядро специально для nForce2 и оптимизированное под Athlon, правда
это ядро предназначено для работы в RedHat 7.x и 8.0, для RH9 я еще этим
не занимался, ядра для RH9 имеют некоторые особенности и поэтому ряд
патчей входящих в мое ядро прикрутить не так просто, если у меня будет
свободное время, то я постараюсь собрать ядро со своими патчами для
9-ки. Данное ядро основано на последней официальной версии 2.4.21,
http://kernel.org/pub/linux/kernel/v2.4/patch-2.4.21.bz2
патчами от Алана Кокса 2.4.21-ac4, некоторыми специфичными патчами
от RedHat'а и немного своими
http://kernel.org/pub/linux/kernel/people/alan/linux-2.4/2.4.21/patch-2.4.21-ac4.bz2
Основные особенности:
- Поддержка Win4Lin
- ACPI IRQ routing для nForce2(Epox EP-8RDA+)
- AGPGART для nForce2
- Все последние драйвера от Nvidia, включая модуль для видео
- Поддержка ZIV1 и других устройств на базе контроллера USS-725
- Все дополнения, которые входят в состав RedHat'овского ядра (lm_sensors, tux и т.д.)
Тем кому интересно собрать это ядро самостоятельно, то вы можете взять
tar архив http://www.mcmcc.bat.ru/acpi_nforce2/downloads/patches_kernel-2.4.21-1.w4l.tar.bz2
со всеми патчами и спек файлами, отсутствует только исходники самого ядра 2.4.21
и патча 2.4.21-ac4 от Алана, это сделано специально, что бы уменьшить размер и
не тянуть лишний раз одно и тоже...
30.06.03 McMCC (mcmcc@mail.ru)
1143 Прочтений • [Решение проблемы с IRQ на nForce2 материнках в Linux. (linux hardware irq video trouble)] [08.05.2012] [Комментариев: 0]