PersCom — Компьютерная Энциклопедия Компьютерная Энциклопедия

Что такое душ виши.

PCI и PCI-X

Общая информация

В шину PCI изначально заложены возможности автоматического конфигурирования системных ресурсов (пространств памяти и ввода-вывода и линий запроса прерываний). Автоматическое конфигурирование устройств (выбор адресов и прерываний) поддерживается средствами BIOS и ОС; оно ориентировано на технологию PnP. Стандарт PCI определяет для каждой функции конфигурационное пространство размером до 256 регистров (8-битных), не приписанных ни к пространству памяти, ни к пространству ввода-вывода. Доступ к ним осуществляется по специальным командам шины Configuration Read и Configuration Write, вырабатываемым с помощью одного из аппаратно-программных механизмов, описанных далее. В этом пространстве есть области, обязательные для всех устройств, и специфические. Конкретное устройство может иметь регистры не во всех адресах, но должно поддерживать нормальное завершение для адресуемых к ним операций. При этом чтение несуществующих регистров должно возвращать нули, а запись выполняться как холостая операция.

Конфигурационное пространство функции начинается со стандартного заголовка, в котором содержатся идентификаторы производителя, устройства и его класса, а также описание требуемых и занимаемых системных ресурсов. Структура заголовка стандартизована для обычных устройств (тип 0), мостов PCI-PCI (тип 1), мостов PCI-CardBus (тип 2). Тип заголовка определяет расположение общеизвестных регистров и назначение их бит. После заголовка могут располагаться регистры, специфичные для устройства. Для стандартизованных свойств (capability) устройств (например, управления энергопотреблением) в конфигурационном пространстве имеются блоки регистров известного назначения. Эти блоки организуются в цепочки, на первый такой блок есть ссылка в стандартном заголовке (CAP_PTR); в первом же регистре блока есть ссылка на следующий блок (или 0, если данный блок — последний). Таким образом, просмотрев цепочку, конфигурационное ПО получает список всех доступных свойств устройства и их позиций в конфигурационном пространстве функции. В PCI 2.3 определены следующие идентификаторы CAP_ID, часть из которых мы рассмотрим: 

  • 01 — управление энергопотреблением;
  • 02 — порт AGP;
  • 03 — VPD (Vital Product Data), данные, дающие исчерпывающее описание аппаратных (возможно, и программных) свойств устройств;
  • 04 — нумерация слотов и шасси;
  • 05 — прерывания MSI;
  • 06 — Hot Swap, горячее подключение для Compact PCI;
  • 07 — протокольные расширения PCI-X;
  • 08 — зарезервировано для AMD;
  • 09 — на усмотрение производителя (Vendor Specific);
  • 0Ah — отладочный порт (Debug Port);
  • 0Bh — PCI Hot Plug, стандартное обеспечение «горячего подключения».

В PCI-X для устройств Mode 2 конфигурационное пространство расширено до 4096 байт; в расширенном пространстве могут присутствовать расширенные описания свойств.

После аппаратного сброса (или при включении питания) устройства PCI не отвечают на обращения к пространству памяти и ввода-вывода, они доступны только для операций конфигурационного считывания и записи. В этих операциях устройства выбираются по индивидуальным сигналам IDSEL, чтением регистров конфигурационное ПО узнает о потребностях в ресурсах и возможных вариантах конфигурирования устройств. После распределения ресурсов, выполняемого программой конфигурирования (во время теста POST или при загрузке ОС), в конфигурационные регистры устройства записываются параметры конфигурирования (базовые адреса). Только после этого устройствам (точнее, функциям) устанавливаются биты, разрешающие им отвечать на команды обращения к памяти и портам ввода-вывода, а также самим управлять шиной. Для того чтобы всегда можно было найти работоспособную конфигурацию, все ресурсы, занимаемые картами, должны быть перемещаемыми в своих пространствах. Для многофункциональных устройств каждая функция должна иметь собственное конфигурационное пространство. Устройство может одни и те же регистры отображать и на память, и на пространство ввода-вывода. При этом в их конфигурационных регистрах должны присутствовать оба описателя, но драйвер должен использовать только один способ обращения (предпочтительно через память).

В заголовке конфигурационного пространства описываются потребности в адресах трех типов:

  • регистры в пространстве ввода-вывода (I/O Space));
  • регистры ввода-вывода, отображенные на память (Memory Mapped I/O). Это область памяти, обращения к которой должны производиться в строгом соответствии с тем, что запрашивает инициатор обмена. Обращение к этим регистрам может изменять внутреннее состояние периферийных устройств;
  • память, допускающая предвыборку (Prefetchable Memory). Это область памяти, «лишнее» чтение которой (с неиспользуемыми результатами) не приводит к побочным эффектам, все байты считываются независимо от сигналов BE[3:0]#, и записи отдельных байтов мостом могут быть объединены (то есть это память в чистом виде).

Потребности в адресах указываются в регистрах базовых адресов — BAR (Base Address Register). Конфигурирующая программа может определить и размеры требуемых областей. Для этого после аппаратного сброса она должна считать и сохранить значения базовых адресов (это будут адреса по умолчанию), записать в каждый регистр FFFFFFFFh и снова считать их значение. В полученных словах нужно обнулить биты декодирования типа (биты [3:0] для памяти и биты [1:0] для вводавывода), инвертировать и инкрементировать полученное 32-битное слово — результатом будет длина области (для портов биты [31:16] игнорировать). Метод подразумевает, что длина области выражается числом 2n и область выровнена естественным образом. Стандартный заголовок вмещает до 6 регистров базового адреса, но при использовании 64-битной адресации число описываемых блоков сокращается. Неиспользуемые регистры BAR при чтении всегда должны возвращать нули.

В PCI имеется поддержка старых (legacy) устройств (VGA, IDE), которые сами себя таковыми объявляют по коду класса в заголовке. Их традиционные (фиксированные) адреса портов не заявляются в конфигурационном пространстве, но как только устанавливается бит разрешения обращения к портам, устройствам разрешается ответ и по этим адресам.