Решился создать тему для обсуждения вопросов, связанными с платами расширения.
Помогите, пожалуйста, разобраться со следующим вопросом.
Я никак не пойму с регистром XROMBAR - Expansion ROM Base Address register, что по смещению 30h в конфигурационном пространстве PCI.
Читал спецификацию PCI и Салихана.
Что значит фраза в спецификации PCI Firmware, "если регистр XROMBAR реализован, то содержимое образа ROM копируется в память и запускается инициализирующая функция"
Значит ли эта фраза, что если в ответ на запись одними 1, он вернёт ненулевое значение, то это он реализован.
Я как бы не хочу, чтобы мой ROM BIOS платы расширения отображался на память, но при этом инициализирующий код должен выполнится.
Сейчас можно вставлять микросхемы для ROM карт расширения PCI объёмом 1Мб.
Что в таком случае будет происходить при работе BIOS. Там размер доступной памяти 1Мб всего. На инициализирующую часть одной карты расширения PCI выделяется, если не ошибаюсь, 2Кб. Как при этом происходит отображение этого самого ROM?
P.S.
У меня сейчас сформулировался неразрешимый для меня вопрос.
Смотрю на регистр XROMBAR в коде инициализации на этапе инициализации PnP устройств, то есть выполняется образ, записанный на ROM карты расширения.
Он показывает адрес 0xCFFF0000. Заметьте нулевой бит равен 0 !!!! Как написано в спецификации, записываю регистр одними единицами, на что в регистре плата возвращает 0xFFFFC001.
Нулевой бит равен 1 !!! То есть ROM BIOS есть, показывается требуемый объём памяти.
Так вот кто и как потом сбрасывает нулевой бит??? Ибо даже если я его взвожу, он потом становится нулевым.
И кстати, когда читаю память по адресу 0xCFFF0000, там только 0xFFFFFFFF.
В общем, не понимаю я, как работает нулевой бит этого регистра. И как отображается ROM платы расширения на память. И почему инициализирующий код выполняется по адресу 0xCA907? Разве он не должен выполняться по адресу отображения?
а на electronix.ru/forum/index.php?s=7b8278c37850ce4284893d2d4027d0e0&showforum=46
спрашивали/искали?
когда 60-80Кб OpROM после инициализации "усыхают" до рабочих 8кб, не понимаю о каком лимите в 2кб идет речь?
OpROM в 1мб - тоже логичен для UEFI варианта (при желании свою операционку туда кинуть, и кучу всего в SMM ),
в легаси варианте до 128кб
где бы не лежал ваш OpROM , сначала он будет скопираван в 0хС8000-0хF0000 и только там выполнен (инициализация устройства и усыхание до рабочего размера)
....., освежусь практикой и отпишусь
... иди туда, незнаю куда, возьми то, не знаю что ... (C) Русские народные сказки
Спасибо.
electronix пока молчит.
Промежуточные результаты такие. Есть следующие ответы:
Ссылки, где дополнительно задал вопрос (помимо electronix'а) и слегка ответили:
на codenet'e
на sources
Вроде как все и ответили.
А кому счас легко...
У меня остался такой вопрос.
А как тогда происходит работа с ROM? Кто потом включает этот бит в XROMBAR? И как после включения этого бита содержимое ROM появляется в памяти на отображаемом пространстве?(не инициализирующий код, копируемый в память, а содержимое на отображаемом пространстве)
Я имею ввиду, как используется возможность перепрограммирования ROM (чаще всего в спецификациях на микросхемы flash-rom через посылку определённых команд по смещению 555h на отображаемой области в памяти)?
Или даже просто нужно, чтобы весь ROM отображался в память ( а это порой объём до 1Мб).
Карта имплементирует XROMBAR с нужным размером BIOS. По RST ставит бит, если хочет, чтобы BIOS запускался. Сбрасывает - BIOS матери после вычитки содержимого.
Как сделаете, так и появится. XROMBAR - это грубо говоря "особенный" MEMBAR. Т.е. карта обязана декодировать обращения к памяти от XROMBAR до XROMBAR+заявленный size и отдавать данные (т.е. код Addon BIOSа), пока стоит бит 0.
BIOS матери глянет, проверит сигнатуру, VID/DID, CRC, выкинет в ОЗУ компа, замапит на C0000-F0000 и отдаст управление на точку входа. Код инициализации может после выполнения объявить, что размер run-time кода у него нулевой или меньше, чем заявлено в ROMBAR.
А вот это я не понимаю. У Вас есть MEMBAR. Что там есть - так что выдадите картой, то и есть.
Приведу конкретный пример моего любимого девайса)
Есть PCI-плата. На ней FPGA, отвечающая за интерфейс PCI. Имплементируеся IOBAR, MEMBAR (или 2 MEMBAR для PCIe) и ROMBAR. В FPGA унутре есть память aka ОЗУ на 2K, декодер работает так - при активном бит 0, обращения к ROMBAR уходят на это ОЗУ. При неактивном - обращения к одному из MEMBAR уходят на это ОЗУ.
В этом ОЗУ по RST появляется код BIOS. Неважно откуда - из прошивки FPGA, с SPI-флешки, которую умеет читать FPGA, заливается микропроцессором с платы (тогда память двухпортовая). Все, оно работает.
Ничего не понял. Какого ROM, куда отображается память, при чем здесь BIOS?
А кому счас легко...
"как используется возможность перепрограммирования ROM (чаще всего в спецификациях на микросхемы flash-rom через посылку определённых команд по смещению 555h на отображаемой области в памяти)? Или даже просто нужно, чтобы весь ROM отображался в память"
не надо сравнивать "теплое" с "кислым", ROM - ROMу рознь
"на отображаемой области в памяти" - означает систему в которую впаян ваш flash-rom,
он ведь наверно на вашем PCI/e устройстве, а не на материнке?
вот ваше FPGA (на вашем PCI/e устройстве ) и увидит "отображение", при соблюдении правильной схемотехники, и что вы сделаете с этим "отображением" зависит только от вас
а материнка об этом , ни малейшего понятия, у нее свое "отображение" (т.е. БИОС( обеспечиваемое своей схемотехникой
вроде так
... иди туда, незнаю куда, возьми то, не знаю что ... (C) Русские народные сказки
Всем спасибо. Что-то начало проясняться в голове.
То есть для работы непосредственно с ROM карты расширения, чтобы до неё доходили команды на удаление/запись, надо просто взвести нулевой бит в XROMBAR.
Вы случаем к Информзащите в части "Кода Безопасности" не имеете отношения? Платка по описанию на Соболя весьма похожа.
А кому счас легко...
Доброго всем дня!
Делаю образ Extension PCI ROM. Прошиваю его в PCI-E плату. И с соответствующими изменениями в mini-PCI-E плату. Обе поочереди вставляю в слот PCI-E (для mini есть переходник).
Размер образа 32 Кбайта. В заголовке PCI указывается правильное число страниц, для отображаемого образа.
Заметил, что на обычной PCI-E плате отображается только 16Кбайт. Причем образ начинает работать, то есть противоречий с crc, подсчитанной от 32Кб нет. Но при прыжке на адрес за пределами 16Кбайт всё виснет. Кода там нет. Если не выходить за пределы 16Кб, то всё работает.
Для платы mini-PCI-E такого не происходит и весь код отображается и работает нормально.
Вопрос: это особенность ПЛИС платы PCI-E? Это разработчики платы PCI-E так сделали?
Но как тогда считается crc от образа, ведь в заголовке PCI указан размер отображаемого образа и crc должно считаться от него, а если она не совпадает, то и образ запускаться не должен...
Возможно, для Вас будет откровением, но на куче матерей c ширпотребовским Award/AMI main BIOS не проверяет CRC addon BIOSов.))
Ткните в приличный сервер, или в Супермикру какую.
Заявлять на PCI размер OpROM - если у Вас нет "инструментов" (а если Вы пишете ТОЛЬКО ВIOS, то у Вас их и нет), тогда - FPGAшников трясите. Т.е. это особенность не самой FPGA, а ее прошивки.
P.S. Честно говоря - я без понятия, почему различается. Прошивка FPGA по идее вообще может не отличаться для mini в части шины. А может и вообще не отличаться. Ну, разве что Device ID.
P.P.S. Ох, зря я Вам советую... Чую-чую...)
А кому счас легко...
Отправить комментарий