Конфигурационное пространство PCI
Конфигурационное пространство PCI (англ. PCI configuration space) — адресное пространство для конфигурации PCI, в дополнение к типичным адресным пространствам памяти и ввода-вывода.
Одним из главных усовершенствований шины PCI по сравнению с другими архитектурами ввода-вывода стал её конфигурационный механизм, обладающий конфигурационным адресным пространством, состоящим из 256 байт, которые можно адресовать, зная номер шины PCI, номер устройства и номер функции в устройстве. Первые 64 байта из 256 стандартизированы, а остальные регистры могут быть использованы по усмотрению изготовителя устройства.
Стандартизированные регистры
[править | править код]Регистры Vendor ID и Device ID идентифицируют устройство и обычно называются PCI ID. Шестнадцатиразрядный регистр Vendor ID выдаётся организацией PCI SIG. Шестнадцатиразрядный регистр Device ID назначается изготовителем устройства. Существует проект создания базы данных всех известных значений регистров Vendor ID и Device ID. (Смотри список ссылок.)
Первые 16 двойных слов конфигурационного адресного пространства (в соответствии с PCI Local Bus Specification 2.2):
Адрес | 31 ... 24 |
23 ... 16 |
15 ... 8 |
7 ... 0
|
---|---|---|---|---|
0x00 | DeviceID | VendorID | ||
0x04 | Status | Command | ||
0x08 | Class Code | Revision ID | ||
0x0C | BIST | Header Type | Latency Timer | Cache Line Size |
0x10 | Base Address Register 0 | |||
0x14 | Base Address Register 1 | |||
0x18 | Base Address Register 2 | |||
0x1C | Base Address Register 3 | |||
0x20 | Base Address Register 4 | |||
0x24 | Base Address Register 5 | |||
0x28 | Cardbus CIS pointer | |||
0x2C | SubsystemID | Subsystem Vendor ID | ||
0x30 | Expansion ROM Base Address | |||
0x34 | Reserved | Capabilities pointer | ||
0x38 | Reserved | |||
0x3C | Max_Lat | Min_Gnt | Interrupt Pin | Interrupt Line |
Регистры DeviceID, VendorID, Status, Command, Class Code, Revision ID, Header Type являются обязательными для всех PCI-устройств (для многих типов устройств обязательными являются также регистры Subsystem ID и Subsystem Vendor ID).
Все остальные регистры являются опциональными.
Автоматическая инициализация аппаратуры с помощью конфигурационного пространства
[править | править код]Для того, чтобы обращаться к устройству через адресное пространство памяти или ввода-вывода, системное программное обеспечение или ОС программирует базовые адресные регистры (англ. Base Address Registers, также называемые BAR’ами), посылая конфигурационные команды PCI-контроллеру. В начале загрузки системы все PCI-устройства находятся в неактивном состоянии, им не назначены адреса, по которым драйверы устройств могут взаимодействовать с ними. Либо BIOS, либо сама операционная система обращается к PCI-слотам и настраивает BAR’ы в конфигурационном адресном пространстве. Значения BAR’ов действительны всё время, пока система включена. При отключении питания значения этих регистров теряются до следующей загрузки, в процессе которой процедура настройки повторяется. Так как этот процесс полностью автоматизирован, пользователь компьютера освобождается от непростой задачи конфигурирования нового аппаратного обеспечения, подключаемого к шине PCI (в отличие, например, от шины ISA, базовые адреса устройств, подключаемых к которой, приходилось настраивать перемычками или переключателями).
Любое PCI-устройство, не являющееся мостом (см. PCI-to-PCI Bridge Architecture Specification. Revision 1.1) может иметь до шести BAR’ов, каждый из которых отвечает за определённый диапазон адресов в адресном пространстве памяти или ввода-вывода. Кроме того, устройство может иметь firmware).
Доступ к PCI через порты I/O
[править | править код]Для работы с шиной PCI в PC-AT и совместимых машинах выделено два основных порта.
0CF8h -W порт адреса Address
0CFCh RW порт данных Data
Оба порта являются 32-битными.
Порт адреса представляет собой следующую 32-битную структуру:
Порт адреса задает шину, устройства и адрес регистра в конфигурационном пространстве устройства.
Грубо говоря, устройство — это физически присутствующее устройство. А функция — это логическое устройство.
+---+---------+-------+----------+--------+---------------+-+-+
|31 |30 24|23 16|15 11|10 8|7 2|1|0|
+---+---------+-------+----------+--------+---------------+-+-+
| с | резерв |шина |устройство| функция|Индекс регистра|0|0|
+---+---------+-------+----------+--------+---------------+-+-+
С — флаг доступа к устройству.
Младшие два бита в порту адреса всегда 0.
По окончании работы с устройством следует сбросить адрес в 0.
Если в ответ на запрос нулевого регистра возвращается 0FFFFh, то устройства не существует.
Vendor ID (ID производителя) — для Intel это 8086h, но не может принимать значение 0FFFFh.
Device ID (ID устройства) принимает различные значения
Revision ID (ID модификации) обозначает номер модификации устройства, назначается производителем.
Class Code (Код класса) состоит из трех частей
+---------------+--------------+---------------------+
|23 16|15 8|7 0|
+---------------+--------------+---------------------+
|Base Class Code|Sub Class Code|Programming Interface|
+---------------+--------------+---------------------+
Base Class Code — базовый класс, сокращенно BCC.
Sub Class Code — подкласс, сокращенно SCC.
Programming Interface — интерфейс, сокращенно PI.
Header Type (тип заголовка) — если бит 7 равен 1, то устройство содержит несколько функций.
Если бит 6 равен 0, то заголовок стандартный. Стандартные заголовки:
00 — стандартный смотри выше.
01 — стандартный для моста PCI-to-PCI
02 — стандартный для моста CardBus.
Ссылки
[править | править код]- The Linux PCI ID Repository, база данных ID PCI-устройств
- PCI Vendor and Device Lists — том, где можно найти драйвер под устройство.
Для улучшения этой статьи желательно:
|