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