Уже почти неделю не могу написать вменяемый код для распознавания драйвов. Пользуясь руководством
wiki.osdev.org/AHCI, предпринимаю следующие шаги:
1. Нахожу AHCI HBA как PCI устройство
2. Читаю его BAR5 и получаю адрес регистров контроллера
3. Проверяю GHC.HR (hardware reset bit), нужно чтобы был 0, иначе контроллер in hung or locked state
4. Для каждого установленного бита в PI (ports implemented) проверяю DET, IPM и SIG
Этот подход работает в старом KVM/QEMU и VirtualBox. Но в Parallels Desktop 6 имея GHC.HR=0 для всех реализованных портов DET=0 и SIG=0xFFFFFFFF, при том, что один диск подключен и распознаётся Linux-ом. Кроме того, в новых KVM/QEMU, а также на реальном железе (HP Compaq 8200) GHC.HR=1, ну и та же ситуация с портами (опять же, драйв точно установлен).
Вывести контроллер из GHC.HR=1 ручной установкой единицы (по спецификации максимум через секунду должен обнулиться) не получается. Контроллер находится в power state D0, биты PCI CMD.MSE и CMD.BME установлены. Так что понятия не имею, что тут нужно сделать, чтобы контроллер завёлся.
Может кто-то имел опыт написания AHCI-драйверов, ну или хорошо знаком с такого рода кодом? Заранее спасибо.