В шину PCI изначально заложены возможности автоматического конфигурирования системных ресурсов (пространств памяти и ввода-вывода, а также линий запроса прерываний). Автоматическое конфигурирование устройств (выбор адресов и прерываний) поддерживается средствами BIOS и ОС; оно ориентировано на технологию РпР. Стандарт PCI определяет для каждой функции конфигурационное пространство размером до 256 8-битных регистров, не приписанных ни к пространству памяти, ни к пространству ввода-вывода. Доступ к ним осуществляется по специальным командам шины Configuration Read и Configuration Write, вырабатываемым с помощью аппаратно-программного механизма.
Конфигурационное пространство функции начинается со стандартного заголовка, в котором содержатся идентификаторы производителя, устройства и его класса, а также описание требуемых и занимаемых системных ресурсов. После заголовка могут располагаться регистры, специфичные для устройства. Для стандартизованных свойств (capability) устройств (например, управления энергопотреблением) в конфигурационном пространстве имеются блоки регистров известного назначения. Эти блоки организуются в цепочки; просмотрев цепочку, конфигурационное ПО получает список всех доступных свойств устройства.
В PCI-X для устройств Mode 2 конфигурационное пространство расширено до 4096 байт; в расширенном пространстве могут присутствовать расширенные описания свойств.
После аппаратного сброса (или при включении питания) устройства PCI не отвечают на обращения к пространству памяти и ввода-вывода, они доступны только для операций конфигурационного считывания и записи. В этих операциях устройства выбираются по индивидуальным сигналам IDSEL, чтением регистров конфигурационное ПО узнает о потребностях в ресурсах и возможных вариантах конфигурирования устройств. После распределения ресурсов, выполняемого программой конфигурирования (во время теста POST или при загрузке ОС), в конфигурационные регистры устройства записываются параметры конфигурирования (базовые адреса). Только после этого устройствам (точнее, функциям) устанавливаются биты, разрешающие им отвечать на команды обращения к памяти и портам ввода-вывода, а также самим управлять шиной. Для того чтобы всегда можно было найти работоспособную конфигурацию, все ресурсы, занимаемые картами, должны быть перемещаемыми в своих пространствах. Для многофункциональных устройств каждая функция должна иметь собственное конфигурационное пространство. Устройство может одни и те же регистры отображать и на память, и на пространство ввода-вывода. При этом в конфигурационных регистрах должны присутствовать оба описателя, но драйвер должен использовать только один способ обращения (предпочтительно через память).
В заголовке конфигурационного пространства описываются потребности в адресах трех типов:
♦ Регистры в пространстве ввода-вывода (I/O Space).
♦ Регистры ввода-вывода, отображенные на память (Memory Mapped I/O). Это область памяти, обращения к которой должны производиться в строгом соответствии с тем, что запрашивает инициатор обмена. Обращения к этим регистрам могут изменять внутреннее состояние периферийных устройств.
♦ Память, допускающая предвыборку (Prefetchable Memory). Это область па мяти, «лишнее» чтение которой (с неиспользуемыми результатами) не при водит к побочным эффектам (то есть это память в чистом виде).
Потребности в адресах указываются устройствами в регистрах базовых адресов (Base Address Register, BAR), в этих же регистрах конфигурирующая программа устанавливает начальный адрес области.
В PCI имеется поддержка устаревших (legacy) устройств (VGA, IDE), которые сами себя таковыми объявляют по коду класса в заголовке. Их традиционные (фиксированные) адреса портов не заявляются в конфигурационном пространстве, но как только устанавливается бит разрешения обращения к портам, устройствам разрешается ответ и по этим адресам.
PCI BIOS
Для облегчения взаимодействия с устройствами PCI имеются дополнительные функции BIOS, доступные как из реального, так и из защищенного режима работы процессора. Функции PCI BIOS применяются только для поиска и конфигурирования устройств PCI — процедур, требующих доступа к их конфигурационному пространству. Функции приходится поддерживать и использовать потому, что циклы конфигурационных обращений, как и специальный цикл, выполняются специфическим образом. Кроме того, PCI BIOS позволяет управлять коммутатором запроса прерываний (PCI Interrupt Steering), скрывая специфический программный интерфейс чипсета системной платы. Остальное взаимодействие с устройствами через их пространства памяти и ввода-вывода, а также обработка прерываний в поддержке со стороны BIOS не нуждаются, поскольку выполняются непосредственно командами процессора и не зависят от платформы (чипсета системной платы). Регулярная работа с этими устройствами выполняется через обращения к регистрам устройств по адресам, полученным при конфигурировании, и в ходе обработки известных номеров прерываний от этих устройств. Функция проверки наличия PCI BIOS позволяет определить доступные конфигурационные механизмы, и, зная их работу, программа в дальнейшем может обходиться без вызовов PCI BIOS.
Программы с помощью функций PCI BIOS могут искать интересующие их устройства по идентификаторам или кодам класса. Если стоит задача полного «переучета» установленных устройств, то она решается чтением конфигурационной информации по всем функциям всех устройств всех шин — это быстрее, чем перебирать все возможные сочетания идентификаторов или классов кодов. Для найденных устройств программы должны определять реальные параметры чтением регистров конфигурационного пространства, учитывая возможность перемещения ресурсов по всему пространству и даже между пространствами памяти и ввода-вывода.