Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Конфигурирование шины PCI
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > ISA/PCI/PCI-X/PCI Express
voland95
Добрый день. Помогите составить блок-схему или алгоритм конфигурирования устройств на PCI например при взаимодействии с видеоадаптером или контроллером HDD. Никак не могу разобраться(((
Harbour
1. пробиваем pci шину на vendor/product id
2. для каждого устройства с заданными ids :

a) маппим mem/reg регионы из pci address space в OS address space
cool.gif если нужно - выделяем ресурсы DMA/IRQ в системе
c) инициализируем устройство (спец. регистры и все такое)
d) активируем/подключаем выделенные ресурсы и сигнализируем о готовности драйвера устройства

3. работаем через драйвер с устройством
plis
Цитата(Harbour @ Oct 15 2009, 07:24) *
a) маппим mem/reg регионы из pci address space в OS address space

А как это сделать внутри драйвера для винды ???
Harbour
х.з. - с вендой уже 10 лет не дружу
lsvmo
Я никак не пойму с регистром 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? Разве он не должен выполняться по адресу отображения?
Shivers
А вы почитайте спецификацию. Когда бит (EXROM_Enable) поднят, софт не может обращаться к другим барам.

Т.е. алгоритм следующий - биос при опросе устройств пишет 32'hffffffff по смещению 30, и получает результат - нулевое смещение это разрешение использовать EXROM, а количество f в старших разрядах определеют его размер. После чего биос считывает хеадер EXROM по указателям (не забыв при этом взвести Mem_Enable, как требует спецификация), копирует содержимое в ОЗУ и исполняет. После чего нулевой бит (EXROM_Enable) зануляется, чтобы можно было работать с устройством в Memory space.
Все это написано в 6.2.5.2. спецификации 2.1

p.s. если по смещению 0 регистра 30 единица не прописывается, биос не может исполнить EXROM. С другой стороны, если единица таки прописывается, биос может и не захотеть исполнять EXROM (видел такие настройки в PCшках).
lsvmo
Цитата(Shivers @ Jan 26 2012, 12:36) *
После чего нулевой бит (EXROM_Enable) зануляется, чтобы можно было работать с устройством в Memory space.


Кто и как потом взводит этот бит?
В винде у меня этот бит взведён, а по адресам, на которые указывает XROMBAR, содержимое флеш-памяти. То есть отображается ROM карты расширения.

А в BIOS, даже выставляя нулевой бит в 1, я по тому адресу читаю только FFFFFFFFh.
Shivers
Я процитировал стандарт. Сам никогда в дезайн P-EXROM не вставлял, только собирался экспериментировать с сетевой картой и поэтому вдумчиво вчитывался в текст стандарта. EXROM это один из обычных способов хакать биос в РС: берется сетевая карта, в EEPROM прописывается код, который исполняется до передачи управления ОС. Обсуждали на ром.бае и еще кое где. Кто то в EXROM встраивал Линукс и даже ДОС. Но это уже оффтопик.
По теме - не знаю что посоветовать. Вы Memory Space Ena прописываете, перед тем как BAR EXROMа щупать?

И зачем он вам вообще дался, могу полюбопытствовать?

p.s.
> А в BIOS, даже выставляя нулевой бит в 1, я по тому адресу читаю только FFFFFFFFh.
А как вы под биосом читаете этот адрес?
Ведь биос это физические адреса процессора, а PCI - тридесятая шина, доступ к которой осуществляется через мосты. И кроме того, в интелловских контроллерах PCI CFG вообще не меппится в память, а весь доступ проходит через два регистра - адреса и данных ... надеюсь вы все это учитываете.
lsvmo
Цитата(Shivers @ Jan 30 2012, 18:23) *
Я процитировал стандарт. Сам никогда в дезайн P-EXROM не вставлял, только собирался экспериментировать с сетевой картой и поэтому вдумчиво вчитывался в текст стандарта. EXROM это один из обычных способов хакать биос в РС: берется сетевая карта, в EEPROM прописывается код, который исполняется до передачи управления ОС. Обсуждали на ром.бае и еще кое где. Кто то в EXROM встраивал Линукс и даже ДОС. Но это уже оффтопик.
По теме - не знаю что посоветовать. Вы Memory Space Ena прописываете, перед тем как BAR EXROMа щупать?

И зачем он вам вообще дался, могу полюбопытствовать?

p.s.
> А в BIOS, даже выставляя нулевой бит в 1, я по тому адресу читаю только FFFFFFFFh.
А как вы под биосом читаете этот адрес?
Ведь биос это физические адреса процессора, а PCI - тридесятая шина, доступ к которой осуществляется через мосты. И кроме того, в интелловских контроллерах PCI CFG вообще не меппится в память, а весь доступ проходит через два регистра - адреса и данных ... надеюсь вы все это учитываете.


В командном регистре, который в конфигурационном пространстве PCI по смещению 0x04, стоит Memory Space Enable.
Собственно, зачем дался? Разрабатываем PCI-E плату, хочу понять, как этот механизм работает, как вот этот самый код, который выполняется до передачи управления ОС, сочетается с дальнейшим использованием регистра XROMBAR.

Под BIOS'ом читаю через регистры 0xCFC, 0xCF8. Конфигурационное пространство PCI устройств доступно. Да и вообще для этого также существует механизм прерывания 1Ah.
Shivers
Цитата(lsvmo @ Feb 8 2012, 16:30) *
В командном регистре, который в конфигурационном пространстве PCI по смещению 0x04, стоит Memory Space Enable.
Собственно, зачем дался? Разрабатываем PCI-E плату, хочу понять, как этот механизм работает, как вот этот самый код, который выполняется до передачи управления ОС, сочетается с дальнейшим использованием регистра XROMBAR.

Под BIOS'ом читаю через регистры 0xCFC, 0xCF8. Конфигурационное пространство PCI устройств доступно. Да и вообще для этого также существует механизм прерывания 1Ah.

Все верно, в PCI Cfg вы залезаете через указанные вами два смещения. Но смещение в регистре XROMBAR - лежит уже в адресном пространстве PCI Memory! Вы должны сначала узнать с какого адреса в адресах процессора меппится PCI Memory, и потом уже к этому значению добавить свой XROMBAR. Если я правильно вас понял

p.s.
CODE

The PC-compatible specific set of steps for the system POST code when handling each
expansion ROM are:
1. Map and enable the expansion ROM to an unoccupied area of the memory address
space.
2. Find the proper image in the ROM and copy it from ROM into the compatibility area
of RAM (typically 0C0000h to 0E0000h) using the number of bytes specified by
Initialization Size.
3. Disable the Expansion ROM Base Address register.
4. Leave the RAM area writable and call the INIT function.
5. Use the byte at offset 02h (which

В общем, вам нужно узнать куда меппится PCI Memory(или самому настроить окно), самому прописать EXROMBAR(через pci-cfg) и только потом уже делать дамп.

p.p.s. это всё также означает, что EXROMBAR_Ena не обязательно опускать. Если ОС считает, что зарезервированная в PCI MEm область (под EXROM) никому не мешает, то EXROMBAR_Ena можно и не гасить.
lsvmo
Доброго всем дня!
Делаю образ 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 должно счтаться от него, а если она не совпадает, то и образ запускаться не должен...
Shivers
Если у вас ПЛИС, то запустите сигнал тап, чип скоп, или что там ваша ПЛИС поддерживает. И посмотрите, сколько адресов копируется, и вообще что на шине происходит. Теоретически, в ПЛИС может стоять ограничение на размер pci memory, но 16кб это както .. маловато, не думаю.
Скорее всего ошибка в коде, но без (встроенного) анализатора это все как на кофейной гуще гадать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.