Конфигурационное пространство PCI
Пространство конфигурации 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. Каждая возможность имеет один байт, который описывает, какая это возможность, и один байт, указывающий на следующую возможность. Количество дополнительных байтов зависит от идентификатора возможности. Если возможности используются, в регистре состояния устанавливается бит, а в шапке предоставляется указатель на первую в связанном списке возможностей . регистр- указатель , определенный в стандартизированных регистрах.
PCI-X 2.0 и PCI Express представили расширенное пространство конфигурации до 4096 байт. Единственная стандартизированная часть расширенного конфигурационного пространства — это первые четыре байта по адресу. 0x100 , которые являются началом расширенного списка возможностей. Расширенные возможности очень похожи на обычные возможности, за исключением того, что они могут ссылаться на любой байт в расширенном пространстве конфигурации (используя 12 бит вместо восьми), имеют четырехбитный номер версии и 16-битный идентификатор возможности. Идентификаторы расширенных возможностей совпадают с идентификаторами обычных возможностей, но путаницы не возникает, поскольку они находятся в отдельных списках.
Стандартизированные регистры
[ редактировать ]Регистры Device ID (DID) и Vendor ID (VID) идентифицируют устройство (например, IC ) и обычно называются PCI ID . 16-битный идентификатор поставщика выделяется PCI-SIG . Затем поставщик назначает 16-битный идентификатор устройства. Существует неактивный проект по сбору всех известных идентификаторов поставщиков и устройств. (См. внешние ссылки ниже.)
Регистр состояния используется для сообщения о том, какие функции поддерживаются и произошли ли определенные виды ошибок. Регистр команд содержит битовую маску функций, которые можно индивидуально включать и отключать. Значения регистра типа заголовка определяют различные макеты оставшихся 48 байтов (64–16) заголовка в зависимости от функции устройства. То есть заголовки типа 1 для корневого комплекса, коммутаторов и мостов. Затем введите 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 (выбор устройства инициализации).
Биты | Описание | Ценности |
---|---|---|
Для всех PCI BAR | ||
0 | Тип региона | 0 = Память 1 = ввод/вывод |
Для планок памяти | ||
2-1 | Аренда | 0 = любой 32-битный 1 = < 1 МБ 2 = любой 64-битный |
3 | Предварительная выборка | 0 = нет 1 = да |
31-4 | Базовый адрес | естественно выровнено по 16 байтам |
Для панелей ввода/вывода | ||
1 | Сдержанный | |
31-2 | Базовый адрес | естественно выровнено по 4 байта |
Когда компьютер включен, шины 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 путем доступа к двум определенным стандартизированным портам. Эти порты представляют собой адрес пространства конфигурации ( 0xCF8 ) Порт ввода-вывода и данные пространства конфигурации ( 0xCFC ) Порт ввода-вывода. Значение, записываемое в порт ввода-вывода адреса конфигурационного пространства , создается путем объединения значений B/D/F и значения адреса регистров в 32-битное слово.
Программная реализация
[ редактировать ]Чтение и запись конфигурации может быть инициирована из ЦП двумя способами: один устаревший метод через адреса ввода-вывода. 0xCF8 и 0xCFC и еще один, называемый конфигурацией с отображением в памяти. [6]
Устаревший метод присутствовал в исходном PCI и называется механизмом доступа к конфигурации (CAM). Он позволяет косвенно получить доступ к 256 байтам адресного пространства устройства через два 32-битных регистра, называемых PCI CONFIG_ADDRESS и PCI CONFIG_DATA. Эти регистры находятся по адресам 0xCF8 и 0xCFC в адресном пространстве ввода-вывода x86. [7] Например, программный драйвер (прошивка, ядро ОС или драйвер ядра) может использовать эти регистры для настройки устройства PCI, записывая адрес регистра устройства в CONFIG_ADDRESS и помещая данные, которые должны быть записаны в устройство, в КОНФИГ_ДАННЫЕ. Поскольку для записи в регистр устройства этот процесс требует записи в регистр, он называется «косвенным».
Формат CONFIG_ADDRESS следующий:
0x80000000 | bus << 16 | device << 11 | function << 8 | offset
Как объяснялось ранее, адресация устройства через шину, устройство и функцию (BDF) также называется «географической адресацией устройства». Видеть arch/x86/pci/early.c
в коде ядра Linux для примера кода, использующего географическую адресацию. [8]
Когда на некоторых процессорах AMD используется расширенное конфигурационное пространство, дополнительные биты смещения 11:8 записываются в биты 27:24 регистра CONFIG_ADDRESS: [9] [10]
0x80000000 | (offset & 0xf00) << 16 | bus << 16 | device << 11 | function << 8 | (offset & 0xff)
Второй метод был создан для PCI Express. Это называется механизмом расширенного доступа к конфигурации (ECAM). Он расширяет пространство конфигурации устройства до 4 КБ, при этом нижние 256 байт перекрывают исходное (устаревшее) пространство конфигурации в PCI. Часть адресного пространства «украдена», так что доступ со стороны ЦП не идет к памяти, а достигает данного устройства в структуре PCI Express. Во время инициализации системы BIOS определяет базовый адрес для этой «украденной» адресной области и сообщает его корневому комплексу и операционной системе.
Каждое устройство имеет собственное пространство размером 4 КБ, и информация о каждом устройстве доступна через простой массив. dev[bus][device][function]
так что для этого использования «украдено» 256 МБ физического непрерывного пространства (256 шин × 32 устройства × 8 функций × 4 КБ = 256 МБ). Базовый физический адрес этого массива не указан. Например, в современных системах x86 таблицы ACPI содержат необходимую информацию. [11]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Jump up to: а б «Регистры базовых адресов» . PCI . osdev.org. 24 декабря 2013 г. Проверено 17 апреля 2014 г.
- ^ «Методы настройки PCI» . прочтите.seas.hardvard.edu. 22 ноября 2011 г. Проверено 27 сентября 2021 г.
- ^ Jump up to: а б с д Арчер, Джеймс (07 декабря 2021 г.). «Что такое Resizable BAR и стоит ли его использовать?» . Каменно-бумажный дробовик . Проверено 26 марта 2024 г.
- ^ Рэйвенлорд (04 декабря 2020 г.). «ASRock реализует CAM (память с интеллектуальным доступом) на материнской плате Intel Z490 Taichi» . TechPowerUp . Проверено 26 марта 2024 г.
- ^ «Что такое изменяемый размер BAR и как его включить?» . intel.com . Корпорация Интел. 18 апреля 2023 г. Проверено 26 марта 2024 г.
- ^ «Доступ к регистрам конфигурации PCI Express* с использованием наборов микросхем Intel» (PDF) . Корпорация Интел . Проверено 27 сентября 2018 г.
- ^ «Механизм настройки PCI №1» . osdev.org . 01.01.2015 . Проверено 1 января 2015 г.
- ^ «kernel/git/stable/linux-stable.git:arch/x86/pci/early.c (дерево стабильных версий ядра Linux, версия 3.12.7)» . ядро.орг . Проверено 10 января 2014 г.
- ^ «kernel/git/stable/linux-stable.git:arch/x86/pci/direct.c (дерево стабильных версий ядра Linux, версия 3.12.7)» . ядро.орг . Проверено 11 сентября 2017 г.
- ^ Рихтер, Роберт. «x86: добавить доступ к расширенному конфигурационному пространству PCI для AMD Barcelona» . ядро.орг . Проверено 26 сентября 2018 г.
- ^ «XSDT — OSDev Wiki» . Проверено 30 апреля 2017 г.
Внешние ссылки
[ редактировать ]- Списки поставщиков и устройств PCI
- Репозиторий PCI ID — проект по сбору всех известных идентификаторов.
- Описание использования порта ввода-вывода для конфигурации PCI
- Заголовочный файл ядра Linux с определениями регистров пространства конфигурации.