Приветственный бонус от Pin-Up до 30 000 рублей. Забирай промокод на beting-rating.ru. 101da.ru.
Обмен информацией по шине PCI и PCI-X организован в виде транзакций — логически завершенных операций обмена. В типовой транзакции участвуют два устройства —инициатор обмена (initiator), он же ведущее устройство (master), и целевое устройство (ЦУ, target)), оно же ведомое (slave). Правила взаимодействия этих устройств определяются протоколом шины PCI. Устройство может следить за транзакциями на шине и не являясь их участником (не вводя никаких сигналов); режиму слежения соответствует термин Snooping. Есть особый тип транзакции (Special Cycle) — широковещательный, в котором инициатор протокольно не взаимодействует ни с одним из устройств. В каждой транзакции выполняется одна команда — как правило, чтение или запись данных по указанному адресу. Транзакция начинается с фазы адреса, в которой инициатор задает команду и целевой адрес. Далее могут следовать фазы данных, в которых одно устройство (источник данных) помещает данные на шину, а другое (приемник) их считывает. Транзакции, в которых присутствует множество фаз данных, называются пакетными. Есть и одиночные транзакции (с одной фазой данных). Транзакция может завершиться и без фаз данных, если целевое устройство (или инициатор) не готово к обмену. В шине PCI-X добавлена фаза атрибутов, в которой передается дополнительная информация о транзакции.
Состав и назначение интерфейсных сигналов шины раскрывает таблице ниже. Состояния всех сигнальных линий воспринимаются по положительному перепаду CLK, и именно эти моменты в дальнейшем описании подразумеваются под тактами шины (на рисунках отмечены вертикальными пунктирными линиями). В разные моменты времени одними и теми же сигнальными линиями управляют разные устройства шины, и для корректной (бесконфликтной) «передачи полномочий» требуется, чтобы существовал промежуток времени, в течение которого линией не управляет ни одно устройство. На временных диаграммах это событие — так называемый «пируэт» (turnaround) — обозначается парой полукруглых стрелок.
Таблица. сигналы шины PCI
Сигнал |
Назначение |
AD[31:0] | Address/Data — мультиплексированная шина адреса/данных. В начале транзакции передается адрес, в последующих тактах — данные |
C/B [3:0]# | Command/Byte Enable — команда/разрешение обращения к байтам. Команда, определяющая тип очередного цикла шины, задается четырехбитным кодом в фазе адреса |
FRAME# |
Кадр. Введением сигнала отмечается начало транзакции (фаза адреса), снятие сигнала указывает на то, что последующий цикл передачи данных является последним в транзакции |
DEVSEL# |
Device Select — устройство выбрано (ответ ЦУ на адресованную к нему транзакцию) |
IRDY# |
Initiator Ready — готовность ведущего устройства к обмену данными |
TRDY# |
Target Ready — готовность ЦУ к обмену данными |
STOP# |
Запрос ЦУ к ведущему устройству на остановку текущей транзакции |
LOCK# |
Сигнал блокировки (захвата) шины для обеспечения целостного выполнения операции. Используется мостом, которому для выполнения одной операции требуется выполнить несколько транзакций PCI |
REQ# |
Request — запрос от ведущего устройства на захват шины |
GNT# |
Grant — предоставление ведущему устройству управления шиной |
PAR |
Parity — общий бит четности для линий AD[31:0] и C/BE[3:0]# |
PERR# |
Parity Error — сигнал об ошибке четности (для всех циклов, кроме специальных). Вырабатывается любым устройством, обнаружившим ошибку |
PME# |
Power Management Event — сигнал о событиях, вызывающих изменение режима потребления (дополнительный сигнал, введенный в PCI 2.2) |
CLKRUN# |
Clock running — шина работает на номинальной частоте синхронизации. Снятие сигнала означает замедление или остановку синхронизации с целью снижения потребления (для мобильных применений) |
PRSN [1,2]# |
Present — индикаторы присутствия платы, кодирующие запрос потребляемой мощности. На карте расширения одна или две линии индикаторов соединяются с шиной GND, что воспринимается системной платой |
RST# |
Reset — сброс всех регистров в начальное состояние (по кнопке «Reset» и при перезагрузке) |
IDSEL |
Initialization Device Select — выбор устройства в циклах конфигурационного считывания и записи; на эти циклы отвечает устройство, обнаружившее на данной линии высокий уровень сигнала |
SERR# |
System Error — системная ошибка. Ошибка четности адреса или данных в специальном цикле или иная катастрофическая ошибка, обнаруженная устройством. Активизируется любым устройством PCI и вызывает NMI |
REQ64# |
Request 64 bit — запрос на 64-битный обмен. Сигнал вводится 64-битным инициатором, по времени он совпадает с сигналом FRAME#. Во время окончания сброса (сигналом RST#) сигнализирует 64-битному устройству о том, что оно подключено к 64-битной шине. Если 64-битное устройство не обнаружит этого сигнала, оно должно переконфигурироваться на 32-битный режим, отключив буферные схемы старших байтов |
ACK64# |
Подтверждение 64-битного обмена. Сигнал вводится 64-битным ЦУ, опознавшим свой адрес, одновременно с DEVSEL#. Отсутствие этого подтверждения заставит инициатор выполнять обмен с 32-битной разрядностью |
INTA#, INTB#, INTC#, INTD# |
Interrupt A, B, C, D — линии запросов прерывания, чувствительность к уровню, активный уровень — низкий, что допускает разделяемость (совместное использование) линий |
CLK |
Clock — тактовая частота шины. Должна лежать в пределах 20—33 МГц, начиная с PCI 2.1 может быть до 66 МГц, в PCI-X до 100 и 133 МГц |
M66EN |
66MHz Enable — разрешение частоты синхронизации до 66 МГц (на картах 33 МГц заземлен, на 66 МГц — свободен) |
PCIXCAP (38B) |
Возможности PCI-X: на платах PCI — заземлен, на PCI-X133 соединен с землей через конденсатор 0,01 мкФ, на PCI-X66 — параллельной RC-цепочкой 10 кОм, 0,01 мкФ. |
SDONE |
Snoop Done — сигнал завершенности цикла слежения для текущей транзакции. Низкий уровень указывает на незавершенность цикла слежения за когерентностью памяти и кэша. Необязательный сигнал, используется только устройствами шины с кэшируемой памятью. Исключен начиная с PCI 2.2 |
SBO# |
Snoop Backoff — попадание текущего обращения к памяти абонента шины в модифицированную строку кэша. Необязательный сигнал, используется только абонентами шины с кэшируемой памятью при алгоритме обратной записи. Исключен начиная с PCI 2.2 |
SMBCLK |
SMBus Clock — тактовый сигнал шины SMBus (интерфейс I2C). Введен начиная с PCI 2.3 |
SMBDAT |
SMBus Data — последовательные данные шины SMBus (интерфейс I2C). Введен начиная с PCI 2.3 |
TCK |
Test Clock — синхронизация тестового интерфейса JTAG |
TDI |
Test Data Input — входные данные тестового интерфейса JTAG |
TDO |
Test Data Output — выходные данные тестового интерфейса JTAG |
TMS |
Test Mode Select — выбор режима для тестового интерфейса JTAG |
TRST |
Test Logic Reset — сброс тестовой логики |
В каждый момент времени шиной может управлять только одно ведущее устройство, получившее на это право от арбитра. Каждое ведущее устройство имеет пару сигналов — REQ# для запроса на управление шиной и GNT# для подтверждения предоставления управления шиной. Устройство может начинать транзакцию (устанавливать сигнал FRAME#) только при полученном активном сигнале GNT# и дождавшись отсутствия активности шины. Заметим, что за время ожидания покоя арбитр может «передумать» и отдать управление шиной другому устройству с более высоким приоритетом. Снятие сигнала GNT# не позволяет устройству начать следующую транзакцию, а при определенных условиях (см. далее) может заставить прекратить начатую транзакцию. Арбитражем запросов на использование шины занимается специальный узел — арбитр, входящий в мост, соединяющий данную шину с центром. Схема приоритетов (фиксированный, циклический, комбинированный) определяется программированием арбитра.
Для адреса и данных используются общие мультиплексированные линии AD. Четыре мультиплексированные линии C/BE[3:0] обеспечивают кодирование команд в фазе адреса и разрешение байтов в фазе данных. В транзакциях записи линии C/BE[3:0] разрешают использование байтов данных одновременно с их присутствием на шине AD, в транзакциях чтения эти сигналы относятся к байтам следующей за ними фазы данных. В фазе адреса (начало транзакции) ведущее устройство активирует сигнал FRAME#, передает целевой адрес по шине AD, а по линиям C/BE# — информацию о типе транзакции (команду). Адресованное целевое устройство отзывается сигналом DEVSEL#. Ведущее устройство указывает на свою готовность к обмену данными сигналом IRDY#, эта готовность может быть выставлена и до получения DEVSEL#. Когда и целевое устройство будет готово к обмену данными, оно установит сигнал TRDY#. Данные по шине AD передаются только при одновременном наличии сигналов IRDY# и TRDY#. С помощью этих сигналов ведущее и целевое устройства согласовывают свои скорости, вводя такты ожидания (wait states). На рисунке ниже приведена временная диаграмма обмена, в которой и ведущее и целевое устройства вводят такты ожидания. Если бы они оба ввели сигналы готовности в конце фазы адреса и не снимали бы их до конца обмена, то в каждом такте после фазы адреса передавались бы по 32 бита данных, что обеспечило бы выход на предельную производительность обмена. В транзакциях чтения после фазы адреса необходим дополнительный такт для пируэта, во время которого инициатор прекращает управление линией AD; целевое устройство сможет взять на себя управление шиной AD только в следующем такте. В транзакции записи пируэт не нужен, поскольку данные передает инициатор.
На шине PCI все транзакции трактуются как пакетные: каждая транзакция начинается фазой адреса, за которой может следовать одна или несколько фаз данных. Количество фаз данных в пакете явно не указывается, но в такте последней фазы данных ведущее устройство при введенном сигнале IRDY# снимает сигнал FRAME#. В одиночных транзакциях сигнал FRAME# активен лишь в течение одного такта. Если устройство не поддерживает пакетные транзакции в ведомом режиме, то оно должно потребовать прекращения пакетной транзакции в течение первой фазы данных (выставив сигнал STOP# одновременно с TRDY#). В ответ на это ведущее устройство завершит данную транзакцию и продолжит обмен последующей транзакцией со следующим значением адреса. После завершающей фазы данных ведущее устройство снимает сигнал IRDY#, и шина переходит в состояние покоя (Idle) — оба сигнала: — FRAME# и IRDY# — находятся в пассивном состоянии.
Инициатор может начать следующую транзакцию и без такта покоя, установив FRAME# одновременно со снятием IRDY#. Такие быстрые смежные транзакции (Fast Back-to-Back) могут быть обращены как к одному, так и к разным целевым устройствам. Первый тип быстрых смежных транзакций поддерживается всеми устройствами PCI, выступающими в роли целевого устройства. На поддержку второго типа смежных транзакций (такая поддержка необязательна) указывает бит 7 регистра состояния. Инициатору разрешают (если он умеет) использовать быстрые смежные транзакции с различными устройствами (разрешение определяется битом 9 регистра команд), только если все агенты шины допускают быстрые обращения. При обмене данных в режиме PCI-X быстрые смежные транзакции недопустимы.
Протокол шины обеспечивает надежность обмена — ведущее устройство всегда получает информацию об отработке транзакции целевым устройством. Средством повышения достоверности обмена является применение контроля четности: линии AD[31:0] и C/BE[3:0]# и в фазе адреса, и в фазе данных защищены битом четности PAR (количество установленных битов этих линий, включая PAR, должно быть четным). Действительное значение PAR появляется на шине с задержкой в один такт относительно линий AD и C/BE#. При обнаружении ошибки устройство вырабатывает сигнал PERR# (со сдвигом на такт после появления на шине действительного бита четности). В подсчете четности при передаче данных учитываются все байты, включая и недействительные (отмеченные высоким уровнем сигнала C/BEx#). Состояние бит, даже и в недействительных байтах данных, во время фазы данных должно оставаться стабильным.
Каждая транзакция на шине должна быть завершена планово или прекращена, при этом шина должна перейти в состояние покоя (сигналы FRAME# и IRDY# пассивны). Завершение транзакции выполняется либо по инициативе ведущего устройства, либо по инициативе целевого устройства.
Ведущее устройство может завершить транзакцию одним из следующих способов:
Транзакция может быть прекращена по инициативе целевого устройства; для этого оно может ввести сигнал STOP#. Возможны три типа прекращения транзакции:
Использование трех типов прекращения транзакции вовсе не обязательно для всех целевых устройств, однако любое ведущее устройство должно быть готово к завершению транзакций по любой из этих причин.
Прекращение типа retry используется для организации отложенных транзакций (delayed transactions). Отложенные транзакции используются только медленными целевыми устройствами, а также мостами PCI при трансляции транзакций на другую шину. Прекращая (для инициатора) транзакцию условием retry, целевое устройство внутренне выполняет данную транзакцию. Когда инициатор повторит эту транзакцию (выдаст ту же команду с тем же адресом и тем же набором сигналов C/BE# в фазе данных), у целевого устройства (или моста) уже будет готов результат (данные чтения или состояние выполнения записи), который оно быстро вернет инициатору. Результат отложенной транзакции, выполненной данным устройством, устройство или мост должны хранить до тех пор, пока результаты не будут запрошены инициатором. Однако он может и «забыть» повторить транзакцию (из-за каких-либо нештатных ситуаций). Чтобы избежать переполнения буфера хранения результатов, устройству приходится отбрасывать (discard) эти результаты. Отбрасывание может быть выполнено без побочных эффектов, если откладывалась транзакция к памяти, допускающей предвыборку (с атрибутом prefetchable, см. далее). Остальные типы транзакций в общем случае безнаказанно отбрасывать нельзя (может нарушиться целостность данных), для них отбрасывание разрешается только после безрезультатного ожидания повтора в течение 215 тактов шины (по срабатыванию discard timer). Об этой особой ситуации устройство может сообщить своему драйверу (или всей системе).
Инициатор транзакции может потребовать монопольного использования шины PCI на все время выполнения операции обмена, требующей нескольких шинных транзакций. Так, например, если центральный процессор выполняет инструкцию модификации данных в ячейке памяти, принадлежащей устройству PCI, ему нужно прочитать данные из устройства, модифицировать их в своем АЛУ и вернуть результат в устройство. Чтобы в эту операцию не вклинивались транзакции от других инициаторов (что чревато нарушением целостности данных), главный мост выполняет ее как блокированную — на все время исполнения операции подается шинный сигнал LOCK#. Этот сигнал никак не используется (и не вырабатывается) обычными устройствами PCI (не мостами); он используется только мостами для управления арбитражем.
Команды PCI определяют направление и тип транзакций, а также адресное пространство, к которому они относятся. Набор команд шины PCI включает следующие:
Команды кодируются значениями бит C/BE# в фазе адреса (см. таблицу ниже), специфические команды PCI-X рассмотрены в последующих разделах.
Код C/BE[3:0] | PCI команда | PCI-X команда | Длина | Возможность расщепления |
0000 | Interrupt Acknowledge | Interrupt Acknowledge, подтверждение прерывания | DWORD | + |
0001 | Special Cycle | Special Cycle, специальный широковещательный цикл | DWORD | - |
0010 | I/O Read | I/O Read, чтение ввода/вывода | DWORD | + |
0011 | I/O Write | I/O Read, запись ввода/вывода | DWORD | + |
0100 | Резерв | Резерв | - | - |
0101 | Резерв | Device ID Message (DIM), посылка собщения устройству (PCI-X 2.0) |
Пакет | - |
0110 | Memory Read | Memory Read DWORD, одиночное чтение памяти | DWORD | + |
0111 | Memory Write | Memory Write, запись памяти | Пакет | - |
1000 | Резерв | Alias to Memory Read Block псевдоним чтения блока памяти | Пакет | + |
1001 | Резерв | Alias to Memory Write Block, псевдоним записи блока памяти | Пакет | - |
1010 | Configuration Read | Configuration Read, конфигурационное чтение | DWORD | + |
1011 | Configuration Write | Configuration Write, конфигурационная запись | DWORD | + |
1100 | Memory Read Multiple | Split Completion, завершение расщепленной транзакции | Пакет | - |
1101 | Dual Address Cycle | Dual Address Cycle (DAC), цикл передачи расширенного адреса памяти | - | - |
1110 | Memory Read Line | Memory Read Block, чтение блока памяти | Пакет | + |
1111 | Memory Write and Invalidate | Memory Write Block, запись блока памяти | Пакет | - |
Таблица. Декодирование команд шин PCI и PCI-X
В каждой команде шины указывается адрес, относящийся к первой фазе данных пакета. Для каждой последующей фазы данных пакета адрес увеличивается на 4 (следующее двойное слово) или 8 (для 64-битных передач), но в командах обращения к памяти предусматривался и иной порядок.
В шине PCI байты шины AD, несущие реальную информацию, определяются сигналами C/BE[3:0]# в фазах данных. Разрешенные байты могут быть разрозненными; возможны фазы данных, в которых не разрешено ни одного байта. В PCI-X правила разрешения байтов изменились (см. ниже). Сигналами C/BE[3:0]# управляет инициатор, он указывает требуемые байты для каждой фазы данных и не меняет состояние этих сигналов в течение всей этой фазы. В транзакциях чтения байты «заказывает» опять же инициатор; если поведение целевого устройства (источника данных для чтения) зависит от того, какие байты заказаны, то целевое устройство вынуждено растягивать каждую фазу данных. При этом в первом такте каждой фазы данных целевое устройство принимает C/BE[3:0]# и только в последующем такте (а может, и с дополнительным ожиданием) выдает данные чтения.
В отличие от шины ISA на PCI нет динамического изменения разрядности — все устройства должны подключаться к шине 32- или 64-разрядным способом. Если в устройстве PCI применяются функциональные схемы иной разрядности (к примеру, нужно подключить микросхему 8255, имеющую 8-битную шину данных и четыре регистра), то приходится применять схемотехнические методы преобразования, отображающие все регистры на 32-разрядную шину AD. Возможность 16-битных подключений появилась только во второй версии PCI-X.
Для каждого из трех пространств — памяти, портов ввода/вывода и конфигурационных регистров — адресация различна; в специальных циклах адрес игнорируется.
На шине PCI передается физический адрес памяти; в процессорах x86 (и других) он получается из логического посредством постраничной табличной трансляции блоком MMU.
В командах обращения к памяти на шине PCI адрес, выровненный по границе двойного слова, передается по линиям AD[31:2]; линии AD[1:0] задают порядок адресов в пакете:
Если требуется доступ к адресам свыше 4 Гбайт, то используется двухадресный цикл, передающий младшие 32 бита полного 64-битного адреса для последующей команды, вместе с которой передаются старшие биты адреса. В обычных командах подразумевается нулевое значение бит [63:32] полного адреса.
В PCI-X передается полный адрес памяти — используются все линии AD[31:0]. В пакетных транзакциях адрес определяет точное положение начального байта пакета, и всегда подразумевается линейный нарастающий порядок адресов. В пакетной транзакции участвуют все байты, начиная с данного и до последнего (по счетчику байтов). Запреты отдельных байтов в пакете (как в PCI) для транзакций PCI-X недопустимы. В одиночных транзакциях (DWORD) биты адреса AD[1:0] определяют байты, которые могут быть разрешены сигналами C/BE[3:0]#1: При AD[1:0] = 00 допустимо C/BE[3:0]# = xxxx (могут быть разрешены любые байты), при AD[1:0] = = 01 — C/BE[3:0]# = xxx1, при AD[1:0] = 10 — C/BE[3:0]# = xx11, при AD[1:0] = 11 — — C/BE[3:0]# = x111 (передается лишь байт 3 или ни один байт не разрешен).
В командах обращения к портам ввода/вывода для адресации любого байта используются (декодируются) все линии AD[31:0]. При этом биты адреса AD[31:2] указывают на адрес двойного слова, к которому принадлежат передаваемые данные, а младшие биты адреса AD[1:0] определяют байты, которые могут быть разрешены сигналами C/BE[3:0]#. Для транзакций ввода/вывода на PCI правила несколько иные, чем для обращений к памяти: если передается хотя бы один байт, то всегда должен быть разрешен и тот байт, на который указывает адрес. При AD[1:0] = 00 допустимо C/BE[3:0]# = xxx0 или 1111, при AD[1:0] = 01 — C/BE[3:0]# = xx01 или 1111, при AD[1:0] = 10 — C/BE[3:0]# = x011 или 1111, при AD[1:0] = 11 — C/BE[3:0]# = = 0111 (передается лишь байт 3) или 1111 (ни один байт не разрешен). Эти циклы формально тоже могут быть пакетными, хотя реально эта возможность практически не используется. Для адресации портов на шине PCI доступны все 32 бита адреса, но процессоры x86 могут использовать только младшие 16 бит.
Для транзакций ввода/вывода на PCIX распространяются те же взаимосвязи сигналов C/BE[3:0]# и те же адреса, что и для одиночных (DWORD) транзакций с памятью, приведенные в предыдущем разделе. Эти транзакции всегда одиночные (DWORD).
В командах конфигурационной записи/считывания применяется специфическая трактовка адреса, здесь формат адреса может быть одним из двух типов. Для доступа к регистрам устройства, расположенного на данной шине, используются конфигурационные транзакции типа 0. При этом устройство (карта расширения) выбирается индивидуальным сигналом IDSEL, который формируется мостом этой шины из номера устройства. Выбранное устройство на шине в битах AD[10:8] «видит» номер функции Fun, а в битах AD[7:2] — номер конфигурационного регистра Reg, при этом AD[1:0] = 00 является признаком типа 0. Линии AD[31:11] используются в качестве источника сигналов IDSEL для устройств данной шины. В спецификации на саму шину по линии AD11 передается IDSEL для устройства 0, по AD12 — для устройства 1, … по AD31 — для устройства 20. В спецификации на мосты приводится таблица, в которой используются только линии c AD16 (устройство 0) по AD31 (устройство 15). Устройства PCI, скомбинированные с мостом (расположенные с ним в одной микросхеме), могут использовать и большие номера, для которых линий AD уже не хватает. В PCI-X по линиям AD[15:11] передается недекодированный номер устройства Dev — он нужен устройству для передачи в качестве части своего идентификатора в атрибутах транзакции. Для устройств, работающих в Mode 1, для IDSEL используются линии AD[31:16], а для Mode 2 — только AD[23:16], так что максимальный номер устройства — 7. Это позволяет расширить конфигурационное пространство функции до 4 Кбайт: в качестве старших бит номера конфигурационного регистра UReg используются линии AD[27:24].
Для доступа к устройствам других шин используются конфигурационные транзакции типа 1. Здесь номер шины Bus, на котором расположено искомое устройство, определяется битами AD[23:16]; номер устройства Dev — битами AD[15:11], номер функции Fun — битами AD[10:8]; номер регистра Reg — битами AD[7:2]; при этом AD[1:0] = 01 является признаком типа 1. В PCI-X для Mode 2 по AD[27:24] передаются старшие биты номера регистра (UReg).
Поскольку биты AD[1:0] используются для идентификации типа транзакции, конфигурационные регистры адресуются только двойными словами. Различение двух типов конфигурационных транзакций используется для построения иерархической системы конфигурирования PCI. Мост, приведший конфигурационную транзакцию к шине, на которой расположено целевое устройство, преобразует транзакцию типа 1 в транзакцию типа 2. Заметим, что в отличие от транзакций по адресам памяти и ввода/вывода, которые от инициатора до адресованного целевого устройства доберутся при любом их взаимном расположении, конфигурационные транзакции распространяются по иерархии шин только «вниз» — от хоста (центрального процессора) через главную шину к подчиненным. Таким образом, только хост может выполнить конфигурирование всех устройств PCI (включая и мосты), и это его «почетная обязанность».
В широковещательной команде PCI, называемой специальным циклом, в фазе адреса информация по шине AD не передается. Любой агент шины PCI может вызвать специальный цикл на любой конкретно заданной шине, используя транзакцию конфигурационной записи типа 1, указав номер шины в битах AD[23:16]. При этом в полях номеров устройства и функции (в битах AD[15:8]) должны быть все единицы, в поле номера регистра — нули. Эта транзакция проходит между шинами независимо от взаимного расположения источника и целевой шины, и только самым последним мостом, приведшим ее к целевой шине, преобразуется в собственно специальный цикл.