PCI и PCI-X
Команды PCI определяют направление и тип транзакций, а также адресное пространство, к которому они относятся. Набор команд шины PCI включает следующие:
- I/O Read, I/O Write — команды чтения и записи ввода/вывода, служат для обращения к пространству портов;
- Memory Read, Memory Write — команды чтения и записи памяти, служат для выполнения коротких (как правило, непакетных) транзакций. Их прямое назначение — обращение к отображенным на память устройствам ввода/вывода. Для «настоящей» памяти, допускающей предвыборки, предназначены команды чтения строк, множественного чтения и записи с инвалидацией;
- Memory-Read Line — чтение строки памяти, применяется, когда в транзакции планируется чтение до конца строки кэша. Выделение данного типа чтения позволяет повысить производительность обмена с памятью;
- Multiple Memory Read — множественное чтение памяти, используется для транзакций, затрагивающих более одной строки кэш-памяти. Использование данного типа транзакций позволяет контроллеру памяти выполнять упреждающую выборку строк, что дает дополнительный выигрыш производительности;
- Memory Write and Invalidate (MVI) — запись с инвалидацией, применяется к целым строкам кэша, причем все байты во всех фазах должны быть разрешены. Эта операция заставляет контроллер кэш-памяти очищать «грязные» строки кэша, соответствующие записываемой области, без их выгрузки в ОЗУ, что экономит время. Инициатор, вводящий эту команду, должен знать размер строки кэша в данной системе (для этого у него есть специальный регистр в конфигурационном пространстве);
- Dual Address Cycle (DAC) — двухадресный цикл, позволяет по 32-битной шине обращаться к устройствам с 64-битной адресацией. В этом случае младшие 32 бита адреса передаются одновременно с данной командой, а далее следует обычный цикл, определяющий команду обмена и несущий старшие 32 бита адреса. Шина PCI допускает 64-битную адресацию как памяти, так и портов ввода/вывода (последнее для систем на x86 бесполезно, но PCI существует и на других платформах);
- Configuration Read, Configuration Write — команды конфигурационного чтения и записи, адресуются к конфигурационному пространству устройств. Обращение производится только выровненными двойными словами, биты AD[1:0] используются для идентификации типа цикла (см. ниже). Для генерации данных команд требуется специальный аппаратно-программный механизм;
- Special Cycle — специальный цикл, отличается от всех других тем, что является широковещательным. Однако ни один агент на него не отвечает, а главный мост или иное устройство, вводящее этот цикл, всегда завершает его способом Master Abort (на него требуется 6 тактов шины). Специальный цикл предназначен для генерации широковещательных сообщений, которые могут читать любые «заинтересованные» агенты шины. Тип сообщения декодируется содержимым линий AD[15:0]; на линиях AD[31:16] могут помещаться данные, передаваемые в сообщении. Фаза адреса в этом цикле обычными устройствами игнорируется, но мосты используют ее информацию для управления распространением сообщения. Сообщения с кодами 0000h, 0001h и 0002h требуются для указания на отключение (сообщение Shutdown), остановку (сообщение Halt) процессора или специфические функции процессора x86, связанные с кэшем и трассировкой. Коды 0003h–FFFFh зарезервированы. Специальный цикл может генерироваться тем же аппаратно-программным механизмом, что и конфигурационные циклы, но со специфическим значением адреса;
- Interrupt Acknowledge (INTA) — команда подтверждения прерывания, предназначена для чтения вектора прерываний. По протоколу она выглядит как команда чтения, неявно адресованная к системному контроллеру прерываний. Здесь в фазе адреса по шине AD полезная информация не передается (BE[3:0]# задают размер вектора), но ее инициатор (главный мост) должен обеспечить стабильность сигналов и корректность бита четности. В x86-архитектуре 8-битный вектор передается в байте 0 по готовности контроллера прерываний (по сигналу TRDY#). Подтверждение прерываний выполняется за один цикл (первый холостой цикл, который процессоры x86 делают в дань совместимости со стариной, мостом подавляется).
Команды кодируются значениями бит 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.
Для каждого из трех пространств — памяти, портов ввода/вывода и конфигурационных регистров — адресация различна; в специальных циклах адрес игнорируется.