PCIDEV - определение PCI устройств

...
  • А какая ценность по твоему мнению в выводе прерываний назначенных БИОС?
    Вообще-то я писал о номерах IRQ а не векторах прерываний. Это все же разные вещи. Думаю что такая информация была бы полезна при создании драйверов устройств. Неплохо сравнить назначаемые БИОС IRQ на разных чипсетах.
    Что касается БИОС и USB то БИОС нfверное и не должна определять все устройства по USB подключённые. Это должны делать драйверы самих устройств.
  • Первая версия была выпущена 19 месяцев назад и мы можем отпразновать эту дату с PCIDEV 2.00 ( http://www.coolthemes.narod.ru/pcidev.html ). Спасибо Марату.
  • Оффтоп: нужен ли форк PCIDEV, который будет давать информацию о видяхах, как CPUID дает её о процессоре? Пока я добавил пару строк для вывода только устройств класса 3 (gfx) и нашел на винче (неполный) список Device id для 27 вендоров видях. Прога по идее должна выдавать разрешение экрана, количество бит на пиксель, название видяхи, размер памяти видяхи (или хотя бы размер апертуры AGP), список разрешений, список поддерживаемых технологий (в спецификации AGP 3.0 про это туманно написано - возможно, что у каждого вендора свой формат хранения возможностей), возможно какую-то информацию по Vesa. Также надеюсь на помощь Mike.dld и Serge, если в такой проге есть какая-то нужда.
  • Было бы неплохо. Для ядра пригодится код надёжного определения размера видеопамяти, а то с VESA были проблемы. Готов помочь чем смогу.
  • To Serge
    Serge wrote:Было бы неплохо. Для ядра пригодится код надёжного определения размера видеопамяти, а то с VESA были проблемы. Готов помочь чем смогу.
    VESA - это самый надежный способ. И если уж с ним проблемы, то новернека что-то не в порядке либо с кодом либо с видюхой.
    Размер видео памяти можно определить и через PCI.

    А вот про технологии у видео карт не знаю ничего. Уверен что каждый вендор по свойму хранит информацию об этом.

    Насчет IRQ - большинство из них стандартерезировано. И просто так менять нельзя.
  • Pavia

    >Размер видео памяти можно определить и через PCI.

    Каким образом?
  • Serge wrote:Pavia

    >Размер видео памяти можно определить и через PCI.

    Каким образом?
    В конфигурационном пространстве PCI у видео карты как и у лебого другого устройства есть BAR -регистры. Они определяют положение и диапозон памяти и портов ввода вывода который нужен для устройства.

    Небольшое отступление.
    BAR регистр или Bass address (базовый адрес)-это адрес регистров устройства. Обычно эти регистры отображаются на физические адреса памяти. Или более устаревшая модель в адресатное пространство портов ввода/вывода. Это и есть основные регистры PCI устройства, через который происходит программирование, но информация эта вендор зависимая.

    Более детально о Bass address.

    Если все биты 32 установлены в 0 то Bass address не записан в ячейку.
    Если бит 0 установлен в 1 то Bass address задает базовый адрес в пространстве портов I/O.
    Иначе если бит 0 установлен в 1 то Bass address задает базовый адрес в пространстве адресов памяти.
    Если наш Bass address задает базовый адрес в пространстве портов I/O. То он имеет следующий формат.

    Code: Select all

    +------------------------------------------------+-+-+
    |31                                             2|1|0|
    +------------------------------------------------+-+-+
    |         Bass address                           |0|1|
    +------------------------------------------------+-+-+
    
    32 бита.
    Нулевой бит указывает на то, что это пространство портов I/O.
    Первый бит зарезервирован.
    Остальные указываюсь адрес базового порта ввода вывода.

    Если наш Bass address задает базовый адрес в пространстве памяти. То он имеет следующий формат.

    Code: Select all

    +--------------------------------------------+-+-+-+-+
    |                                           4|3|2|1|0|
    +--------------------------------------------+-+-+-+-+
    |         Bass address                       | |   |0|
    +--------------------------------------------+-+-+-+-+
    
    Либо 32 бита, либо 64 бита.
    Нулевой бит указывает на то, что это пространство памяти.
    Следующие два бита 1 и 2 определяют тип записи.
    00- 32 битная запись любой адрес
    01- 32 битная запись, но адрес меньше мегабайта.
    02- 64 битная запись любой адрес
    03- зарезервировано
    Бит 3 – Prefetchable
    Остальные биты базовый адрес.
    Если вы хотите узнать размер памяти, которая отображается в адресное пространство. Или число портов ввода вывода. То вы должны выставить максимальное значение FFFFFFFF и прочитав его. Устройство занулит биты, которые соответствуют его диапазону адресов. Замечу, что выставляемый адрес должен быть кратным размеру его диапазона, выровнен по этому размеру.
    Ищем видео карту, вернее ее конфигурационное пространство. Узнаем размер BAR регистров(их там несколько), тот который требует наибольшей диапазон тот и отвечает за положение и размер видео памяти.
    Узнаем размер так читаем значение из BAR регистр, чтобы в последствии можно было его восстановить. Пешим в BAR регистр FFFFFFFFh читаем в ответ приходит нечто наподобие
    F800000Ch зануляем первые 3-4 бита они служебные
    F800000Ch and FFFFFFF0 получаем
    F8000000h дальше отрицание neg
    8000000h -128МБайт.
    Там несколько BAR регистров один из них видео память другой регистры отображенные в адресатное пространство памяти остальные не задействованы. Выбираем максимальное- это нужно потому что у разных видео карт разные BAR регистры имеют разные предназначения.
    Можно не выбирать максимально составить табличку для разных видео карт.
    Восстанавливаем адрес пишем в BAR сохраненное значение.
  • Pavia
    Мне не очень нравится идея записывать данные в BAR. Не ясно как это может повлиять на работу карт. Это рекомендованный разработчиками PCI способ или хакерский приём?
  • Serge wrote:Pavia
    Мне не очень нравится идея записывать данные в BAR. Не ясно как это может повлиять на работу карт. Это рекомендованный разработчиками PCI способ или хакерский приём?
    То что в бар можно писать и что адрес подкорректируется описано в спецификации на PCI. В основном применяется данный способ БИОС, что бы установить начальные адреса.
    Также этот способ используется в программах для определения параметров железа.

    А во вторых мы восстанавливаем адрес.
    Еще нужно позаботиться, что бы никто не обращался к железу. Пока мы будем писать читать значения. Иначе это может привести к ошибкам. Возможно есть еще какие-то хитрости о которых я не знаю.
  • Pavia

    > Возможно есть еще какие-то хитрости о которых я не знаю

    Вот эти хитрости и беспокоят. Сама по себе запись в регистры PCI не проблема, но как на это потом отреагирует железо ? Может после такого перепрограммирования надо делать сброс всего устройства. Не даром ведь у видеокарт есть своя БИОС.
  • В 2004-м году я поигрался с мю-эн-ОС. Загрузился с дискеты, посмотрел все 7 ил 9 программ, вышел. С тех пор у меня в загрузочном экране биос (там где информация об ОЗУ, процесссоре и т.п.) все содержимое экрана как будто сдвинуто влево таким образом, что первые две буквы предложений не видны... Видимо надо где-то хранить исходное содержание регистров PCI, а потом их восстанавливать при выходе из ОС (а что будет, если ядро повиснет???).
  • Serge wrote:Pavia

    > Возможно есть еще какие-то хитрости о которых я не знаю

    Вот эти хитрости и беспокоят. Сама по себе запись в регистры PCI не проблема, но как на это потом отреагирует железо ? Может после такого перепрограммирования надо делать сброс всего устройства. Не даром ведь у видеокарт есть своя БИОС.
    Сброс не нужен так как значения мы возвращаем в исходное тут же. Я сам видел как другие программы так делают и сам делал в своей. Тот же виндоус и линукс узнают диапазоны памяти и портов ввода/вывода у различных устройств таким же способом.

    То что писать можно и это недолжно привадить к ошибкам написано в спецификации на PCI.
    and host bridges can merge processor writes (refer to
    Section 3.2.3) into this range(45) without causing errors.
    Bits 0-3 are read-only.
    The number of upper bits that a device actually implements depends on how much of the
    address space the device will respond to.

    (45) Any device that has a range that behaves like normal memory should mark the range as prefetchable. A
    linear frame buffer in a graphics device is an example of a range that should be marked prefetchable.

    Отсюда и другой способ определения что этот BAR регистр отвечает за память видео карты а не ее регистр 3 бит prefetchable.

    Хитрость заключается в том, что когда мы перепрограммируем на FFFFFFFFh память передвигается в самый верх и перекрывается с другими системными областями. Такими как BIOS, контролер APIC и PM Timer и др. По этому мы и возвращаем диапазон на старое место.
    Ну и нужно позаботиться, что бы небело прерываний которые могут обращаться к выше перечисленным вещам. А также к памяти и портам устройства. Запрет прерываний в полной мере должен решать эту проблему.

    БИУС у видео карт нужен для реализации функции INT 10 и особенно прерываний VESA.
    После запуска БИУСА видеокарты. Он делает первичную настройку видео карты. Устанавливает прерывание. После чего вход на первичную инициализацию блокируется. В старых видео картах идет обращение только через стандартные порты ввода/вывода, которые мы не меняем. Есть мнение что в новых видео картах при работе с VESA идет обращение к регистрам расположенных в памяти. Но обращение к ним будет идти только при вызове прерывания.



    To Wildwest
    То что экран сдвинулся это к PCI регистрам не имеет отношение. Мало вероятно что это имеет отношение к Колибри ОС.
    Если это LCD монитор то на них есть функция выравнивания позиции экрана. Насчет CRT сказать не могу. Но вроде они тоже запоминают позицию при разных разрешениях.
    Исходное значение хранить не нужно. После выключения питания параметры сбрасываются. Часть выставляет устройство. А другую уже инициирует БИУС.
    Повиснет и повиснет. Мы же минеям регистры только на короткий срок, и тут же их восстанавливаем.
  • Pavia
    Попробовать конечно можно, но уж больно засекреченные это устройства. Желательно точно знать как отреагирует видеокарта на запись неправильных значений в её конфиг. регистры.
  • Я выше говорил про все PCI устройства и их стандартные регистры, не только видео карту. Это поможет в распределении ресурсов, я считаю что следует пересмотреть этот момент и добавить в ядро ОС.

    В часть регистров конфигурационного пространства ты просто не запишишь так как они только для четения. А запись в другии регистры может привести к различным последствиям. Но то что ты там что либо испортишь мало вероятно. А если и испортишь то перезагрузка востановит.
    Про последствия неправельной записи в регистры BAR - я не уточняю, так как многое описал.

    Могу заверить что ничего страшного в этом нет. Я вот понимаю страшно мне было SPD перепрошивать(разумеется программа своя), но нужно.

    Насчет видео карты, описание есть только у INTEL для их видео карт. Пролистал описание собственно там нет никаких особенных регистров, только стандартные.
    Судя по тем знаниям что есть у меня о других видео картах, там тоже нет ничего особенного(только стандартные регистры). Программирование видео карт в драйверах идет через регистры отображенные в память базовый адресс которых задается в одном из BAR регистров в конфигурационном пространстве.
    Правда не знаю как настраивается GART, возможно там задействован конфигурационное пространство.

    PS. Рассикретим если надо.
    PPS Моя программо под дос для определения параметров железа, в разделе PCI выводятся диапозоны памяти и портов воода/вывода - собственно о чем я и говорю.
    http://footballtabl.h15.ru/ivan/info%200.623.zip
    Сори вчера не тот билд предоставил.
    В ближайшее время возможно обновление до версии 0.7
    Last edited by Pavia on Tue Mar 13, 2007 7:43 pm, edited 1 time in total.
  • Who is online

    Users browsing this forum: No registered users and 1 guest