Пространство конфигурации PCI — это базовый способ, с помощью которого традиционные платы PCI , PCI-X и PCI Express выполняют автоматическую настройку карт, вставленных в их шину.
Устройства PCI имеют набор регистров, называемых конфигурационным пространством , а PCI Express вводит расширенное конфигурационное пространство для устройств. Регистры конфигурационного пространства отображаются в области памяти. Драйверы устройств и диагностическое программное обеспечение должны иметь доступ к конфигурационному пространству, а операционные системы обычно используют API для доступа к конфигурационному пространству устройства. Когда операционная система не имеет определенных методов доступа или API для запросов к отображенному в память конфигурационному пространству, драйвер или диагностическое программное обеспечение несут бремя доступа к конфигурационному пространству способом, совместимым с базовыми правилами доступа операционной системы. Во всех системах драйверам устройств рекомендуется использовать API, предоставляемые операционной системой, для доступа к конфигурационному пространству устройства.
Одним из основных усовершенствований локальной шины PCI по сравнению с другими архитектурами ввода-вывода был ее механизм конфигурации. В дополнение к обычным пространствам памяти и портам ввода-вывода каждая функция устройства на шине имеет пространство конфигурации длиной 256 байт, адресуемое с помощью знания восьмибитной шины PCI , пятибитного устройства и трехбитных номеров функций для устройства (обычно называемых BDF или B/D/F , как сокращение от bus/device/function ). Это позволяет использовать до 256 шин, каждая из которых может содержать до 32 устройств, каждая из которых поддерживает восемь функций. Одна карта расширения PCI может отвечать как устройство и должна реализовывать как минимум функцию с номером ноль. Первые 64 байта пространства конфигурации стандартизированы; остальные доступны для целей, определяемых поставщиком. Некоторые высокопроизводительные компьютеры поддерживают более одного домена PCI (или сегмента PCI); каждый домен PCI поддерживает до 256 шин.
Чтобы обеспечить стандартизацию большего количества частей пространства конфигурации без конфликта с существующими вариантами использования, может быть список возможностей, определенных в оставшихся 192 байтах пространства конфигурации PCI. Каждая возможность имеет один байт, описывающий, какая это возможность, и один байт, указывающий на следующую возможность. Количество дополнительных байтов зависит от идентификатора возможности. Если возможности используются, устанавливается бит в регистре состояния , а указатель на первую в связанном списке возможностей предоставляется в регистре указателя Cap., определенном в стандартизированных регистрах.
PCI-X 2.0 и PCI Express ввели расширенное пространство конфигурации, до 4096 байт. Единственная стандартизированная часть расширенного пространства конфигурации — это первые четыре байта в 0x100 , которые являются началом расширенного списка возможностей. Расширенные возможности очень похожи на обычные возможности, за исключением того, что они могут ссылаться на любой байт в расширенном пространстве конфигурации (используя 12 бит вместо восьми), имеют четырехбитный номер версии и 16-битный идентификатор возможности. Идентификаторы расширенных возможностей пересекаются с идентификаторами обычных возможностей, но путаницы не возникает, поскольку они находятся в отдельных списках.
Регистры идентификатора устройства (DID) и идентификатора поставщика (VID) идентифицируют устройство (например, IC ) и обычно называются идентификатором PCI . 16-битный идентификатор поставщика выделяется PCI-SIG . Затем поставщик назначает 16-битный идентификатор устройства. Существует неактивный проект по сбору всех известных идентификаторов поставщиков и устройств. (См. внешние ссылки ниже.)
Регистр состояния используется для сообщения о том, какие функции поддерживаются и произошли ли определенные виды ошибок. Регистр команд содержит битовую маску функций, которые могут быть индивидуально включены и отключены. Значения регистра типа заголовка определяют различные макеты оставшихся 48 байт (64-16) заголовка в зависимости от функции устройства. То есть заголовки типа 1 для Root Complex, коммутаторов и мостов. Затем тип 0 для конечных точек. Регистр размера строки кэша должен быть запрограммирован до того, как устройству будет сообщено, что оно может использовать транзакцию записи в память и аннулирования. Обычно он должен соответствовать размеру строки кэша ЦП , но правильная настройка зависит от системы. Этот регистр не применяется к PCI Express.
Идентификатор подсистемы (SSID) и идентификатор поставщика подсистемы (SVID) различают конкретную модель (например, карту расширения). В то время как идентификатор поставщика принадлежит производителю чипсета , идентификатор поставщика подсистемы принадлежит производителю карты. Идентификатор подсистемы назначается производителем подсистемы, идентификатор устройства назначается производителем чипсета. Например, в случае беспроводных сетевых карт производителем чипа может быть Intel , Broadcom или Atheros , а производителем карты может быть Netgear или Hewlett-Packard . Как правило, комбинация идентификатора поставщика–идентификатора устройства определяет, какой драйвер должен загрузить хост для обработки устройства, поскольку все карты с одинаковой комбинацией VID:DID могут обрабатываться одним и тем же драйвером. Комбинация идентификатора поставщика подсистемы–идентификатора подсистемы идентифицирует карту, что является типом информации, которую драйвер может использовать для внесения незначительных изменений, характерных для карты, в ее работу.
Для обращения к устройству PCI его необходимо включить, отобразив в адресное пространство порта ввода-вывода системы или адресное пространство, отображенное в память . Прошивка системы (например, BIOS ) или операционная система программируют регистры базового адреса (обычно называемые BAR), чтобы информировать устройство о конфигурации его ресурсов, записывая команды конфигурации в контроллер PCI. Поскольку все устройства PCI находятся в неактивном состоянии при сбросе системы, им не будут назначены адреса, по которым операционная система или драйверы устройств могут с ними взаимодействовать. BIOS или операционная система географически адресуют устройства PCI (например, первый слот PCI, второй слот PCI, третий слот PCI или интегрированные устройства PCI и т. д. на материнской плате ) через контроллер PCI с помощью сигналов IDSEL (Initialization Device Select) для каждого слота или устройства.
При включении компьютера шина(ы) PCI и устройство(а) должны быть пронумерованы BIOS или операционной системой. Пронумерация шин выполняется путем попытки доступа к регистрам пространства конфигурации PCI для каждой шины, устройства и функции. Обратите внимание, что номер устройства, отличный от VID и DID, является просто порядковым номером устройства на этой шине. Более того, после обнаружения нового моста определяется новый номер шины, и пронумерация устройств перезапускается с нулевого номера устройства.
Если от функции устройства № 0 не получен ответ, мастер шины выполняет прерывание и возвращает значение «все биты включены» ( FFFFFFFF в шестнадцатеричном формате), что является недопустимым значением VID/DID, поэтому BIOS или операционная система могут определить, что указанная комбинация шина/номер_устройства/функция (B/D/F) отсутствует. Таким образом, когда чтение идентификатора функции, равного нулю, для данной шины/устройства приводит к прерыванию работы мастера (инициатора), следует предположить, что на этой шине нет рабочего устройства, поскольку для реализации функции номер ноль требуются устройства. В этом случае чтения оставшихся номеров функций (1–7) не нужны, поскольку они также не будут существовать.
Когда чтение указанной комбинации B/D/F для регистра идентификатора поставщика завершается успешно, системная прошивка или операционная система знает, что он существует; она записывает все единицы в свои BAR и считывает запрошенный размер памяти устройства в закодированной форме. Конструкция подразумевает, что все размеры адресного пространства являются степенью двойки и естественным образом выровнены. [1]
На этом этапе BIOS или операционная система запрограммируют адреса, отображенные в памяти, и адреса портов ввода-вывода в регистры конфигурации BAR устройства. Эти адреса остаются действительными, пока система остается включенной. После выключения питания эти настройки теряются, и процедура повторяется при следующем включении системы. BIOS или операционная система также запрограммируют некоторые другие регистры пространства конфигурации PCI для каждого устройства PCI, например запрос прерывания . Поскольку весь этот процесс полностью автоматизирован, пользователь избавлен от необходимости вручную настраивать любое новое добавленное оборудование, изменяя DIP-переключатели на самих картах. Это автоматическое обнаружение устройств и назначение адресного пространства — вот как реализована технология plug and play .
Если найден мост PCI-PCI, система должна назначить вторичной шине PCI за мостом номер шины, отличный от нуля, а затем перечислить устройства на этой вторичной шине. Если найдено больше мостов PCI, обнаружение продолжается рекурсивно, пока не будут просканированы все возможные комбинации домен/шина/устройство.
Каждая функция устройства PCI, не являющегося мостом, может реализовать до 6 BAR, каждый из которых может отвечать на различные адреса в порту ввода-вывода и адресном пространстве, отображенном в памяти. Каждый BAR описывает область [2] [1] , которая имеет размер от 16 байт до 2 гигабайт, расположенную ниже предела адресного пространства в 4 гигабайта. Если платформа поддерживает опцию «Выше 4G» в системной прошивке, можно использовать 64-битные BAR. Изменяемый размер BAR (также известный как Re-Size BAR , AMD Smart Access Memory (SAM), [3] или ASRock Clever Access Memory (CAM)) [4] — это возможность, которую устройство PCIe может использовать для согласования большего размера BAR. [5] Классически BAR были ограничены размером 256 МБ, но современные видеокарты имеют буферы кадров гораздо большего размера. [3] Это несоответствие приводило к неэффективности при доступе ЦП к буферу кадров. [3] Изменяемый размер BAR позволяет процессору получать доступ ко всему буферу кадров одновременно, тем самым повышая производительность. [3]
Устройство PCI также может иметь дополнительное ПЗУ .
При выполнении доступа к пространству конфигурации устройство PCI не декодирует адрес, чтобы определить, должно ли оно отвечать, а вместо этого смотрит на сигнал выбора устройства инициализации (IDSEL). Для каждого сигнала IDSEL существует уникальный метод активации в масштабе всей системы. Устройство PCI должно декодировать только 11 младших бит адресного пространства (AD[10] - AD[0]) сигналов адреса/данных и может игнорировать декодирование 21 старшего сигнала A/D (AD[31] - AD[11]), поскольку реализация доступа к пространству конфигурации имеет вывод IDSEL каждого слота, подключенный к другой старшей линии адреса/данных AD[11] - AD[31]. Сигнал IDSEL - это отдельный вывод для каждого устройства/адаптера/слота PCI.
Для настройки карты в слоте n мост шины PCI выполняет цикл доступа к пространству конфигурации с регистром устройства PCI, адресуемым по строкам AD[7:2] (AD[1:0] всегда равны нулю, поскольку регистры представляют собой двойные слова (32 бита)), и номером функции PCI, указанным в битах AD[10:8], при этом все биты старшего порядка равны нулю, за исключением AD[ n +11], который используется в качестве сигнала IDSEL на данном слоте/устройстве.
Для снижения электрической нагрузки на критическую по времени (и, следовательно, чувствительную к электрической нагрузке) шину AD[], сигнал IDSEL на разъеме слота PCI обычно подключается к назначенному ему выводу AD[ n +11] через резистор. Это приводит к тому, что сигнал IDSEL PCI достигает своего активного состояния медленнее, чем другие сигналы шины PCI (из-за постоянной времени RC как резистора, так и входной емкости вывода IDSEL). Таким образом, доступ к пространству конфигурации выполняется медленнее, чтобы дать сигналу IDSEL время достичь допустимого уровня.
Сканирование на шине выполняется на платформе Intel путем доступа к двум определенным стандартизированным портам. Эти порты — порт ввода-вывода Configuration Space Address ( 0xCF8 ) и порт ввода-вывода Configuration Space Data ( 0xCFC ). Значение, записанное в порт ввода-вывода Configuration Space Address, создается путем объединения значений B/D/F и значения адреса регистра в 32-битное слово.
Чтение и запись конфигурации могут быть инициированы из ЦП двумя способами: один устаревший метод через адреса ввода-вывода 0xCF8 и 0xCFC , а другой называется конфигурацией с отображением памяти. [6]
Устаревший метод присутствовал в оригинальном PCI и называется Configuration Access Mechanism (CAM). Он позволяет получить косвенный доступ к 256 байтам адресного пространства устройства через два 32-битных регистра, называемых PCI CONFIG_ADDRESS и PCI CONFIG_DATA. Эти регистры находятся по адресам 0xCF8 и 0xCFC в адресном пространстве ввода-вывода x86. [7] Например, программный драйвер (прошивка, ядро ОС или драйвер ядра) может использовать эти регистры для настройки устройства PCI, записывая адрес регистра устройства в CONFIG_ADDRESS и помещая данные, которые должны быть записаны на устройство, в CONFIG_DATA. Поскольку этот процесс требует записи в регистр для записи регистра устройства, он называется «косвенным».
Формат CONFIG_ADDRESS следующий:
0x80000000 | шина << 16 | устройство << 11 | функция << 8 | смещение
Как объяснялось ранее, адресация устройства через шину, устройство и функцию (BDF) также называется «географической адресацией устройства». Пример кода, использующего географическую адресацию, см. arch/x86/pci/early.c
в коде ядра Linux . [8]
При использовании расширенного пространства конфигурации на некоторых процессорах AMD дополнительные биты 11:8 смещения записываются в биты 27:24 регистра CONFIG_ADDRESS: [9] [10]
0x80000000 | ( смещение & 0xf00 ) << 16 | шина << 16 | устройство << 11 | функция << 8 | ( смещение & 0xff )
Второй метод был создан для PCI Express. Он называется Enhanced Configuration Access Mechanism (ECAM). Он расширяет пространство конфигурации устройства до 4 КБ, причем нижние 256 байт перекрывают исходное (устаревшее) пространство конфигурации в PCI. Раздел адресуемого пространства «украденный», так что доступы от ЦП не идут в память, а достигают заданного устройства в структуре PCI Express. Во время инициализации системы BIOS определяет базовый адрес для этой «украденной» области адреса и сообщает его корневому комплексу и операционной системе.
Каждое устройство имеет свое собственное пространство размером 4 КБ, и информация каждого устройства доступна через простой массив dev[bus][device][function]
, так что 256 МБ физического непрерывного пространства «украдены» для этого использования (256 шин × 32 устройства × 8 функций × 4 КБ = 256 МБ). Базовый физический адрес этого массива не указан. Например, в современных системах x86 таблицы ACPI содержат необходимую информацию. [11]