Понимание PCIe

Поскольку этот домен для меня новый, у меня есть некоторые затруднения в понимании PCIe. Раньше я работал над некоторыми протоколами, такими как I2c, spi, uart, can, и большинство из этих протоколов имеют четко определенные документы (максимум 300 страниц). Почти во всех упомянутых протоколах с точки зрения программного обеспечения приложение должно было просто записывать данные в регистр данных, а обо всем остальном позаботится оборудование. Как, например, в Uart, мы просто загружаем данные в регистр данных, и данные отправляются со стартовым, контрольным и стоповым битами.

Я прочитал несколько вещей о PCIe в Интернете, и вот понимание, которое у меня есть до сих пор.

Во время загрузки системы микропрограмма BIOS определит объем памяти, необходимый для устройства PCIe, с помощью волшебной процедуры записи и чтения в BAR в устройстве PCIe (конечной точке). Как только он это выяснит, он выделит адресное пространство для устройства в карте системной памяти (фактическая оперативная память не используется в HOST, память находится только в конечной точке. Enpoint - это память, отображаемая в Host). Я вижу, что у PCIe есть несколько полей заголовков, которые микропрограмма BIOS определяет на этапе перечисления шины.

Теперь, если Хост хочет установить бит в регистре конфигурации, расположенном по адресу 0x10000004 (адрес, отображаемый для enpoint), хост сделает что-то вроде (предположим, что существует только 1 enpoint без ветвей):

*(volatile uint32 *)0x10000004 |= (1<<Bit_pos);

1. Как корневой комплекс знает, куда направить эти сообщения, потому что BAR находится в конечной точке. Выполняет ли RC широковещательную рассылку на все конечные точки, а затем каждая конечная точка сравнивает адрес с адресом, запрограммированным в BAR, чтобы увидеть, должен ли он его принимать или нет? (Как фильтр принятия в CAN).

  1. Добавляет ли RC всю информацию, относящуюся к заголовку PCIe (хост просто записывает по адресу)?

  2. Если хост записывает в 0x10000004, будет ли он писать для регистрации в местоположении 0x4 в конечной точке?

  3. Как хост узнает, что конечной точке задано адресное пространство, начинающееся с 0x10000000?

  4. RC похож на роутер?

Вышеупомянутые запросы были связаны с, только если регистр конфигурации в enpoint необходимо было прочитать или записать. Следующие ниже запросы относятся к передаче данных от хоста к конечной точке.

1. Предположим, хост запрашивает конечную точку сохранить определенные данные, присутствующие в драме, на SSD, и, поскольку SSD подключен к слоту PCIe, будет ли PCIe также выполнять передачи DMA? Например, является ли специальный BAR в enpoint, который хост записывает, с начальным адресом в Dram, который должен быть перемещен в ssd, что, в свою очередь, запускает PCIe для выполнения передачи DMA от хоста к enpoint?

Я пытаюсь понять PCIe относительно любых других протоколов, над которыми я работал до сих пор. Мне это кажется немного новым.


person AlphaGoku    schedule 28.11.2019    source источник


Ответы (1)


RC обычно является частью самого процессора. Он служит мостом, который направляет запрос ЦП в нисходящем направлении, а также от конечной точки к ЦП в восходящем направлении.

Конечные точки PCIe имеют заголовки типа 0, а мосты / коммутаторы имеют заголовок типа 1. Заголовки типа 1 имеют базовый (минимальный адрес) и предельный регистры (максимальный адрес). Заголовки типа 0 имеют регистры BAR, которые программируются на этапе перечисления.

После того, как этап перечисления завершен и для всех конечных точек запрограммированы свои BAR, программируются регистры Base и Limit в заголовке Type 1 RC и мостов / коммутаторов.

Пример: Предположим, что система имеет только 1 конечную точку, подключенную непосредственно к RC без промежуточных мостов / коммутаторов, чей BAR имеет значение A00000. Если он запрашивает 4 Кб адресного пространства в ЦП (MMIO), RC будет иметь свой базовый регистр как A00000 и регистр ограничения как AFFFFF (он всегда выровнен на 1 МБ, хотя пространство, запрошенное конечной точкой, намного меньше 1 МБ). Если ЦП записывает в регистр A00004, RC проверяет базовый и ограничительный регистры, чтобы выяснить, попадает ли адрес в его диапазон, и направляет пакет в нисходящем направлении к конечной точке.

Конечные точки используют BAR, чтобы узнать, должны они принимать пакеты или нет. RC, мосты и коммутаторы используют регистры Base и Limit для маршрутизации пакетов на правильный нисходящий порт. В большинстве случаев коммутатор может иметь несколько нисходящих портов, и каждый порт будет иметь свой собственный заголовок типа 1, чей регистр Base и Limit будет запрограммирован относительно конечных точек, подключенных к его порту. Это используется для маршрутизации пакетов.

Передача данных между памятью ЦП и конечными точками осуществляется посредством записи в память PCIe. Каждый пакет PCIe имеет максимальную полезную нагрузку 4 КБ. Если на конечную точку необходимо отправить более 4 КБ, это делается через несколько операций записи в память. Записи в память - это разнесенные транзакции (ACK от конечной точки не требуется).

person AlphaGoku    schedule 29.03.2020