OSDev
http://osdev.su/

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

Автор:  Bargest [ 07 дек 2011, 19:41 ]
Заголовок сообщения:  PCI

Собираюсь реализовывать работу с PCI. Посоветуйте пожалуйста документации или какие статьи по нему. Спецификацию PCI начал читать - там больше аппаратной части. А мне нужно именно сама работа: как определить все PCI устройства, как писать/читать их регистры, ...

Автор:  pavia [ 07 дек 2011, 20:20 ]
Заголовок сообщения:  Re: PCI

А чего там разбираться?
Обсуждали сто раз. Поищи.

Есть 2 порта. Принцип похож на общение с другими устройствами. В первый устанавливаешь адрес из второго читаешь пишешь данные. *)
Есть такое понятие как конфигурационное пространство(КФП). Это набор регистров которые есть у каждого устройства PCI.
Вот адрес задает шину устройство, функцию(логическое устройство), а также номер регистра в КФП.
Регистр 4 байта.

Для того чтобы найти все устройства.
1. Узнать число шин. Варианты:
a) Прочитать из PIR table сигнатура "$PCI"
б) Биос вызывать нужное прерывание
с) путём подсчёта мостов PCI-PCI
2. Перебираешь все устройства и шины. Можно совместить с пунктом c).
Читаешь нулевой регистр и по нему определяешь присутствие или отсутствие устройства.
3. По нулевому устройству определяешь есть ли логические устройства.

Из КФП читаешь регистры с базовых адресов(РБА/BAR).
Надо сказать что БРА бывают двух типов
I. которые указывают либо на базовый адрес порта ввода/вывода доступные через команды in out.
II. которые указывают либо на базовый адрес порта ввода/вывода отображенного в память(ПВВОП/ MMIO) доступные через команды mov [],r и другии команды работы с памятью.


*) Там есть ещё флаг C который, как я понимаю служит сигнализацией что адрес целиком записан.

Автор:  pavia [ 07 дек 2011, 20:30 ]
Заголовок сообщения:  Re: PCI

РБА/BAR служит для непосредственной работы с устройством.
Описание и принцип действия этих портов читается из спецификации на конкретное устройство.

Отдельно надо поговорить про IRQ. В КФП просто информационное поле для IRQ и запись в него не влияет на устройство.
За переназначение отвечает IRQ routing, реализация зависит от железа. Специфика прерываний описана в спецификации PCI.

Автор:  Bargest [ 07 дек 2011, 21:02 ]
Заголовок сообщения:  Re: PCI

Спасибо большое!
А каков формат PIR table? В плане где в ней искать количество шин?
И правильно ли я понял, что получив число шин, нужно тыркаться во все устройства перебором?
И еще, как отличить BAR разных видов? Всмысле как определить, какие из них указывают на адрес порта, а какие на память (кроме как "число маленькое - значит порт")? Кстати, в вике пишут, что их надо не читать, а как раз наоборот, мол изначально они сами частенько не выставлены.

Автор:  pavia [ 08 дек 2011, 05:29 ]
Заголовок сообщения:  Re: PCI

a)
Цитата:
А каков формат PIR table? В плане где в ней искать количество шин?

http://ru.osdev.wikia.com/wiki/PCI_IRQ_Routing_Table_Specification
b)
http://ru.osdev.wikia.com/wiki/PCI_BIOS
c) Уже сказал. Перебор с подсчётом мостов.


Цитата:
И правильно ли я понял, что получив число шин, нужно тыркаться во все устройства перебором?

Да правильно.

Цитата:
И еще, как отличить BAR разных видов? Всмысле как определить, какие из них указывают на адрес порта, а какие на память (кроме как "число маленькое - значит порт")? Кстати, в вике пишут, что их надо не читать, а как раз наоборот, мол изначально они сами частенько не выставлены.

Если в БИОСе выбрано PnP OS то должно выставляться. Вот если не выбрано, то возможно надо выставлять. Задачка не простая. Так как зависимость по железу будет большой. Пока советую просто читать. А вот с установкой если столкнётесь то делайте под конкретную материку.

Автор:  pavia [ 08 дек 2011, 05:33 ]
Заголовок сообщения:  Re: PCI

По поводу типа BAR определяется по флагам в самом регистре читай
PCI Local Bus Specification. Revision 3.0

Автор:  Bargest [ 08 дек 2011, 18:49 ]
Заголовок сообщения:  Re: PCI

Благодарю!
Только вот не нашел в PIR table поля, отвечающего за количество шин. Пожалуй заюзаю биос или подсчет мостов.

Подсчет мостов - значит, перечисляем все на первой шине, находим мост (если есть), перечисляем на следующей? Как тогда определить, что встретили мост?

Автор:  Bargest [ 14 дек 2011, 22:17 ]
Заголовок сообщения:  Re: PCI

UP. Читать регистры научился, но все еще не знаю, как узнать, когда встретил мост.

Автор:  pavia [ 16 дек 2011, 13:40 ]
Заголовок сообщения:  Re: PCI

Header Type (тип заголовка) – если бит 7 равен 1 то устройство содержит несколько функций.
Если бит 6 равен 0 то заголовок стандартный. Стандартные заголовки:
00 – стандартный смотри выше.
01 – стандартный для моста PCI-to-PCI
02 – стандартный для моста CardBus.

Автор:  Bargest [ 17 дек 2011, 13:21 ]
Заголовок сообщения:  Re: PCI

Спасибо. Перечисление сделал, работает.
Теперь немного наивный вопрос: А есть способ определить, какого типа устройство? В USB насколько я знаю есть несколько стандартных типов устройств. Есть ли подобное в PCI, чтобы система могла однозначно сказать: "Это видеокарта. А это сетевая. А это контроллер дисков."?

К чему это я: хочу работать с дисками через контроллер дисков PCI-ный. И нормальный DMA сделать.

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