На ПЛИС 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 -- все также.
Какие есть соображения по этому поводу?
п.3 - т.е. заработало или ситуация, описанная 21 Окт 2013 - 21:53?
Конечно - Expansion ROM в данном случае дает ТОЛЬКО загрузку с устройства. Ну, и работу в DOS-подобных системах.
В ОС, имеющих свои драйвера он не играет никакой роли. Плюс написание ROM накопителя - IMHO, гемморрой еще тот.
Странно, я считал, что Linux тоже поднимает драйвер по Class Code. А они там расплодили... Но это мелочи - пересобрать драйвер ata_piix (как я понимаю - работает именно он) с добавлением нужных VID/DID - не есть большая проблема.
А с Виндой - ну, дебаг, изучение исходников (atapi из DDK и альтеровских), ничего другого посоветовать не могу.
А кому счас легко...
Так чтобы прям взлетело нет. Обращения к онтроллеру идут и, судя по тому что в отладке видно и идентификация подключенного диска проходит, а вот что дальше ему не нравится хз. Пока забил на это, видимо, оно решается как вы и сказали:
Да, почитал немного о структуре XROM -- сурово, но разобраться можно. Саму флешку к ПЛИС подключить не проблема и читать ее. Только вот не понятно что и куда писать в коде драйвера, который туда запихну, чтобы с BIOS нормально дружил. Я так понимаю, что механизм загрузки с диска стандартизирован. Что почитать по этой теме?
Код ROM можно загнать и в прошивку Xilinx и отдавать по обращению к ROMBAR+offset
> Только вот не понятно что и куда писать в коде драйвера, который туда запихну, чтобы с BIOS нормально дружил.
Упс. Legacy (не UEFI) BIOS накопителей я не писал. Т.е. я понимаю, что там должен быть обработчик INT13 (работающий по спецификации EDD 3.0), поставить его нужно при инициализации ROM. Но реального опыта нету. С UEFI - ну, тоже кусок геморроя, но смысл ясен - надо объявить себя накопителем (лень лезьть в спецификацию, но это просто спецификация UEFI 2.x, она доступна).
В наших реалиях (до полной победы UEFI) - надо писать оба (Legacy/UEFI). Так можно - т.е. они "склеиваются", а в зависимости от стиля загрузки будет вызываться Legacy или UEFI.
В общем - я бы нанял специально заточенного человека для обеспечения загрузки. В общем, и для разборок с Виндой - тоже.
P.S. Просто одна из моих функций - как раз системщик, мало шарящий в VHDL/Verilog, но сидящий рядом с FPGA-шником и обеспечивающий написание драйверов/тестов/BIOS-ов и т.п. Т.е. смотрящий на девайс со стороны системы.
А кому счас легко...
Отправить комментарий