link560 link561 link562 link563 link564 link565 link566 link567 link568 link569 link570 link571 link572 link573 link574 link575 link576 link577 link578 link579 link580 link581 link582 link583 link584 link585 link586 link587 link588 link589 link590 link591 link592 link593 link594 link595 link596 link597 link598 link599 link600 link601 link602 link603 link604 link605 link606 link607 link608 link609 link610 link611 link612 link613 link614 link615 link616 link617 link618 link619 link620 link621 link622 link623 link624 link625 link626 link627 link628 link629 link630 link631 link632 link633 link634 link635 link636 link637 link638 link639 link640 link641 link642 link643 link644 link645 link646 link647 link648 link649 link650 link651 link652 link653 link654 link655 link656 link657 link658 link659 link660 link661 link662 link663 link664 link665 link666 link667 link668 link669 link670 link671 link672 link673 link674 link675 link676 link677 link678 link679 link680 link681 link682 link683 link684 link685 link686 link687 link688 link689 link690 link691 link692 link693 link694 link695 link696 link697 link698 link699

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# устройств всех логических шин.