OSDev
http://osdev.su/

PCI VGA Cards
http://osdev.su/viewtopic.php?f=7&t=504
Страница 1 из 4

Автор:  DJ PhoeniX [ 06 мар 2012, 20:20 ]
Заголовок сообщения:  PCI VGA Cards

Приветствую.
Где-то 2 месяца назад занялся осдевом, раскурил пачку мануалов, и перешёл к практике. А практика следующая:
Есть код:
Код:
#define outportl(p, l) asm("outl %d0, %w1"::"a"(l), "d"(p))
#define inportl(l, p) asm("inl %w1, %d0":"=a"(l):"d"(p))
int pci_read(char bus, char slot, char func, char offset){
   int address = (int)((((int)bus & 0xFF) << 16) | (((int)slot & 0xFF) << 11) | (((int)func & 0xFF) << 8) | (offset & 0xfc) | ((int)0x80000000));
   outportl(PCI_CONFIG_ADDRESS, address);
   inportl(address, PCI_CONFIG_DATA);
   return address;
}
short video_find_pci(){
   char bus, buscount=1, slot, bar;
   char ht, cc, sc;
   for(bus=0; bus<buscount; bus++){
      for(slot=0; slot<32; slot++){
         ht  = (pci_read(bus, slot, 0, 0x0C) >> 16) & 0xFF;
         if(ht == 0x01) {buscount++; continue;}
         if(ht == 0x02) continue;
         cc  = (pci_read(bus, slot, 0, 0x08) >> 24) & 0xFF;
         sc  = (pci_read(bus, slot, 0, 0x08) >> 16) & 0xFF;
         if(((cc == 0x00) && (sc == 0x01)) || (cc == 0x03))
            return ((short)bus << 8) | (short)slot;
      }
   }
   return 0xFFFF;
}

Код ищет PCI-видеокарточки.
На 7 контрольных устройствах (виртуалбокс, варя, 2 нетбука, ноутбук, планшет и домашний сервер-файлопомойка) он сработал идеально, но на компьютере друга решил, что видеокарточки нет. Причины обнаружить не удалось. Согласен, что 7/8 - хороший результат для новичка, но хотелось бы 100% детекта. Собственно, какие варианты, почему не работает?

И ещё вопрос в тему: как определить, какой из BAR-ов является LFB? Пока что делаю это по определению, какой из них выделяет больше всего памяти, но чую чакрами, что это не есть правильно.

Автор:  Станислав [ 07 мар 2012, 06:43 ]
Заголовок сообщения:  Re: PCI VGA Cards

Зачем вам искать видеокарточки? Что вы с ними делаете? По каким условиям вы их ишите?
Сделайте просто вывод всех контролеров с PCI шин и их класкоды, номер фирмы по девайсу и модели по вендору, её функцию, шину, её номер прерывания и чтонибудь ещё, и если она там будет, то вы её увидете и все другие устройства.

Автор:  Bargest [ 07 мар 2012, 10:14 ]
Заголовок сообщения:  Re: PCI VGA Cards

Станислав, смысл не в отображении имен устройств, а в написании простейшего драйвера для работы с видео. Думаю, это очевидно. Для меня сей вопрос тоже актуален.

Автор:  pavia [ 07 мар 2012, 10:53 ]
Заголовок сообщения:  Re: PCI VGA Cards

DJ PhoeniX, вы функции не перебираете, а надо.
LFB можно узнать через VESA, самый универсальный способ. И второй способ составить табличку Vendor ID Device ID - BAR
А чтобы понять где ошибка лучше весь список вывести и сравнить с чем либо.

Автор:  DJ PhoeniX [ 07 мар 2012, 12:14 ]
Заголовок сообщения:  Re: PCI VGA Cards

Станислав писал(а):
Зачем вам искать видеокарточки? Что вы с ними делаете? По каким условиям вы их ишите?

Зачем и что я делаю - по-моему очевидно: хочу получить адрес LFB и работать с ним, а также в последствии использовать другие данные из этого.
По каким условиям - вроде, понятно из кода. Class_00&Subclass_01 и Class_03.
pavia писал(а):
DJ PhoeniX, вы функции не перебираете, а надо.

Да, я уже думал об этом. Спасибо за наводку, сегодня попробую.
pavia писал(а):
LFB можно узнать через VESA, самый универсальный способ. И второй способ составить табличку Vendor ID Device ID - BAR
А чтобы понять где ошибка лучше весь список вывести и сравнить с чем либо.

VESA решил не использовать, как и остальной BIOS. А табличка выйдет довольно громоздкой. Пока что мой метод нигде не ошибся, так что пользуюсь им.

Автор:  pavia [ 07 мар 2012, 14:31 ]
Заголовок сообщения:  Re: PCI VGA Cards

В BAR есть ещё prefetch bit, можно по нему еще попробовать. Теоретически он присутствует на портах он должен отключать кэширование на чтение, а на ОЗУ отсутствует может и отсутствовать. За подробностями читай спецификацию PCI.

Автор:  DJ PhoeniX [ 07 мар 2012, 14:56 ]
Заголовок сообщения:  Re: PCI VGA Cards

Префетч-бит на всех протестированных девайсах установлен, добавил фильтрацию по нему.
MF-устройства сделал, жду возможности проверить работу на ПК друга. Это реально из-за них, ибо видяха у него на 4 басе, а один из мостов не на нулевой функции, так что до неё просто не доходил перебор. Класс 3, по фильтру совпадает, так что теперь должно работать...

Автор:  valeri [ 14 мар 2012, 08:38 ]
Заголовок сообщения:  Re: PCI VGA Cards

DJ PhoeniX писал(а):
И ещё вопрос в тему: как определить, какой из BAR-ов является LFB? Пока что делаю это по определению, какой из них выделяет больше всего памяти, но чую чакрами, что это не есть правильно.


Если вы ищете правильный способ, то, как правильно говорили выше, это VESA, даже стандартный видеодрайвер Windows, вплоть до Windows 8, пока использует его.

Автор:  DJ PhoeniX [ 14 мар 2012, 11:12 ]
Заголовок сообщения:  Re: PCI VGA Cards

valeri писал(а):
Если вы ищете правильный способ, то, как правильно говорили выше, это VESA, даже стандартный видеодрайвер Windows, вплоть до Windows 8, пока использует его.

Я ищу самый правильный из доступных. :)

Автор:  DJ PhoeniX [ 26 мар 2012, 18:36 ]
Заголовок сообщения:  Re: PCI VGA Cards

С детектом разобрался, нашёл LFB и I/O-порты. Вопрос возник новый: какие команды в порты отсылать для работы с видеорежимами?

Поигравшись с VMWARE+IDA, получил километровый лог "чего куда", но даже при его полном воссоздании режим не меняется.

Страница 1 из 4 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/