Вопросы связанные с платами PCI, PCI-E расширения BIOS

Решился создать тему для обсуждения вопросов, связанными с платами расширения.
Помогите, пожалуйста, разобраться со следующим вопросом.

Я никак не пойму с регистром XROMBAR - Expansion ROM Base Address register, что по смещению 30h в конфигурационном пространстве PCI.
Читал спецификацию PCI и Салихана.

Что значит фраза в спецификации PCI Firmware, "если регистр XROMBAR реализован, то содержимое образа ROM копируется в память и запускается инициализирующая функция"

Значит ли эта фраза, что если в ответ на запись одними 1, он вернёт ненулевое значение, то это он реализован.

Меня волнует бит 0. Вот если он вернётся 0. То всё равно POST компа скопирует образ и запустит инициализирующую функцию???
Значит ли этот бит, что просто сам ROM карты расширения не будет доступен для записи и чтения через отображение на память. Но при этом POST всё равно запустит код из образа, находящегося в нём???

Я как бы не хочу, чтобы мой 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 пока молчит.

Промежуточные результаты такие. Есть следующие ответы:

Цитата:

POST

ставит все 1 устройство корректирует адресу согласно своим размерам.
Так как 0 бит XROMBAR тоже установлин в 1, то ROM отображается по этому адресу которое вернет XROMBAR.
Отключает ROM, записью 0 в XROMBAR.
POST копирует ROM в RAM, причем не весь а только 64КБайт максимум (Для UEFI может больше, до 64 кб для PC совместных систем).
Потом начинает выполнять код который он скопировал.
После инициализации лочит RAM от записи

Цитата:
при установленном в ноль 0 бите 0 XROMBAR ром-биос может быть скопирован в оперативку (зависит от реализации мб-биоса и от бита 1 регистра команд) , но на инициализацию не пойдёт .
ром карты никак не может быть доступен . доступен образ в оперативке до инициализации и иногда после , тк. процедура инициализации часто затеняют соответствующую область памяти .

Ссылки, где дополнительно задал вопрос (помимо electronix'а) и слегка ответили:

на codenet'e
на sources

Аватар пользователя savely

Вроде как все и ответили.

А кому счас легко...

У меня остался такой вопрос.
А как тогда происходит работа с ROM? Кто потом включает этот бит в XROMBAR? И как после включения этого бита содержимое ROM появляется в памяти на отображаемом пространстве?(не инициализирующий код, копируемый в память, а содержимое на отображаемом пространстве)

Я имею ввиду, как используется возможность перепрограммирования ROM (чаще всего в спецификациях на микросхемы flash-rom через посылку определённых команд по смещению 555h на отображаемой области в памяти)?
Или даже просто нужно, чтобы весь ROM отображался в память ( а это порой объём до 1Мб).

Аватар пользователя savely

Цитата:
А как тогда происходит работа с ROM?

Карта имплементирует XROMBAR с нужным размером BIOS. По RST ставит бит, если хочет, чтобы BIOS запускался. Сбрасывает - BIOS матери после вычитки содержимого.

Цитата:
И как после включения этого бита содержимое ROM появляется в памяти на отображаемом пространстве?

Как сделаете, так и появится. 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 (чаще всего в спецификациях на микросхемы flash-rom через посылку определённых команд по смещению 555h на отображаемой области в памяти)?
Или даже просто нужно, чтобы весь ROM отображался в память ( а это порой объём до 1Мб).

Ничего не понял. Какого ROM, куда отображается память, при чем здесь BIOS?

А кому счас легко...

"как используется возможность перепрограммирования ROM (чаще всего в спецификациях на микросхемы flash-rom через посылку определённых команд по смещению 555h на отображаемой области в памяти)? Или даже просто нужно, чтобы весь ROM отображался в память"

не надо сравнивать "теплое" с "кислым", ROM - ROMу рознь

"на отображаемой области в памяти" - означает систему в которую впаян ваш flash-rom,
он ведь наверно на вашем PCI/e устройстве, а не на материнке?

вот ваше FPGA (на вашем PCI/e устройстве ) и увидит "отображение", при соблюдении правильной схемотехники, и что вы сделаете с этим "отображением" зависит только от вас

а материнка об этом , ни малейшего понятия, у нее свое "отображение" (т.е. БИОС( обеспечиваемое своей схемотехникой

вроде так

... иди туда, незнаю куда, возьми то, не знаю что ... (C) Русские народные сказки

Всем спасибо. Что-то начало проясняться в голове.
То есть для работы непосредственно с ROM карты расширения, чтобы до неё доходили команды на удаление/запись, надо просто взвести нулевой бит в XROMBAR.

Аватар пользователя savely

Вы случаем к Информзащите в части "Кода Безопасности" не имеете отношения?:) Платка по описанию на Соболя весьма похожа.;)

А кому счас легко...

Доброго всем дня!
Делаю образ 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 должно считаться от него, а если она не совпадает, то и образ запускаться не должен...

Аватар пользователя savely

Цитата:
Причем образ начинает работать, то есть противоречий с crc, подсчитанной от 32Кб нет

Возможно, для Вас будет откровением, но на куче матерей c ширпотребовским Award/AMI main BIOS не проверяет CRC addon BIOSов.:)))
Ткните в приличный сервер, или в Супермикру какую.

Цитата:
Вопрос: это особенность ПЛИС платы PCI-E?

Заявлять на PCI размер OpROM - если у Вас нет "инструментов" (а если Вы пишете ТОЛЬКО ВIOS, то у Вас их и нет), тогда - FPGAшников трясите. Т.е. это особенность не самой FPGA, а ее прошивки.

P.S. Честно говоря - я без понятия, почему различается. Прошивка FPGA по идее вообще может не отличаться для mini в части шины. А может и вообще не отличаться. Ну, разве что Device ID.

P.P.S. Ох, зря я Вам советую... Чую-чую...:))

А кому счас легко...

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Разрешённые HTML-теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img>
  • You can use BBCode tags in the text. URLs will automatically be converted to links.

Подробнее о форматировании текста

Антибот - введите цифру.
Ленты новостей