На ПЛИС Virtex5 реализовал Serial ATA Host Bus Adapter (HBA) с интерфейсом PCI Express. Работает в режиме эмуляции IDE. Тестировал на материнке (Intel MB950F). Пробовал под Linux (Ubuntu 10.04), Windows XP SP3. В конфигурационном пространстве моей платы прописана следующая инфа:
1) VendorID/DeviceID = 8086/3B26h (подсмотрел по аналогии на встроенных контроллерах).
2) ClassCode = 010105h. Интерфейс 05h потому что пока только в PIO режиме тестирую.
3) BAR0/BAR2 -- ATA Command/Control блоки. Размеры регистров прописаны по 128 байт (аппаратное ядро PCI Express в virtex5 не позволяет поставить меньший размер IO, только больше).
4) BAR1/BAR3/BAR4 пока 0h (не используются).
Проблема в том, что под Linux контроллер работает как надо с помощью стандартных драйверов, а под Windows нет, загрузка с диска тоже невозможна.
Начну с BIOS(AMI BIOS 8). На этапе загрузки выводится список HDD. Подключенного через мою плату HDD в этом списке нет. В Setup Utility также диск отсутствует во всех соответствующих вкладках. Загрузка продолжается. На экране появляется табличка с номерами прерываний. Вижу там свой контроллер с номером прерывания (пишет: PCIe to IDE bridge). Далее boot menu загрузчика grub, который установлен на другом диске. Если в системе оставить только 1 hdd, который подключен через мой контроллер, то BIOS говорит, что нет системного диска. Смотрю, что происходит на интерфейсе PCI Express внутри ПЛИС с помощью отладчика chipscope во время загрузки BIOS. Меня интересуют только транзакции уровня TLP. Таковых не наблюдается вообще в процессе загрузки BIOS. Вероятно, и скорее всего, что конфигурационные запросы приходят, так как прерывание моей плате все же назначается. Далее BIOS-у что-то не нравится в конфиге и он не работает с мои контроллером (вопрос что именно?). Есть предположение, что BIOS для класса устройства 0101h проверяет размеры BAR'ов. Ведь другие контроллеры на плате имеют размеры по 8/4 байта на BAR для соответственно Command и Control блоков ATA.
Теперь о Windows. Система обнаруживает новое устройство и ставит ему стандартный драйвер драйвер (Стандартный двухканальный контроллер PCI IDE), и отмечает его восклицательным знаком. На вкладке "Ресурсы" не отображаются занимаемые диапазоны IO/MEM. Только присутствует надпись: "устройство не использует ресурсов, возможно, в его работе присутствуют ошибки". Далее просматриваю конфигурационное пространство своего контроллера прог-ой PCI Tree. К моему удивлению, диапазоны IO для BAR'ов все-таки выделены и адреса прописаны в BAR'ы (сс00h-сс7Fh, 8800h-887Fh). Смотрю, что происходит на интерфейсе PCI Express внутри ПЛИС с помощью отладчика chipscope во время загрузки Windows. Меня интересуют только транзакции уровня TLP. Таковых не наблюдается вообще в процессе загрузки Windows. Вероятно, и скорее всего, что конфигурационные запросы приходят, так как прерывание моей плате все же назначается и IO ресурсы также выделяются (хотя в диспетчере устройств они не отображаются).
Из всех этих экспериментов прихожу к выводу, что драйвера HDD контроллеров в BIOS и Windows проверяют размер BAR'ов для устройств класса 0101h, а при несовпадении с ожидаемыми просто прекращают работать с таким устройством.
Проверял на другой материнке с BIOS от AWARD -- все также.
Какие есть соображения по этому поводу?
А попробуйте драйвер Альтера с интересом
alter.org.ua/soft/win/uni_ata/
Если не заработает - дебаговую версию поюзать и посмотреть, что ему не нравится.
Пока нет нормально стартовавшего драйвера железки - винда в той закладке не покажет ресурсы.
А кому счас легко...
BIOS не будет выводить информацию о подключенных к вашему устройству HDD. Реализовывать загрузку с этих HDD BIOS будет только если вы создадите соответствующий программный модуль, а в BIOS сможете выбрать опцию аля "Загрузка с прочих устройств".
Не, я так понимаю - родной контроллер задизейблен и MarK c интеловскими VID/DID надеется, что BIOS его поделку примет за чипсетный контроллер. Но тут столько засад, что я даже не знаю...
А так - да. Кошерный путь (для загрузки) известен - написать Addon BIOS.
P.S. Начиная от того, что родной контроллер - это не "мост PCIe-IDE", насколько я помню.
Дизайн откуда взялся? До какого момента это Xilinx-овский дизайн?
P.P.S. Но сразу скажу - я не FPGA-шник. Так, краем глаза.
А кому счас легко...
to maco. Где почитать подробнее?
to savely.
1) Какие засады могут быть? Я же реализовал стандартный интерфейс дискового контроллера. Я бы с вами согласился, если бы хост хоть что-то писал в регистры моего контроллера, но он ничего не пишет. Из описанного мною в первом посте становится ясно, что проблема начинается раньше, чем драйвер вообще начинает что-либо вычитывать из моего контроллера. Почему в линуксе устройство работает с такими же VID/DID без проприетарного драйвера?
В винде на эти контроллеры и на все остальные загружены стандартные драйвера и ничего, работают же.
2) UniATA пробовал. Винда уходит на на ребут при загрузке...Пробовал давно, но не на дебаговой. Вернусь к эксперименту.
Дизайн чего? Если всего контроллера, то все кроме аппаратной корки pcie самописное + gtx.
PS: А у меня и не мост PCI-IDE. С чего вы это взяли?
Попутно - может/должен ли любой компонент чипсета (в данном случае Intel Q57) транслировать запросы к "штатно внутреннему устройству" на внешнюю шину (в данном случае PCI-E)? Документацию читать пока лень.
Об использовании BIOS'ом внешних контроллеров? Тогда поглядите в сторону матплат с интегрированными PATA/SATA контроллерами - дизассемблируйте BIOS (или просто покопайтесь каким-нибудь редактором) и сравните с BIOS'ом той матплаты, которую вы используете.
О возможности загрузки с помощью внешних контроллеров? Дык savely уже упоминял Addon BIOS.
2. Вы сами упоминали:
Вы, верно, под отключением(я так и не понял чего) имеете ввиду отключение жесткого диска? Так это делается простым выниманием sata кабеля и кабеля питания, а больше я ничего не отключал:) Откуда такая информация, что родной контроллер задизейблин?
А для того чтобы узнать как устроен SATA HBA Вы, наверное, посоветуете сканировать рентгеном какой-нибудь конкретный чип?:)
Не понимаю, на чем основано ваше утверждение, что написание addon rom единственный верный путь. Пруфлинк в студию!
И еще один разгромный комент:) Чтобы ваш addon rom (в стандарте PCI он называется Expansion ROM) вообще заработал, нужно, чтобы хост начал читать выделенную под BAR6 область памяти, чего не происходит вообще-то (описывал в первом посте) при загрузки Win, BIOS.
1) Я везде писал PCIe. Извиняюсь, наверное, правильно будет PCI-E сокращать.
2) Это сообщение BIOS, а не я писал:)
Предлагаю пока не упираться именно в загрузку с hdd, подключенного к моему контроллеру. Невозможность загрузки тут является лишь следствием того, что BIOS и WIN вообще не обращаются к регистрам контроллера (кроме конфигурационного пространства), под которые выделены ресурсы IO в BAR'ах. Под Linux'ом ведь все работает с теми же VID/DID, и никакой контроллер с такими же VID/DID не мешает (у них же адреса на шине разные). Все решают первые 2 байта ClassCode (0101h).
Если вам не нравится этот путь, никто не запрещает вам верить в то, что любой BIOS сможет выполнить определенный набор действий для осуществления загрузки ОС с помощью вашего контроллера.
--> тема, связанная с Addon ROM в составе устройства.
Прочитал еще раз. Неверно воспринял предложение " (или просто покопайтесь каким-нибудь редактором) ". Подумал, почему-то о текстовом редакторе, выходные, однако:)
Давайте все-таки различать. Мое устройство это не контроллер hdd (тот например, что в самих hdd) это адаптер интерфейса, написанный по стандарту knowledgetek.com/graphicsNew/SerialATA_Revision_3_1_Gold-KT.pdf .
Это устройство не выполняет команды ATA, и ничего о них не знает. Оно просто содержит теневые регистры - копии регистров реального дискового контроллера (того который в sata-hdd живет) и предоставляет доступ к ним хосту и передает их устройству. Этот адаптер поддерживает legacy набор регистров (движок ACHI работает вообще отдельно, как написано в спеке на ACHI, да я его и не делал). Про эту тему хорошо написано в SATA Storage Technology от Mindshare. Надеюсь, теперь вы точно представляете, что именно за устройство я делаю?
Не пойму только зачем нужно городить свой addon rom чтобы выполнить стандартный набор действий со стандартным устройством, которое имеет стандартный интерфейс? Видимо, я чего-то не понимаю...
Отправить комментарий