Как определяется устройство в перечислении PCI? (Автобус / устройство / функция)

8

Я запутался по поводу перечисления шины / устройства / функции PCI. Глядя на страницу Википедии для конфигурации PCI , я вижу, что для данной шины мастер будет запрашивать идентификатор поставщика и идентификатор устройства для всех устройств, использующих функцию 0. Если возвращены все 0xFF, то ни одного устройства нет, и перечисление продолжается. Если найдены действительный идентификатор устройства и идентификатор поставщика, то там есть PCI-модуль, и он будет перечислен. Я не уверен, как определяется устройство в функции bus.device.f.

Например, допустим, у меня есть процессор с одной шиной PCI и одним периферийным устройством PCI. Я понимаю, что процессор будет смотреть на шину 0 (по умолчанию) и будет проверять все номера устройств, глядя на функцию 0. Как определяется номер устройства периферийного устройства?

simple_symbols
источник

Ответы:

6

В исходной платформе PCI («Обычный PCI»), а также в PCI-X устройства соответствовали «слотам», каждое из которых имеет свои собственные разъемы, подключенные к одной и той же параллельной шине. Каждый слот имел уникальный идентификационный номер, который был указан при перечислении. Перечисление по существу спрашивало (для каждого слота): «Эй, есть ли что-нибудь в этом слоте?» Устройство ответило передачей данных на шину в ответ на этот сигнал. Отсутствие ответа означало отсутствие устройства.

Устройство также может быть «мостом», что означает, что оно образует подчиненную шину. Эта шина будет иметь отдельный идентификатор (назначенный от восходящего потока) и будет иметь свой собственный набор слотов, которые перечисляются независимо.

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

PCIe был разработан таким образом, чтобы его концептуальная структура и адресация (и, следовательно, поведение, предоставляемое программному обеспечению) были совместимы с PCI и PCI-X. Реализация, однако, совершенно другая. Например, при перечислении устройств, поскольку это точка-точка, единственным вопросом, который необходимо определить в каждой точке перечисления, является «что-нибудь там?» Поскольку каждое устройство имеет свой собственный независимый набор проводов, идентификаторы устройств по существу все жестко закодированы (следовательно, каждый мост, включая «корневой комплекс» верхнего уровня, сообщает каждому устройству, каким будет его идентификатор устройства).

Во всех случаях «функциональная» часть шины / устройства / функции обрабатывается строго внутри периферийного устройства. Например, контроллер NIC с двумя портами часто имеет две функции, по одной для каждого порта. Они могут быть настроены и работать независимо, но путь данных от процессора к функции одинаков для обоих.

Джил Гамильтон
источник
1
Ответ немного запутанный: 1) в PCI «номер устройства» фактически означает «номер слота» (и это имеет смысл), 2) вы говорите «PCIe совершенно другой» и «так как каждое устройство имеет свой собственный независимый набор проводов» идентификаторы устройств по существу все жестко запрограммированы », что означает, что набор проводов (= слот) имеет жестко запрограммированный идентификатор, таким образом, он такой же, как в PCI. Теперь вопрос, когда происходит «жесткое кодирование»? Коммутаторы / мосты переназначают идентификаторы при сбросе?
xealits
2
Да. Это можно было бы сформулировать лучше. Дело в том, что в PCI карта находится на общей шине, но «знает», в каком слоте она находится, и отвечает только тогда, когда подтвержден ее специфический для слота вывод. В PCIe мост имеет N различных наборов «проводов». Таким образом, мостовое устройство имеет дискретный номер слота для каждого набора проводов. С точки зрения моста у этого слота есть определенное число; нужно только определить, есть ли что-то там. Сама карта не знает, в каком слоте она находится. Как только мост определяет, что там что-то есть, он сообщает этому устройству, какой у него номер слота.
Джил Гамильтон