1)Согласен с тем что надо убедиться в том что контролёр PCI-IDE настроен и запущен.
Цитата:
Если к нему подключен загрузочный диск, то BIOS гарантированно контроллер настроит (
Где-то видел требования что BIOS должен настроить и запустить все контролёры жёстких дисков на материнской плате.
Но он не обязан настраивать и запускать контролёры на платах расширения.
2) Что касается PnP. Если он включён в настройках биоса.
И если на плате расширения стоит ПЗУ-память, то биос обязан вызвать её код.
3) PCI-CFG биос должен настроить и без включения PnP. Хотя бывает и такое.
4)
Цитата:
Соответственно, не факт, что к уже настроенному контроллеру удастся обратиться командами in и out -- вполне может быть,
Это конечно верно. И описано в стандарте PCI. Но есть стандарты на жёсткие диски. Есть у нас контролёр PCI-IDE то он обязан сделать порты для совместимости. А если прочий контроллер дисков, то нет.
5)
Цитата:
В общем, если система разрабатывается под конкретный ПК с конкретным железом и конкретной версией BIOS, можно "закладываться" на то, как именно данный BIOS выполняет настройку железа. Однако если ОС должна быть достаточно универсальной, нужно предусматривать все возможные варианты.
Не пишите универсальных драйверов. Пишите для каждого контроллера свой драйвер. Иногда их можно объединить в семейства.
Цитата:
Но есть следующий вопрос: команды out и in направляются на фиксированные адреса портов или они как-то берутся из Pci bar - ов устройства ?
Читаем BAR регистр отвечающей за BM_BASE. Если он настроен, тогда контроллер настроен. Проверяем дальше читаем другие BAR регистры если там не 0, то регистры настроены и используем их значения. Если 0 то используются стандартные фиксированные значения.
Подробнее можно прочитать в:
http://ru.osdev.wikia.com/wiki/Работа_с_жесткими_дисками_и_их_контроллерамиPS. Протокол чтения там реализован неверно.