Конфигурационное пространство PCI - PCI configuration space

Конфигурационное пространство PCI лежит в основе Обычный PCI, PCI-X и PCI Express выполнить автоконфигурацию карт, вставленных в их шину.

Обзор

Устройства PCI имеют набор регистров, называемых конфигурационное пространство и PCI Express представляет расширенное пространство конфигурации для устройств. Регистры пространства конфигурации отображаются в ячейки памяти. Драйверы устройств и диагностическое программное обеспечение должны иметь доступ к пространству конфигурации, а операционные системы обычно используют API-интерфейсы, чтобы разрешить доступ к пространству конфигурации устройства. Когда в операционной системе не определены методы доступа или API-интерфейсы для запросов к пространству конфигурации с отображением в память, драйвер или диагностическое программное обеспечение обязаны осуществлять доступ к пространству конфигурации способом, совместимым с базовыми правилами доступа операционной системы. Во всех системах драйверам устройств рекомендуется использовать API-интерфейсы, предоставляемые операционной системой, для доступа к пространству конфигурации устройства.

Техническая информация

Одно из основных улучшений Локальная шина PCI По сравнению с другими архитектурами ввода-вывода был свой механизм конфигурации. В дополнение к нормальному отображению памяти и пространствам портов ввода / вывода каждая функция устройства на шине имеет конфигурационное пространство, длина которого составляет 256 байт, адресуемую, зная восьмибитный PCI автобус, пятиразрядное устройство и трехбитовые номера функций для устройства (обычно называемые BDF или B / D / F, как сокращенно от шина / устройство / функция). Это позволяет использовать до 256 шин, на каждой до 32 устройств, каждая из которых поддерживает восемь функций. Одна карта расширения PCI может работать как устройство и должна реализовывать как минимум нулевую функцию. Первые 64 байта пространства конфигурации стандартизированы; остальные доступны для целей, определенных поставщиком.

Чтобы позволить стандартизировать большее количество частей конфигурационного пространства, не вступая в конфликт с существующими применениями, может быть список возможности определяется в первых 192 байтах конфигурационного пространства PCI. У каждой возможности есть один байт, который описывает, какая это возможность, и один байт, указывающий на следующую возможность. Количество дополнительных байтов зависит от идентификатора возможности. Если возможности используются, немного в Статус установлен регистр, и указатель на первый в связанном списке возможностей предоставляется в Кепка. указатель регистр, определенный в стандартизованных регистрах.

PCI-X 2.0 и PCI Express введено расширенное пространство конфигурации до 4096 байт. Единственная стандартизированная часть расширенного конфигурационного пространства - это первые четыре байта в 0x100 которые являются началом расширенного списка возможностей. Расширенные возможности очень похожи на обычные возможности, за исключением того, что они могут относиться к любому байту в расширенном пространстве конфигурации (с использованием 12 бит вместо восьми), иметь четырехбитный номер версии и 16-битный идентификатор возможности. Идентификаторы расширенных возможностей частично совпадают с идентификаторами обычных возможностей, но нет никакой возможности путаницы, поскольку они находятся в отдельных списках.

Стандартизированные регистры

Стандартные регистры заголовка пространства конфигурации PCI типа 0 (без моста)

В ID устройства (DID) и ID поставщика (VID) регистры идентифицируют устройство (например, IC ), и их обычно называют PCI ID. 16-битный идентификатор поставщика выделяется PCI-SIG. Затем поставщик присваивает 16-битный идентификатор устройства. Существует неактивный проект по сбору всех известных идентификаторов поставщиков и устройств. (См. внешние ссылки ниже.)

В Статус register используется для сообщения о том, какие функции поддерживаются и произошли ли определенные виды ошибок. В Команда register содержит битовую маску функций, которые можно индивидуально включать и отключать. В Тип заголовка значения регистров определяют различные схемы остальных 48 байтов (64–16) заголовка в зависимости от функции устройства. То есть заголовки типа 1 для корневого комплекса, коммутаторов и мостов. Затем введите 0 для конечных точек. В Размер строки кэша Регистр должен быть запрограммирован до того, как устройству сообщат, что он может использовать транзакцию записи и аннулирования памяти. Обычно это должно соответствовать Кеш процессора размер строки, но правильная настройка зависит от системы. Этот регистр не применяется к PCI Express.

В ID подсистемы (SSID) и ID поставщика подсистемы (SVID) дифференцировать конкретную модель (например, карту расширения). Хотя идентификатор поставщика совпадает с чипсет Производитель, идентификатор поставщика подсистемы - это идентификатор производителя карты. ID подсистемы назначается поставщиком подсистемы из того же цифрового пространства, что и ID устройства. Например, в случае беспроводные сетевые карты, производитель чипсета может быть Broadcom или Atheros, а производитель карты может быть Netgear или D-Link. Как правило, комбинация идентификатора поставщика и идентификатора устройства указывает, какой Водитель хост должен загружаться, чтобы обрабатывать устройство, поскольку все карты с одинаковой комбинацией VID: DID могут обрабатываться одним и тем же драйвером. Комбинация идентификатора поставщика подсистемы и идентификатора подсистемы идентифицирует карту, которая представляет собой тип информации, которую драйвер может использовать для внесения незначительных изменений в работу карты.

Перечисление автобусов

Чтобы адресовать устройство PCI, оно должно быть включено путем отображения в адресное пространство порта ввода-вывода системы или адресное пространство, отображаемое в памяти. Прошивка системы, драйверы устройств или Операционная система запрограммировать Регистры базового адреса (обычно называемые BAR) для информирования устройства о его отображении адресов путем записи команд конфигурации в контроллер PCI. Поскольку все устройства PCI находятся в неактивный состояние после перезагрузки системы, им не будут назначены адреса, по которым операционная система или драйверы устройств может с ними общаться. Либо BIOS или операционная система географически адресует слоты PCI (например, первый слот PCI, второй слот PCI или третий слот PCI и т. д. на материнская плата ) через контроллер PCI с помощью сигналов IDSEL (выбор устройства инициализации) для каждого слота.

Биты PCI BAR
БитыОписаниеЦенности
Для всех PCI BAR
0Тип региона0 = Память
1 = ввод / вывод
Для полосок памяти
2-1Доступный0 = любой 32-битный
1 = < 1 МиБ
2 = любой 64-битный
3С возможностью предварительной загрузки0 = нет
1 = да
31-4Базовый адрес16-байтное выравнивание
Для панелей ввода / вывода
1Зарезервированный
31-2Базовый адрес4-байтовое выравнивание

Поскольку для BIOS или операционной системы не существует прямого метода определения, в какие слоты PCI установлены устройства (а также для определения функций, реализуемых устройством), шина (и) PCI должна быть перечисленный. Перечисление шины выполняется путем попытки прочитать регистр идентификатора поставщика и идентификатора устройства (VID / DID) для каждой комбинации номера шины и номера устройства в функции устройства №0. Обратите внимание, что номер устройства, отличный от DID, является просто последовательным номером устройства. номер в этом автобусе. Более того, после обнаружения нового моста определяется новый номер шины, и нумерация устройств перезапускается с нулевого номера устройства.

Если от функции № 0 устройства не получено ответа, автобусный мастер выполняет прерывание и возвращает все битовое значение (FFFFFFFF в шестнадцатеричном формате), что является недопустимым значением VID / DID, поэтому драйвер устройства может сказать, что указанная комбинация bus / device_number / function (B / D / F) отсутствует. Таким образом, когда чтение идентификатора функции, равного нулю, для данной шины / устройства приводит к прерыванию работы ведущего устройства (инициатора), следует предположить, что на этой шине нет рабочего устройства, поскольку устройства должны реализовывать функцию с номером ноль. В этом случае считывание оставшихся номеров функций (1–7) не требуется, так как они также не будут существовать.

Когда чтение указанной комбинации B / D / F для регистра идентификатора поставщика завершается успешно, драйвер устройства знает, что он существует; он записывает все единицы в свои BAR и считывает запрошенный размер памяти устройства в закодированной форме. Дизайн подразумевает, что все размеры адресного пространства являются степенью двойки и естественно выровнены.[1]

На этом этапе BIOS или операционная система запрограммируют отображаемые в памяти и адреса портов ввода-вывода в регистр конфигурации BAR устройства. Эти адреса остаются действительными, пока система остается включенной. При отключении питания все эти настройки теряются, и процедура повторяется при следующем включении системы. Поскольку весь этот процесс полностью автоматизирован, пользователю не нужно вручную настраивать новое добавленное оборудование путем изменения DIP-переключатели на самих картах. Это автоматическое обнаружение устройства и назначение адресного пространства - вот как подключи и играй реализован.

Если мост PCI-to-PCI обнаружен, система должна назначить вторичной шине PCI за мостом номер шины, отличный от нуля, а затем перечислить устройства на этой вторичной шине. Если обнаружены другие мосты PCI, обнаружение продолжается рекурсивно, пока не будут просканированы все возможные комбинации домен / шина / устройство.

Каждая функция устройства PCI без моста может реализовывать до 6 полос BAR, каждая из которых может отвечать на разные адреса в порте ввода-вывода и адресном пространстве, отображенном в памяти. Каждый BAR описывает регион:[2][1]

Устройство PCI также может иметь дополнительное ПЗУ который может содержать код драйвера или информацию о конфигурации.

Аппаратная реализация

При выполнении Пространство конфигурации доступа, устройство PCI не декодирует адрес, чтобы определить, должно ли оно отвечать, а вместо этого смотрит на Выбор устройства инициализации сигнал (IDSEL). Для каждого сигнала IDSEL существует общесистемный уникальный метод активации. Устройство PCI должно декодировать только 11 битов младшего разряда адресного пространства (от AD [10] до AD [0]) сигналов адреса / данных и может игнорировать декодирование 21 сигнала A / D высокого порядка (AD [31] к AD [11]), поскольку Пространство конфигурации В реализации доступа вывод IDSEL каждого слота подключен к разным линиям адреса / данных высокого порядка от AD [11] до AD [31]. Сигнал IDSEL - это отдельный вывод для каждого слота устройства / адаптера PCI.

Чтобы настроить карту в слоте п, мост шины PCI выполняет цикл доступа к пространству конфигурации с адресом регистра устройства PCI в строках AD [7: 2] (AD [1: 0] всегда равны нулю, поскольку регистры являются двойными словами (32-битные)), и номер функции PCI, указанный в битах AD [10: 8], со всеми нулями старших битов, за исключением AD [п+11], который используется как сигнал IDSEL в данном слоте.

Чтобы уменьшить электрическую нагрузку на критическую по времени (и, следовательно, чувствительную к электрической нагрузке) шину AD [], сигнал IDSEL на разъеме слота PCI обычно подключается к назначенному ему AD [п+11] через резистор. Это приводит к тому, что сигнал IDSEL PCI достигает своего активного состояния медленнее, чем другие сигналы шины PCI (из-за постоянной времени RC как резистора, так и входной емкости вывода IDSEL). Таким образом Пространство конфигурации доступ выполняется медленнее, чтобы дать сигнал IDSEL достичь допустимого уровня.

Сканирование на шине выполняется на платформе Intel путем доступа к двум определенным стандартизованные порты. Эти порты являются Адрес пространства конфигурации (0xCF8) Порт ввода / вывода и Данные пространства конфигурации (0xCFC) Порт ввода / вывода. Значение, записанное в Адрес пространства конфигурации Порт ввода-вывода создается путем объединения значений B / D / F и значения адреса регистров в 32-битное слово.

Программная реализация

Чтение и запись конфигурации могут быть инициированы из ЦП двумя способами: один устаревший метод через адреса ввода-вывода 0xCF8 и 0xCFC, а другой называется конфигурацией с отображением памяти.[3]

Унаследованный метод присутствовал в исходной PCI и называется механизмом доступа к конфигурации (CAM). Он позволяет косвенно получить доступ к 256 байтам адресного пространства устройства через два 32-битных регистра, называемых PCI CONFIG_ADDRESS и PCI CONFIG_DATA. Эти регистры находятся по адресам 0xCF8 и 0xCFC в адресном пространстве ввода-вывода x86.[4] Например, программный драйвер (микропрограммное обеспечение, ядро ​​ОС или драйвер ядра) может использовать эти регистры для настройки устройства PCI, записывая адрес регистра устройства в CONFIG_ADDRESS и помещая данные, которые должны быть записаны в устройство, в CONFIG_DATA. Поскольку этот процесс требует записи в регистр для записи в регистр устройства, он называется «косвенным».

Формат CONFIG_ADDRESS следующий:

0x80000000 | автобус << 16 | устройство << 11 | функция <<  8 | смещение

Как объяснялось ранее, адресация устройства через шину, устройство и функцию (BDF) также называется «географической адресацией устройства». Увидеть Arch / x86 / pci / early.c в Ядро Linux code для примера кода, использующего географическую адресацию.[5]

Когда на некоторых процессорах AMD используется расширенное пространство конфигурации, дополнительные биты 11: 8 смещения записываются в биты 27:24 регистра CONFIG_ADDRESS:[6][7]

0x80000000 | (смещение & 0xf00) << 16 | автобус << 16 | устройство << 11 | функция <<  8 | (смещение & 0xff)

Второй способ был создан для PCI Express. Это называется усовершенствованным механизмом доступа к конфигурации (ECAM). Он расширяет пространство конфигурации устройства до 4k, при этом нижние 256 байтов перекрывают исходное (устаревшее) пространство конфигурации в PCI. Часть адресного пространства «украдена», так что доступы из ЦП не идут в память, а достигают определенного устройства в структуре PCI Express. Во время инициализации системы микропрограммное обеспечение определяет базовый адрес для этой «украденной» адресной области и передает его корневому комплексу и операционной системе. Этот метод связи зависит от реализации и не определен в спецификации PCI Express.

Каждое устройство имеет собственное пространство размером 4 КиБ, и информация о каждом устройстве доступна через простой массив. dev [шина] [устройство] [функция] так что 256 МБ непрерывного физического пространства «украдены» для этого использования (256 шин × 32 устройства × 8 функций × 4 КиБ = 256 МБ). Базовый физический адрес этого массива не указан. Например, на машинах Intel таблицы ACPI содержат необходимую информацию.[8]

Смотрите также

использованная литература

  1. ^ а б "Регистры базового адреса". PCI. osdev.org. 2013-12-24. Получено 2014-04-17.
  2. ^ «Способы настройки PCI». cs.ucla.edu. 2011-11-22. Получено 2014-04-17.
  3. ^ «Доступ к регистрам конфигурации PCI Express * с использованием наборов микросхем Intel®» (PDF). Корпорация Intel. Получено 27 сентября 2018.
  4. ^ «Механизм настройки PCI №1». osdev.org. 2015-01-01. Получено 2015-01-01.
  5. ^ "kernel / git / stable / linux-stable.git: arch / x86 / pci / early.c (стабильное дерево ядра Linux, версия 3.12.7)". kernel.org. Получено 2014-01-10.
  6. ^ "kernel / git / stable / linux-stable.git: arch / x86 / pci / direct.c (стабильное дерево ядра Linux, версия 3.12.7)". kernel.org. Получено 2017-09-11.
  7. ^ Рихтер, Роберт. «x86: добавить доступ к расширенному пространству конфигурации PCI для AMD Barcelona». kernel.org. Получено 26 сентября 2018.
  8. ^ «XSDT - OSDev Wiki». Получено 2017-04-30.

внешние ссылки