PersCom — Компьютерная Энциклопедия Компьютерная Энциклопедия

PCI Express

Транзакции и форматы пакетов

Весь трафик в PCI Express оформлен в виде пакетов, из которых прикладной интерес представляют пакеты уровня транзакций — TLP. Каждый пакет TLP начинается с заголовка, за которым может следовать поле данных и, дополнительно, поле «дайджеста» (Digest) — 32-битного CRC-кода. Длина всего пакета перечисленных полей кратна двойному слову (DW, 32 бит). Заголовок пакета содержит следующие обязательные поля:

  • поле формата Fmt[1:0], задающее вид пакета: бит 0 — длина заголовка (0 —3 DW, 1 — 4 DW), бит 1 — присутствие поля данных (0 — нет данных);
  • поле типа Type[4:0], определяющее назначение пакета (тип транзакции, см. таблицу ниже);
  • поле класса трафика TC[2:0];
  • признак «дайджеста» TD: единичное значение указывает на применение 32-битного CRC-кода в конце пакета, защищающего все поля пакета, не изменяемые в процессе его путешествия через коммутаторы PCI Express. Этот дополнительный контроль применяют для особо важных случаев; для обычных транзакций ограничиваются CRC-контролем канального уровня;
  • признак ошибки данных EP, которым сообщается, что при чтении передаваемых данных произошла ошибка и данные могут быть недействительными (poisoned data);
  • длина поля данных Length[9:0] (количество двойных слов, 000…01 — 1, 111…111 —1023 DW, 000…000 — 1024 DW.

 

Таблица. Пакеты транзакций PCI Express

Мнемоника

Fmt [1:0]

Type [4:0] Назначение
MRd

00

01

0 0000 Memory Read Request, запрос чтения памяти
MRdLk

00

01

0 0000 Memory Read Request-Locked, запрос блокированного чтения памяти
MWr

10

11

0 0010 Memory Write Request, запрос записи в память (с данными)
IORd

00

0 0010 I/O Read Request, запрос чтения ввода/вывода
IOWr 10 0 0010 I/O Write Request, запрос записи ввода/вывода (с данными)
CfgRd0 00 0 0100 Configuration Read Type 0, конфигурационное чтение типа 0
CfgWr0 10 0 0100 Configuration Write Type 0, конфигурационная запись типа 0
CfgRd1 00 0 0101 Configuration Read Type 1, конфигурационное чтение типа 1
CfgWr1 10 0 0101 Configuration Write Type 1, конфигурационная запись типа 1
Msg 01 1 0 rrr Message Request, запрос сообщения без данных, rrr определяет механизм маршрутизации
MsgD 10 1 0 rrr Message Request with data payload, запрос сообщения с данными, rrr определяет механизм маршрутизации
Cpl 00 0 1010 Completion without Data, завершение без данных, используется в ответ на IOWr и CfgWr, а также при завершении любого блокированного чтения с ошибкой
CplD 10 0 1010 Completion with Data, завершение с данными, используется в ответ на запросы чтения
CplLk 00 0 1011 Completion for Locked Memory Read without Data, ошибочное завершение блокированного чтения памяти
CplDLk 10 0 1011 Completion for Locked Memory Read, завершение блокированного чтения памяти

 

Идентификатором транзакции является идентификатор устройства-запросчика в совокупности с 8-битным тегом; дескриптор транзакции содержит еще и атрибуты транзакции (RO и NS), а также класс трафика TC. Тег используется только для транзакций, требующих пакета завершения. По умолчанию запросчик может держать незавершенными до 32 транзакций, так что из 8-битного тега используются лишь 5 бит. Однако можно разрешить и расширенное использование тега, когда будут использоваться все 8 бит (до 256 незавершенных запросов).

В зависимости от типа транзакций в пакетах применяются различные форматы адреса и маршрутизации. Адрес задается с точностью до выровненного двойного слова (биты [1:0] = 00). Для всех транзакций, несущих данные (кроме сообщений), один из байтов заголовка несет битовые признаки действительности байтов в первом и последнем двойном слове поля данных (в середине подразумевается действительность всех байтов). Таким образом пакет может нести произвольное число смежных байтов, начиная с произвольного адреса.

Транзакции с памятью могут быть как с коротким (32-битным), так и с длинным (64-битным) адресом. Сочетания адреса и длины транзакции не должны вызывать пересечение границы 4-килобайтных страниц. Транзакции записи в память выполняются как отправленные (posted write), на них не требуется ответа.

Транзакции ввода/вывода сохранены в PCI Express для совместимости с PCI/PCIX и старым ПО; от этого типа транзакций планируется избавиться. В этих транзакциях используется 32-битный адрес и передается лишь одно двойное слово данных.

Конфигурационные транзакции адресуются и маршрутизируются по идентификатору устройства; в этих транзакциях используется 32-битный адрес и передается лишь одно двойное слово данных. Идентификатор устройства имеет формат, используемый для PCI: 8-битное поле номера шины, 5-битное поле номера устройства и 3-битное поле номера функции.

Транзакции сообщений маршрутизируются в зависимости от поля rrr: 000 — к корневому комплексу, 001 — по адресу, 010 — по идентификатору, 011 — широковещание от корневого комплекса, 100 — локальное сообщение (не идет дальше приемника), 101 — собираются и маршрутизируются к корневому комплексу. В сообщении один байт отводится под код сообщения, и ряд сообщений обходится без поля данных. Сообщения с rrr = 100 только изменяют состояние приемника (так, например, реализуются нижеописанные виртуальные провода INTx#). Вариант маршрутизации с rrr = 101 используются для одного из типов сообщений управления потреблением: коммутатор пошлет такое сообщение на восходящий порт, только получив их со всех нисходящих портов. Сообщения используются для эмуляции проводных прерываний, оповещения о событиях управления энергопотреблением и ошибках, а также для коммуникаций между устройствами.

Для эмуляции прерываний по INTx# (четырех виртуальных проводов) используются 8 кодов сообщений (по четыре на установку и по четыре на снятие каждого сигнала). Коммутаторы (и корневой комплекс) должны отслеживать состояние виртуальных проводов на каждом из нисходящих портов, учитывая приходы сообщений от соответствующих устройств (циклическое чередование четырех линий INTx#, как в PCI, сохраняется). В соответствии с этими состояниями по функции ИЛИ формируется состояние виртуальных проводов восходящего порта, и по изменению состояний генерируются соответствующие сообщения. Для эмуляции разделяемых прерываний сообщение на установку запроса передается на восходящий порт по приходу первого (для данного провода) сообщения установки от нисходящего порта. Если до прихода сообщения о снятии запроса для того же провода придет сообщение об установке запроса от другого порта, то это сообщение на восходящий порт не транслируется. Сообщение о снятии запроса будет послано на восходящий порт только по получении сообщений о снятии запросов для данного провода со всех нисходящих портов, ранее сообщивших об установке запроса. Корневой комплекс выполняет аналогичные задачи и, наконец, доводит виртуальные сигналы до реального контроллера прерываний. Таким образом, пакеты сообщений позволяют «объединить» виртуальные провода INTx# устройств всех логических шин.